mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-06-17 05:49:19 +00:00
f617a91abb
- Bug 1167633 - Remove SpiderMonkey specific JS syntax from App Manager / WebIDE. r=pbrosset (882d61d26) - missing parts of Bug 932179 - Part 1: Expose security information in the WebConsoleActor. r=past (202d33c93) - Bug 1106470 - Drop SSLv3 support from devtools. r=vporof (4d6f99643) - Bug 955933 - Allow copying the network response string. r=vporof (0f1a79fe1) - Follow-up nit to bug 1147648 (alphabetize prefs). r=kats (e251ec2e5) - Bug 1155252 * -WError fix (2d4c016d2) - Disable layers acceleration on Windows if the last startup crashed during driver initialization. (bug 1168935, r=mattwoodrow) (cb4769ace) - Add telemetry for reporting graphics driver startup states. (bug 1168935 part 2, r=vdjeric,mattwoodrow) (a7a605d93) - Bug 1150715 - Implement "Copy Request/Response Headers" context menu items. r=jsantell (0eabd68f7) - part of Bug 1102219 - Part 4: Replace with in chrome code. r=till (dab16f660) - Bug 1150717 - Implement "Copy URL Parameters" context menu item. r=bgrins (f20e86e8f) - Bug 1158046 - Add access keys to all context menu items in the Network panel. r=bgrins r=jsantell (71fd1e050) - Remove static vars from DriverInitCrashDetection. (bug 1183910 part 1, r=mattwoodrow) (29ea344ce) - Bug 1151541, part 3 - Fix leading tabs in xpcom/. r=froydnj (eb1fa5c14) - Bug 1151541, part 1 - Add MPL2 to StaticMutex.h and stub_test.cpp. r=froydnj (bf00b19ee) - Bug 1140760 - Move TestXPIDLString.cpp to gtest and enable it; r=froydnj (7bea14ce1) - Bug 1140762 - Move TestThreads.cpp to gtest and enable it; r=froydnj (93a007768) - Bug 1151541, part 2 - Fix mode lines in xpcom/. r=froydnj (0ac8fd176) - Bug 1159751: Ensure WARP can never be used for Windows 7. r=milan (ad4a84b10) - Bug 1178426. Add GfxInfo to ServicesList.h. r=nfroyd (8e09c6349) - Bug 1158144 - Fix "Copy URL Parameters" line separation on Windows. r=vporof (d7359d740) - Bug 1158144 - Implement "Copy POST Data" context menu item. r=vporof (adddce05a) - Bug 1127423 - Don't scroll horizontally when selecting an element in markup view;r=jryans (3256aa5eb) - Bug 1159938 - Remove dead nodeChanged() function;r=pbrosset (213880754) - Bug 1153022 - Add trimOutput option to inplace editor;r=pbrosset (52228252a) - Bug 1120111 - Adds key listeners to highlighter pick mode to traverse DOM and submit/cancel selection; r=pbrosset (40f6e8e33) - Bug 1120111 - Tests for the highlighter pick mode key listeners; r=pbrosset (6c9ff1c95) - Bug 988278 - Fixes ESCape keypress mess in the inspector to make sure the split console opens; r=miker (d915ca7ae) - Bug 1153635 - Focus first focusable element in MarkupContainer when line is clicked; r=bgrins (f7b231d4c) - Bug 1158781 - Make sure attributes gets focused when clicked in the inspector. r=bgrins (d6e1521f3) - Bug 966787 - 1 - Code cleanup in breadcrumbs.js; r=bgrins For a better consistency with the rest of the DevTools codebase. (867a768c6) - fix imports again (180eb1ac7) - Bug 966787 - 2 - Skip inspector breadcrumb updates when the output doesn't change; r=bgrins (5bddce972) - Bug 892935 - Auto-expand elements with only text in the markup view;r=pbrosset,r=bgrins (6dddecd01)
258 lines
8.0 KiB
JavaScript
258 lines
8.0 KiB
JavaScript
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
|
|
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
const Cu = Components.utils;
|
|
let {gDevTools} = Cu.import("resource://gre/modules/devtools/gDevTools.jsm", {});
|
|
let {devtools} = Cu.import("resource://gre/modules/devtools/Loader.jsm", {});
|
|
let TargetFactory = devtools.TargetFactory;
|
|
let {Promise: promise} = Cu.import("resource://gre/modules/Promise.jsm", {});
|
|
let {console} = Components.utils.import("resource://gre/modules/devtools/Console.jsm", {});
|
|
|
|
// All test are asynchronous
|
|
waitForExplicitFinish();
|
|
|
|
const TEST_URL_ROOT = "http://example.com/browser/browser/devtools/layoutview/test/";
|
|
|
|
// Uncomment this pref to dump all devtools emitted events to the console.
|
|
// Services.prefs.setBoolPref("devtools.dump.emit", true);
|
|
|
|
// Services.prefs.setBoolPref("devtools.debugger.log", true);
|
|
|
|
// Set the testing flag on gDevTools and reset it when the test ends
|
|
gDevTools.testing = true;
|
|
registerCleanupFunction(() => gDevTools.testing = false);
|
|
|
|
// Clean-up all prefs that might have been changed during a test run
|
|
// (safer here because if the test fails, then the pref is never reverted)
|
|
Services.prefs.setIntPref("devtools.toolbox.footer.height", 350);
|
|
registerCleanupFunction(() => {
|
|
Services.prefs.clearUserPref("devtools.dump.emit");
|
|
Services.prefs.clearUserPref("devtools.debugger.log");
|
|
Services.prefs.clearUserPref("devtools.toolbox.footer.height");
|
|
Services.prefs.setCharPref("devtools.inspector.activeSidebar", "ruleview");
|
|
});
|
|
|
|
registerCleanupFunction(function*() {
|
|
let target = TargetFactory.forTab(gBrowser.selectedTab);
|
|
yield gDevTools.closeToolbox(target);
|
|
|
|
// Move the mouse outside inspector. If the test happened fake a mouse event
|
|
// somewhere over inspector the pointer is considered to be there when the
|
|
// next test begins. This might cause unexpected events to be emitted when
|
|
// another test moves the mouse.
|
|
EventUtils.synthesizeMouseAtPoint(1, 1, {type: "mousemove"}, window);
|
|
|
|
while (gBrowser.tabs.length > 1) {
|
|
gBrowser.removeCurrentTab();
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Add a new test tab in the browser and load the given url.
|
|
* @param {String} url The url to be loaded in the new tab
|
|
* @return a promise that resolves to the tab object when the url is loaded
|
|
*/
|
|
function addTab(url) {
|
|
let def = promise.defer();
|
|
|
|
let tab = gBrowser.selectedTab = gBrowser.addTab();
|
|
gBrowser.selectedBrowser.addEventListener("load", function onload() {
|
|
gBrowser.selectedBrowser.removeEventListener("load", onload, true);
|
|
info("URL " + url + " loading complete into new test tab");
|
|
waitForFocus(() => {
|
|
def.resolve(tab);
|
|
}, content);
|
|
}, true);
|
|
content.location = url;
|
|
|
|
return def.promise;
|
|
}
|
|
|
|
/**
|
|
* Simple DOM node accesor function that takes either a node or a string css
|
|
* selector as argument and returns the corresponding node
|
|
* @param {String|DOMNode} nodeOrSelector
|
|
* @return {DOMNode}
|
|
*/
|
|
function getNode(nodeOrSelector) {
|
|
return typeof nodeOrSelector === "string" ?
|
|
content.document.querySelector(nodeOrSelector) :
|
|
nodeOrSelector;
|
|
}
|
|
|
|
/**
|
|
* Highlight a node and set the inspector's current selection to the node or
|
|
* the first match of the given css selector.
|
|
* @param {String|DOMNode} nodeOrSelector
|
|
* @param {InspectorPanel} inspector
|
|
* The instance of InspectorPanel currently loaded in the toolbox
|
|
* @return a promise that resolves when the inspector is updated with the new
|
|
* node
|
|
*/
|
|
function selectAndHighlightNode(nodeOrSelector, inspector) {
|
|
info("Highlighting and selecting the node " + nodeOrSelector);
|
|
|
|
let node = getNode(nodeOrSelector);
|
|
let updated = inspector.toolbox.once("highlighter-ready");
|
|
inspector.selection.setNode(node, "test-highlight");
|
|
return updated;
|
|
|
|
}
|
|
|
|
/**
|
|
* Set the inspector's current selection to a node or to the first match of the
|
|
* given css selector.
|
|
* @param {String|DOMNode} nodeOrSelector
|
|
* @param {InspectorPanel} inspector
|
|
* The instance of InspectorPanel currently loaded in the toolbox
|
|
* @param {String} reason
|
|
* Defaults to "test" which instructs the inspector not to highlight the
|
|
* node upon selection
|
|
* @return a promise that resolves when the inspector is updated with the new
|
|
* node
|
|
*/
|
|
function selectNode(nodeOrSelector, inspector, reason="test") {
|
|
info("Selecting the node " + nodeOrSelector);
|
|
|
|
let node = getNode(nodeOrSelector);
|
|
let updated = inspector.once("inspector-updated");
|
|
inspector.selection.setNode(node, reason);
|
|
return updated;
|
|
}
|
|
|
|
/**
|
|
* Open the toolbox, with the inspector tool visible.
|
|
* @return a promise that resolves when the inspector is ready
|
|
*/
|
|
let openInspector = Task.async(function*() {
|
|
info("Opening the inspector");
|
|
let target = TargetFactory.forTab(gBrowser.selectedTab);
|
|
|
|
let inspector, toolbox;
|
|
|
|
// The actual highligher show/hide methods are mocked in layoutview tests.
|
|
// The highlighter is tested in devtools/inspector/test.
|
|
function mockHighlighter({highlighter}) {
|
|
highlighter.showBoxModel = function(nodeFront, options) {
|
|
return promise.resolve();
|
|
}
|
|
highlighter.hideBoxModel = function() {
|
|
return promise.resolve();
|
|
}
|
|
}
|
|
|
|
// Checking if the toolbox and the inspector are already loaded
|
|
// The inspector-updated event should only be waited for if the inspector
|
|
// isn't loaded yet
|
|
toolbox = gDevTools.getToolbox(target);
|
|
if (toolbox) {
|
|
inspector = toolbox.getPanel("inspector");
|
|
if (inspector) {
|
|
info("Toolbox and inspector already open");
|
|
mockHighlighter(toolbox);
|
|
return {
|
|
toolbox: toolbox,
|
|
inspector: inspector
|
|
};
|
|
}
|
|
}
|
|
|
|
info("Opening the toolbox");
|
|
toolbox = yield gDevTools.showToolbox(target, "inspector");
|
|
yield waitForToolboxFrameFocus(toolbox);
|
|
inspector = toolbox.getPanel("inspector");
|
|
|
|
info("Waiting for the inspector to update");
|
|
yield inspector.once("inspector-updated");
|
|
|
|
mockHighlighter(toolbox);
|
|
return {
|
|
toolbox: toolbox,
|
|
inspector: inspector
|
|
};
|
|
});
|
|
|
|
/**
|
|
* Wait for the toolbox frame to receive focus after it loads
|
|
* @param {Toolbox} toolbox
|
|
* @return a promise that resolves when focus has been received
|
|
*/
|
|
function waitForToolboxFrameFocus(toolbox) {
|
|
info("Making sure that the toolbox's frame is focused");
|
|
let def = promise.defer();
|
|
let win = toolbox.frame.contentWindow;
|
|
waitForFocus(def.resolve, win);
|
|
return def.promise;
|
|
}
|
|
|
|
/**
|
|
* Checks whether the inspector's sidebar corresponding to the given id already
|
|
* exists
|
|
* @param {InspectorPanel}
|
|
* @param {String}
|
|
* @return {Boolean}
|
|
*/
|
|
function hasSideBarTab(inspector, id) {
|
|
return !!inspector.sidebar.getWindowForTab(id);
|
|
}
|
|
|
|
/**
|
|
* Open the toolbox, with the inspector tool visible, and the layout-view
|
|
* sidebar tab selected.
|
|
* @return a promise that resolves when the inspector is ready and the layout
|
|
* view is visible and ready
|
|
*/
|
|
let openLayoutView = Task.async(function*() {
|
|
let {toolbox, inspector} = yield openInspector();
|
|
|
|
if (!hasSideBarTab(inspector, "layoutview")) {
|
|
info("Waiting for the layoutview sidebar to be ready");
|
|
yield inspector.sidebar.once("layoutview-ready");
|
|
}
|
|
|
|
info("Selecting the layoutview sidebar");
|
|
inspector.sidebar.select("layoutview");
|
|
|
|
return {
|
|
toolbox: toolbox,
|
|
inspector: inspector,
|
|
view: inspector.sidebar.getWindowForTab("layoutview")["layoutview"]
|
|
};
|
|
});
|
|
|
|
/**
|
|
* Wait for the layoutview-updated event.
|
|
* @return a promise
|
|
*/
|
|
function waitForUpdate(inspector) {
|
|
return inspector.once("layoutview-updated");
|
|
}
|
|
|
|
/**
|
|
* The addTest/runTests function couple provides a simple way to define
|
|
* subsequent test cases in a test file. Example:
|
|
*
|
|
* addTest("what this test does", function*() {
|
|
* ... actual code for the test ...
|
|
* });
|
|
* addTest("what this second test does", function*() {
|
|
* ... actual code for the second test ...
|
|
* });
|
|
* runTests().then(...);
|
|
*/
|
|
var TESTS = [];
|
|
|
|
function addTest(message, func) {
|
|
TESTS.push([message, Task.async(func)])
|
|
}
|
|
|
|
let runTests = Task.async(function*(...args) {
|
|
for (let [message, test] of TESTS) {
|
|
info("Running new test case: " + message);
|
|
yield test.apply(null, args);
|
|
}
|
|
});
|