merge fx-team to mozilla-central

This commit is contained in:
Carsten "Tomcat" Book 2014-06-03 14:43:14 +02:00
commit 5f917d7fcf
54 changed files with 931 additions and 201 deletions

View File

@ -2,10 +2,15 @@
skip-if = e10s # Bug ?????? - devtools tests disabled with e10s
subsuite = devtools
support-files =
doc_layoutview_iframe1.html
doc_layoutview_iframe2.html
head.js
[browser_layoutview.js]
[browser_layoutview_rotate-labels-on-sides.js]
[browser_layoutview_update-after-navigation.js]
[browser_layoutview_update-after-reload.js]
[browser_layoutview_update-in-iframes.js]
[browser_editablemodel.js]
[browser_editablemodel_allproperties.js]
[browser_editablemodel_border.js]

View File

@ -0,0 +1,99 @@
/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Test that the layout-view continues to work after a page navigation and that
// it also works after going back
let test = asyncTest(function*() {
yield addTab(TEST_URL_ROOT + "doc_layoutview_iframe1.html");
let {toolbox, inspector, view} = yield openLayoutView();
yield runTests(inspector, view);
yield destroyToolbox(inspector);
});
addTest("Test that the layout-view works on the first page",
function*(inspector, view) {
info("Selecting the test node");
yield selectNode("p", inspector);
info("Checking that the layout-view shows the right value");
let paddingElt = view.doc.querySelector(".padding.top > span");
is(paddingElt.textContent, "50");
info("Listening for layout-view changes and modifying the padding");
let onUpdated = waitForUpdate(inspector);
getNode("p").style.padding = "20px";
yield onUpdated;
ok(true, "Layout-view got updated");
info("Checking that the layout-view shows the right value after update");
is(paddingElt.textContent, "20");
});
addTest("Navigate to the second page",
function*(inspector, view) {
yield navigateTo(TEST_URL_ROOT + "doc_layoutview_iframe2.html");
yield inspector.once("markuploaded");
});
addTest("Test that the layout-view works on the second page",
function*(inspector, view) {
info("Selecting the test node");
yield selectNode("p", inspector);
info("Checking that the layout-view shows the right value");
let sizeElt = view.doc.querySelector(".size > span");
is(sizeElt.textContent, "100x100");
info("Listening for layout-view changes and modifying the size");
let onUpdated = waitForUpdate(inspector);
getNode("p").style.width = "200px";
yield onUpdated;
ok(true, "Layout-view got updated");
info("Checking that the layout-view shows the right value after update");
is(sizeElt.textContent, "200x100");
});
addTest("Go back to the first page",
function*(inspector, view) {
content.history.back();
yield inspector.once("markuploaded");
});
addTest("Test that the layout-view works on the first page after going back",
function*(inspector, view) {
info("Selecting the test node");
yield selectNode("p", inspector);
info("Checking that the layout-view shows the right value, which is the" +
"modified value from step one because of the bfcache");
let paddingElt = view.doc.querySelector(".padding.top > span");
is(paddingElt.textContent, "20");
info("Listening for layout-view changes and modifying the padding");
let onUpdated = waitForUpdate(inspector);
getNode("p").style.padding = "100px";
yield onUpdated;
ok(true, "Layout-view got updated");
info("Checking that the layout-view shows the right value after update");
is(paddingElt.textContent, "100");
});
function navigateTo(url) {
info("Navigating to " + url);
let def = promise.defer();
gBrowser.selectedBrowser.addEventListener("load", function onload() {
gBrowser.selectedBrowser.removeEventListener("load", onload, true);
info("URL " + url + " loading complete");
waitForFocus(def.resolve, content);
}, true);
content.location = url;
return def.promise;
}

View File

@ -0,0 +1,42 @@
/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Test that the layout-view continues to work after the page is reloaded
let test = asyncTest(function*() {
yield addTab(TEST_URL_ROOT + "doc_layoutview_iframe1.html");
let {toolbox, inspector, view} = yield openLayoutView();
info("Test that the layout-view works on the first page");
yield assertLayoutView(inspector, view);
info("Reload the page");
content.location.reload();
yield inspector.once("markuploaded");
info("Test that the layout-view works on the reloaded page");
yield assertLayoutView(inspector, view);
yield destroyToolbox(inspector);
});
function* assertLayoutView(inspector, view) {
info("Selecting the test node");
yield selectNode("p", inspector);
info("Checking that the layout-view shows the right value");
let paddingElt = view.doc.querySelector(".padding.top > span");
is(paddingElt.textContent, "50");
info("Listening for layout-view changes and modifying the padding");
let onUpdated = waitForUpdate(inspector);
getNode("p").style.padding = "20px";
yield onUpdated;
ok(true, "Layout-view got updated");
info("Checking that the layout-view shows the right value after update");
is(paddingElt.textContent, "20");
}

View File

@ -0,0 +1,61 @@
/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Test that the layout-view for elements within iframes also updates when they
// change
let test = asyncTest(function*() {
yield addTab(TEST_URL_ROOT + "doc_layoutview_iframe1.html");
let iframe2 = getNode("iframe").contentDocument.querySelector("iframe");
let {toolbox, inspector, view} = yield openLayoutView();
yield runTests(inspector, view, iframe2);
yield destroyToolbox(inspector);
});
addTest("Test that resizing an element in an iframe updates its box model",
function*(inspector, view, iframe2) {
info("Selecting the nested test node");
let node = iframe2.contentDocument.querySelector("div");
yield selectNode(node, inspector);
info("Checking that the layout-view shows the right value");
let sizeElt = view.doc.querySelector(".size > span");
is(sizeElt.textContent, "400x200");
info("Listening for layout-view changes and modifying its size");
let onUpdated = waitForUpdate(inspector);
node.style.width = "200px";
yield onUpdated;
ok(true, "Layout-view got updated");
info("Checking that the layout-view shows the right value after update");
is(sizeElt.textContent, "200x200");
});
addTest("Test reflows are still sent to the layout-view after deleting an iframe",
function*(inspector, view, iframe2) {
info("Deleting the iframe2");
iframe2.remove();
yield inspector.once("inspector-updated");
info("Selecting the test node in iframe1");
let node = getNode("iframe").contentDocument.querySelector("p");
yield selectNode(node, inspector);
info("Checking that the layout-view shows the right value");
let sizeElt = view.doc.querySelector(".size > span");
is(sizeElt.textContent, "100x100");
info("Listening for layout-view changes and modifying its size");
let onUpdated = waitForUpdate(inspector);
node.style.width = "200px";
yield onUpdated;
ok(true, "Layout-view got updated");
info("Checking that the layout-view shows the right value after update");
is(sizeElt.textContent, "200x100");
});

View File

@ -0,0 +1,3 @@
<!DOCTYPE html>
<p style="padding:50px;color:#f06;">Root page</p>
<iframe src="doc_layoutview_iframe2.html"></iframe>

View File

@ -0,0 +1,3 @@
<!DOCTYPE html>
<p style="width:100px;height:100px;background:red;">iframe 1</p>
<iframe src="data:text/html,<div style='width:400px;height:200px;background:yellow;'>iframe 2</div>"></iframe>

View File

@ -23,6 +23,7 @@ support-files = head.js
[browser_scratchpad_falsy.js]
[browser_scratchpad_edit_ui_updates.js]
[browser_scratchpad_revert_to_saved.js]
[browser_scratchpad_run_error_goto_line.js]
[browser_scratchpad_contexts.js]
[browser_scratchpad_execute_print.js]
[browser_scratchpad_files.js]
@ -34,6 +35,7 @@ support-files = head.js
[browser_scratchpad_throw_output.js]
[browser_scratchpad_pprint-02.js]
[browser_scratchpad_pprint.js]
[browser_scratchpad_pprint_error_goto_line.js]
[browser_scratchpad_restore.js]
[browser_scratchpad_tab_switch.js]
[browser_scratchpad_ui.js]

View File

@ -0,0 +1,66 @@
/* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2; fill-column: 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/ */
"use strict";
function test()
{
waitForExplicitFinish();
gBrowser.selectedTab = gBrowser.addTab();
gBrowser.selectedBrowser.addEventListener("load", function onLoad() {
gBrowser.selectedBrowser.removeEventListener("load", onLoad, true);
openScratchpad(runTests);
}, true);
content.location = "data:text/html;charset=utf8,test Scratchpad pretty print error goto line.";
}
function testJumpToPrettyPrintError(sp, error, remark) {
info("will test jumpToLine after prettyPrint error" + remark);
// CodeMirror lines and columns are 0-based, Scratchpad UI and error
// stack are 1-based.
is(/Invalid regexp flag \(3:10\)/.test(error), true, "prettyPrint expects error in editor text:\n" + error);
const errorLine = 3, errorColumn = 10;
const editorDoc = sp.editor.container.contentDocument;
sp.editor.jumpToLine();
const lineInput = editorDoc.querySelector("input");
const errorLocation = lineInput.value;
const [ inputLine, inputColumn ] = errorLocation.split(":");
is(inputLine, errorLine, "jumpToLine input field is set from editor selection (line)");
is(inputColumn, errorColumn, "jumpToLine input field is set from editor selection (column)");
EventUtils.synthesizeKey("VK_RETURN", { }, editorDoc.defaultView);
// CodeMirror lines and columns are 0-based, Scratchpad UI and error
// stack are 1-based.
const cursor = sp.editor.getCursor();
is(inputLine, cursor.line + 1, "jumpToLine goto error location (line)");
is(inputColumn, cursor.ch + 1, "jumpToLine goto error location (column)");
}
function runTests(sw, sp)
{
sp.setText([
"// line 1",
"// line 2",
"var re = /a bad /regexp/; // line 3 is an obvious syntax error!",
"// line 4",
"// line 5",
""
].join("\n"));
sp.prettyPrint().then(aFulfill => {
ok(false, "Expecting Invalid regexp flag (3:10)");
finish();
}, error => {
testJumpToPrettyPrintError(sp, error, " (Bug 1005471, first time)");
});
sp.prettyPrint().then(aFulfill => {
ok(false, "Expecting Invalid regexp flag (3:10)");
finish();
}, error => {
// Second time verifies bug in earlier implementation fixed.
testJumpToPrettyPrintError(sp, error, " (second time)");
finish();
});
}

View File

@ -0,0 +1,49 @@
/* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2; fill-column: 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/ */
"use strict";
function test()
{
waitForExplicitFinish();
gBrowser.selectedTab = gBrowser.addTab();
gBrowser.selectedBrowser.addEventListener("load", function onLoad() {
gBrowser.selectedBrowser.removeEventListener("load", onLoad, true);
openScratchpad(runTests);
}, true);
content.location = "data:text/html;charset=utf8,test Scratchpad pretty print.";
}
function runTests(sw)
{
const sp = sw.Scratchpad;
sp.setText([
"// line 1",
"// line 2",
"var re = /a bad /regexp/; // line 3 is an obvious syntax error!",
"// line 4",
"// line 5",
""
].join("\n"));
sp.run().then(() => {
// CodeMirror lines and columns are 0-based, Scratchpad UI and error
// stack are 1-based.
let errorLine = 3;
let editorDoc = sp.editor.container.contentDocument;
sp.editor.jumpToLine();
let lineInput = editorDoc.querySelector("input");
let inputLine = lineInput.value;
is(inputLine, errorLine, "jumpToLine input field is set from editor selection");
EventUtils.synthesizeKey("VK_RETURN", { }, editorDoc.defaultView);
// CodeMirror lines and columns are 0-based, Scratchpad UI and error
// stack are 1-based.
let cursor = sp.editor.getCursor();
is(cursor.line + 1, inputLine, "jumpToLine goto error location (line)");
is(cursor.ch + 1, 1, "jumpToLine goto error location (column)");
finish();
});
}

View File

@ -1,3 +1,4 @@
/* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2; fill-column: 80 -*- */
/* vim:set ts=2 sw=2 sts=2 et tw=80:
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
@ -20,6 +21,11 @@ const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.x
// while shifting to a line which was initially out of view.
const MAX_VERTICAL_OFFSET = 3;
// Match @Scratchpad/N:LINE[:COLUMN] or (LINE[:COLUMN]) anywhere at an end of
// line in text selection.
const RE_SCRATCHPAD_ERROR = /(?:@Scratchpad\/\d+:|\()(\d+):?(\d+)?(?:\)|\n)/;
const RE_JUMP_TO_LINE = /^(\d+):?(\d+)?/;
const {Promise: promise} = Cu.import("resource://gre/modules/Promise.jsm", {});
const events = require("devtools/toolkit/event-emitter");
@ -752,7 +758,28 @@ Editor.prototype = {
div.appendChild(txt);
div.appendChild(inp);
this.openDialog(div, (line) => this.setCursor({ line: line - 1, ch: 0 }));
if (!this.hasMultipleSelections()) {
let cm = editors.get(this);
let sel = cm.getSelection();
// Scratchpad inserts and selects a comment after an error happens:
// "@Scratchpad/1:10:2". Parse this to get the line and column.
// In the string above this is line 10, column 2.
let match = sel.match(RE_SCRATCHPAD_ERROR);
if (match) {
let [ , line, column ] = match;
inp.value = column ? line + ":" + column : line;
inp.selectionStart = inp.selectionEnd = inp.value.length;
}
}
this.openDialog(div, (line) => {
// Handle LINE:COLUMN as well as LINE
let match = line.toString().match(RE_JUMP_TO_LINE);
if (match) {
let [ , line, column ] = match;
this.setCursor({line: line - 1, ch: column ? column - 1 : 0 });
}
});
},
/**

View File

@ -22,6 +22,7 @@ support-files =
[browser_editor_basic.js]
[browser_editor_cursor.js]
[browser_editor_goto_line.js]
[browser_editor_history.js]
[browser_editor_markers.js]
[browser_editor_movelines.js]

View File

@ -0,0 +1,130 @@
/* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2; fill-column: 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/ */
"use strict";
function testJumpToLine (ed, inputLine, expectCursor) {
ed.jumpToLine();
let editorDoc = ed.container.contentDocument;
let lineInput = editorDoc.querySelector("input");
lineInput.value = inputLine;
EventUtils.synthesizeKey("VK_RETURN", { }, editorDoc.defaultView);
// CodeMirror lines and columns are 0-based, Scratchpad UI is 1-based.
ch(ed.getCursor(), expectCursor, "jumpToLine " + inputLine + " expects cursor " + expectCursor.toSource());
}
function test() {
waitForExplicitFinish();
setup((ed, win) => {
let textLines = [
"// line 1",
"// line 2",
"// line 3",
"// line 4",
"// line 5",
""];
ed.setText(textLines.join("\n"));
waitForFocus(function () {
let testVectors = [
// Various useless inputs go to line 0, column 0 or do nothing.
["",
{line:0, ch:0}],
[":",
{line:0, ch:0}],
[" ",
{line:0, ch:0}],
[" : ",
{line:0, ch:0}],
["a:b",
{line:0, ch:0}],
["LINE:COLUMN",
{line:0, ch:0}],
["-1",
{line:0, ch:0}],
[":-1",
{line:0, ch:0}],
["-1:-1",
{line:0, ch:0}],
["0",
{line:0, ch:0}],
[":0",
{line:0, ch:0}],
["0:0",
{line:0, ch:0}],
// Starting here expect data needs to get updated for length changes to
// "textLines" above.
// Just jump to line
["1",
{line:0, ch:0}],
// Jump to second character in line
["1:2",
{line:0, ch:1}],
// Jump to last character on line
["1:9",
{line:0, ch:8}],
// Jump just after last character on line (end of line)
["1:10",
{line:0, ch:9}],
// Jump one character past end of line (gets clamped to end of line)
["1:11",
{line:0, ch:9}],
["2",
{line:1, ch:0}],
["2:2",
{line:1, ch:1}],
["2:10",
{line:1, ch:9}],
["2:11",
{line:1, ch:10}],
["2:12",
{line:1, ch:10}],
["3",
{line:2, ch:0}],
["3:2",
{line:2, ch:1}],
["3:11",
{line:2, ch:10}],
["3:12",
{line:2, ch:11}],
["3:13",
{line:2, ch:11}],
["4",
{line:3, ch:0}],
["4:2",
{line:3, ch:1}],
["4:12",
{line:3, ch:11}],
["4:13",
{line:3, ch:12}],
["4:14",
{line:3, ch:12}],
["5",
{line:4, ch:0}],
["5:2",
{line:4, ch:1}],
["5:13",
{line:4, ch:12}],
["5:14",
{line:4, ch:13}],
["5:15",
{line:4, ch:13}],
// One line beyond last newline in editor text:
["6",
{line:5, ch:0}],
["6:2",
{line:5, ch:0}],
// Two line beyond last newline in editor text (gets clamped):
["7",
{line:5, ch:0}],
["7:2",
{line:5, ch:0}]
];
testVectors.forEach(function (vector) {
testJumpToLine(ed, vector[0], vector[1]);
});
teardown(ed, win);
});
});
}

View File

@ -5,53 +5,47 @@
// This test makes sure that the style editor does not store any
// content CSS files in the permanent cache when opened from PB mode.
let gUI;
function test() {
waitForExplicitFinish();
let windowsToClose = [];
let gUI;
let testURI = 'http://' + TEST_HOST + '/browser/browser/devtools/styleeditor/test/test_private.html';
function checkCache() {
checkDiskCacheFor(TEST_HOST, function() {
gUI = null;
finish();
});
}
info("Opening a new private window");
let win = OpenBrowserWindow({private: true});
win.addEventListener("load", function onLoad() {
win.removeEventListener("load", onLoad, false);
executeSoon(startTest);
}, false);
function doTest(aWindow) {
aWindow.gBrowser.selectedBrowser.addEventListener("load", function onLoad() {
aWindow.gBrowser.selectedBrowser.removeEventListener("load", onLoad, true);
function startTest() {
win.gBrowser.selectedBrowser.addEventListener("load", function onLoad() {
win.gBrowser.selectedBrowser.removeEventListener("load", onLoad, true);
info("Clearing the browser cache");
cache.clear();
openStyleEditorInWindow(aWindow, function(panel) {
info("Opening the style editor in the private window");
openStyleEditorInWindow(win, function(panel) {
gUI = panel.UI;
gUI.on("editor-added", onEditorAdded);
});
}, true);
aWindow.gBrowser.selectedBrowser.loadURI(testURI);
info("Loading the test URL in the new private window");
win.content.location = testURI;
}
function onEditorAdded(aEvent, aEditor) {
info("The style editor is ready")
aEditor.getSourceEditor().then(checkCache);
}
function testOnWindow(options, callback) {
let win = OpenBrowserWindow(options);
win.addEventListener("load", function onLoad() {
win.removeEventListener("load", onLoad, false);
windowsToClose.push(win);
executeSoon(function() callback(win));
}, false);
};
registerCleanupFunction(function() {
windowsToClose.forEach(function(win) {
function checkCache() {
checkDiskCacheFor(TEST_HOST, function() {
win.close();
win = null;
gUI = null;
finish();
});
});
testOnWindow({private: true}, function(win) {
doTest(win);
});
}
}

View File

@ -272,10 +272,18 @@ browser.jar:
skin/classic/browser/devtools/debugger-toggleBreakpoints@2x.png (../shared/devtools/images/debugger-toggleBreakpoints@2x.png)
skin/classic/browser/devtools/tracer-icon.png (../shared/devtools/images/tracer-icon.png)
skin/classic/browser/devtools/tracer-icon@2x.png (../shared/devtools/images/tracer-icon@2x.png)
skin/classic/browser/devtools/responsive-se-resizer.png (../shared/devtools/images/responsive-se-resizer.png)
skin/classic/browser/devtools/responsive-vertical-resizer.png (../shared/devtools/images/responsive-vertical-resizer.png)
skin/classic/browser/devtools/responsive-horizontal-resizer.png (../shared/devtools/images/responsive-horizontal-resizer.png)
skin/classic/browser/devtools/responsive-background.png (../shared/devtools/images/responsive-background.png)
skin/classic/browser/devtools/responsive-se-resizer.png (../shared/devtools/images/responsivemode/responsive-se-resizer.png)
skin/classic/browser/devtools/responsive-se-resizer@2x.png (../shared/devtools/images/responsivemode/responsive-se-resizer@2x.png)
skin/classic/browser/devtools/responsive-vertical-resizer.png (../shared/devtools/images/responsivemode/responsive-vertical-resizer.png)
skin/classic/browser/devtools/responsive-vertical-resizer@2x.png (../shared/devtools/images/responsivemode/responsive-vertical-resizer@2x.png)
skin/classic/browser/devtools/responsive-horizontal-resizer.png (../shared/devtools/images/responsivemode/responsive-horizontal-resizer.png)
skin/classic/browser/devtools/responsive-horizontal-resizer@2x.png (../shared/devtools/images/responsivemode/responsive-horizontal-resizer@2x.png)
skin/classic/browser/devtools/responsiveui-rotate.png (../shared/devtools/images/responsivemode/responsiveui-rotate.png)
skin/classic/browser/devtools/responsiveui-rotate@2x.png (../shared/devtools/images/responsivemode/responsiveui-rotate@2x.png)
skin/classic/browser/devtools/responsiveui-touch.png (../shared/devtools/images/responsivemode/responsiveui-touch.png)
skin/classic/browser/devtools/responsiveui-touch@2x.png (../shared/devtools/images/responsivemode/responsiveui-touch@2x.png)
skin/classic/browser/devtools/responsiveui-screenshot.png (../shared/devtools/images/responsivemode/responsiveui-screenshot.png)
skin/classic/browser/devtools/responsiveui-screenshot@2x.png (../shared/devtools/images/responsivemode/responsiveui-screenshot@2x.png)
skin/classic/browser/devtools/toggle-tools.png (../shared/devtools/images/toggle-tools.png)
skin/classic/browser/devtools/dock-bottom@2x.png (../shared/devtools/images/dock-bottom@2x.png)
skin/classic/browser/devtools/dock-side@2x.png (../shared/devtools/images/dock-side@2x.png)
@ -309,9 +317,6 @@ browser.jar:
skin/classic/browser/devtools/font-inspector.css (../shared/devtools/font-inspector.css)
skin/classic/browser/devtools/computedview.css (../shared/devtools/computedview.css)
skin/classic/browser/devtools/arrow-e.png (../shared/devtools/images/arrow-e.png)
skin/classic/browser/devtools/responsiveui-rotate.png (../shared/devtools/responsiveui-rotate.png)
skin/classic/browser/devtools/responsiveui-touch.png (../shared/devtools/responsiveui-touch.png)
skin/classic/browser/devtools/responsiveui-screenshot.png (../shared/devtools/responsiveui-screenshot.png)
skin/classic/browser/devtools/projecteditor/projecteditor.css (../shared/devtools/projecteditor/projecteditor.css)
skin/classic/browser/devtools/projecteditor/file-icons-sheet@2x.png (../shared/devtools/projecteditor/file-icons-sheet@2x.png)
skin/classic/browser/devtools/app-manager/connection-footer.css (../shared/devtools/app-manager/connection-footer.css)

View File

@ -4,6 +4,14 @@
%include ../../../shared/incontentprefs/preferences.css
tab[selected] {
/* Override styles for tab[selected] from
toolkit/themes/linux/global/tabbox.css */
margin-bottom: 0;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
button > .button-box,
menulist > .menulist-label-box {
-moz-appearance: none;

View File

@ -392,10 +392,18 @@ browser.jar:
skin/classic/browser/devtools/tracer-icon@2x.png (../shared/devtools/images/tracer-icon@2x.png)
skin/classic/browser/devtools/floating-scrollbars.css (devtools/floating-scrollbars.css)
skin/classic/browser/devtools/floating-scrollbars-light.css (devtools/floating-scrollbars-light.css)
skin/classic/browser/devtools/responsive-se-resizer.png (../shared/devtools/images/responsive-se-resizer.png)
skin/classic/browser/devtools/responsive-vertical-resizer.png (../shared/devtools/images/responsive-vertical-resizer.png)
skin/classic/browser/devtools/responsive-horizontal-resizer.png (../shared/devtools/images/responsive-horizontal-resizer.png)
skin/classic/browser/devtools/responsive-background.png (../shared/devtools/images/responsive-background.png)
skin/classic/browser/devtools/responsive-se-resizer.png (../shared/devtools/images/responsivemode/responsive-se-resizer.png)
skin/classic/browser/devtools/responsive-se-resizer@2x.png (../shared/devtools/images/responsivemode/responsive-se-resizer@2x.png)
skin/classic/browser/devtools/responsive-vertical-resizer.png (../shared/devtools/images/responsivemode/responsive-vertical-resizer.png)
skin/classic/browser/devtools/responsive-vertical-resizer@2x.png (../shared/devtools/images/responsivemode/responsive-vertical-resizer@2x.png)
skin/classic/browser/devtools/responsive-horizontal-resizer.png (../shared/devtools/images/responsivemode/responsive-horizontal-resizer.png)
skin/classic/browser/devtools/responsive-horizontal-resizer@2x.png (../shared/devtools/images/responsivemode/responsive-horizontal-resizer@2x.png)
skin/classic/browser/devtools/responsiveui-rotate.png (../shared/devtools/images/responsivemode/responsiveui-rotate.png)
skin/classic/browser/devtools/responsiveui-rotate@2x.png (../shared/devtools/images/responsivemode/responsiveui-rotate@2x.png)
skin/classic/browser/devtools/responsiveui-touch.png (../shared/devtools/images/responsivemode/responsiveui-touch.png)
skin/classic/browser/devtools/responsiveui-touch@2x.png (../shared/devtools/images/responsivemode/responsiveui-touch@2x.png)
skin/classic/browser/devtools/responsiveui-screenshot.png (../shared/devtools/images/responsivemode/responsiveui-screenshot.png)
skin/classic/browser/devtools/responsiveui-screenshot@2x.png (../shared/devtools/images/responsivemode/responsiveui-screenshot@2x.png)
skin/classic/browser/devtools/toggle-tools.png (../shared/devtools/images/toggle-tools.png)
skin/classic/browser/devtools/dock-bottom@2x.png (../shared/devtools/images/dock-bottom@2x.png)
skin/classic/browser/devtools/dock-side@2x.png (../shared/devtools/images/dock-side@2x.png)
@ -427,9 +435,6 @@ browser.jar:
skin/classic/browser/devtools/font-inspector.css (../shared/devtools/font-inspector.css)
skin/classic/browser/devtools/computedview.css (../shared/devtools/computedview.css)
skin/classic/browser/devtools/arrow-e.png (../shared/devtools/images/arrow-e.png)
skin/classic/browser/devtools/responsiveui-rotate.png (../shared/devtools/responsiveui-rotate.png)
skin/classic/browser/devtools/responsiveui-touch.png (../shared/devtools/responsiveui-touch.png)
skin/classic/browser/devtools/responsiveui-screenshot.png (../shared/devtools/responsiveui-screenshot.png)
skin/classic/browser/devtools/projecteditor/projecteditor.css (../shared/devtools/projecteditor/projecteditor.css)
skin/classic/browser/devtools/projecteditor/file-icons-sheet@2x.png (../shared/devtools/projecteditor/file-icons-sheet@2x.png)
skin/classic/browser/devtools/app-manager/connection-footer.css (../shared/devtools/app-manager/connection-footer.css)

View File

@ -4,6 +4,20 @@
%include ../../../shared/incontentprefs/preferences.css
prefpane .groupbox-title {
background: none;
margin-bottom: 0;
}
tabs {
padding-right: 0;
padding-left: 0;
}
tab[selected] {
text-shadow: none;
}
menulist:not([editable="true"]) > menupopup > menuitem[checked="true"]::before,
menulist:not([editable="true"]) > menupopup > menuitem[selected="true"]::before {
display: none;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 927 B

View File

@ -7,7 +7,7 @@
/* Responsive Mode */
.browserContainer[responsivemode] {
background: #222 url("chrome://browser/skin/devtools/responsive-background.png");
background-color: #222;
padding: 0 20px 20px 20px;
}
@ -43,6 +43,11 @@
color: inherit;
}
.devtools-responsiveui-toolbarbutton > .toolbarbutton-icon {
width: 16px;
height: 16px;
}
.devtools-responsiveui-toolbarbutton > .toolbarbutton-menubutton-button {
-moz-box-orient: horizontal;
}
@ -135,6 +140,16 @@
list-style-image: url("chrome://browser/skin/devtools/responsiveui-rotate.png");
}
@media (min-resolution: 2dppx) {
.devtools-responsiveui-close {
list-style-image: url("chrome://browser/skin/devtools/close@2x.png");
}
.devtools-responsiveui-rotate {
list-style-image: url("chrome://browser/skin/devtools/responsiveui-rotate@2x.png");
}
}
.devtools-responsiveui-touch {
list-style-image: url("chrome://browser/skin/devtools/responsiveui-touch.png");
-moz-image-region: rect(0px,16px,16px,0px);
@ -144,15 +159,33 @@
-moz-image-region: rect(0px,32px,16px,16px);
}
@media (min-resolution: 2dppx) {
.devtools-responsiveui-touch {
list-style-image: url("chrome://browser/skin/devtools/responsiveui-touch@2x.png");
-moz-image-region: rect(0px,32px,32px,0px);
}
.devtools-responsiveui-touch[checked] {
-moz-image-region: rect(0px,64px,32px,32px);
}
}
.devtools-responsiveui-screenshot {
list-style-image: url("chrome://browser/skin/devtools/responsiveui-screenshot.png");
}
@media (min-resolution: 2dppx) {
.devtools-responsiveui-screenshot {
list-style-image: url("chrome://browser/skin/devtools/responsiveui-screenshot@2x.png");
}
}
.devtools-responsiveui-resizebarV {
width: 7px;
height: 24px;
cursor: ew-resize;
transform: translate(12px, -12px);
background-size: cover;
background-image: url("chrome://browser/skin/devtools/responsive-vertical-resizer.png");
}
@ -161,6 +194,7 @@
height: 7px;
cursor: ns-resize;
transform: translate(-12px, 12px);
background-size: cover;
background-image: url("chrome://browser/skin/devtools/responsive-horizontal-resizer.png");
}
@ -169,5 +203,20 @@
height: 16px;
cursor: se-resize;
transform: translate(12px, 12px);
background-size: cover;
background-image: url("chrome://browser/skin/devtools/responsive-se-resizer.png");
}
@media (min-resolution: 2dppx) {
.devtools-responsiveui-resizebarV {
background-image: url("chrome://browser/skin/devtools/responsive-vertical-resizer@2x.png");
}
.devtools-responsiveui-resizebarH {
background-image: url("chrome://browser/skin/devtools/responsive-horizontal-resizer@2x.png");
}
.devtools-responsiveui-resizehandle {
background-image: url("chrome://browser/skin/devtools/responsive-se-resizer@2x.png");
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 528 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 834 B

View File

@ -12,7 +12,7 @@
page {
-moz-appearance: none;
background-image: linear-gradient(#FFFFFF, #EDEDED 100px);
background-color: white;
}
* {
@ -84,10 +84,9 @@ tabpanels {
tabs {
-moz-margin-start: 60px;
margin-bottom: 15px;
border-top: 2px solid;
border-bottom: 2px solid;
-moz-border-top-colors: #BBBBBB #F9F9F9;
-moz-border-bottom-colors: #F9F9F9 #BBBBBB;
border-top: 1px solid #c1c1c1;
border-bottom: 1px solid #c1c1c1;
background-color: #fbfbfb;
}
.tabs-left,
@ -98,38 +97,26 @@ tabs {
tab {
-moz-appearance: none;
margin-top: 0;
padding: 0;
-moz-margin-end: 30px;
min-height: 60px;
background-color: transparent;
padding: 0 20px;
min-height: 44px;
color: #424f5a;
background-color: #fbfbfb;
border-width: 0;
border-bottom: 3px solid transparent;
transition: background-color 50ms ease 0s;
}
tab:hover {
background-color: #ebebeb;
}
tab[selected] {
border-bottom-color: #FF9500;
background-color: #ebebeb;
box-shadow: inset 0 -4px 0 0 #ff9500;
}
.tab-text {
font-size: 1.3rem;
line-height: 22px;
color: #333333;
border: 1px solid transparent;
border-radius: 5px;
}
tab:not([selected]):hover > .tab-middle > .tab-text {
background-color: rgba(255,255,255,0.5);
border-color: #FFFFFF;
}
tab:not([selected]):hover:active > .tab-middle > .tab-text {
background-color: rgba(0,0,0,0.03);
}
tab[selected] > .tab-middle > .tab-text {
font-weight: bold;
color: #424E5A;
}
/* buttons and menulists */

View File

@ -310,10 +310,18 @@ browser.jar:
skin/classic/browser/devtools/debugger-toggleBreakpoints@2x.png (../shared/devtools/images/debugger-toggleBreakpoints@2x.png)
skin/classic/browser/devtools/tracer-icon.png (../shared/devtools/images/tracer-icon.png)
skin/classic/browser/devtools/tracer-icon@2x.png (../shared/devtools/images/tracer-icon@2x.png)
skin/classic/browser/devtools/responsive-se-resizer.png (../shared/devtools/images/responsive-se-resizer.png)
skin/classic/browser/devtools/responsive-vertical-resizer.png (../shared/devtools/images/responsive-vertical-resizer.png)
skin/classic/browser/devtools/responsive-horizontal-resizer.png (../shared/devtools/images/responsive-horizontal-resizer.png)
skin/classic/browser/devtools/responsive-background.png (../shared/devtools/images/responsive-background.png)
skin/classic/browser/devtools/responsive-se-resizer.png (../shared/devtools/images/responsivemode/responsive-se-resizer.png)
skin/classic/browser/devtools/responsive-se-resizer@2x.png (../shared/devtools/images/responsivemode/responsive-se-resizer@2x.png)
skin/classic/browser/devtools/responsive-vertical-resizer.png (../shared/devtools/images/responsivemode/responsive-vertical-resizer.png)
skin/classic/browser/devtools/responsive-vertical-resizer@2x.png (../shared/devtools/images/responsivemode/responsive-vertical-resizer@2x.png)
skin/classic/browser/devtools/responsive-horizontal-resizer.png (../shared/devtools/images/responsivemode/responsive-horizontal-resizer.png)
skin/classic/browser/devtools/responsive-horizontal-resizer@2x.png (../shared/devtools/images/responsivemode/responsive-horizontal-resizer@2x.png)
skin/classic/browser/devtools/responsiveui-rotate.png (../shared/devtools/images/responsivemode/responsiveui-rotate.png)
skin/classic/browser/devtools/responsiveui-rotate@2x.png (../shared/devtools/images/responsivemode/responsiveui-rotate@2x.png)
skin/classic/browser/devtools/responsiveui-touch.png (../shared/devtools/images/responsivemode/responsiveui-touch.png)
skin/classic/browser/devtools/responsiveui-touch@2x.png (../shared/devtools/images/responsivemode/responsiveui-touch@2x.png)
skin/classic/browser/devtools/responsiveui-screenshot.png (../shared/devtools/images/responsivemode/responsiveui-screenshot.png)
skin/classic/browser/devtools/responsiveui-screenshot@2x.png (../shared/devtools/images/responsivemode/responsiveui-screenshot@2x.png)
skin/classic/browser/devtools/toggle-tools.png (../shared/devtools/images/toggle-tools.png)
skin/classic/browser/devtools/dock-bottom@2x.png (../shared/devtools/images/dock-bottom@2x.png)
skin/classic/browser/devtools/dock-side@2x.png (../shared/devtools/images/dock-side@2x.png)
@ -346,9 +354,6 @@ browser.jar:
skin/classic/browser/devtools/font-inspector.css (../shared/devtools/font-inspector.css)
skin/classic/browser/devtools/computedview.css (../shared/devtools/computedview.css)
skin/classic/browser/devtools/arrow-e.png (../shared/devtools/images/arrow-e.png)
skin/classic/browser/devtools/responsiveui-rotate.png (../shared/devtools/responsiveui-rotate.png)
skin/classic/browser/devtools/responsiveui-touch.png (../shared/devtools/responsiveui-touch.png)
skin/classic/browser/devtools/responsiveui-screenshot.png (../shared/devtools/responsiveui-screenshot.png)
skin/classic/browser/devtools/projecteditor/projecteditor.css (../shared/devtools/projecteditor/projecteditor.css)
skin/classic/browser/devtools/projecteditor/file-icons-sheet@2x.png (../shared/devtools/projecteditor/file-icons-sheet@2x.png)
skin/classic/browser/devtools/app-manager/connection-footer.css (../shared/devtools/app-manager/connection-footer.css)
@ -705,10 +710,18 @@ browser.jar:
skin/classic/aero/browser/devtools/debugger-toggleBreakpoints@2x.png (../shared/devtools/images/debugger-toggleBreakpoints@2x.png)
skin/classic/aero/browser/devtools/tracer-icon.png (../shared/devtools/images/tracer-icon.png)
skin/classic/aero/browser/devtools/tracer-icon@2x.png (../shared/devtools/images/tracer-icon@2x.png)
skin/classic/aero/browser/devtools/responsive-se-resizer.png (../shared/devtools/images/responsive-se-resizer.png)
skin/classic/aero/browser/devtools/responsive-vertical-resizer.png (../shared/devtools/images/responsive-vertical-resizer.png)
skin/classic/aero/browser/devtools/responsive-horizontal-resizer.png (../shared/devtools/images/responsive-horizontal-resizer.png)
skin/classic/aero/browser/devtools/responsive-background.png (../shared/devtools/images/responsive-background.png)
skin/classic/aero/browser/devtools/responsive-se-resizer.png (../shared/devtools/images/responsivemode/responsive-se-resizer.png)
skin/classic/aero/browser/devtools/responsive-se-resizer@2x.png (../shared/devtools/images/responsivemode/responsive-se-resizer@2x.png)
skin/classic/aero/browser/devtools/responsive-vertical-resizer.png (../shared/devtools/images/responsivemode/responsive-vertical-resizer.png)
skin/classic/aero/browser/devtools/responsive-vertical-resizer@2x.png (../shared/devtools/images/responsivemode/responsive-vertical-resizer@2x.png)
skin/classic/aero/browser/devtools/responsive-horizontal-resizer.png (../shared/devtools/images/responsivemode/responsive-horizontal-resizer.png)
skin/classic/aero/browser/devtools/responsive-horizontal-resizer@2x.png (../shared/devtools/images/responsivemode/responsive-horizontal-resizer@2x.png)
skin/classic/aero/browser/devtools/responsiveui-rotate.png (../shared/devtools/images/responsivemode/responsiveui-rotate.png)
skin/classic/aero/browser/devtools/responsiveui-rotate@2x.png (../shared/devtools/images/responsivemode/responsiveui-rotate@2x.png)
skin/classic/aero/browser/devtools/responsiveui-touch.png (../shared/devtools/images/responsivemode/responsiveui-touch.png)
skin/classic/aero/browser/devtools/responsiveui-touch@2x.png (../shared/devtools/images/responsivemode/responsiveui-touch@2x.png)
skin/classic/aero/browser/devtools/responsiveui-screenshot.png (../shared/devtools/images/responsivemode/responsiveui-screenshot.png)
skin/classic/aero/browser/devtools/responsiveui-screenshot@2x.png (../shared/devtools/images/responsivemode/responsiveui-screenshot@2x.png)
skin/classic/aero/browser/devtools/toggle-tools.png (../shared/devtools/images/toggle-tools.png)
skin/classic/aero/browser/devtools/dock-bottom@2x.png (../shared/devtools/images/dock-bottom@2x.png)
skin/classic/aero/browser/devtools/dock-side@2x.png (../shared/devtools/images/dock-side@2x.png)
@ -741,9 +754,6 @@ browser.jar:
skin/classic/aero/browser/devtools/font-inspector.css (../shared/devtools/font-inspector.css)
skin/classic/aero/browser/devtools/computedview.css (../shared/devtools/computedview.css)
skin/classic/aero/browser/devtools/arrow-e.png (../shared/devtools/images/arrow-e.png)
skin/classic/aero/browser/devtools/responsiveui-rotate.png (../shared/devtools/responsiveui-rotate.png)
skin/classic/aero/browser/devtools/responsiveui-touch.png (../shared/devtools/responsiveui-touch.png)
skin/classic/aero/browser/devtools/responsiveui-screenshot.png (../shared/devtools/responsiveui-screenshot.png)
skin/classic/aero/browser/devtools/projecteditor/projecteditor.css (../shared/devtools/projecteditor/projecteditor.css)
skin/classic/aero/browser/devtools/projecteditor/file-icons-sheet@2x.png (../shared/devtools/projecteditor/file-icons-sheet@2x.png)
skin/classic/aero/browser/devtools/app-manager/connection-footer.css (../shared/devtools/app-manager/connection-footer.css)

View File

@ -4,6 +4,10 @@
%include ../../../shared/incontentprefs/preferences.css
caption {
background-color: transparent;
}
menulist:not([editable="true"]) > .menulist-dropmarker {
margin-top: 1px;
margin-bottom: 1px;

View File

@ -416,19 +416,6 @@ abstract public class BrowserApp extends GeckoApp
return values;
}
void handleReaderRemoved(final String url) {
ThreadUtils.postToBackgroundThread(new Runnable() {
@Override
public void run() {
BrowserDB.removeReadingListItemWithURL(getContentResolver(), url);
showToast(R.string.page_removed, Toast.LENGTH_SHORT);
final int count = BrowserDB.getReadingListCount(getContentResolver());
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Reader:ListCountUpdated", Integer.toString(count)));
}
});
}
private void handleReaderFaviconRequest(final String url) {
(new UiAsyncTask<Void, Void, String>(ThreadUtils.getBackgroundHandler()) {
@Override
@ -542,7 +529,6 @@ abstract public class BrowserApp extends GeckoApp
"Menu:Add",
"Menu:Remove",
"Reader:ListStatusRequest",
"Reader:Removed",
"Reader:Share",
"Settings:Show",
"Telemetry:Gather",
@ -900,7 +886,6 @@ abstract public class BrowserApp extends GeckoApp
"Menu:Add",
"Menu:Remove",
"Reader:ListStatusRequest",
"Reader:Removed",
"Reader:Share",
"Settings:Show",
"Telemetry:Gather",
@ -1231,10 +1216,6 @@ abstract public class BrowserApp extends GeckoApp
} else if ("Reader:ListStatusRequest".equals(event)) {
handleReaderListStatusRequest(message.getString("url"));
} else if ("Reader:Removed".equals(event)) {
final String url = message.getString("url");
handleReaderRemoved(url);
} else if ("Reader:Share".equals(event)) {
final String title = message.getString("title");
final String url = message.getString("url");

View File

@ -499,10 +499,6 @@ public abstract class GeckoApp
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mToast != null) {
mToast.onSaveInstanceState(outState);
}
outState.putBoolean(SAVED_STATE_IN_BACKGROUND, isApplicationInBackground());
outState.putString(SAVED_STATE_PRIVATE_SESSION, mPrivateBrowsingSession);
}

View File

@ -154,8 +154,15 @@ public class Telemetry {
}
}
/**
* @param method A non-null method (if null is desired, consider using Method.NONE)
*/
private static void sendUIEvent(final String eventName, final Method method,
final long timestamp, final String extras) {
if (method == null) {
throw new IllegalArgumentException("Expected non-null method - use Method.NONE?");
}
Log.d(LOGTAG, "SendUIEvent: event = " + eventName + " method = " + method +
" timestamp = " + timestamp + " extras = " + extras);
final GeckoEvent geckoEvent = GeckoEvent.createTelemetryUIEvent(

View File

@ -26,6 +26,7 @@ import org.mozilla.gecko.PrefsHelper;
import org.mozilla.gecko.R;
import org.mozilla.gecko.Telemetry;
import org.mozilla.gecko.TelemetryContract;
import org.mozilla.gecko.TelemetryContract.Method;
import org.mozilla.gecko.background.announcements.AnnouncementsConstants;
import org.mozilla.gecko.background.common.GlobalConstants;
import org.mozilla.gecko.background.healthreport.HealthReportConstants;
@ -854,9 +855,9 @@ OnSharedPreferenceChangeListener
if (null == localeManager.setSelectedLocale(context, newValue)) {
localeManager.updateConfiguration(context, Locale.getDefault());
}
Telemetry.sendUIEvent(TelemetryContract.Event.LOCALE_BROWSER_UNSELECTED, null,
Telemetry.sendUIEvent(TelemetryContract.Event.LOCALE_BROWSER_UNSELECTED, Method.NONE,
currentLocale == null ? "unknown" : currentLocale);
Telemetry.sendUIEvent(TelemetryContract.Event.LOCALE_BROWSER_SELECTED, null, newValue);
Telemetry.sendUIEvent(TelemetryContract.Event.LOCALE_BROWSER_SELECTED, Method.NONE, newValue);
}
ThreadUtils.postToUiThread(new Runnable() {

View File

@ -6,6 +6,7 @@ package org.mozilla.gecko.preferences;
import org.mozilla.gecko.Telemetry;
import org.mozilla.gecko.TelemetryContract;
import org.mozilla.gecko.TelemetryContract.Method;
import org.mozilla.gecko.home.HomeConfig;
import org.mozilla.gecko.home.HomeConfig.PanelConfig;
import org.mozilla.gecko.home.HomeConfig.State;
@ -162,7 +163,7 @@ public class PanelsPreferenceCategory extends CustomListCategory {
mConfigEditor.setDefault(id);
mConfigEditor.apply();
Telemetry.sendUIEvent(TelemetryContract.Event.PANEL_SET_DEFAULT, null, id);
Telemetry.sendUIEvent(TelemetryContract.Event.PANEL_SET_DEFAULT, Method.NONE, id);
}
@Override

View File

@ -38,13 +38,12 @@ public class ButtonToast {
private final TextView mMessageView;
private final Button mButton;
private final Handler mHideHandler = new Handler();
private final LinkedList<Toast> mQueue = new LinkedList<Toast>();
private Toast mCurrentToast;
public enum ReasonHidden {
CLICKED,
TIMEOUT,
REPLACED,
STARTUP
}
@ -104,10 +103,10 @@ public class ButtonToast {
}
private void show(Toast t, boolean immediate) {
// If we're already showing a toast, add this one to the queue to show later
if (mView.getVisibility() == View.VISIBLE) {
mQueue.offer(t);
return;
// If we're already showing a toast, replace it with the new one by hiding the old one and quickly showing the new one.
if (mCurrentToast != null) {
hide(true, ReasonHidden.REPLACED);
immediate = true;
}
mCurrentToast = t;
@ -130,11 +129,6 @@ public class ButtonToast {
}
public void hide(boolean immediate, ReasonHidden reason) {
if (mButton.isPressed() && reason != ReasonHidden.CLICKED) {
mHideHandler.postDelayed(mHideRunnable, TOAST_DURATION);
return;
}
if (mCurrentToast != null && mCurrentToast.listener != null) {
mCurrentToast.listener.onToastHidden(reason);
}
@ -146,7 +140,6 @@ public class ButtonToast {
mView.clearAnimation();
if (immediate) {
mView.setVisibility(View.GONE);
showNextInQueue();
} else {
// Using Android's animation frameworks will not correctly turn off clicking.
// See bug 885717.
@ -157,7 +150,6 @@ public class ButtonToast {
// onAnimationEnd will be called when the app is restored
public void onPropertyAnimationEnd() {
mView.setVisibility(View.GONE);
showNextInQueue();
}
public void onPropertyAnimationStart() { }
});
@ -165,20 +157,6 @@ public class ButtonToast {
}
}
public void onSaveInstanceState(Bundle outState) {
// Add whatever toast we're currently showing to the front of the queue
if (mCurrentToast != null) {
mQueue.add(0, mCurrentToast);
}
}
private void showNextInQueue() {
Toast t = mQueue.poll();
if (t != null) {
show(t, false);
}
}
private Runnable mHideRunnable = new Runnable() {
@Override
public void run() {

View File

@ -7523,13 +7523,6 @@ let Reader = {
let url = aData;
this.removeArticleFromCache(url, function(success) {
this.log("Reader:Remove success=" + success + ", url=" + url);
if (success) {
sendMessageToJava({
type: "Reader:Removed",
url: url
});
}
}.bind(this));
break;
}

View File

@ -376,22 +376,26 @@
<handler event="keypress" keycode="VK_UP" phase="target">
this.checkAdjacentElement(false);
event.stopPropagation();
event.preventDefault();
</handler>
<handler event="keypress" keycode="VK_LEFT" phase="target">
// left arrow goes back when we are ltr, forward when we are rtl
this.checkAdjacentElement(document.defaultView.getComputedStyle(
this, "").direction == "rtl");
event.stopPropagation();
event.preventDefault();
</handler>
<handler event="keypress" keycode="VK_DOWN" phase="target">
this.checkAdjacentElement(true);
event.stopPropagation();
event.preventDefault();
</handler>
<handler event="keypress" keycode="VK_RIGHT" phase="target">
// right arrow goes forward when we are ltr, back when we are rtl
this.checkAdjacentElement(document.defaultView.getComputedStyle(
this, "").direction == "ltr");
event.stopPropagation();
event.preventDefault();
</handler>
<!-- set a focused attribute on the selected item when the group

View File

@ -30,6 +30,7 @@ const protocol = require("devtools/server/protocol");
const {method, Arg, RetVal, types} = protocol;
const events = require("sdk/event/core");
const Heritage = require("sdk/core/heritage");
const {setTimeout, clearTimeout} = require("sdk/timers");
const EventEmitter = require("devtools/toolkit/event-emitter");
exports.register = function(handle) {
@ -148,7 +149,6 @@ exports.ReflowFront = protocol.FrontClass(ReflowActor, {
*/
function Observable(tabActor, callback) {
this.tabActor = tabActor;
this.win = tabActor.window;
this.callback = callback;
}
@ -199,7 +199,6 @@ Observable.prototype = {
destroy: function() {
this.stop();
this.callback = null;
this.win = null;
this.tabActor = null;
}
};
@ -237,6 +236,8 @@ function LayoutChangesObserver(tabActor) {
EventEmitter.decorate(this);
}
exports.LayoutChangesObserver = LayoutChangesObserver;
LayoutChangesObserver.prototype = Heritage.extend(Observable.prototype, {
/**
* How long does this observer waits before emitting a batched reflows event.
@ -281,12 +282,20 @@ LayoutChangesObserver.prototype = Heritage.extend(Observable.prototype, {
this.emit("reflows", this.reflows);
this.reflows = [];
}
this.eventLoopTimer = this.win.setTimeout(this._startEventLoop,
this.eventLoopTimer = this._setTimeout(this._startEventLoop,
this.EVENT_BATCHING_DELAY);
},
_stopEventLoop: function() {
this.win.clearTimeout(this.eventLoopTimer);
this._clearTimeout(this.eventLoopTimer);
},
// Exposing set/clearTimeout here to let tests override them if needed
_setTimeout: function(cb, ms) {
return setTimeout(cb, ms);
},
_clearTimeout: function(t) {
return clearTimeout(t);
},
/**
@ -362,21 +371,60 @@ exports.releaseLayoutChangesObserver = releaseLayoutChangesObserver;
*/
function ReflowObserver(tabActor, callback) {
Observable.call(this, tabActor, callback);
this.docshell = this.win.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShell);
this._onWindowReady = this._onWindowReady.bind(this);
events.on(this.tabActor, "window-ready", this._onWindowReady);
this._onWindowDestroyed = this._onWindowDestroyed.bind(this);
events.on(this.tabActor, "window-destroyed", this._onWindowDestroyed);
}
ReflowObserver.prototype = Heritage.extend(Observable.prototype, {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIReflowObserver,
Ci.nsISupportsWeakReference]),
_onWindowReady: function({window}) {
if (this.observing) {
this._startListeners([window]);
}
},
_onWindowDestroyed: function({window}) {
if (this.observing) {
this._stopListeners([window]);
}
},
_start: function() {
this.docshell.addWeakReflowObserver(this);
this._startListeners(this.tabActor.windows);
},
_stop: function() {
this.docshell.removeWeakReflowObserver(this);
if (this.tabActor.attached && this.tabActor.docShell) {
// It's only worth stopping if the tabActor is still attached
this._stopListeners(this.tabActor.windows);
}
},
_startListeners: function(windows) {
for (let window of windows) {
let docshell = window.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShell);
docshell.addWeakReflowObserver(this);
}
},
_stopListeners: function(windows) {
for (let window of windows) {
// Corner cases where a global has already been freed may happen, in which
// case, no need to remove the observer
try {
let docshell = window.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShell);
docshell.removeWeakReflowObserver(this);
} catch (e) {}
}
},
reflow: function(start, end) {
@ -388,7 +436,13 @@ ReflowObserver.prototype = Heritage.extend(Observable.prototype, {
},
destroy: function() {
if (this._isDestroyed) {
return;
}
this._isDestroyed = true;
events.off(this.tabActor, "window-ready", this._onWindowReady);
events.off(this.tabActor, "window-destroyed", this._onWindowDestroyed);
Observable.prototype.destroy.call(this);
this.docshell = null;
}
});

View File

@ -141,18 +141,52 @@ RootActor.prototype = {
*/
get window() Services.wm.getMostRecentWindow(DebuggerServer.chromeWindowType),
/**
* The list of all windows
*/
get windows() {
return this.docShells.map(docShell => {
return docShell.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow);
});
},
/**
* URL of the chrome window.
*/
get url() { return this.window ? this.window.document.location.href : null; },
/**
* The top level window's docshell
*/
get docShell() {
return this.window
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDocShell);
},
/**
* The list of all docshells
*/
get docShells() {
let docShellsEnum = this.docShell.getDocShellEnumerator(
Ci.nsIDocShellTreeItem.typeAll,
Ci.nsIDocShell.ENUMERATE_FORWARDS
);
let docShells = [];
while (docShellsEnum.hasMoreElements()) {
docShells.push(docShellsEnum.getNext());
}
return docShells;
},
/**
* Getter for the best nsIWebProgress for to watching this window.
*/
get webProgress() {
return this.window
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDocShell)
return this.docShell
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebProgress);
},

View File

@ -13,7 +13,7 @@ let { RootActor } = require("devtools/server/actors/root");
let { AddonThreadActor, ThreadActor } = require("devtools/server/actors/script");
let { DebuggerServer } = require("devtools/server/main");
let DevToolsUtils = require("devtools/toolkit/DevToolsUtils");
let { dbg_assert, dumpn } = DevToolsUtils;
let { dbg_assert } = DevToolsUtils;
let {Promise: promise} = Cu.import("resource://gre/modules/Promise.jsm", {});
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
@ -567,6 +567,24 @@ TabActor.prototype = {
throw "The docShell getter should be implemented by a subclass of TabActor";
},
/**
* Getter for the list of all docshell in this tabActor
* @return {Array}
*/
get docShells() {
let docShellsEnum = this.docShell.getDocShellEnumerator(
Ci.nsIDocShellTreeItem.typeAll,
Ci.nsIDocShell.ENUMERATE_FORWARDS
);
let docShells = [];
while (docShellsEnum.hasMoreElements()) {
docShells.push(docShellsEnum.getNext());
}
return docShells;
},
/**
* Getter for the tab content's DOM window.
*/
@ -576,6 +594,17 @@ TabActor.prototype = {
.getInterface(Ci.nsIDOMWindow);
},
/**
* Getter for the list of all content DOM windows in this tabActor
* @return {Array}
*/
get windows() {
return this.docShells.map(docShell => {
return docShell.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow);
});
},
/**
* Getter for the nsIWebProgress for watching this window.
*/
@ -740,7 +769,7 @@ TabActor.prototype = {
/**
* Does the actual work of detaching from a tab.
*
* @returns false if the tab wasn't attached or true of detahing succeeds.
* @returns false if the tab wasn't attached or true of detaching succeeds.
*/
_detach: function BTA_detach() {
if (!this.attached) {
@ -752,6 +781,7 @@ TabActor.prototype = {
if (this.docShell) {
this._progressListener.unwatch(this.docShell);
}
this._progressListener.destroy();
this._progressListener = null;
this._popContext();
@ -945,7 +975,6 @@ TabActor.prototype = {
*/
_windowReady: function (window) {
let isTopLevel = window == this.window;
dumpn("window-ready: " + window.location + " isTopLevel:" + isTopLevel);
events.emit(this, "window-ready", {
window: window,
@ -970,6 +999,13 @@ TabActor.prototype = {
}
},
_windowDestroyed: function (window) {
events.emit(this, "window-destroyed", {
window: window,
isTopLevel: window == this.window
});
},
/**
* Start notifying server codebase and client about a new document
* being loaded in the currently targeted context.
@ -989,7 +1025,6 @@ TabActor.prototype = {
request: request
});
// We don't do anything for inner frames in TabActor.
// (we will only update thread actor on window-ready)
if (!isTopLevel) {
@ -1390,6 +1425,15 @@ BrowserAddonActor.prototype.requestTypes = {
function DebuggerProgressListener(aTabActor) {
this._tabActor = aTabActor;
this._onWindowCreated = this.onWindowCreated.bind(this);
this._onWindowHidden = this.onWindowHidden.bind(this);
// Watch for windows destroyed (global observer that will need filtering)
Services.obs.addObserver(this, "inner-window-destroyed", false);
// XXX: for now we maintain the list of windows we know about in this instance
// so that we can discriminate windows we care about when observing
// inner-window-destroyed events. Bug 1016952 would remove the need for this.
this._knownWindowIDs = new Map();
}
DebuggerProgressListener.prototype = {
@ -1399,7 +1443,13 @@ DebuggerProgressListener.prototype = {
Ci.nsISupports,
]),
watch: function DPL_watch(docShell) {
destroy: function() {
Services.obs.removeObserver(this, "inner-window-destroyed", false);
this._knownWindowIDs.clear();
this._knownWindowIDs = null;
},
watch: function(docShell) {
let webProgress = docShell.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebProgress);
webProgress.addProgressListener(this, Ci.nsIWebProgress.NOTIFY_STATUS |
@ -1407,52 +1457,116 @@ DebuggerProgressListener.prototype = {
Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
// TODO: fix docShell.chromeEventHandler in child processes!
let chromeEventHandler = docShell.chromeEventHandler ||
docShell.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIContentFrameMessageManager);
let handler = docShell.chromeEventHandler ||
docShell.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIContentFrameMessageManager);
// Watch for globals being created in this docshell tree.
chromeEventHandler.addEventListener("DOMWindowCreated",
this._onWindowCreated, true);
chromeEventHandler.addEventListener("pageshow",
this._onWindowCreated, true);
handler.addEventListener("DOMWindowCreated", this._onWindowCreated, true);
handler.addEventListener("pageshow", this._onWindowCreated, true);
handler.addEventListener("pagehide", this._onWindowHidden, true);
// Dispatch the _windowReady event on the tabActor for pre-existing windows
for (let win of this._getWindowsInDocShell(docShell)) {
this._tabActor._windowReady(win);
this._knownWindowIDs.set(this._getWindowID(win), win);
}
},
unwatch: function DPL_unwatch(docShell) {
unwatch: function(docShell) {
let webProgress = docShell.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebProgress);
webProgress.removeProgressListener(this);
// TODO: fix docShell.chromeEventHandler in child processes!
let chromeEventHandler = docShell.chromeEventHandler ||
docShell.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIContentFrameMessageManager);
chromeEventHandler.removeEventListener("DOMWindowCreated",
this._onWindowCreated, true);
chromeEventHandler.removeEventListener("pageshow",
this._onWindowCreated, true);
let handler = docShell.chromeEventHandler ||
docShell.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIContentFrameMessageManager);
handler.removeEventListener("DOMWindowCreated", this._onWindowCreated, true);
handler.removeEventListener("pageshow", this._onWindowCreated, true);
handler.removeEventListener("pagehide", this._onWindowHidden, true);
for (let win of this._getWindowsInDocShell(docShell)) {
this._knownWindowIDs.delete(this._getWindowID(win));
}
},
onWindowCreated:
DevToolsUtils.makeInfallible(function DPL_onWindowCreated(evt) {
// Ignore any event if the tab actor isn't attached.
_getWindowsInDocShell: function(docShell) {
let docShellsEnum = docShell.getDocShellEnumerator(
Ci.nsIDocShellTreeItem.typeAll,
Ci.nsIDocShell.ENUMERATE_FORWARDS
);
let windows = [];
while (docShellsEnum.hasMoreElements()) {
let w = docShellsEnum.getNext().QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow);
windows.push(w);
}
return windows;
},
_getWindowID: function(window) {
return window.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindowUtils)
.currentInnerWindowID;
},
onWindowCreated: DevToolsUtils.makeInfallible(function(evt) {
if (!this._tabActor.attached) {
return;
}
// pageshow events for non-persisted pages have already been handled by a
// prior DOMWindowCreated event.
// prior DOMWindowCreated event. For persisted pages, act as if the window
// had just been created since it's been unfrozen from bfcache.
if (evt.type == "pageshow" && !evt.persisted) {
return;
}
let window = evt.target.defaultView;
this._tabActor._windowReady(window);
if (evt.type !== "pageshow") {
this._knownWindowIDs.set(this._getWindowID(window), window);
}
}, "DebuggerProgressListener.prototype.onWindowCreated"),
onWindowHidden: DevToolsUtils.makeInfallible(function(evt) {
if (!this._tabActor.attached) {
return;
}
// Only act as if the window has been destroyed if the 'pagehide' event
// was sent for a persisted window (persisted is set when the page is put
// and frozen in the bfcache). If the page isn't persisted, the observer's
// inner-window-destroyed event will handle it.
if (!evt.persisted) {
return;
}
let window = evt.target.defaultView;
this._tabActor._windowDestroyed(window);
}, "DebuggerProgressListener.prototype.onWindowHidden"),
observe: DevToolsUtils.makeInfallible(function(subject, topic) {
if (!this._tabActor.attached) {
return;
}
// Because this observer will be called for all inner-window-destroyed in
// the application, we need to filter out events for windows we are not
// watching
let innerID = subject.QueryInterface(Ci.nsISupportsPRUint64).data;
let window = this._knownWindowIDs.get(innerID);
if (window) {
this._knownWindowIDs.delete(innerID);
this._tabActor._windowDestroyed(window);
}
}, "DebuggerProgressListener.prototype.observe"),
onStateChange:
DevToolsUtils.makeInfallible(function DPL_onStateChange(aProgress, aRequest, aFlag, aStatus) {
// Ignore any event if the tab actor isn't attached.
DevToolsUtils.makeInfallible(function(aProgress, aRequest, aFlag, aStatus) {
if (!this._tabActor.attached) {
return;
}

View File

@ -5,13 +5,22 @@
let {
getLayoutChangesObserver,
releaseLayoutChangesObserver
releaseLayoutChangesObserver,
LayoutChangesObserver
} = devtools.require("devtools/server/actors/layout");
// Override set/clearTimeout on LayoutChangesObserver to avoid depending on
// time in this unit test. This means that LayoutChangesObserver.eventLoopTimer
// will be the timeout callback instead of the timeout itself, so test cases
// will need to execute it to fake a timeout
LayoutChangesObserver.prototype._setTimeout = cb => cb;
LayoutChangesObserver.prototype._clearTimeout = function() {};
// Mock the tabActor since we only really want to test the LayoutChangesObserver
// and don't want to depend on a window object, nor want to test protocol.js
function MockTabActor() {
this.window = new MockWindow();
this.windows = [this.window];
}
function MockWindow() {}
@ -22,7 +31,9 @@ MockWindow.prototype = {
getInterface: function() {
return {
QueryInterface: function() {
self.docShell = new MockDocShell();
if (!self.docShell) {
self.docShell = new MockDocShell();
}
return self.docShell;
}
};
@ -91,7 +102,6 @@ function eventsAreBatched() {
// Note that in this test, we mock the TabActor and its window property, so we
// also mock the setTimeout/clearTimeout mechanism and just call the callback
// manually
let tabActor = new MockTabActor();
let observer = getLayoutChangesObserver(tabActor);

View File

@ -53,7 +53,6 @@ html|applet:not([height]), html|applet[height=""] {
word-spacing: initial;
letter-spacing: initial;
line-height: initial;
position: relative;
}
/* Initialize the overlay with visibility:hidden to prevent flickering if

View File

@ -16,7 +16,6 @@
background-color: rgb(72,72,72);
color: white;
-moz-user-select: none;
position: relative;
}
.hoverBox {
@ -168,22 +167,17 @@ html|a {
.closeIcon {
display: block;
position: absolute;
width: 16px;
height: 16px;
top: 4px;
right: 4px;
margin-top: 4px;
-moz-margin-start: -20px;
-moz-margin-end: 4px;
border: none;
background-color: transparent;
background-image: url("chrome://mozapps/skin/plugins/contentPluginClose.png");
background-repeat: no-repeat;
}
.mainBox[chromedir="rtl"] .closeIcon {
right: auto;
left: 4px;
}
.closeIcon:hover {
background-position: -16px 0;
}