aboutsummaryrefslogtreecommitdiff
path: root/contexts/data/lib/closure-library/closure/goog/editor/plugins/enterhandler_test.html
diff options
context:
space:
mode:
Diffstat (limited to 'contexts/data/lib/closure-library/closure/goog/editor/plugins/enterhandler_test.html')
-rw-r--r--contexts/data/lib/closure-library/closure/goog/editor/plugins/enterhandler_test.html754
1 files changed, 0 insertions, 754 deletions
diff --git a/contexts/data/lib/closure-library/closure/goog/editor/plugins/enterhandler_test.html b/contexts/data/lib/closure-library/closure/goog/editor/plugins/enterhandler_test.html
deleted file mode 100644
index ee8b090..0000000
--- a/contexts/data/lib/closure-library/closure/goog/editor/plugins/enterhandler_test.html
+++ /dev/null
@@ -1,754 +0,0 @@
-<!DOCTYPE html>
-<!--
-
- Tests for goog.editor.plugins.EnterHandler
-
- @author nicksantos@google.com (Nick Santos)
---><html>
-<!--
-Copyright 2008 The Closure Library Authors. All Rights Reserved.
-
-Use of this source code is governed by the Apache License, Version 2.0.
-See the COPYING file for details.
--->
-<head>
-<meta http-equiv="X-UA-Compatible" content="IE=edge">
-<title>Closure Unit Tests - goog.editor.plugins.EnterHandler</title>
-<script src="../../base.js"></script>
-<script>
- goog.require('goog.dom');
- goog.require('goog.dom.DomHelper');
- goog.require('goog.dom.Range');
- goog.require('goog.editor.BrowserFeature');
- goog.require('goog.editor.Field');
- goog.require('goog.editor.plugins.Blockquote');
- goog.require('goog.editor.plugins.EnterHandler');
- goog.require('goog.editor.range');
- goog.require('goog.testing.ExpectedFailures');
- goog.require('goog.testing.MockClock');
- goog.require('goog.testing.editor.TestHelper');
- goog.require('goog.testing.events');
- goog.require('goog.testing.jsunit');
-
-</script>
-<style type='text/css'>
- .tr-field {
- border: thin solid blue;
- }
-
- .tr_bq {
- border-left: thin solid red;
- margin-left: 5px;
- }
-</style>
-</head>
-<body>
-
-<input type='button' value='Make all fields editable'
- onclick='setUp()' />
-
-<p/>
-
-<div id="container">This is used to test static utility functions.</div>
-<div id='root'>
- <div id='field1' class='tr-field'>
- <blockquote>
- This is an <span id='field1cursor'>selection</span> unsetup blockquote
- </blockquote>
- </div>
- <p/>
-
- <div id='field2' class='tr-field'>
- <blockquote class='tr_bq'>
- This is a <span id='field2cursor'>selection</span> setup blockquote
- </blockquote>
- </div>
- <p/>
-</div>
-<script>
-
-var savedHtml;
-
-var field1;
-var field2;
-var firedDelayedChange;
-var firedBeforeChange;
-var clock;
-var container = goog.dom.getElement('container');
-var EXPECTEDFAILURES;
-
-function setUp() {
- EXPECTEDFAILURES = new goog.testing.ExpectedFailures();
- savedHtml = goog.dom.getElement('root').innerHTML;
- clock = new goog.testing.MockClock(true);
-}
-
-function setUpFields(classnameRequiredToSplitBlockquote) {
- field1 = makeField('field1', classnameRequiredToSplitBlockquote);
- field2 = makeField('field2', classnameRequiredToSplitBlockquote);
-
- field1.makeEditable();
- field2.makeEditable();
-}
-
-function tearDown() {
- clock.dispose();
-
- EXPECTEDFAILURES.handleTearDown();
-
- goog.dom.getElement('root').innerHTML = savedHtml;
-}
-
-function testEnterInNonSetupBlockquote() {
- setUpFields(true);
- resetChangeFlags();
- var prevented = !selectNodeAndHitEnter(field1, 'field1cursor');
- waitForChangeEvents();
- assertChangeFlags();
-
- // make sure there's just one blockquote, and that the text has been deleted.
- var elem = field1.getElement();
- var dom = field1.getEditableDomHelper();
- EXPECTEDFAILURES.expectFailureFor(goog.userAgent.OPERA,
- 'The blockquote is overwritten with DIV due to CORE-22104 -- Opera ' +
- 'overwrites the BLOCKQUOTE ancestor with DIV when doing FormatBlock ' +
- 'for DIV');
- try {
- assertEquals('Blockquote should not be split',
- 1, dom.getElementsByTagNameAndClass('BLOCKQUOTE', null, elem).length);
- } catch(e) {
- EXPECTEDFAILURES.handleException(e);
- }
- assert('Selection should be deleted',
- -1 == elem.innerHTML.indexOf('selection'));
-
- assertEquals('The event should have been prevented only on webkit',
- prevented, goog.userAgent.WEBKIT);
-}
-
-function testEnterInSetupBlockquote() {
- setUpFields(true);
- resetChangeFlags();
- var prevented = !selectNodeAndHitEnter(field2, 'field2cursor');
- waitForChangeEvents();
- assertChangeFlags();
-
- // make sure there are two blockquotes, and a DIV with nbsp in the middle.
- var elem = field2.getElement();
- var dom = field2.getEditableDomHelper();
- assertEquals('Blockquote should be split', 2,
- dom.getElementsByTagNameAndClass('BLOCKQUOTE', null, elem).length);
- assert('Selection should be deleted',
- -1 == elem.innerHTML.indexOf('selection'));
-
- assert('should have div with &nbsp;',
- -1 != elem.innerHTML.indexOf('>' + getNbsp() + '<'));
- assert('event should have been prevented', prevented);
-}
-
-function testEnterInNonSetupBlockquoteWhenClassnameIsNotRequired() {
- setUpFields(false);
-
- resetChangeFlags();
- var prevented = !selectNodeAndHitEnter(field1, 'field1cursor');
- waitForChangeEvents();
- assertChangeFlags();
-
- // make sure there are two blockquotes, and a DIV with nbsp in the middle.
- var elem = field1.getElement();
- var dom = field1.getEditableDomHelper();
- assertEquals('Blockquote should be split', 2,
- dom.getElementsByTagNameAndClass('BLOCKQUOTE', null, elem).length);
- assert('Selection should be deleted',
- -1 == elem.innerHTML.indexOf('selection'));
-
- assert('should have div with &nbsp;',
- -1 != elem.innerHTML.indexOf('>' + getNbsp() + '<'));
- assert('event should have been prevented', prevented);
-}
-
-function testEnterInBlockquoteCreatesDivInBrMode() {
- setUpFields(true);
- selectNodeAndHitEnter(field2, 'field2cursor');
- var elem = field2.getElement();
- var dom = field2.getEditableDomHelper();
-
- var firstBlockquote = dom.getElementsByTagNameAndClass('BLOCKQUOTE', null, elem)[0];
- var div = dom.getNextElementSibling(firstBlockquote);
- assertEquals('Element after blockquote should be a div', 'DIV', div.tagName);
- assertEquals('Element after div should be second blockquote',
- 'BLOCKQUOTE', dom.getNextElementSibling(div).tagName);
-}
-
-/**
- * Tests that breaking after a BR doesn't result in unnecessary newlines.
- * @bug 1471047
- */
-function testEnterInBlockquoteRemovesUnnecessaryBrWithCursorAfterBr() {
- setUpFields(true);
-
- // Assume the following HTML snippet:-
- // <blockquote>one<br>|two<br></blockquote>
- //
- // After enter on the cursor position without the fix, the resulting HTML
- // after the blockquote split was:-
- // <blockquote>one</blockquote>
- // <div>&nbsp;</div>
- // <blockquote><br>two<br></blockquote>
- //
- // This creates the impression on an unnecessary newline. The resulting HTML
- // after the fix is:-
- //
- // <blockquote>one<br></blockquote>
- // <div>&nbsp;</div>
- // <blockquote>two<br></blockquote>
- field1.setHtml(false,
- '<blockquote id="quote" class="tr_bq">one<br>' +
- 'two<br></blockquote>');
- var dom = field1.getEditableDomHelper();
- goog.dom.Range.createCaret(dom.getElement('quote'), 2).select();
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.ENTER);
- var elem = field1.getElement();
- var secondBlockquote = dom.getElementsByTagNameAndClass('BLOCKQUOTE', null, elem)[1];
- assertHTMLEquals('two<br>', secondBlockquote.innerHTML);
-
- // Verifies that a blockquote split doesn't happen if it doesn't need to.
- field1.setHtml(false,
- '<blockquote class="tr_bq">one<br id="brcursor"></blockquote>');
- selectNodeAndHitEnter(field1, 'brcursor');
- assertEquals(1, dom.getElementsByTagNameAndClass('BLOCKQUOTE', null, elem).length);
-}
-
-/**
- * Tests that breaking in a text node before a BR doesn't result in unnecessary
- * newlines.
- * @bug 1471047
- */
-function testEnterInBlockquoteRemovesUnnecessaryBrWithCursorBeforeBr() {
- setUpFields(true);
-
- // Assume the following HTML snippet:-
- // <blockquote>one|<br>two<br></blockquote>
- //
- // After enter on the cursor position, the resulting HTML should be.
- // <blockquote>one<br></blockquote>
- // <div>&nbsp;</div>
- // <blockquote>two<br></blockquote>
- field1.setHtml(false,
- '<blockquote id="quote" class="tr_bq">one<br>' +
- 'two<br></blockquote>');
- var dom = field1.getEditableDomHelper();
- var cursor = dom.getElement('quote').firstChild;
- goog.dom.Range.createCaret(cursor, 3).select();
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.ENTER);
- var elem = field1.getElement();
- var secondBlockquote = dom.getElementsByTagNameAndClass('BLOCKQUOTE', null, elem)[1];
- assertHTMLEquals('two<br>', secondBlockquote.innerHTML);
-
- // Ensures that standard text node split works as expected with the new
- // change.
- field1.setHtml(false,
- '<blockquote id="quote" class="tr_bq">one<b>two</b><br>');
- cursor = dom.getElement('quote').firstChild;
- goog.dom.Range.createCaret(cursor, 3).select();
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.ENTER);
- secondBlockquote = dom.getElementsByTagNameAndClass('BLOCKQUOTE', null, elem)[1];
- assertHTMLEquals('<b>two</b><br>', secondBlockquote.innerHTML);
-}
-
-/**
- * Tests that pressing enter in a blockquote doesn't create unnecessary
- * DOM subtrees.
- *
- * @bug 1991539
- * @bug 1991392
- */
-function testEnterInBlockquoteRemovesExtraNodes() {
- setUpFields(true);
-
- // Let's assume we have the following DOM structure and the
- // cursor is placed after the first numbered list item "one".
- //
- // <blockquote class="tr_bq">
- // <div><div>a</div><ol><li>one|</li></div>
- // <div>two</div>
- // </blockquote>
- //
- // After pressing enter, we have the following structure.
- //
- // <blockquote class="tr_bq">
- // <div><div>a</div><ol><li>one|</li></div>
- // </blockquote>
- // <div>&nbsp;</div>
- // <blockquote class="tr_bq">
- // <div><ol><li><span id=""></span></li></ol></div>
- // <div>two</div>
- // </blockquote>
- //
- // This appears to the user as an empty list. After the fix, the HTML
- // will be
- //
- // <blockquote class="tr_bq">
- // <div><div>a</div><ol><li>one|</li></div>
- // </blockquote>
- // <div>&nbsp;</div>
- // <blockquote class="tr_bq">
- // <div>two</div>
- // </blockquote>
- //
- field1.setHtml(false,
- '<blockquote class="tr_bq">' +
- '<div><div>a</div><ol><li id="cursor">one</li></div>' +
- '<div>b</div>' +
- '</blockquote>');
- var dom = field1.getEditableDomHelper();
- goog.dom.Range.createCaret(dom.getElement('cursor').firstChild, 3).select();
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.ENTER);
- var elem = field1.getElement();
- var secondBlockquote = dom.getElementsByTagNameAndClass('BLOCKQUOTE', null, elem)[1];
- assertHTMLEquals('<div>b</div>', secondBlockquote.innerHTML);
-
- // Ensure that we remove only unnecessary subtrees.
- field1.setHtml(false,
- '<blockquote class="tr_bq">' +
- '<div><span>a</span><div id="cursor">one</div><div>two</div></div>' +
- '<div><span>c</span></div>' +
- '</blockquote>');
- goog.dom.Range.createCaret(dom.getElement('cursor').firstChild, 3).select();
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.ENTER);
- secondBlockquote = dom.getElementsByTagNameAndClass('BLOCKQUOTE', null, elem)[1];
- var expectedHTML = '<div><div>two</div></div>' +
- '<div><span>c</span></div>';
- assertHTMLEquals(expectedHTML, secondBlockquote.innerHTML);
-
- // Place the cursor in the middle of a line.
- field1.setHtml(false,
- '<blockquote id="quote" class="tr_bq">' +
- '<div>one</div><div>two</div>' +
- '</blockquote>');
- goog.dom.Range.createCaret(
- dom.getElement('quote').firstChild.firstChild, 1).select();
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.ENTER);
- var blockquotes = dom.getElementsByTagNameAndClass('BLOCKQUOTE', null, elem);
- assertEquals(2, blockquotes.length);
- assertHTMLEquals('<div>o</div>', blockquotes[0].innerHTML);
- assertHTMLEquals('<div>ne</div><div>two</div>', blockquotes[1].innerHTML);
-}
-
-function testEnterInList() {
- setUpFields(true);
-
- // <enter> in a list should *never* be handled by custom code. Lists are
- // just way too complicated to get right.
- field1.setHtml(false,
- '<ol><li>hi!<span id="field1cursor"></span></li></ol>');
- if (goog.userAgent.OPERA) {
- // Opera doesn't actually place the selection in the empty span
- // unless we add a text node first.
- var dom = field1.getEditableDomHelper();
- dom.getElement('field1cursor').appendChild(dom.createTextNode(''));
- }
- var prevented = !selectNodeAndHitEnter(field1, 'field1cursor');
- assertFalse('<enter> in a list should not be prevented', prevented);
-}
-
-function testEnterAtEndOfBlockInWebkit() {
- setUpFields(true);
-
- if (goog.userAgent.WEBKIT) {
- field1.setHtml(false,
- '<blockquote>hi!<span id="field1cursor"></span></blockquote>');
-
- var cursor = field1.getEditableDomHelper().getElement('field1cursor');
- goog.editor.range.placeCursorNextTo(cursor, false);
- goog.dom.removeNode(cursor);
-
- var prevented = !goog.testing.events.fireKeySequence(
- field1.getElement(), goog.events.KeyCodes.ENTER);
- waitForChangeEvents();
- assertChangeFlags();
- assert('event should have been prevented', prevented);
-
- // Make sure that the block now has two brs.
- var elem = field1.getElement();
- assertEquals('should have inserted two br tags: ' + elem.innerHTML,
- 2, goog.dom.getElementsByTagNameAndClass('BR', null, elem).length);
- }
-}
-
-/**
- * Tests that deleting a BR that comes right before a block element works.
- * @bug 1471096
- * @bug 2056376
- */
-function testDeleteBrBeforeBlock() {
- setUpFields(true);
-
- // This test only works on Gecko, because it's testing for manual deletion of
- // BR tags, which is done only for Gecko. For other browsers we fall through
- // and let the browser do the delete, which can only be tested with a robot
- // test (see javascript/apps/editor/tests/delete_br_robot.html).
- if (goog.userAgent.GECKO) {
- field1.setHtml(false, 'one<br><br><div>two</div>');
- var helper = new goog.testing.editor.TestHelper(field1.getElement());
- helper.select(field1.getElement(), 2); // Between the two BR's.
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.DELETE);
- assertEquals('Should have deleted exactly one <br>',
- 'one<br><div>two</div>',
- field1.getElement().innerHTML);
-
- // We test the case where the BR has a previous sibling which is not
- // a block level element.
- field1.setHtml(false, 'one<br><ul><li>two</li></ul>');
- helper.select(field1.getElement(), 1); // Between one and BR.
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.DELETE);
- assertEquals('Should have deleted the <br>',
- 'one<ul><li>two</li></ul>',
- field1.getElement().innerHTML);
- // Verify that the cursor is placed at the end of the text node "one".
- var range = field1.getRange();
- var focusNode = range.getFocusNode();
- assertTrue('The selected range should be collapsed', range.isCollapsed());
- assertTrue('The focus node should be the text node "one"',
- focusNode.nodeType == goog.dom.NodeType.TEXT &&
- focusNode.data == 'one');
- assertEquals('The focus offset should be at the end of the text node "one"',
- focusNode.length,
- range.getFocusOffset());
- assertTrue('The next sibling of the focus node should be the UL',
- focusNode.nextSibling &&
- focusNode.nextSibling.tagName == goog.dom.TagName.UL);
-
- // We test the case where the previous sibling of the BR is a block
- // level element.
- field1.setHtml(false, '<div>foo</div><br><div><span>bar</span></div>');
- helper.select(field1.getElement(), 1); // Before the BR.
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.DELETE);
- assertEquals('Should have deleted the <br>',
- '<div>foo</div><div><span>bar</span></div>',
- field1.getElement().innerHTML);
- range = field1.getRange();
- assertEquals('The selected range should be contained within the <span>',
- goog.dom.TagName.SPAN,
- range.getContainerElement().tagName);
- assertTrue('The selected range should be collapsed', range.isCollapsed());
- // Verify that the cursor is placed inside the span at the beginning of bar.
- focusNode = range.getFocusNode();
- assertTrue('The focus node should be the text node "bar"',
- focusNode.nodeType == goog.dom.NodeType.TEXT &&
- focusNode.data == 'bar');
- assertEquals('The focus offset should be at the beginning ' +
- 'of the text node "bar"',
- 0,
- range.getFocusOffset());
-
- // We test the case where the BR does not have a previous sibling.
- field1.setHtml(false, '<br><ul><li>one</li></ul>');
- helper.select(field1.getElement(), 0); // Before the BR.
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.DELETE);
- assertEquals('Should have deleted the <br>',
- '<ul><li>one</li></ul>',
- field1.getElement().innerHTML);
- range = field1.getRange();
- // Verify that the cursor is placed inside the LI at the text node "one".
- assertEquals('The selected range should be contained within the <li>',
- goog.dom.TagName.LI,
- range.getContainerElement().tagName);
- assertTrue('The selected range should be collapsed', range.isCollapsed());
- focusNode = range.getFocusNode();
- assertTrue('The focus node should be the text node "one"',
- (focusNode.nodeType == goog.dom.NodeType.TEXT &&
- focusNode.data == 'one'));
- assertEquals('The focus offset should be at the beginning of '+
- 'the text node "one"',
- 0,
- range.getFocusOffset());
-
- // Testing deleting a BR followed by a block level element and preceded
- // by a BR.
- field1.setHtml(false, '<br><br><ul><li>one</li></ul>');
- helper.select(field1.getElement(), 1); // Between the BR's.
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.DELETE);
- assertEquals('Should have deleted the <br>',
- '<br><ul><li>one</li></ul>',
- field1.getElement().innerHTML);
- // Verify that the cursor is placed inside the LI at the text node "one".
- range = field1.getRange();
- assertEquals('The selected range should be contained within the <li>',
- goog.dom.TagName.LI,
- range.getContainerElement().tagName);
- assertTrue('The selected range should be collapsed', range.isCollapsed());
- focusNode = range.getFocusNode();
- assertTrue('The focus node should be the text node "one"',
- (focusNode.nodeType == goog.dom.NodeType.TEXT &&
- focusNode.data == 'one'));
- assertEquals('The focus offset should be at the beginning of '+
- 'the text node "one"',
- 0,
- range.getFocusOffset());
- } // End if GECKO
-}
-
-/**
- * Tests that deleting a BR before a blockquote doesn't remove quoted text.
- * @bug 1471075
- */
-function testDeleteBeforeBlockquote() {
- setUpFields(true);
-
- if (goog.userAgent.GECKO) {
- field1.setHtml(false,
- '<br><br><div><br><blockquote>foo</blockquote></div>');
- var helper = new goog.testing.editor.TestHelper(field1.getElement());
- helper.select(field1.getElement(), 0); // Before the first BR.
- // Fire three deletes in quick succession.
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.DELETE);
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.DELETE);
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.DELETE);
- assertEquals('Should have deleted all the <br>\'s and the blockquote ' +
- 'isn\'t affected',
- '<div><blockquote>foo</blockquote></div>',
- field1.getElement().innerHTML);
- var range = field1.getRange();
- assertEquals('The selected range should be contained within the ' +
- '<blockquote>',
- goog.dom.TagName.BLOCKQUOTE,
- range.getContainerElement().tagName);
- assertTrue('The selected range should be collapsed', range.isCollapsed());
- var focusNode = range.getFocusNode();
- assertTrue('The focus node should be the text node "foo"',
- (focusNode.nodeType == goog.dom.NodeType.TEXT &&
- focusNode.data == 'foo'));
- assertEquals('The focus offset should be at the ' +
- 'beginning of the text node "foo"',
- 0,
- range.getFocusOffset());
- }
-}
-
-/**
- * Tests that deleting a BR is working normally (that the workaround for the
- * bug is not causing double deletes).
- * @bug 1471096
- */
-function testDeleteBrNormal() {
- setUpFields(true);
-
- // This test only works on Gecko, because it's testing for manual deletion of
- // BR tags, which is done only for Gecko. For other browsers we fall through
- // and let the browser do the delete, which can only be tested with a robot
- // test (see javascript/apps/editor/tests/delete_br_robot.html).
- if (goog.userAgent.GECKO) {
-
- field1.setHtml(false, 'one<br><br><br>two');
- var helper = new goog.testing.editor.TestHelper(field1.getElement());
- helper.select(field1.getElement(), 2); // Between the first and second BR's.
- field1.getElement().focus();
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.DELETE);
- assertEquals('Should have deleted exactly one <br>',
- 'one<br><br>two',
- field1.getElement().innerHTML);
-
- } // End if GECKO
-}
-
-/**
- * Tests that deleteCursorSelectionW3C_ correctly recognizes visually
- * collapsed selections in Opera even if they contain a <br>.
- * See the deleteCursorSelectionW3C_ comment in enterhandler.js.
- */
-function testCollapsedSelectionKeepsBrOpera() {
- setUpFields(true);
-
- if (goog.userAgent.OPERA) {
- field1.setHtml(false, '<div><br id="pleasedontdeleteme"></div>');
- field1.focus();
- goog.testing.events.fireKeySequence(field1.getElement(),
- goog.events.KeyCodes.ENTER);
- assertNotNull('The <br> must not have been deleted',
- goog.dom.getElement('pleasedontdeleteme'));
- }
-}
-
-/**
- * Selects the node at the given id, and simulates an ENTER keypress.
- * @param {goog.editor.Field} field The field with the node.
- * @param {string} id A DOM id.
- * @return {boolean} Whether preventDefault was called on the event.
- */
-function selectNodeAndHitEnter(field, id) {
- var dom = field.getEditableDomHelper();
- var cursor = dom.getElement(id);
- goog.dom.Range.createFromNodeContents(cursor).select();
- return goog.testing.events.fireKeySequence(
- cursor, goog.events.KeyCodes.ENTER);
-}
-
-/**
- * Creates a field with only the enter handler plugged in, for testing.
- * @param {string} id A DOM id.
- * @return {goog.editor.Field} A field.
- */
-function makeField(id, classnameRequiredToSplitBlockquote) {
- var field = new goog.editor.Field(id);
- field.registerPlugin(new goog.editor.plugins.EnterHandler());
- field.registerPlugin(new goog.editor.plugins.Blockquote(
- classnameRequiredToSplitBlockquote))
-
- goog.events.listen(field, goog.editor.Field.EventType.BEFORECHANGE,
- function() {
- // set the global flag that beforechange was fired.
- firedBeforeChange = true;
- });
- goog.events.listen(field, goog.editor.Field.EventType.DELAYEDCHANGE,
- function() {
- // set the global flag that delayed change was fired.
- firedDelayedChange = true;
- });
-
- return field;
-}
-
-/**
- * Reset all the global flags related to change events.
- */
-function resetChangeFlags() {
- waitForChangeEvents();
- firedBeforeChange = firedDelayedChange = false;
-}
-
-/**
- * Asserts that both change flags were fired since the last reset.
- */
-function assertChangeFlags() {
- assert('Beforechange should have fired', firedBeforeChange);
- assert('Delayedchange should have fired', firedDelayedChange);
-}
-
-/**
- * Wait for delayedchange to propagate.
- */
-function waitForChangeEvents() {
- clock.tick(goog.editor.Field.DELAYED_CHANGE_FREQUENCY +
- goog.editor.Field.CHANGE_FREQUENCY);
-}
-
-function getNbsp() {
- // On WebKit (pre-528) and Opera, &nbsp; shows up as its unicode character in
- // innerHTML under some circumstances.
- return (goog.userAgent.WEBKIT && !goog.userAgent.isVersion('528')) ||
- goog.userAgent.OPERA ? '\u00a0' : '&nbsp;';
-}
-
-
-function testPrepareContent() {
- setUpFields(true);
- assertPreparedContents('hi', 'hi');
- assertPreparedContents(
- goog.editor.BrowserFeature.COLLAPSES_EMPTY_NODES ? '<br>' : '', ' ');
-}
-
-
-/**
- * Assert that the prepared contents matches the expected.
- */
-function assertPreparedContents(expected, original) {
- assertEquals(expected,
- field1.reduceOp_(
- goog.editor.Plugin.Op.PREPARE_CONTENTS_HTML, original));
-}
-
-// UTILITY FUNCTION TESTS.
-
-function testDeleteW3CSimple() {
- if (goog.editor.BrowserFeature.HAS_W3C_RANGES) {
- container.innerHTML = '<div>abcd</div>';
- var range = goog.dom.Range.createFromNodes(container.firstChild.firstChild,
- 1, container.firstChild.firstChild, 3);
- range.select();
- goog.editor.plugins.EnterHandler.deleteW3cRange_(range);
-
- goog.testing.dom.assertHtmlContentsMatch('<div>ad</div>', container);
- }
-}
-
-function testDeleteW3CAll() {
- if (goog.editor.BrowserFeature.HAS_W3C_RANGES) {
- container.innerHTML = '<div>abcd</div>';
- var range = goog.dom.Range.createFromNodes(container.firstChild.firstChild,
- 0, container.firstChild.firstChild, 4);
- range.select();
- goog.editor.plugins.EnterHandler.deleteW3cRange_(range);
-
- goog.testing.dom.assertHtmlContentsMatch('<div>&nbsp;</div>', container);
- }
-}
-
-function testDeleteW3CPartialEnd() {
- if (goog.editor.BrowserFeature.HAS_W3C_RANGES) {
- container.innerHTML = '<div>ab</div><div>cd</div>';
- var range = goog.dom.Range.createFromNodes(container.firstChild.firstChild,
- 1, container.lastChild.firstChild, 1);
- range.select();
- goog.editor.plugins.EnterHandler.deleteW3cRange_(range);
-
- goog.testing.dom.assertHtmlContentsMatch('<div>ad</div>', container);
- }
-}
-
-function testDeleteW3CNonPartialEnd() {
- if (goog.editor.BrowserFeature.HAS_W3C_RANGES) {
- container.innerHTML = '<div>ab</div><div>cd</div>';
- var range = goog.dom.Range.createFromNodes(container.firstChild.firstChild,
- 1, container.lastChild.firstChild, 2);
- range.select();
- goog.editor.plugins.EnterHandler.deleteW3cRange_(range);
-
- goog.testing.dom.assertHtmlContentsMatch('<div>a</div>', container);
- }
-}
-
-function testIsInOneContainer() {
- if (goog.editor.BrowserFeature.HAS_W3C_RANGES) {
- container.innerHTML = '<div><br></div>';
- var div = container.firstChild;
- var range = goog.dom.Range.createFromNodes(div, 0, div, 1);
- range.select();
- assertTrue('Selection must be recognized as being in one container',
- goog.editor.plugins.EnterHandler.isInOneContainerW3c_(range));
- }
-}
-
-function testDeletingEndNodesWithNoNewLine() {
- if (goog.editor.BrowserFeature.HAS_W3C_RANGES) {
- container.innerHTML =
- 'a<div>b</div><div><br></div><div>c</div><div>d</div>';
- var range = goog.dom.Range.createFromNodes(
- container.childNodes[2], 0, container.childNodes[4].childNodes[0], 1);
- range.select();
- var newRange = goog.editor.plugins.EnterHandler.deleteW3cRange_(range);
- goog.testing.dom.assertHtmlContentsMatch('a<div>b</div>', container);
- assertTrue(newRange.isCollapsed());
- assertEquals(container, newRange.getStartNode());
- assertEquals(2, newRange.getStartOffset());
- }
-}
-
-</script>
-</body>
-</html>