217 lines
8.2 KiB
JavaScript
217 lines
8.2 KiB
JavaScript
// Copyright 2007 The Closure Library Authors. All Rights Reserved.
|
|
//
|
|
// Licensed 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.
|
|
|
|
goog.provide('goog.editor.icontentTest');
|
|
goog.setTestOnly('goog.editor.icontentTest');
|
|
|
|
goog.require('goog.dom');
|
|
goog.require('goog.editor.BrowserFeature');
|
|
goog.require('goog.editor.icontent');
|
|
goog.require('goog.editor.icontent.FieldFormatInfo');
|
|
goog.require('goog.editor.icontent.FieldStyleInfo');
|
|
goog.require('goog.testing.PropertyReplacer');
|
|
goog.require('goog.testing.jsunit');
|
|
goog.require('goog.userAgent');
|
|
|
|
var wrapperDiv;
|
|
var realIframe;
|
|
var realIframeDoc;
|
|
var propertyReplacer;
|
|
|
|
function setUp() {
|
|
wrapperDiv = goog.dom.createDom('div', null,
|
|
realIframe = goog.dom.createDom('iframe'));
|
|
goog.dom.appendChild(document.body, wrapperDiv);
|
|
realIframeDoc = realIframe.contentWindow.document;
|
|
propertyReplacer = new goog.testing.PropertyReplacer();
|
|
}
|
|
|
|
function tearDown() {
|
|
goog.dom.removeNode(wrapperDiv);
|
|
propertyReplacer.reset();
|
|
}
|
|
|
|
function testWriteHttpsInitialIframeContent() {
|
|
// This is not a particularly useful test; it's just a sanity check to make
|
|
// sure nothing explodes
|
|
var info =
|
|
new goog.editor.icontent.FieldFormatInfo('id', false, false, false);
|
|
var doc = createMockDocument();
|
|
goog.editor.icontent.writeHttpsInitialIframe(info, doc, 'some html');
|
|
assertBodyCorrect(doc.body, 'id', 'some html');
|
|
}
|
|
|
|
function testWriteHttpsInitialIframeContentRtl() {
|
|
var info = new goog.editor.icontent.FieldFormatInfo('id', false, false, true);
|
|
var doc = createMockDocument();
|
|
goog.editor.icontent.writeHttpsInitialIframe(info, doc, 'some html');
|
|
assertBodyCorrect(doc.body, 'id', 'some html', true);
|
|
}
|
|
|
|
function testWriteInitialIframeContentBlendedStandardsGrowing() {
|
|
if (goog.editor.BrowserFeature.HAS_CONTENT_EDITABLE) {
|
|
return; // only executes when using an iframe
|
|
}
|
|
|
|
var info = new goog.editor.icontent.FieldFormatInfo('id', true, true, false);
|
|
var styleInfo = new goog.editor.icontent.FieldStyleInfo(wrapperDiv,
|
|
'.MyClass { position: absolute; top: 500px; }');
|
|
var doc = realIframeDoc;
|
|
var html = '<div class="MyClass">Some Html</div>';
|
|
goog.editor.icontent.writeNormalInitialBlendedIframe(info, html,
|
|
styleInfo, realIframe);
|
|
|
|
assertBodyCorrect(doc.body, 'id', html);
|
|
assertEquals('CSS1Compat', doc.compatMode); // standards
|
|
assertEquals('auto', doc.documentElement.style.height); // growing
|
|
assertEquals('100%', doc.body.style.height); // standards
|
|
assertEquals('hidden', doc.body.style.overflowY); // growing
|
|
assertEquals('', realIframe.style.position); // no padding on wrapper
|
|
|
|
assertEquals(500, doc.body.firstChild.offsetTop);
|
|
assert(doc.getElementsByTagName('style')[0].innerHTML.indexOf(
|
|
'-moz-force-broken-image-icon') != -1); // standards
|
|
}
|
|
|
|
function testWriteInitialIframeContentBlendedQuirksFixedRtl() {
|
|
if (goog.editor.BrowserFeature.HAS_CONTENT_EDITABLE) {
|
|
return; // only executes when using an iframe
|
|
}
|
|
|
|
var info = new goog.editor.icontent.FieldFormatInfo('id', false, true, true);
|
|
var styleInfo = new goog.editor.icontent.FieldStyleInfo(wrapperDiv, '');
|
|
wrapperDiv.style.padding = '2px 5px';
|
|
var doc = realIframeDoc;
|
|
var html = 'Some Html';
|
|
goog.editor.icontent.writeNormalInitialBlendedIframe(info, html,
|
|
styleInfo, realIframe);
|
|
|
|
assertBodyCorrect(doc.body, 'id', html, true);
|
|
assertEquals('BackCompat', doc.compatMode); // quirks
|
|
assertEquals('100%', doc.documentElement.style.height); // fixed height
|
|
assertEquals('auto', doc.body.style.height); // quirks
|
|
assertEquals('auto', doc.body.style.overflow); // fixed height
|
|
|
|
assertEquals('-2px', realIframe.style.marginTop);
|
|
assertEquals('-5px', realIframe.style.marginLeft);
|
|
assert(doc.getElementsByTagName('style')[0].innerHTML.indexOf(
|
|
'-moz-force-broken-image-icon') == -1); // quirks
|
|
}
|
|
|
|
function testWhiteboxStandardsFixedRtl() {
|
|
var info = new goog.editor.icontent.FieldFormatInfo('id', true, false, true);
|
|
var styleInfo = null;
|
|
var doc = realIframeDoc;
|
|
var html = 'Some Html';
|
|
goog.editor.icontent.writeNormalInitialBlendedIframe(info, html,
|
|
styleInfo, realIframe);
|
|
assertBodyCorrect(doc.body, 'id', html, true);
|
|
|
|
// TODO(nicksantos): on Safari, there's a bug where all written iframes
|
|
// are CSS1Compat. It's fixed in the nightlies as of 3/31/08, so remove
|
|
// this guard when the latest version of Safari is on the farm.
|
|
if (!goog.userAgent.WEBKIT) {
|
|
assertEquals('BackCompat', doc.compatMode); // always use quirks in whitebox
|
|
}
|
|
}
|
|
|
|
function testGetInitialIframeContent() {
|
|
var info = new goog.editor.icontent.FieldFormatInfo(
|
|
'id', true, false, false);
|
|
var styleInfo = null;
|
|
var html = 'Some Html';
|
|
propertyReplacer.set(goog.editor.BrowserFeature,
|
|
'HAS_CONTENT_EDITABLE', false);
|
|
var htmlOut = goog.editor.icontent.getInitialIframeContent_(
|
|
info, html, styleInfo);
|
|
assertEquals(/contentEditable/i.test(htmlOut), false);
|
|
propertyReplacer.set(goog.editor.BrowserFeature,
|
|
'HAS_CONTENT_EDITABLE', true);
|
|
htmlOut = goog.editor.icontent.getInitialIframeContent_(
|
|
info, html, styleInfo);
|
|
assertEquals(/<body[^>]+?contentEditable/i.test(htmlOut), true);
|
|
assertEquals(/<html[^>]+?style="[^>"]*min-width:\s*0/i.test(htmlOut), true);
|
|
assertEquals(/<body[^>]+?style="[^>"]*min-width:\s*0/i.test(htmlOut), true);
|
|
}
|
|
|
|
function testIframeMinWidthOverride() {
|
|
if (goog.editor.BrowserFeature.HAS_CONTENT_EDITABLE) {
|
|
return; // only executes when using an iframe
|
|
}
|
|
|
|
var info = new goog.editor.icontent.FieldFormatInfo('id', true, true, false);
|
|
var styleInfo = new goog.editor.icontent.FieldStyleInfo(wrapperDiv,
|
|
'.MyClass { position: absolute; top: 500px; }');
|
|
var doc = realIframeDoc;
|
|
var html = '<div class="MyClass">Some Html</div>';
|
|
goog.editor.icontent.writeNormalInitialBlendedIframe(info, html,
|
|
styleInfo, realIframe);
|
|
|
|
// Make sure that the minimum width isn't being inherited from the parent
|
|
// document's style.
|
|
assertTrue(doc.body.offsetWidth < 700);
|
|
}
|
|
|
|
function testBlendedStandardsGrowingMatchesComparisonDiv() {
|
|
// TODO(nicksantos): If we ever move
|
|
// TR_EditableUtil.prototype.makeIframeField_
|
|
// into goog.editor.icontent (and I think we should), we could actually run
|
|
// functional tests to ensure that the iframed field matches the dimensions
|
|
// of the equivalent uneditable div. Functional tests would help a lot here.
|
|
}
|
|
|
|
|
|
/**
|
|
* Check a given body for the most basic properties that all iframes must have.
|
|
*
|
|
* @param {Element} body The actual body element
|
|
* @param {string} id The expected id
|
|
* @param {string} bodyHTML The expected innerHTML
|
|
* @param {boolean=} opt_rtl If true, expect RTL directionality
|
|
*/
|
|
function assertBodyCorrect(body, id, bodyHTML, opt_rtl) {
|
|
assertEquals(bodyHTML, body.innerHTML);
|
|
// We can't just check
|
|
// assert(HAS_CONTENTE_EDITABLE, !!body.contentEditable) since in
|
|
// FF 3 we don't currently use contentEditable, but body.contentEditable
|
|
// = 'inherit' and !!'inherit' = true.
|
|
if (goog.editor.BrowserFeature.HAS_CONTENT_EDITABLE) {
|
|
assertEquals('true', String(body.contentEditable));
|
|
} else {
|
|
assertNotEquals('true', String(body.contentEditable));
|
|
}
|
|
assertContains('editable', body.className.match(/\S+/g));
|
|
assertEquals('true', String(body.getAttribute('g_editable')));
|
|
assertEquals('true',
|
|
// IE has bugs with getAttribute('hideFocus'), and
|
|
// Webkit has bugs with normal .hideFocus access.
|
|
String(goog.userAgent.IE ? body.hideFocus :
|
|
body.getAttribute('hideFocus')));
|
|
assertEquals(id, body.id);
|
|
}
|
|
|
|
|
|
/**
|
|
* @return {Object} A mock document
|
|
*/
|
|
function createMockDocument() {
|
|
return {
|
|
body: {
|
|
setAttribute: function(key, val) { this[key] = val; },
|
|
getAttribute: function(key) { return this[key]; },
|
|
style: { direction: '' }
|
|
}
|
|
};
|
|
}
|