зеркало из https://github.com/mozilla/pjs.git
Bug 583041 - Style Editor integration; part 5 - tests; r=rcampbell
This commit is contained in:
Родитель
f611b7caca
Коммит
0d6d4da3f5
|
@ -0,0 +1,72 @@
|
|||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (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.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is Style Editor code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Mozilla Foundation.
|
||||
#
|
||||
# Portions created by the Initial Developer are Copyright (C) 2007
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Cedric Vivier <cedricv@neonux.com> (original author)
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
DEPTH = ../../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = browser/devtools/styleeditor/test
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
_BROWSER_TEST_FILES = \
|
||||
browser_styleeditor_enabled.js \
|
||||
browser_styleeditor_import.js \
|
||||
browser_styleeditor_init.js \
|
||||
browser_styleeditor_loading.js \
|
||||
browser_styleeditor_new.js \
|
||||
browser_styleeditor_pretty.js \
|
||||
browser_styleeditor_readonly.js \
|
||||
browser_styleeditor_reopen.js \
|
||||
browser_styleeditor_sv_filter.js \
|
||||
browser_styleeditor_sv_keynav.js \
|
||||
browser_styleeditor_sv_resize.js \
|
||||
four.html \
|
||||
head.js \
|
||||
media.html \
|
||||
media-small.css \
|
||||
minified.html \
|
||||
simple.css \
|
||||
simple.css.gz \
|
||||
simple.css.gz^headers^ \
|
||||
simple.gz.html \
|
||||
simple.html \
|
||||
$(NULL)
|
||||
|
||||
libs:: $(_BROWSER_TEST_FILES)
|
||||
$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/browser/$(relativesrcdir)
|
|
@ -0,0 +1,101 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
// https rather than chrome to improve coverage
|
||||
const TESTCASE_URI = TEST_BASE_HTTPS + "simple.html";
|
||||
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
let count = 0;
|
||||
addTabAndLaunchStyleEditorChromeWhenLoaded(function (aChrome) {
|
||||
aChrome.addChromeListener({
|
||||
onEditorAdded: function (aChrome, aEditor) {
|
||||
count++;
|
||||
if (count == 2) {
|
||||
// we test against first stylesheet after all are ready
|
||||
let editor = aChrome.editors[0];
|
||||
if (!editor.sourceEditor) {
|
||||
editor.addActionListener({
|
||||
onAttach: function (aEditor) {
|
||||
run(aChrome, aEditor);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
run(aChrome, editor);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
content.location = TESTCASE_URI;
|
||||
}
|
||||
|
||||
function run(aChrome, aEditor)
|
||||
{
|
||||
testEnabledToggle(aChrome, aEditor);
|
||||
}
|
||||
|
||||
function testEnabledToggle(aChrome, aEditor)
|
||||
{
|
||||
is(aEditor, aChrome.editors[0],
|
||||
"stylesheet with index 0 is the first stylesheet listed in the UI");
|
||||
|
||||
let firstStyleSheetEditor = aEditor;
|
||||
let firstStyleSheetUI = aChrome.getSummaryElementForEditor(aEditor);
|
||||
let enabledToggle = firstStyleSheetUI.querySelector(".stylesheet-enabled");
|
||||
|
||||
is(firstStyleSheetEditor.contentDocument.styleSheets[0].disabled, false,
|
||||
"first stylesheet is initially enabled");
|
||||
is(firstStyleSheetEditor.hasFlag("disabled"), false,
|
||||
"first stylesheet is initially enabled, it does not have DISABLED flag");
|
||||
is(firstStyleSheetUI.classList.contains("disabled"), false,
|
||||
"first stylesheet is initially enabled, UI does not have DISABLED class");
|
||||
|
||||
let disabledToggleCount = 0;
|
||||
firstStyleSheetEditor.addActionListener({
|
||||
onFlagChange: function (aEditor, aFlagName) {
|
||||
if (aFlagName != "disabled") {
|
||||
return;
|
||||
}
|
||||
disabledToggleCount++;
|
||||
|
||||
if (disabledToggleCount == 1) {
|
||||
is(firstStyleSheetEditor, aEditor,
|
||||
"FlagChange handler triggered for DISABLED flag on the first editor");
|
||||
is(firstStyleSheetEditor.styleSheet.disabled, true,
|
||||
"first stylesheet is now disabled");
|
||||
is(firstStyleSheetEditor.hasFlag("disabled"), true,
|
||||
"first stylesheet is now disabled, it has DISABLED flag");
|
||||
is(firstStyleSheetUI.classList.contains("disabled"), true,
|
||||
"first stylesheet is now disabled, UI has DISABLED class");
|
||||
|
||||
// now toggle it back to enabled
|
||||
waitForFocus(function () {
|
||||
EventUtils.synthesizeMouseAtCenter(enabledToggle, {}, gChromeWindow);
|
||||
}, gChromeWindow);
|
||||
return;
|
||||
}
|
||||
|
||||
// disabledToggleCount == 2
|
||||
is(firstStyleSheetEditor, aEditor,
|
||||
"FlagChange handler triggered for DISABLED flag on the first editor (2)");
|
||||
is(firstStyleSheetEditor.styleSheet.disabled, false,
|
||||
"first stylesheet is now enabled again");
|
||||
is(firstStyleSheetEditor.hasFlag("disabled"), false,
|
||||
"first stylesheet is now enabled again, it does not have DISABLED flag");
|
||||
is(firstStyleSheetUI.classList.contains("disabled"), false,
|
||||
"first stylesheet is now enabled again, UI does not have DISABLED class");
|
||||
|
||||
finish();
|
||||
}
|
||||
});
|
||||
|
||||
waitForFocus(function () {
|
||||
EventUtils.synthesizeMouseAtCenter(enabledToggle, {}, gChromeWindow);
|
||||
}, gChromeWindow);
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
// http rather than chrome to improve coverage
|
||||
const TESTCASE_URI = TEST_BASE_HTTP + "simple.html";
|
||||
|
||||
Components.utils.import("resource://gre/modules/FileUtils.jsm");
|
||||
const FILENAME = "styleeditor-import-test.css";
|
||||
const SOURCE = "body{background:red;}";
|
||||
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
addTabAndLaunchStyleEditorChromeWhenLoaded(function (aChrome) {
|
||||
aChrome.addChromeListener({
|
||||
onContentAttach: run,
|
||||
onEditorAdded: testEditorAdded
|
||||
});
|
||||
if (aChrome.isContentAttached) {
|
||||
run(aChrome);
|
||||
}
|
||||
});
|
||||
|
||||
content.location = TESTCASE_URI;
|
||||
}
|
||||
|
||||
function run(aChrome)
|
||||
{
|
||||
is(aChrome.editors.length, 2,
|
||||
"there is 2 stylesheets initially");
|
||||
}
|
||||
|
||||
function testImport(aChrome, aEditor)
|
||||
{
|
||||
// create file to import first
|
||||
let file = FileUtils.getFile("ProfD", [FILENAME]);
|
||||
let ostream = FileUtils.openSafeFileOutputStream(file);
|
||||
let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
|
||||
.createInstance(Ci.nsIScriptableUnicodeConverter);
|
||||
converter.charset = "UTF-8";
|
||||
let istream = converter.convertToInputStream(SOURCE);
|
||||
NetUtil.asyncCopy(istream, ostream, function (status) {
|
||||
FileUtils.closeSafeFileOutputStream(ostream);
|
||||
|
||||
// click the import button now that the file to import is ready
|
||||
aChrome._mockImportFile = file;
|
||||
|
||||
waitForFocus(function () {
|
||||
let document = gChromeWindow.document
|
||||
let importButton = document.querySelector(".style-editor-importButton");
|
||||
EventUtils.synthesizeMouseAtCenter(importButton, {}, gChromeWindow);
|
||||
}, gChromeWindow);
|
||||
});
|
||||
}
|
||||
|
||||
let gAddedCount = 0;
|
||||
function testEditorAdded(aChrome, aEditor)
|
||||
{
|
||||
if (++gAddedCount == 2) {
|
||||
// test import after the 2 initial stylesheets have been loaded
|
||||
if (!aChrome.editors[0].sourceEditor) {
|
||||
aChrome.editors[0].addActionListener({
|
||||
onAttach: function () {
|
||||
testImport(aChrome);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
testImport(aChrome);
|
||||
}
|
||||
}
|
||||
|
||||
if (!aEditor.hasFlag("imported")) {
|
||||
return;
|
||||
}
|
||||
|
||||
ok(!aEditor.hasFlag("inline"),
|
||||
"imported stylesheet does not have INLINE flag");
|
||||
ok(aEditor.savedFile,
|
||||
"imported stylesheet will be saved directly into the same file");
|
||||
is(aEditor.getFriendlyName(), FILENAME,
|
||||
"imported stylesheet has the same name as the filename");
|
||||
|
||||
finish();
|
||||
}
|
|
@ -0,0 +1,126 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
const TESTCASE_URI = TEST_BASE + "simple.html";
|
||||
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
addTabAndLaunchStyleEditorChromeWhenLoaded(function (aChrome) {
|
||||
aChrome.addChromeListener({
|
||||
onContentAttach: run,
|
||||
onEditorAdded: testEditorAdded
|
||||
});
|
||||
if (aChrome.isContentAttached) {
|
||||
run(aChrome);
|
||||
}
|
||||
});
|
||||
|
||||
content.location = TESTCASE_URI;
|
||||
}
|
||||
|
||||
let gContentAttachHandled = false;
|
||||
function run(aChrome)
|
||||
{
|
||||
gContentAttachHandled = true;
|
||||
is(aChrome.contentWindow.document.readyState, "complete",
|
||||
"content document is complete");
|
||||
|
||||
let SEC = gChromeWindow.styleEditorChrome;
|
||||
is(SEC, aChrome, "StyleEditorChrome object exists as new window property");
|
||||
|
||||
ok(gChromeWindow.document.title.indexOf("simple testcase") >= 0,
|
||||
"the Style Editor window title contains the document's title");
|
||||
|
||||
// check editors are instantiated
|
||||
is(SEC.editors.length, 2,
|
||||
"there is two StyleEditor instances managed");
|
||||
ok(SEC.editors[0].styleSheetIndex < SEC.editors[1].styleSheetIndex,
|
||||
"editors are ordered by styleSheetIndex");
|
||||
|
||||
// check StyleEditorChrome is a singleton wrt to the same DOMWindow
|
||||
let chromeWindow = StyleEditor.openChrome();
|
||||
is(chromeWindow, gChromeWindow,
|
||||
"attempt to edit the same document returns the same Style Editor window");
|
||||
}
|
||||
|
||||
let gEditorAddedCount = 0;
|
||||
function testEditorAdded(aChrome, aEditor)
|
||||
{
|
||||
if (!gEditorAddedCount) {
|
||||
is(gContentAttachHandled, true,
|
||||
"ContentAttach event triggered before EditorAdded");
|
||||
}
|
||||
|
||||
if (aEditor.styleSheetIndex == 0) {
|
||||
gEditorAddedCount++;
|
||||
testFirstStyleSheetEditor(aChrome, aEditor);
|
||||
}
|
||||
if (aEditor.styleSheetIndex == 1) {
|
||||
gEditorAddedCount++;
|
||||
testSecondStyleSheetEditor(aChrome, aEditor);
|
||||
}
|
||||
|
||||
if (gEditorAddedCount == 2) {
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
function testFirstStyleSheetEditor(aChrome, aEditor)
|
||||
{
|
||||
//testing TESTCASE's simple.css stylesheet
|
||||
is(aEditor.styleSheetIndex, 0,
|
||||
"first stylesheet is at index 0");
|
||||
|
||||
is(aEditor, aChrome.editors[0],
|
||||
"first stylesheet corresponds to StyleEditorChrome.editors[0]");
|
||||
|
||||
ok(!aEditor.hasFlag("inline"),
|
||||
"first stylesheet does not have INLINE flag");
|
||||
|
||||
let summary = aChrome.getSummaryElementForEditor(aEditor);
|
||||
ok(!summary.classList.contains("inline"),
|
||||
"first stylesheet UI does not have INLINE class");
|
||||
|
||||
let name = summary.querySelector(".stylesheet-name").textContent;
|
||||
is(name, "simple.css",
|
||||
"first stylesheet's name is `simple.css`");
|
||||
|
||||
let ruleCount = summary.querySelector(".stylesheet-rule-count").textContent;
|
||||
is(parseInt(ruleCount), 1,
|
||||
"first stylesheet UI shows rule count as 1");
|
||||
|
||||
ok(summary.classList.contains("splitview-active"),
|
||||
"first stylesheet UI is focused/active");
|
||||
}
|
||||
|
||||
function testSecondStyleSheetEditor(aChrome, aEditor)
|
||||
{
|
||||
//testing TESTCASE's inline stylesheet
|
||||
is(aEditor.styleSheetIndex, 1,
|
||||
"second stylesheet is at index 1");
|
||||
|
||||
is(aEditor, aChrome.editors[1],
|
||||
"second stylesheet corresponds to StyleEditorChrome.editors[1]");
|
||||
|
||||
ok(aEditor.hasFlag("inline"),
|
||||
"second stylesheet has INLINE flag");
|
||||
|
||||
let summary = aChrome.getSummaryElementForEditor(aEditor);
|
||||
ok(summary.classList.contains("inline"),
|
||||
"second stylesheet UI has INLINE class");
|
||||
|
||||
let name = summary.querySelector(".stylesheet-name").textContent;
|
||||
ok(/^<.*>$/.test(name),
|
||||
"second stylesheet's name is surrounded by `<>`");
|
||||
|
||||
let ruleCount = summary.querySelector(".stylesheet-rule-count").textContent;
|
||||
is(parseInt(ruleCount), 3,
|
||||
"second stylesheet UI shows rule count as 3");
|
||||
|
||||
ok(!summary.classList.contains("splitview-active"),
|
||||
"second stylesheet UI is NOT focused/active");
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
const TESTCASE_URI = TEST_BASE + "simple.html";
|
||||
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
|
||||
// launch Style Editor right when the tab is created (before load)
|
||||
// this checks that the Style Editor still launches correctly when it is opened
|
||||
// *while* the page is still loading
|
||||
launchStyleEditorChrome(function (aChrome) {
|
||||
isnot(gBrowser.selectedBrowser.contentWindow.document.readyState, "complete",
|
||||
"content document is still loading");
|
||||
|
||||
if (!aChrome.isContentAttached) {
|
||||
aChrome.addChromeListener({
|
||||
onContentAttach: run
|
||||
});
|
||||
} else {
|
||||
run(aChrome);
|
||||
}
|
||||
});
|
||||
|
||||
content.location = TESTCASE_URI;
|
||||
}
|
||||
|
||||
function run(aChrome)
|
||||
{
|
||||
is(aChrome.contentWindow.document.readyState, "complete",
|
||||
"content document is complete");
|
||||
|
||||
finish();
|
||||
}
|
|
@ -0,0 +1,117 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
const TESTCASE_URI = TEST_BASE + "simple.html";
|
||||
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
addTabAndLaunchStyleEditorChromeWhenLoaded(function (aChrome) {
|
||||
aChrome.addChromeListener({
|
||||
onContentAttach: run,
|
||||
onEditorAdded: testEditorAdded
|
||||
});
|
||||
if (aChrome.isContentAttached) {
|
||||
run(aChrome);
|
||||
}
|
||||
});
|
||||
|
||||
content.location = TESTCASE_URI;
|
||||
}
|
||||
|
||||
function run(aChrome)
|
||||
{
|
||||
is(aChrome.editors.length, 2,
|
||||
"there is 2 stylesheets initially");
|
||||
}
|
||||
|
||||
let gAddedCount = 0; // to add new stylesheet after the 2 initial stylesheets
|
||||
let gNewEditor; // to make sure only one new stylesheet got created
|
||||
let gCommitCount = 0; // to make sure only one Commit event is triggered
|
||||
|
||||
function testEditorAdded(aChrome, aEditor)
|
||||
{
|
||||
gAddedCount++;
|
||||
if (gAddedCount == 2) {
|
||||
waitForFocus(function () { // create a new style sheet
|
||||
let newButton = gChromeWindow.document.querySelector(".style-editor-newButton");
|
||||
EventUtils.synthesizeMouseAtCenter(newButton, {}, gChromeWindow);
|
||||
}, gChromeWindow);
|
||||
}
|
||||
if (gAddedCount != 3) {
|
||||
return;
|
||||
}
|
||||
|
||||
ok(!gNewEditor, "creating a new stylesheet triggers one EditorAdded event");
|
||||
gNewEditor = aEditor; // above test will fail if we get a duplicate event
|
||||
|
||||
is(aChrome.editors.length, 3,
|
||||
"creating a new stylesheet added a new StyleEditor instance");
|
||||
|
||||
let listener = {
|
||||
onAttach: function (aEditor) {
|
||||
waitForFocus(function () {
|
||||
ok(aEditor.isLoaded,
|
||||
"new editor is loaded when attached");
|
||||
ok(aEditor.hasFlag("new"),
|
||||
"new editor has NEW flag");
|
||||
ok(!aEditor.hasFlag("unsaved"),
|
||||
"new editor does not have UNSAVED flag");
|
||||
|
||||
ok(aEditor.inputElement,
|
||||
"new editor has an input element attached");
|
||||
|
||||
ok(aEditor.sourceEditor.hasFocus(),
|
||||
"new editor has focus");
|
||||
|
||||
let summary = aChrome.getSummaryElementForEditor(aEditor);
|
||||
let ruleCount = summary.querySelector(".stylesheet-rule-count").textContent;
|
||||
is(parseInt(ruleCount), 0,
|
||||
"new editor initially shows 0 rules");
|
||||
|
||||
let computedStyle = content.getComputedStyle(content.document.body, null);
|
||||
is(computedStyle.backgroundColor, "rgb(255, 255, 255)",
|
||||
"content's background color is initially white");
|
||||
|
||||
for each (let c in "body{background-color:red;}") {
|
||||
EventUtils.synthesizeKey(c, {}, gChromeWindow);
|
||||
}
|
||||
}, gChromeWindow) ;
|
||||
},
|
||||
|
||||
onCommit: function (aEditor) {
|
||||
gCommitCount++;
|
||||
|
||||
ok(aEditor.hasFlag("new"),
|
||||
"new editor still has NEW flag");
|
||||
ok(aEditor.hasFlag("unsaved"),
|
||||
"new editor has UNSAVED flag after modification");
|
||||
|
||||
let summary = aChrome.getSummaryElementForEditor(aEditor);
|
||||
let ruleCount = summary.querySelector(".stylesheet-rule-count").textContent;
|
||||
is(parseInt(ruleCount), 1,
|
||||
"new editor shows 1 rule after modification");
|
||||
|
||||
let computedStyle = content.getComputedStyle(content.document.body, null);
|
||||
is(computedStyle.backgroundColor, "rgb(255, 0, 0)",
|
||||
"content's background color has been updated to red");
|
||||
|
||||
executeSoon(function () {
|
||||
is(gCommitCount, 1, "received only one Commit event (throttle)");
|
||||
|
||||
aEditor.removeActionListener(listener);
|
||||
|
||||
gNewEditor = null;
|
||||
finish();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
aEditor.addActionListener(listener);
|
||||
if (aEditor.sourceEditor) {
|
||||
listener.onAttach(aEditor);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
const TESTCASE_URI = TEST_BASE + "minified.html";
|
||||
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
addTabAndLaunchStyleEditorChromeWhenLoaded(function (aChrome) {
|
||||
aChrome.addChromeListener({
|
||||
onEditorAdded: function (aChrome, aEditor) {
|
||||
if (aEditor.sourceEditor) {
|
||||
run(aEditor); // already attached to input element
|
||||
} else {
|
||||
aEditor.addActionListener({
|
||||
onAttach: run
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
content.location = TESTCASE_URI;
|
||||
}
|
||||
|
||||
let editorTestedCount = 0;
|
||||
function run(aEditor)
|
||||
{
|
||||
if (aEditor.styleSheetIndex == 0) {
|
||||
let prettifiedSource = "body\{\r?\n\tbackground\:white;\r?\n\}\r?\n\r?\ndiv\{\r?\n\tfont\-size\:4em;\r?\n\tcolor\:red\r?\n\}\r?\n";
|
||||
let prettifiedSourceRE = new RegExp(prettifiedSource);
|
||||
|
||||
ok(prettifiedSourceRE.test(aEditor.sourceEditor.getText()),
|
||||
"minified source has been prettified automatically");
|
||||
editorTestedCount++;
|
||||
let chrome = gChromeWindow.styleEditorChrome;
|
||||
let summary = chrome.getSummaryElementForEditor(chrome.editors[1]);
|
||||
EventUtils.synthesizeMouseAtCenter(summary, {}, gChromeWindow);
|
||||
}
|
||||
|
||||
if (aEditor.styleSheetIndex == 1) {
|
||||
let originalSource = "body \{ background\: red; \}\r?\ndiv \{\r?\nfont\-size\: 5em;\r?\ncolor\: red\r?\n\}";
|
||||
let originalSourceRE = new RegExp(originalSource);
|
||||
|
||||
ok(originalSourceRE.test(aEditor.sourceEditor.getText()),
|
||||
"non-minified source has been left untouched");
|
||||
editorTestedCount++;
|
||||
}
|
||||
|
||||
if (editorTestedCount == 2) {
|
||||
finish();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
const TESTCASE_URI = TEST_BASE + "simple.html";
|
||||
|
||||
|
||||
let gEditorAddedCount = 0;
|
||||
let gEditorReadOnlyCount = 0;
|
||||
let gChromeListener = {
|
||||
onEditorAdded: function (aChrome, aEditor) {
|
||||
gEditorAddedCount++;
|
||||
if (aEditor.readOnly) {
|
||||
gEditorReadOnlyCount++;
|
||||
}
|
||||
|
||||
if (gEditorAddedCount == aChrome.editors.length) {
|
||||
// continue testing after all editors are ready
|
||||
|
||||
is(gEditorReadOnlyCount, 0,
|
||||
"all editors are NOT read-only initially");
|
||||
|
||||
// all editors have been loaded, queue closing the content tab
|
||||
executeSoon(function () {
|
||||
gBrowser.removeCurrentTab();
|
||||
});
|
||||
}
|
||||
},
|
||||
onContentDetach: function (aChrome) {
|
||||
// check that the UI has switched to read-only
|
||||
run(aChrome);
|
||||
}
|
||||
};
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
gBrowser.addTab(); // because we'll close the next one
|
||||
addTabAndLaunchStyleEditorChromeWhenLoaded(function (aChrome) {
|
||||
aChrome.addChromeListener(gChromeListener);
|
||||
});
|
||||
|
||||
content.location = TESTCASE_URI;
|
||||
}
|
||||
|
||||
function run(aChrome)
|
||||
{
|
||||
let document = gChromeWindow.document;
|
||||
let disabledCount;
|
||||
let elements;
|
||||
|
||||
disabledCount = 0;
|
||||
elements = document.querySelectorAll("button,input,select");
|
||||
for (let i = 0; i < elements.length; ++i) {
|
||||
if (elements[i].hasAttribute("disabled")) {
|
||||
disabledCount++;
|
||||
}
|
||||
}
|
||||
ok(elements.length && disabledCount == elements.length,
|
||||
"all buttons, input and select elements are disabled");
|
||||
|
||||
disabledCount = 0;
|
||||
aChrome.editors.forEach(function (aEditor) {
|
||||
if (aEditor.readOnly) {
|
||||
disabledCount++;
|
||||
}
|
||||
});
|
||||
ok(aChrome.editors.length && disabledCount == aChrome.editors.length,
|
||||
"all editors are read-only");
|
||||
|
||||
aChrome.removeChromeListener(gChromeListener);
|
||||
finish();
|
||||
}
|
|
@ -0,0 +1,155 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
// http rather than chrome to improve coverage
|
||||
const TESTCASE_URI = TEST_BASE_HTTP + "simple.gz.html";
|
||||
|
||||
const Cc = Components.classes;
|
||||
const Ci = Components.interfaces;
|
||||
Components.utils.import("resource://gre/modules/FileUtils.jsm");
|
||||
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
addTabAndLaunchStyleEditorChromeWhenLoaded(function (aChrome) {
|
||||
aChrome.addChromeListener({
|
||||
onEditorAdded: function (aChrome, aEditor) {
|
||||
if (aEditor.styleSheetIndex != 0) {
|
||||
return; // we want to test against the first stylesheet
|
||||
}
|
||||
|
||||
if (aEditor.sourceEditor) {
|
||||
run(aEditor); // already attached to input element
|
||||
} else {
|
||||
aEditor.addActionListener({
|
||||
onAttach: run
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
gChromeWindow.addEventListener("unload", function onClose() {
|
||||
gChromeWindow.removeEventListener("unload", onClose, true);
|
||||
gChromeWindow = null;
|
||||
executeSoon(function () {
|
||||
waitForFocus(function () {
|
||||
// wait that browser has focus again
|
||||
// open StyleEditorChrome again (a new one since we closed the previous one)
|
||||
launchStyleEditorChrome(function (aChrome) {
|
||||
is(gChromeWindow.document.documentElement.hasAttribute("data-marker"),
|
||||
false,
|
||||
"opened a completely new StyleEditorChrome window");
|
||||
|
||||
aChrome.addChromeListener({
|
||||
onEditorAdded: function (aChrome, aEditor) {
|
||||
if (aEditor.styleSheetIndex != 0) {
|
||||
return; // we want to test against the first stylesheet
|
||||
}
|
||||
|
||||
if (aEditor.sourceEditor) {
|
||||
testNewChrome(aEditor); // already attached to input element
|
||||
} else {
|
||||
aEditor.addActionListener({
|
||||
onAttach: testNewChrome
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}, true);
|
||||
});
|
||||
|
||||
content.location = TESTCASE_URI;
|
||||
}
|
||||
|
||||
let gFilename;
|
||||
|
||||
function run(aEditor)
|
||||
{
|
||||
gFilename = FileUtils.getFile("ProfD", ["styleeditor-test.css"])
|
||||
|
||||
aEditor.saveToFile(gFilename, function (aFile) {
|
||||
ok(aFile, "file got saved successfully");
|
||||
|
||||
aEditor.addActionListener({
|
||||
onFlagChange: function (aEditor, aFlag) {
|
||||
if (aFlag != "unsaved") {
|
||||
return;
|
||||
}
|
||||
|
||||
ok(aEditor.hasFlag("unsaved"),
|
||||
"first stylesheet has UNSAVED flag after making a change");
|
||||
|
||||
// marker used to check it does not exist when we reopen
|
||||
// ie. the window we opened is indeed a new one
|
||||
gChromeWindow.document.documentElement.setAttribute("data-marker", "true");
|
||||
gChromeWindow.close();
|
||||
}
|
||||
});
|
||||
|
||||
waitForFocus(function () {
|
||||
// insert char so that this stylesheet has the UNSAVED flag
|
||||
EventUtils.synthesizeKey("x", {}, gChromeWindow);
|
||||
}, gChromeWindow);
|
||||
});
|
||||
}
|
||||
|
||||
function testNewChrome(aEditor)
|
||||
{
|
||||
ok(aEditor.savedFile,
|
||||
"first stylesheet editor will save directly into the same file");
|
||||
|
||||
is(aEditor.getFriendlyName(), gFilename.leafName,
|
||||
"first stylesheet still has the filename as it was saved");
|
||||
gFilename = null;
|
||||
|
||||
ok(aEditor.hasFlag("unsaved"),
|
||||
"first stylesheet still has UNSAVED flag at reopening");
|
||||
|
||||
ok(!aEditor.hasFlag("inline"),
|
||||
"first stylesheet does not have INLINE flag");
|
||||
|
||||
ok(!aEditor.hasFlag("error"),
|
||||
"editor does not have error flag initially");
|
||||
let hadError = false;
|
||||
|
||||
let onSaveCallback = function (aFile) {
|
||||
aEditor.addActionListener({
|
||||
onFlagChange: function (aEditor, aFlag) {
|
||||
if (!hadError && aFlag == "error") {
|
||||
ok(aEditor.hasFlag("error"),
|
||||
"editor has ERROR flag after attempting to save with invalid path");
|
||||
hadError = true;
|
||||
|
||||
// save using source editor key binding (previous successful path)
|
||||
waitForFocus(function () {
|
||||
EventUtils.synthesizeKey("S", {accelKey: true}, gChromeWindow);
|
||||
}, gChromeWindow);
|
||||
return;
|
||||
}
|
||||
|
||||
if (hadError && aFlag == "unsaved") {
|
||||
executeSoon(function () {
|
||||
ok(!aEditor.hasFlag("unsaved"),
|
||||
"first stylesheet has no UNSAVED flag after successful save");
|
||||
ok(!aEditor.hasFlag("error"),
|
||||
"ERROR flag has been removed since last operation succeeded");
|
||||
finish();
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
let os = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).OS;
|
||||
if (os == "WINNT") {
|
||||
aEditor.saveToFile("C:\\I_DO_NOT_EXIST_42\\bogus.css", onSaveCallback);
|
||||
} else {
|
||||
aEditor.saveToFile("/I_DO_NOT_EXIST_42/bogos.css", onSaveCallback);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
const TESTCASE_URI = TEST_BASE + "simple.html";
|
||||
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
addTabAndLaunchStyleEditorChromeWhenLoaded(function (aChrome) {
|
||||
aChrome.addChromeListener({
|
||||
onContentAttach: run
|
||||
});
|
||||
if (aChrome.isContentAttached) {
|
||||
run(aChrome);
|
||||
}
|
||||
});
|
||||
|
||||
content.location = TESTCASE_URI;
|
||||
}
|
||||
|
||||
function getFilteredItemsCount(nav)
|
||||
{
|
||||
let matches = nav.querySelectorAll("*.splitview-filtered");
|
||||
return matches ? matches.length : 0;
|
||||
}
|
||||
|
||||
function run(aChrome)
|
||||
{
|
||||
aChrome.editors[0].addActionListener({onAttach: onFirstEditorAttach});
|
||||
aChrome.editors[1].addActionListener({onAttach: onSecondEditorAttach});
|
||||
}
|
||||
|
||||
function onFirstEditorAttach(aEditor)
|
||||
{
|
||||
let filter = gChromeWindow.document.querySelector(".splitview-filter");
|
||||
// force the command event on input since it is not possible to disable
|
||||
// the search textbox's timeout.
|
||||
let forceCommandEvent = function forceCommandEvent() {
|
||||
let evt = gChromeWindow.document.createEvent("XULCommandEvent");
|
||||
evt.initCommandEvent("command", true, true, gChromeWindow, 0, false, false,
|
||||
false, false, null);
|
||||
filter.dispatchEvent(evt);
|
||||
}
|
||||
filter.addEventListener("input", forceCommandEvent, false);
|
||||
|
||||
let nav = gChromeWindow.document.querySelector(".splitview-nav");
|
||||
nav.focus();
|
||||
|
||||
is(getFilteredItemsCount(nav), 0,
|
||||
"there is 0 filtered item initially");
|
||||
|
||||
waitForFocus(function () {
|
||||
// Search [s] (type-on-search since we focused nav above - not filter directly)
|
||||
EventUtils.synthesizeKey("s", {}, gChromeWindow);
|
||||
|
||||
// the search space is "simple.css" and "inline stylesheet #1" (2 sheets)
|
||||
is(getFilteredItemsCount(nav), 0,
|
||||
"there is 0 filtered item if searching for 's'");
|
||||
|
||||
EventUtils.synthesizeKey("i", {}, gChromeWindow); // Search [si]
|
||||
|
||||
is(getFilteredItemsCount(nav), 1, // inline stylesheet is filtered
|
||||
"there is 1 filtered item if searching for 's'");
|
||||
|
||||
// use uppercase to check that filtering is case-insensitive
|
||||
EventUtils.synthesizeKey("X", {}, gChromeWindow); // Search [siX]
|
||||
is(getFilteredItemsCount(nav), 2,
|
||||
"there is 2 filtered items if searching for 's'"); // no match
|
||||
|
||||
// clear the search
|
||||
EventUtils.synthesizeKey("VK_ESCAPE", {}, gChromeWindow);
|
||||
|
||||
is(filter.value, "",
|
||||
"filter is back to empty");
|
||||
is(getFilteredItemsCount(nav), 0,
|
||||
"there is 0 filtered item when filter is empty again");
|
||||
|
||||
for each (let c in "inline") {
|
||||
EventUtils.synthesizeKey(c, {}, gChromeWindow);
|
||||
}
|
||||
|
||||
is(getFilteredItemsCount(nav), 1, // simple.css is filtered
|
||||
"there is 1 filtered item if searching for 'inline'");
|
||||
|
||||
// auto-select the only result (enter the editor)
|
||||
EventUtils.synthesizeKey("VK_ENTER", {}, gChromeWindow);
|
||||
|
||||
filter.removeEventListener("input", forceCommandEvent, false);
|
||||
}, gChromeWindow);
|
||||
}
|
||||
|
||||
function onSecondEditorAttach(aEditor)
|
||||
{
|
||||
ok(aEditor.sourceEditor.hasFocus(),
|
||||
"second editor has been selected and focused automatically.");
|
||||
|
||||
finish();
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
const TESTCASE_URI = TEST_BASE + "four.html";
|
||||
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
addTabAndLaunchStyleEditorChromeWhenLoaded(function (aChrome) {
|
||||
aChrome.addChromeListener({
|
||||
onContentAttach: run
|
||||
});
|
||||
if (aChrome.isContentAttached) {
|
||||
run(aChrome);
|
||||
}
|
||||
});
|
||||
|
||||
content.location = TESTCASE_URI;
|
||||
}
|
||||
|
||||
let gChrome;
|
||||
|
||||
function run(aChrome)
|
||||
{
|
||||
gChrome = aChrome;
|
||||
aChrome.editors[0].addActionListener({onAttach: onEditor0Attach});
|
||||
aChrome.editors[2].addActionListener({onAttach: onEditor2Attach});
|
||||
}
|
||||
|
||||
function getStylesheetNameLinkFor(aEditor)
|
||||
{
|
||||
return gChrome.getSummaryElementForEditor(aEditor).querySelector(".stylesheet-name");
|
||||
}
|
||||
|
||||
function onEditor0Attach(aEditor)
|
||||
{
|
||||
waitForFocus(function () {
|
||||
let summary = gChrome.getSummaryElementForEditor(aEditor);
|
||||
EventUtils.synthesizeMouseAtCenter(summary, {}, gChromeWindow);
|
||||
|
||||
let item = getStylesheetNameLinkFor(gChrome.editors[0]);
|
||||
is(gChromeWindow.document.activeElement, item,
|
||||
"editor 0 item is the active element");
|
||||
|
||||
EventUtils.synthesizeKey("VK_DOWN", {}, gChromeWindow);
|
||||
item = getStylesheetNameLinkFor(gChrome.editors[1]);
|
||||
is(gChromeWindow.document.activeElement, item,
|
||||
"editor 1 item is the active element");
|
||||
|
||||
EventUtils.synthesizeKey("VK_HOME", {}, gChromeWindow);
|
||||
item = getStylesheetNameLinkFor(gChrome.editors[0]);
|
||||
is(gChromeWindow.document.activeElement, item,
|
||||
"fist editor item is the active element");
|
||||
|
||||
EventUtils.synthesizeKey("VK_END", {}, gChromeWindow);
|
||||
item = getStylesheetNameLinkFor(gChrome.editors[3]);
|
||||
is(gChromeWindow.document.activeElement, item,
|
||||
"last editor item is the active element");
|
||||
|
||||
EventUtils.synthesizeKey("VK_UP", {}, gChromeWindow);
|
||||
item = getStylesheetNameLinkFor(gChrome.editors[2]);
|
||||
is(gChromeWindow.document.activeElement, item,
|
||||
"editor 2 item is the active element");
|
||||
|
||||
EventUtils.synthesizeKey("VK_RETURN", {}, gChromeWindow);
|
||||
// this will attach and give focus editor 2
|
||||
}, gChromeWindow);
|
||||
}
|
||||
|
||||
function onEditor2Attach(aEditor)
|
||||
{
|
||||
ok(aEditor.sourceEditor.hasFocus(),
|
||||
"editor 2 has focus");
|
||||
|
||||
gChrome = null;
|
||||
finish();
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
const TESTCASE_URI = TEST_BASE + "simple.html";
|
||||
|
||||
let gOriginalWidth; // these are set by run() when gChromeWindow is ready
|
||||
let gOriginalHeight;
|
||||
|
||||
function test()
|
||||
{
|
||||
waitForExplicitFinish();
|
||||
|
||||
addTabAndLaunchStyleEditorChromeWhenLoaded(function (aChrome) {
|
||||
if (aChrome.isContentAttached) {
|
||||
run(aChrome);
|
||||
} else {
|
||||
aChrome.addChromeListener({
|
||||
onContentAttach: run
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
content.location = TESTCASE_URI;
|
||||
}
|
||||
|
||||
function run(aChrome)
|
||||
{
|
||||
is(aChrome.editors.length, 2,
|
||||
"there is 2 stylesheets initially");
|
||||
|
||||
aChrome.editors[0].addActionListener({
|
||||
onAttach: function onEditorAttached(aEditor) {
|
||||
let originalSourceEditor = aEditor.sourceEditor;
|
||||
aEditor.sourceEditor.setCaretOffset(4); // to check the caret is preserved
|
||||
|
||||
// queue a resize to inverse aspect ratio
|
||||
// this will trigger a detach and reattach (to workaround bug 254144)
|
||||
executeSoon(function () {
|
||||
waitForFocus(function () {
|
||||
gOriginalWidth = gChromeWindow.outerWidth;
|
||||
gOriginalHeight = gChromeWindow.outerHeight;
|
||||
gChromeWindow.resizeTo(120, 480);
|
||||
|
||||
executeSoon(function () {
|
||||
is(aEditor.sourceEditor, originalSourceEditor,
|
||||
"the editor still references the same SourceEditor instance");
|
||||
is(aEditor.sourceEditor.getCaretOffset(), 4,
|
||||
"the caret position has been preserved");
|
||||
|
||||
// queue a resize to original aspect ratio
|
||||
waitForFocus(function () {
|
||||
gChromeWindow.resizeTo(gOriginalWidth, gOriginalHeight);
|
||||
executeSoon(function () {
|
||||
finish();
|
||||
});
|
||||
}, gChromeWindow);
|
||||
});
|
||||
}, gChromeWindow);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>four stylesheets</title>
|
||||
<link rel="stylesheet" type="text/css" media="scren" href="simple.css"/>
|
||||
<style type="text/css">
|
||||
div {
|
||||
font-size: 2em;
|
||||
}
|
||||
</style>
|
||||
<style type="text/css">
|
||||
span {
|
||||
font-size: 3em;
|
||||
}
|
||||
</style>
|
||||
<style type="text/css">
|
||||
p {
|
||||
font-size: 4em;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div>four <span>stylesheets</span></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,46 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
const TEST_BASE = "chrome://mochitests/content/browser/browser/devtools/styleeditor/test/";
|
||||
const TEST_BASE_HTTP = "http://example.com/browser/browser/devtools/styleeditor/test/";
|
||||
const TEST_BASE_HTTPS = "https://example.com/browser/browser/devtools/styleeditor/test/";
|
||||
|
||||
let gChromeWindow; //StyleEditorChrome window
|
||||
|
||||
function cleanup()
|
||||
{
|
||||
if (gChromeWindow) {
|
||||
gChromeWindow.close();
|
||||
gChromeWindow = null;
|
||||
}
|
||||
while (gBrowser.tabs.length > 1) {
|
||||
gBrowser.removeCurrentTab();
|
||||
}
|
||||
}
|
||||
|
||||
function launchStyleEditorChrome(aCallback)
|
||||
{
|
||||
gChromeWindow = StyleEditor.openChrome();
|
||||
if (gChromeWindow.document.readyState != "complete") {
|
||||
gChromeWindow.addEventListener("load", function onChromeLoad() {
|
||||
gChromeWindow.removeEventListener("load", onChromeLoad, true);
|
||||
gChromeWindow.styleEditorChrome._alwaysDisableAnimations = true;
|
||||
aCallback(gChromeWindow.styleEditorChrome);
|
||||
}, true);
|
||||
} else {
|
||||
gChromeWindow.styleEditorChrome._alwaysDisableAnimations = true;
|
||||
aCallback(gChromeWindow.styleEditorChrome);
|
||||
}
|
||||
}
|
||||
|
||||
function addTabAndLaunchStyleEditorChromeWhenLoaded(aCallback)
|
||||
{
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.selectedBrowser.addEventListener("load", function onLoad() {
|
||||
gBrowser.selectedBrowser.removeEventListener("load", onLoad, true);
|
||||
launchStyleEditorChrome(aCallback);
|
||||
}, true);
|
||||
}
|
||||
|
||||
registerCleanupFunction(cleanup);
|
|
@ -0,0 +1,5 @@
|
|||
/* this stylesheet applies when min-width<400px */
|
||||
body {
|
||||
background: red;
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" type="text/css" href="simple.css" media="screen,print"/>
|
||||
<link rel="stylesheet" type="text/css" href="media-small.css" media="screen and (min-width: 200px)"/>
|
||||
</head>
|
||||
<body>
|
||||
<div>test for media labels</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>minified testcase</title>
|
||||
<style type="text/css"><!--
|
||||
body{background:white;}div{font-size:4em;color:red}
|
||||
--></style>
|
||||
<style type="text/css">body { background: red; }
|
||||
div {
|
||||
font-size: 5em;
|
||||
color: red
|
||||
}</style>
|
||||
</head>
|
||||
<body>
|
||||
<div>minified <span>testcase</span></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,8 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
Двоичный файл не отображается.
|
@ -0,0 +1,4 @@
|
|||
Vary: Accept-Encoding
|
||||
Content-Encoding: gzip
|
||||
Content-Type: text/css
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>simple testcase</title>
|
||||
<link rel="stylesheet" type="text/css" media="scren" href="simple.css.gz"/>
|
||||
<style type="text/css">
|
||||
body {
|
||||
background: white;
|
||||
}
|
||||
|
||||
div {
|
||||
font-size: 4em;
|
||||
}
|
||||
|
||||
div > span {
|
||||
text-decoration: underline;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div>simple <span>testcase</span></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,23 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>simple testcase</title>
|
||||
<link rel="stylesheet" type="text/css" media="scren" href="simple.css"/>
|
||||
<style type="text/css">
|
||||
body {
|
||||
background: white;
|
||||
}
|
||||
|
||||
div {
|
||||
font-size: 4em;
|
||||
}
|
||||
|
||||
div > span {
|
||||
text-decoration: underline;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div>simple <span>testcase</span></div>
|
||||
</body>
|
||||
</html>
|
Загрузка…
Ссылка в новой задаче