code: // Licensed to the Software Freedom Conservancy (SFC) under one
  // or more contributor license agreements.  See the NOTICE file
  // distributed with this work for additional information
  // regarding copyright ownership.  The SFC licenses this file
  // to you under the Apache License, Version 2.0 (the
  // "License"); you may not use this file except in compliance
  // with the License.  You may obtain a copy of the License at
  //
  //   http://www.apache.org/licenses/LICENSE-2.0
  //
  // Unless required by applicable law or agreed to in writing,
  // software distributed under the License is distributed on an
  // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  // KIND, either express or implied.  See the License for the
  // specific language governing permissions and limitations
  // under the License.
  
  package org.openqa.selenium;
  
  import static org.assertj.core.api.Assertions.assertThat;
  import static org.junit.jupiter.api.Assumptions.assumeFalse;
  import static org.openqa.selenium.testing.TestUtilities.getEffectivePlatform;
  import static org.openqa.selenium.testing.TestUtilities.isFirefox;
  import static org.openqa.selenium.testing.drivers.Browser.FIREFOX;
  import static org.openqa.selenium.testing.drivers.Browser.IE;
  import static org.openqa.selenium.testing.drivers.Browser.SAFARI;
  
  import org.junit.jupiter.api.AfterEach;
  import org.junit.jupiter.api.Test;
  import org.openqa.selenium.testing.JupiterTestBase;
  import org.openqa.selenium.testing.NotYetImplemented;
  
  class ContentEditableTest extends JupiterTestBase {
  
    @AfterEach
    public void switchToDefaultContent() {
      driver.switchTo().defaultContent();
    }
  
    @Test
    @NotYetImplemented(value = FIREFOX)
    public void testTypingIntoAnIFrameWithContentEditableOrDesignModeSet() {
      driver.get(pages.richTextPage);
  
      driver.switchTo().frame("editFrame");
      WebElement element = driver.switchTo().activeElement();
      element.sendKeys("Fishy");
  
      driver.switchTo().defaultContent();
      WebElement trusted = driver.findElement(By.id("istrusted"));
      WebElement id = driver.findElement(By.id("tagId"));
  
      assertThat(trusted.getText()).isIn("[true]", "[n/a]", "[]");
      assertThat(id.getText()).isIn("[frameHtml]", "[theBody]");
    }
  
    @Test
    @NotYetImplemented(value = FIREFOX)
    @NotYetImplemented(SAFARI)
    public void testNonPrintableCharactersShouldWorkWithContentEditableOrDesignModeSet() {
      assumeFalse(
          isFirefox(driver)
              && (getEffectivePlatform(driver).is(Platform.LINUX)
                  || getEffectivePlatform(driver).is(Platform.MAC)),
          "FIXME: Fails in Firefox on Linux with synthesized events");
  
      driver.get(pages.richTextPage);
  
      driver.switchTo().frame("editFrame");
      WebElement element = driver.switchTo().activeElement();
      element.sendKeys("Dishy", Keys.BACK_SPACE, Keys.LEFT, Keys.LEFT);
      element.sendKeys(Keys.LEFT, Keys.LEFT, "F", Keys.DELETE, Keys.END, "ee!");
  
      assertThat(element.getText()).isEqualTo("Fishee!");
    }
  
    @Test
    void testShouldBeAbleToTypeIntoEmptyContentEditableElement() {
      driver.get(pages.readOnlyPage);
      WebElement editable = driver.findElement(By.id("content-editable-blank"));
  
      editable.sendKeys("cheese");
  
      assertThat(editable.getText()).isEqualTo("cheese");
    }
  
    @Test
    @NotYetImplemented(SAFARI)
    @NotYetImplemented(value = FIREFOX, reason = "https://github.com/mozilla/geckodriver/issues/667")
    public void testShouldBeAbleToTypeIntoContentEditableElementWithExistingValue() {
      driver.get(pages.readOnlyPage);
      WebElement editable = driver.findElement(By.id("content-editable"));
  
      String initialText = editable.getText();
      editable.sendKeys(", edited");
  
      assertThat(editable.getText()).isEqualTo(initialText + ", edited");
    }
  
    @Test
    void testShouldBeAbleToTypeIntoTinyMCE() {
      driver.get(appServer.whereIs("tinymce.html"));
      driver.switchTo().frame("mce_0_ifr");
  
      WebElement editable = driver.findElement(By.id("tinymce"));
  
      editable.clear();
      editable.sendKeys("cheese"); // requires focus on OS X
  
      assertThat(editable.getText()).isEqualTo("cheese");
    }
  
    @Test
    @NotYetImplemented(value = IE, reason = "Prepends text")
    @NotYetImplemented(value = SAFARI, reason = "Prepends text")
    @NotYetImplemented(value = FIREFOX, reason = "https://github.com/mozilla/geckodriver/issues/667")
    public void testShouldAppendToTinyMCE() {
      driver.get(appServer.whereIs("tinymce.html"));
      driver.switchTo().frame("mce_0_ifr");
  
      WebElement editable = driver.findElement(By.id("tinymce"));
  
      editable.sendKeys(" and cheese"); // requires focus on OS X
  
      assertThat(editable.getText()).isEqualTo("Initial content and cheese");
    }
  
    @Test
    @NotYetImplemented(value = SAFARI, reason = "Prepends text")
    public void appendsTextToEndOfContentEditableWithMultipleTextNodes() {
      driver.get(appServer.whereIs("content-editable.html"));
      WebElement input = driver.findElement(By.id("editable"));
      input.sendKeys(", world!");
      assertThat(input.getText()).isEqualTo("Why hello, world!");
    }
  }
  