Merge m-c to inbound.

This commit is contained in:
Ryan VanderMeulen 2014-01-08 15:37:08 -05:00
commit 7b891e49c7
116 changed files with 3672 additions and 6063 deletions

View File

@ -1,4 +1,4 @@
{
"revision": "65400ea2bb3e99ad717f4b99e24ebbfa23b05b58",
"revision": "3b850fa17c888bdd31f1a163fd7b92f6f020449d",
"repo_path": "/integration/gaia-central"
}

View File

@ -92,39 +92,6 @@ Object.freeze(SessionFile);
/**
* Utilities for dealing with promises and Task.jsm
*/
const TaskUtils = {
/**
* Add logging to a promise.
*
* @param {Promise} promise
* @return {Promise} A promise behaving as |promise|, but with additional
* logging in case of uncaught error.
*/
captureErrors: function captureErrors(promise) {
return promise.then(
null,
function onError(reason) {
console.error("Uncaught asynchronous error", reason, "at", reason.stack);
throw reason;
}
);
},
/**
* Spawn a new Task from a generator.
*
* This function behaves as |Task.spawn|, with the exception that it
* adds logging in case of uncaught error. For more information, see
* the documentation of |Task.jsm|.
*
* @param {generator} gen Some generator.
* @return {Promise} A promise built from |gen|, with the same semantics
* as |Task.spawn(gen)|.
*/
spawn: function spawn(gen) {
return this.captureErrors(Task.spawn(gen));
}
};
let SessionFileInternal = {
/**
* The path to sessionstore.js
@ -168,7 +135,7 @@ let SessionFileInternal = {
isFinalWrite = this._isClosed = true;
}
return this._latestWrite = TaskUtils.spawn(function task() {
return this._latestWrite = Task.spawn(function task() {
TelemetryStopwatch.start("FX_SESSION_RESTORE_WRITE_FILE_LONGEST_OP_MS", refObj);
try {

View File

@ -1035,6 +1035,11 @@ let SessionStoreInternal = {
winData._shouldRestore = true;
#endif
// Store the window's close date to figure out when each individual tab
// was closed. This timestamp should allow re-arranging data based on how
// recently something was closed.
winData.closedAt = Date.now();
// Save the window if it has multiple tabs or a single saveable tab and
// it's not private.
if (!winData.isPrivate && (winData.tabs.length > 1 ||
@ -1348,7 +1353,8 @@ let SessionStoreInternal = {
state: tabState,
title: tabTitle,
image: tabbrowser.getIcon(aTab),
pos: aTab._tPos
pos: aTab._tPos,
closedAt: Date.now()
});
var length = this._windows[aWindow.__SSi]._closedTabs.length;
if (length > this._max_tabs_undo)

View File

@ -130,6 +130,7 @@ SourcesView.prototype = Heritage.extend(WidgetMethods, {
let group = SourceUtils.getSourceGroup(url.split(" -> ").pop());
let contents = document.createElement("label");
contents.className = "plain dbg-source-item";
contents.setAttribute("value", label);
contents.setAttribute("crop", "start");
contents.setAttribute("flex", "1");
@ -1892,13 +1893,7 @@ VariableBubbleView.prototype = {
});
}
// Calculate the x, y coordinates for the variable bubble anchor.
let identifierCenter = { line: line - 1, ch: column + length / 2 };
let anchor = editor.getCoordsFromPosition(identifierCenter);
this._tooltip.defaultOffsetX = anchor.left + EDITOR_VARIABLE_POPUP_OFFSET_X;
this._tooltip.defaultOffsetY = anchor.top + EDITOR_VARIABLE_POPUP_OFFSET_Y;
this._tooltip.show(this._editorContainer);
this._tooltip.show(this._markedText.anchor);
},
/**
@ -2261,7 +2256,6 @@ EventListenersView.prototype = Heritage.extend(WidgetMethods, {
dumpn("Initializing the EventListenersView");
this.widget = new SideMenuWidget(document.getElementById("event-listeners"), {
theme: "light",
showItemCheckboxes: true,
showGroupCheckboxes: true
});
@ -3065,7 +3059,7 @@ LineResults.prototype = {
lineNumberNode.setAttribute("value", this.line + 1);
let lineContentsNode = document.createElement("hbox");
lineContentsNode.className = "light list-widget-item dbg-results-line-contents";
lineContentsNode.className = "dbg-results-line-contents";
lineContentsNode.classList.add("devtools-monospace");
lineContentsNode.setAttribute("flex", "1");

View File

@ -569,9 +569,7 @@ StackFramesClassicListView.prototype = Heritage.extend(WidgetMethods, {
initialize: function() {
dumpn("Initializing the StackFramesClassicListView");
this.widget = new SideMenuWidget(document.getElementById("callstack-list"), {
theme: "light"
});
this.widget = new SideMenuWidget(document.getElementById("callstack-list"));
this.widget.addEventListener("select", this._onSelect, false);
this.emptyText = L10N.getStr("noStackFramesText");
@ -868,7 +866,6 @@ FilterView.prototype = {
if (!aToken) {
return;
}
DebuggerView.editor.find(aToken);
},
@ -1000,6 +997,9 @@ FilterView.prototype = {
} else if (targetView.hidden) {
targetView.scheduleSearch(args[0], 0);
} else {
if (!targetView.selectedItem) {
targetView.selectedIndex = 0;
}
this.clearSearch();
}
return;
@ -1023,6 +1023,9 @@ FilterView.prototype = {
} else if (targetView.hidden) {
targetView.scheduleSearch(args[0], 0);
} else {
if (!targetView.selectedItem) {
targetView.selectedIndex = 0;
}
this.clearSearch();
}
return;
@ -1258,8 +1261,11 @@ FilteredSourcesView.prototype = Heritage.extend(ResultsPanelContainer.prototype,
});
}
// Select the first entry in this container.
this.selectedIndex = 0;
// There's at least one item displayed in this container. Don't select it
// automatically if not forced (by tests) or in tandem with an operator.
if (this._autoSelectFirstItem || DebuggerView.Filtering.searchOperator) {
this.selectedIndex = 0;
}
this.hidden = false;
// Signal that file search matches were found and displayed.
@ -1459,8 +1465,11 @@ FilteredFunctionsView.prototype = Heritage.extend(ResultsPanelContainer.prototyp
});
}
// Select the first entry in this container.
this.selectedIndex = 0;
// There's at least one item displayed in this container. Don't select it
// automatically if not forced (by tests).
if (this._autoSelectFirstItem) {
this.selectedIndex = 0;
}
this.hidden = false;
// Signal that function search matches were found and displayed.

View File

@ -27,9 +27,7 @@ const SEARCH_TOKEN_FLAG = "#";
const SEARCH_LINE_FLAG = ":";
const SEARCH_VARIABLE_FLAG = "*";
const EDITOR_VARIABLE_HOVER_DELAY = 350; // ms
const EDITOR_VARIABLE_POPUP_OFFSET_X = 5; // px
const EDITOR_VARIABLE_POPUP_OFFSET_Y = 0; // px
const EDITOR_VARIABLE_POPUP_POSITION = "before_start";
const EDITOR_VARIABLE_POPUP_POSITION = "topcenter bottomleft";
/**
* Object defining the debugger view components.
@ -682,7 +680,7 @@ ResultsPanelContainer.prototype = Heritage.extend(WidgetMethods, {
if (aNode) {
if (!this._panel) {
this._panel = document.createElement("panel");
this._panel.className = "results-panel";
this._panel.id = "results-panel";
this._panel.setAttribute("level", "top");
this._panel.setAttribute("noautofocus", "true");
this._panel.setAttribute("consumeoutsideclicks", "false");
@ -690,6 +688,8 @@ ResultsPanelContainer.prototype = Heritage.extend(WidgetMethods, {
}
if (!this.widget) {
this.widget = new SimpleListWidget(this._panel);
this.autoFocusOnFirstItem = false;
this.autoFocusOnSelection = false;
this.maintainSelectionVisible = false;
}
}

View File

@ -300,7 +300,10 @@
command="removeAllWatchExpressionsCommand"/>
</keyset>
<vbox id="body" layout="horizontal" flex="1" class="theme-body">
<vbox id="body"
class="theme-body"
layout="horizontal"
flex="1">
<toolbar id="debugger-toolbar"
class="devtools-toolbar">
<hbox id="debugger-controls">
@ -396,19 +399,23 @@
</tabbox>
<splitter id="sources-and-editor-splitter"
class="devtools-side-splitter"/>
<deck id="editor-deck" flex="4">
<deck id="editor-deck" flex="1">
<vbox id="editor"/>
<vbox id="black-boxed-message" align="center" pack="center">
<label id="black-boxed-message-label">
<vbox id="black-boxed-message"
align="center"
pack="center">
<description id="black-boxed-message-label">
&debuggerUI.blackBoxMessage.label;
</label>
</description>
<button id="black-boxed-message-button"
class="devtools-toolbarbutton"
label="&debuggerUI.blackBoxMessage.unBlackBoxButton;"
image="chrome://browser/skin/devtools/debugger-blackboxMessageEye.png"
command="unBlackBoxCommand"/>
</vbox>
<vbox id="source-progress-container" align="center" pack="center">
<vbox id="source-progress-container"
align="center"
pack="center">
<progressmeter id="source-progress"
mode="undetermined"/>
</vbox>
@ -423,12 +430,12 @@
<tab id="events-tab" label="&debuggerUI.tabs.events;"/>
</tabs>
<tabpanels flex="1">
<tabpanel id="variables-tabpanel" class="theme-body">
<tabpanel id="variables-tabpanel">
<vbox id="expressions"/>
<splitter class="devtools-horizontal-splitter"/>
<vbox id="variables" flex="1"/>
</tabpanel>
<tabpanel id="events-tabpanel" class="theme-body">
<tabpanel id="events-tabpanel">
<vbox id="event-listeners" flex="1"/>
</tabpanel>
</tabpanels>

View File

@ -175,6 +175,7 @@ support-files =
[browser_dbg_search-global-04.js]
[browser_dbg_search-global-05.js]
[browser_dbg_search-global-06.js]
[browser_dbg_search-popup-jank.js]
[browser_dbg_search-sources-01.js]
[browser_dbg_search-sources-02.js]
[browser_dbg_search-sources-03.js]

View File

@ -0,0 +1,118 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests that sources aren't selected by default when finding a match.
*/
const TAB_URL = EXAMPLE_URL + "doc_editor-mode.html";
let gTab, gDebuggee, gPanel, gDebugger;
let gSearchBox;
function test() {
initDebugger(TAB_URL).then(([aTab, aDebuggee, aPanel]) => {
gTab = aTab;
gDebuggee = aDebuggee;
gPanel = aPanel;
gDebugger = gPanel.panelWin;
gSearchBox = gDebugger.DebuggerView.Filtering._searchbox;
gDebugger.DebuggerView.FilteredSources._autoSelectFirstItem = false;
gDebugger.DebuggerView.FilteredFunctions._autoSelectFirstItem = false;
waitForSourceShown(gPanel, "-01.js")
.then(superGenericFileSearch)
.then(() => ensureSourceIs(aPanel, "-01.js"))
.then(() => ensureCaretAt(aPanel, 1))
.then(superAccurateFileSearch)
.then(() => ensureSourceIs(aPanel, "-01.js"))
.then(() => ensureCaretAt(aPanel, 1))
.then(() => pressKeyToHide("RETURN"))
.then(() => ensureSourceIs(aPanel, "code_test-editor-mode", true))
.then(() => ensureCaretAt(aPanel, 1))
.then(superGenericFileSearch)
.then(() => ensureSourceIs(aPanel, "code_test-editor-mode"))
.then(() => ensureCaretAt(aPanel, 1))
.then(() => pressKey("UP"))
.then(() => ensureSourceIs(aPanel, "doc_editor-mode", true))
.then(() => ensureCaretAt(aPanel, 1))
.then(() => pressKeyToHide("RETURN"))
.then(() => ensureSourceIs(aPanel, "doc_editor-mode"))
.then(() => ensureCaretAt(aPanel, 1))
.then(superAccurateFileSearch)
.then(() => ensureSourceIs(aPanel, "doc_editor-mode"))
.then(() => ensureCaretAt(aPanel, 1))
.then(() => typeText(gSearchBox, ":"))
.then(() => ensureSourceIs(aPanel, "code_test-editor-mode", true))
.then(() => ensureCaretAt(aPanel, 1))
.then(() => typeText(gSearchBox, "5"))
.then(() => ensureSourceIs(aPanel, "code_test-editor-mode"))
.then(() => ensureCaretAt(aPanel, 5))
.then(() => pressKey("DOWN"))
.then(() => ensureSourceIs(aPanel, "code_test-editor-mode"))
.then(() => ensureCaretAt(aPanel, 6))
.then(superGenericFunctionSearch)
.then(() => ensureSourceIs(aPanel, "code_test-editor-mode"))
.then(() => ensureCaretAt(aPanel, 6))
.then(() => pressKey("RETURN"))
.then(() => ensureSourceIs(aPanel, "code_test-editor-mode"))
.then(() => ensureCaretAt(aPanel, 4, 10))
.then(() => closeDebuggerAndFinish(gPanel))
.then(null, aError => {
ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
});
});
}
function waitForMatchFoundAndResultsShown(aName) {
return promise.all([
once(gDebugger, "popupshown"),
waitForDebuggerEvents(gPanel, gDebugger.EVENTS[aName])
]);
}
function waitForResultsHidden() {
return once(gDebugger, "popuphidden");
}
function superGenericFunctionSearch() {
let finished = waitForMatchFoundAndResultsShown("FUNCTION_SEARCH_MATCH_FOUND");
setText(gSearchBox, "@");
return finished;
}
function superGenericFileSearch() {
let finished = waitForMatchFoundAndResultsShown("FILE_SEARCH_MATCH_FOUND");
setText(gSearchBox, ".");
return finished;
}
function superAccurateFileSearch() {
let finished = waitForMatchFoundAndResultsShown("FILE_SEARCH_MATCH_FOUND");
setText(gSearchBox, "editor");
return finished;
}
function pressKey(aKey) {
EventUtils.sendKey(aKey, gDebugger);
}
function pressKeyToHide(aKey) {
let finished = waitForResultsHidden();
EventUtils.sendKey(aKey, gDebugger);
return finished;
}
registerCleanupFunction(function() {
gTab = null;
gDebuggee = null;
gPanel = null;
gDebugger = null;
gSearchBox = null;
});

View File

@ -506,9 +506,11 @@ function initChromeDebugger(aOnClose) {
function prepareDebugger(aDebugger) {
if ("target" in aDebugger) {
let variables = aDebugger.panelWin.DebuggerView.Variables;
variables.lazyEmpty = false;
variables.lazySearch = false;
let view = aDebugger.panelWin.DebuggerView;
view.Variables.lazyEmpty = false;
view.Variables.lazySearch = false;
view.FilteredSources._autoSelectFirstItem = true;
view.FilteredFunctions._autoSelectFirstItem = true;
} else {
// Nothing to do here yet.
}

View File

@ -46,3 +46,4 @@ support-files =
[browser_inspector_sidebarstate.js]
[browser_inspector_bug_848731_reset_selection_on_delete.js]
[browser_inspector_bug_922125_destroy_on_navigate.js]
[browser_inspector_bug_952294_tooltips_dimensions.js]

View File

@ -0,0 +1,175 @@
/* 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";
let contentDoc;
let inspector;
let ruleView;
let markupView;
const PAGE_CONTENT = [
'<style type="text/css">',
' div {',
' width: 300px;height: 300px;border-radius: 50%;',
' transform: skew(45deg);',
' background: red url(chrome://global/skin/icons/warning-64.png);',
' }',
'</style>',
'<div></div>'
].join("\n");
function test() {
waitForExplicitFinish();
gBrowser.selectedTab = gBrowser.addTab();
gBrowser.selectedBrowser.addEventListener("load", function onload(evt) {
gBrowser.selectedBrowser.removeEventListener("load", onload, true);
contentDoc = content.document;
waitForFocus(createDocument, content);
}, true);
content.location = "data:text/html,tooltip dimension test";
}
function createDocument() {
contentDoc.body.innerHTML = PAGE_CONTENT;
openInspector(aInspector => {
inspector = aInspector;
markupView = inspector.markup;
inspector.sidebar.once("ruleview-ready", function() {
ruleView = inspector.sidebar.getWindowForTab("ruleview").ruleview.view;
inspector.sidebar.select("ruleview");
startTests();
});
});
}
function endTests() {
contentDoc = inspector = ruleView = markupView = null;
gBrowser.removeCurrentTab();
finish();
}
function startTests() {
Task.spawn(function() {
yield selectDiv();
yield testTransformDimension();
yield testImageDimension();
yield testPickerDimension();
endTests();
}).then(null, Cu.reportError);
}
function selectDiv() {
let deferred = promise.defer();
inspector.selection.setNode(contentDoc.querySelector("div"));
inspector.once("inspector-updated", () => {
deferred.resolve();
});
return deferred.promise;
}
function testTransformDimension() {
let deferred = promise.defer();
info("Testing css transform tooltip dimensions");
let {valueSpan} = getRuleViewProperty("transform");
showTooltipOn(ruleView.previewTooltip, valueSpan, () => {
let panel = ruleView.previewTooltip.panel;
// Let's not test for a specific size, but instead let's make sure it's at
// least as big as the preview canvas
let canvas = panel.querySelector("canvas");
let w = canvas.width;
let h = canvas.height;
let panelRect = panel.getBoundingClientRect();
ok(panelRect.width >= w, "The panel is wide enough to show the canvas");
ok(panelRect.height >= h, "The panel is high enough to show the canvas");
ruleView.previewTooltip.hide();
deferred.resolve();
});
return deferred.promise;
}
function testImageDimension() {
let deferred = promise.defer();
info("Testing background-image tooltip dimensions");
let {valueSpan} = getRuleViewProperty("background");
let uriSpan = valueSpan.querySelector(".theme-link");
showTooltipOn(ruleView.previewTooltip, uriSpan, () => {
let panel = ruleView.previewTooltip.panel;
// Let's not test for a specific size, but instead let's make sure it's at
// least as big as the image
let imageRect = panel.querySelector("image").getBoundingClientRect();
let panelRect = panel.getBoundingClientRect();
ok(panelRect.width >= imageRect.width,
"The panel is wide enough to show the image");
ok(panelRect.height >= imageRect.height,
"The panel is high enough to show the image");
ruleView.previewTooltip.hide();
deferred.resolve();
});
return deferred.promise;
}
function testPickerDimension() {
let deferred = promise.defer();
info("Testing color-picker tooltip dimensions");
let {valueSpan} = getRuleViewProperty("background");
let swatch = valueSpan.querySelector(".ruleview-colorswatch");
let cPicker = ruleView.colorPicker;
cPicker.tooltip.once("shown", () => {
// The colorpicker spectrum's iframe has a fixed width height, so let's
// make sure the tooltip is at least as big as that
let w = cPicker.tooltip.panel.querySelector("iframe").width;
let h = cPicker.tooltip.panel.querySelector("iframe").height;
let panelRect = cPicker.tooltip.panel.getBoundingClientRect();
ok(panelRect.width >= w, "The panel is wide enough to show the picker");
ok(panelRect.height >= h, "The panel is high enough to show the picker");
cPicker.hide();
deferred.resolve();
});
swatch.click();
return deferred.promise;
}
function showTooltipOn(tooltip, element, cb) {
// If there is indeed a show-on-hover on element, the xul panel will be shown
tooltip.panel.addEventListener("popupshown", function shown() {
tooltip.panel.removeEventListener("popupshown", shown, true);
cb();
}, true);
tooltip._showOnHover(element);
}
function getRuleViewProperty(name) {
let prop = null;
[].forEach.call(ruleView.doc.querySelectorAll(".ruleview-property"), property => {
let nameSpan = property.querySelector(".ruleview-propertyname");
let valueSpan = property.querySelector(".ruleview-propertyvalue");
if (nameSpan.textContent === name) {
prop = {nameSpan: nameSpan, valueSpan: valueSpan};
}
});
return prop;
}

View File

@ -260,7 +260,7 @@ RequestsMenuView.prototype = Heritage.extend(WidgetMethods, {
initialize: function() {
dumpn("Initializing the RequestsMenuView");
this.widget = new SideMenuWidget($("#requests-menu-contents"), false);
this.widget = new SideMenuWidget($("#requests-menu-contents"));
this._splitter = $('#splitter');
this._summary = $("#request-menu-network-summary");
@ -371,9 +371,7 @@ RequestsMenuView.prototype = Heritage.extend(WidgetMethods, {
*/
openRequestInTab: function() {
let win = Services.wm.getMostRecentWindow("navigator:browser");
let selected = this.selectedItem.attachment;
win.openUILinkIn(selected.url, "tab", { relatedToCurrent: true });
},
@ -382,7 +380,6 @@ RequestsMenuView.prototype = Heritage.extend(WidgetMethods, {
*/
copyUrl: function() {
let selected = this.selectedItem.attachment;
clipboardHelper.copyString(selected.url, document);
},
@ -1078,12 +1075,34 @@ RequestsMenuView.prototype = Heritage.extend(WidgetMethods, {
let direction = window.isRTL ? -1 : 1;
for (let x = 0; x < availableWidth; x += scaledStep) {
let divisionMS = (x / aScale).toFixed(0);
let translateX = "translateX(" + ((direction * x) | 0) + "px)";
let millisecondTime = x / aScale;
let normalizedTime = millisecondTime;
let divisionScale = "millisecond";
// If the division is greater than 1 minute.
if (normalizedTime > 60000) {
normalizedTime /= 60000;
divisionScale = "minute";
}
// If the division is greater than 1 second.
else if (normalizedTime > 1000) {
normalizedTime /= 1000;
divisionScale = "second";
}
// Showing too many decimals is bad UX.
if (divisionScale == "millisecond") {
normalizedTime |= 0;
} else {
normalizedTime = L10N.numberWithDecimals(normalizedTime, 2);
}
let node = document.createElement("label");
let text = L10N.getFormatStr("networkMenu.divisionMS", divisionMS);
let text = L10N.getFormatStr("networkMenu." + divisionScale, normalizedTime);
node.className = "plain requests-menu-timings-division";
node.setAttribute("division-scale", divisionScale);
node.style.transform = translateX;
node.setAttribute("value", text);

View File

@ -8,6 +8,7 @@
}
#details-pane-toggle[disabled] {
/* Don't use display: none; to avoid collapsing #requests-menu-toolbar */
visibility: hidden;
}

View File

@ -59,3 +59,4 @@ support-files =
[browser_net_sort-03.js]
[browser_net_status-codes.js]
[browser_net_timeline_ticks.js]
[browser_net_timing-division.js]

View File

@ -31,13 +31,13 @@ function test() {
"There should be at least 3 tick labels in the network requests header.");
is(document.querySelectorAll(".requests-menu-timings-division")[0]
.getAttribute("value"), L10N.getFormatStr("networkMenu.divisionMS", 0),
.getAttribute("value"), L10N.getFormatStr("networkMenu.millisecond", 0),
"The first tick label has an incorrect value");
is(document.querySelectorAll(".requests-menu-timings-division")[1]
.getAttribute("value"), L10N.getFormatStr("networkMenu.divisionMS", 80),
.getAttribute("value"), L10N.getFormatStr("networkMenu.millisecond", 80),
"The second tick label has an incorrect value");
is(document.querySelectorAll(".requests-menu-timings-division")[2]
.getAttribute("value"), L10N.getFormatStr("networkMenu.divisionMS", 160),
.getAttribute("value"), L10N.getFormatStr("networkMenu.millisecond", 160),
"The third tick label has an incorrect value");
is(document.querySelectorAll(".requests-menu-timings-division")[0]

View File

@ -0,0 +1,31 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests if timing intervals are divided againts seconds when appropriate.
*/
function test() {
initNetMonitor(CUSTOM_GET_URL).then(([aTab, aDebuggee, aMonitor]) => {
info("Starting test... ");
let { $all, NetMonitorView } = aMonitor.panelWin;
let { RequestsMenu } = NetMonitorView;
RequestsMenu.lazyUpdate = false;
waitForNetworkEvents(aMonitor, 2).then(() => {
let divisions = $all(".requests-menu-timings-division[division-scale=second]");
ok(divisions.length,
"There should be at least one division on the seconds time scale.");
ok(divisions[0].getAttribute("value").match(/\d+\.\d{2}\s\w+/),
"The division on the seconds time scale looks legit.");
teardown(aMonitor).then(finish);
});
aDebuggee.performRequests(1);
window.setTimeout(() => aDebuggee.performRequests(1), 2000);
});
}

View File

@ -42,16 +42,11 @@
<splitter class="devtools-side-splitter"/>
<vbox flex="1">
<toolbar class="devtools-toolbar">
</toolbar>
<vbox flex="1" id="profiler-report">
<!-- Example:
<iframe id="profiler-cleo-1"
src="devtools/cleopatra.html" flex="1"></iframe>
-->
</vbox>
<vbox flex="1" id="profiler-report">
<!-- Example:
<iframe id="profiler-cleo-1"
src="devtools/cleopatra.html" flex="1"></iframe>
-->
</vbox>
</box>
</window>

View File

@ -222,6 +222,7 @@ let ShadersListView = Heritage.extend(WidgetMethods, {
// program sources or instances.
let label = L10N.getFormatStr("shadersList.programLabel", this.itemCount);
let contents = document.createElement("label");
contents.className = "plain program-item";
contents.setAttribute("value", label);
contents.setAttribute("crop", "start");
contents.setAttribute("flex", "1");

View File

@ -22,7 +22,6 @@ this.EXPORTED_SYMBOLS = ["SideMenuWidget"];
* @param nsIDOMNode aNode
* The element associated with the widget.
* @param Object aOptions
* - theme: "light" or "dark", defaults to dark if falsy.
* - showArrows: specifies if items should display horizontal arrows.
* - showItemCheckboxes: specifies if items should display checkboxes.
* - showGroupCheckboxes: specifies if groups should display checkboxes.
@ -32,18 +31,16 @@ this.SideMenuWidget = function SideMenuWidget(aNode, aOptions={}) {
this.window = this.document.defaultView;
this._parent = aNode;
let { theme, showArrows, showItemCheckboxes, showGroupCheckboxes } = aOptions;
this._theme = theme || "dark";
let { showArrows, showItemCheckboxes, showGroupCheckboxes } = aOptions;
this._showArrows = showArrows || false;
this._showItemCheckboxes = showItemCheckboxes || false;
this._showGroupCheckboxes = showGroupCheckboxes || false;
// Create an internal scrollbox container.
this._list = this.document.createElement("scrollbox");
this._list.className = "side-menu-widget-container";
this._list.className = "side-menu-widget-container theme-body";
this._list.setAttribute("flex", "1");
this._list.setAttribute("orient", "vertical");
this._list.setAttribute("theme", this._theme);
this._list.setAttribute("with-arrows", this._showArrows);
this._list.setAttribute("with-item-checkboxes", this._showItemCheckboxes);
this._list.setAttribute("with-group-checkboxes", this._showGroupCheckboxes);
@ -141,13 +138,7 @@ SideMenuWidget.prototype = {
* The element associated with the displayed item.
*/
removeChild: function(aChild) {
if (aChild.classList.contains("side-menu-widget-item-contents") &&
!aChild.classList.contains("side-menu-widget-item")) {
// Remove the item itself, not the contents.
aChild.parentNode.remove();
} else {
aChild.remove();
}
this._getNodeForContents(aChild).remove();
this._orderedMenuElementsArray.splice(
this._orderedMenuElementsArray.indexOf(aChild), 1);
@ -198,12 +189,10 @@ SideMenuWidget.prototype = {
}
for (let node of menuArray) {
if (node == aChild) {
node.classList.add("selected");
node.parentNode.classList.add("selected");
this._getNodeForContents(node).classList.add("selected");
this._selectedItem = node;
} else {
node.classList.remove("selected");
node.parentNode.classList.remove("selected");
this._getNodeForContents(node).classList.remove("selected");
}
}
},
@ -316,7 +305,6 @@ SideMenuWidget.prototype = {
let label = this.document.createElement("label");
label.className = "plain side-menu-widget-empty-text";
label.setAttribute("value", this._emptyTextValue);
label.setAttribute("theme", this._theme);
this._parent.insertBefore(label, this._list);
this._emptyTextNode = label;
@ -350,7 +338,6 @@ SideMenuWidget.prototype = {
}
let group = new SideMenuGroup(this, aName, {
theme: this._theme,
showCheckbox: this._showGroupCheckboxes
});
@ -373,15 +360,32 @@ SideMenuWidget.prototype = {
*/
_getMenuItemForGroup: function(aGroup, aContents, aAttachment) {
return new SideMenuItem(aGroup, aContents, aAttachment, {
theme: this._theme,
showArrow: this._showArrows,
showCheckbox: this._showItemCheckboxes
});
},
/**
* Returns the .side-menu-widget-item node corresponding to a SideMenuItem.
* To optimize the markup, some redundant elemenst are skipped when creating
* these child items, in which case we need to be careful on which nodes
* .selected class names are added, or which nodes are removed.
*
* @param nsIDOMNode aChild
* An element which is the target node of a SideMenuItem.
* @return nsIDOMNode
* The wrapper node if there is one, or the same child otherwise.
*/
_getNodeForContents: function(aChild) {
if (aChild.hasAttribute("merged-item-contents")) {
return aChild;
} else {
return aChild.parentNode;
}
},
window: null,
document: null,
_theme: "",
_showArrows: false,
_showItemCheckboxes: false,
_showGroupCheckboxes: false,
@ -406,7 +410,6 @@ SideMenuWidget.prototype = {
* The string displayed in the container.
* @param object aOptions [optional]
* An object containing the following properties:
* - theme: the theme colors, either "dark" or "light".
* - showCheckbox: specifies if a checkbox should be displayed.
*/
function SideMenuGroup(aWidget, aName, aOptions={}) {
@ -427,7 +430,6 @@ function SideMenuGroup(aWidget, aName, aOptions={}) {
let title = this._title = this.document.createElement("hbox");
title.className = "side-menu-widget-group-title";
title.setAttribute("theme", aOptions.theme);
let name = this._name = this.document.createElement("label");
name.className = "plain name";
@ -449,7 +451,7 @@ function SideMenuGroup(aWidget, aName, aOptions={}) {
else {
let target = this._target = this._list = this.document.createElement("vbox");
target.className = "side-menu-widget-group side-menu-widget-group-list";
target.setAttribute("theme", aOptions.theme);
target.setAttribute("merged-group-contents", "");
}
}
@ -519,7 +521,6 @@ SideMenuGroup.prototype = {
* The attachment object.
* @param object aOptions [optional]
* An object containing the following properties:
* - theme: the theme colors, either "dark" or "light".
* - showArrow: specifies if a horizontal arrow should be displayed.
* - showCheckbox: specifies if a checkbox should be displayed.
*/
@ -531,7 +532,6 @@ function SideMenuItem(aGroup, aContents, aAttachment={}, aOptions={}) {
if (aOptions.showArrow || aOptions.showCheckbox) {
let container = this._container = this.document.createElement("hbox");
container.className = "side-menu-widget-item";
container.setAttribute("theme", aOptions.theme);
let target = this._target = this.document.createElement("vbox");
target.className = "side-menu-widget-item-contents";
@ -555,7 +555,7 @@ function SideMenuItem(aGroup, aContents, aAttachment={}, aOptions={}) {
else {
let target = this._target = this._container = this.document.createElement("hbox");
target.className = "side-menu-widget-item side-menu-widget-item-contents";
target.setAttribute("theme", aOptions.theme);
target.setAttribute("merged-item-contents", "");
}
this._target.setAttribute("flex", "1");

View File

@ -28,7 +28,7 @@ function SimpleListWidget(aNode) {
// Create an internal list container.
this._list = this.document.createElement("scrollbox");
this._list.className = "simple-list-widget-container";
this._list.className = "simple-list-widget-container theme-body";
this._list.setAttribute("flex", "1");
this._list.setAttribute("orient", "vertical");
this._parent.appendChild(this._list);

View File

@ -469,6 +469,10 @@ Tooltip.prototype = {
vbox.appendChild(innerbox);
var widget = new VariablesView(innerbox, viewOptions);
// Analyzing state history isn't useful with transient object inspectors.
widget.commitHierarchy = () => {};
for (let e in relayEvents) widget.on(e, relayEvents[e]);
VariablesViewController.attach(widget, controllerOptions);
@ -525,7 +529,6 @@ Tooltip.prototype = {
if (options.naturalWidth && options.naturalHeight) {
label.textContent = this._getImageDimensionLabel(options.naturalWidth,
options.naturalHeight);
this.setSize(vbox.width, vbox.height);
} else {
// If no dimensions were provided, load the image to get them
label.textContent = l10n.strings.GetStringFromName("previewTooltip.image.brokenImage");
@ -535,7 +538,6 @@ Tooltip.prototype = {
imgObj.onload = null;
label.textContent = this._getImageDimensionLabel(imgObj.naturalWidth,
imgObj.naturalHeight);
this.setSize(vbox.width, vbox.height);
}
}
vbox.appendChild(label);
@ -634,11 +636,8 @@ Tooltip.prototype = {
let previewer = new CSSTransformPreviewer(root);
this.content = root;
if (!previewer.preview(transform, origin, width, height)) {
// If the preview didn't work, reject the promise
def.reject();
} else {
// Else, make sure the tooltip has the right size and resolve
this.setSize(previewer.canvas.width, previewer.canvas.height);
def.resolve();
}
});

View File

@ -3219,7 +3219,7 @@ VariablesView.stringifiers.byType = {
if (noStringQuotes) {
return aGrip;
}
return uneval(aGrip);
return '"' + aGrip + '"';
},
longString: function({initial}, {noStringQuotes, noEllipsis}) {
@ -3227,7 +3227,7 @@ VariablesView.stringifiers.byType = {
if (noStringQuotes) {
return initial + ellipsis;
}
let result = uneval(initial);
let result = '"' + initial + '"';
if (!ellipsis) {
return result;
}

View File

@ -550,8 +550,16 @@ Editor.prototype = {
*/
markText: function(from, to, className = "marked-text") {
let cm = editors.get(this);
let mark = cm.markText(from, to, { className: className });
return { clear: () => mark.clear() };
let text = cm.getRange(from, to);
let span = cm.getWrapperElement().ownerDocument.createElement("span");
span.className = className;
span.textContent = text;
let mark = cm.markText(from, to, { replacedWith: span });
return {
anchor: span,
clear: () => mark.clear()
};
},
/**

View File

@ -8,7 +8,7 @@ const HOST = 'mochi.test:8888';
const URI = "http://" + HOST + "/browser/browser/devtools/sourceeditor/test/codemirror.html";
function test() {
requestLongerTimeout(2);
requestLongerTimeout(3);
waitForExplicitFinish();
let tab = gBrowser.addTab();

View File

@ -118,7 +118,7 @@ function testJSTerm(hud)
jsterm.clearOutput();
jsterm.execute("pprint({b:2, a:1})");
checkResult("\" b: 2\\n a: 1\"", "pprint()");
checkResult("\" b: 2\n a: 1\"", "pprint()");
yield undefined;
// check instanceof correctness, bug 599940
@ -154,7 +154,7 @@ function testJSTerm(hud)
// bug 614561
jsterm.clearOutput();
jsterm.execute("pprint('hi')");
checkResult("\" 0: \\\"h\\\"\\n 1: \\\"i\\\"\"", "pprint('hi')");
checkResult("\" 0: \"h\"\n 1: \"i\"\"", "pprint('hi')");
yield undefined;
// check that pprint(function) shows function source, bug 618344

View File

@ -22,14 +22,14 @@ let inputTests = [
// 0
{
input: "'hello \\nfrom \\rthe \\\"string world!'",
output: "\"hello \\nfrom \\rthe \\\"string world!\"",
output: "\"hello \nfrom \rthe \"string world!\"",
},
// 1
{
// unicode test
input: "'\xFA\u1E47\u0129\xE7\xF6d\xEA \u021B\u0115\u0219\u0165'",
output: "\"\\xFA\\u1E47\\u0129\\xE7\\xF6d\\xEA \\u021B\\u0115\\u0219\\u0165\"",
output: "\"\xFA\u1E47\u0129\xE7\xF6d\xEA \u021B\u0115\u0219\u0165\"",
},
// 2
@ -81,7 +81,7 @@ let inputTests = [
{
input: "/foo?b*\\s\"ar/igym",
output: "/foo?b*\\s\"ar/gimy",
printOutput: "/foo?b*\\\\s\\\"ar/gimy",
printOutput: "/foo?b*\\s\"ar/gimy",
inspectable: true,
},

View File

@ -12,7 +12,7 @@ let inputTests = [
{
input: "document.getElementById",
output: "function getElementById()",
printOutput: "function getElementById() {\\n [native code]\\n}",
printOutput: "function getElementById() {\n [native code]\n}",
inspectable: true,
variablesViewLabel: "getElementById()",
},

View File

@ -126,7 +126,7 @@ let inputTests = [
// 13
{
input: "document.body.dataset",
output: 'DOMStringMap {preview: "zuzu\\"<a>foo"}',
output: 'DOMStringMap {preview: "zuzu"<a>foo"}',
printOutput: "[object DOMStringMap]",
inspectable: true,
variablesViewLabel: "DOMStringMap[1]",

View File

@ -50,7 +50,7 @@ let inputTests = [
{
input: "testDOMException()",
output: 'DOMException [SyntaxError: "An invalid or illegal string was specified"',
printOutput: '[Exception... \\"An invalid or illegal string was specified\\"',
printOutput: '[Exception... "An invalid or illegal string was specified"',
inspectable: true,
variablesViewLabel: "SyntaxError",
},

View File

@ -124,6 +124,14 @@ networkMenu.sizeKB=%S KB
# in the network menu specifying the time for a request to finish (in milliseconds).
networkMenu.totalMS=→ %S ms
# LOCALIZATION NOTE (networkMenu.divisionMS): This is the label displayed
# LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed
# in the network menu specifying timing interval divisions (in milliseconds).
networkMenu.divisionMS=%S ms
networkMenu.millisecond=%S ms
# LOCALIZATION NOTE (networkMenu.second): This is the label displayed
# in the network menu specifying timing interval divisions (in seconds).
networkMenu.second=%S s
# LOCALIZATION NOTE (networkMenu.minute): This is the label displayed
# in the network menu specifying timing interval divisions (in minutes).
networkMenu.minute=%S min

View File

@ -42,6 +42,7 @@ SessionStore.prototype = {
Ci.nsISupportsWeakReference]),
_windows: {},
_tabsFromOtherGroups: [],
_selectedWindow: 1,
_orderedWindows: [],
_lastSaveTime: 0,
@ -538,6 +539,18 @@ SessionStore.prototype = {
aBrowser.__SS_data = tabData;
},
_saveTabData: function(aTabList, aWinData) {
for (let tab of aTabList) {
let browser = tab.browser;
if (browser.__SS_data) {
let tabData = browser.__SS_data;
if (browser.__SS_extdata)
tabData.extData = browser.__SS_extdata;
aWinData.tabs.push(tabData);
}
}
},
_collectWindowData: function ss__collectWindowData(aWindow) {
// Ignore windows not tracked by SessionStore
if (!aWindow.__SSID || !this._windows[aWindow.__SSID])
@ -550,15 +563,8 @@ SessionStore.prototype = {
winData.selected = parseInt(index) + 1; // 1-based
let tabs = aWindow.Browser.tabs;
for (let i = 0; i < tabs.length; i++) {
let browser = tabs[i].browser;
if (browser.__SS_data) {
let tabData = browser.__SS_data;
if (browser.__SS_extdata)
tabData.extData = browser.__SS_extdata;
winData.tabs.push(tabData);
}
}
this._saveTabData(tabs, winData);
this._saveTabData(this._tabsFromOtherGroups, winData);
},
_forEachBrowserWindow: function ss_forEachBrowserWindow(aFunc) {
@ -774,6 +780,11 @@ SessionStore.prototype = {
let tabs = data.windows[windowIndex].tabs;
let selected = data.windows[windowIndex].selected;
let currentGroupId;
try {
currentGroupId = JSON.parse(data.windows[windowIndex].extData["tabview-groups"]).activeGroupId;
} catch (ex) { /* currentGroupId is undefined if user has no tab groups */ }
// Move all window data from sessionstore.js to this._windows.
for (let i = 0; i < data.windows.length; i++) {
let SSID;
@ -793,6 +804,13 @@ SessionStore.prototype = {
for (let i=0; i<tabs.length; i++) {
let tabData = tabs[i];
let tabGroupId = (typeof currentGroupId == "number") ?
JSON.parse(tabData.extData["tabview-tab"]).groupID : null;
if (tabGroupId && tabGroupId != currentGroupId) {
this._tabsFromOtherGroups.push(tabData);
continue;
}
// We must have selected tabs as soon as possible, so we let all tabs be selected
// until we get the real selected tab. Then we stop selecting tabs. The end result

View File

@ -1,598 +1,9 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* Sources and breakpoints pane */
#sources-pane > tabs {
-moz-border-end: 1px solid #222426; /* Match the sources list's dark margin. */
}
#sources-pane[selectedIndex="0"] + #sources-and-editor-splitter {
border-color: transparent;
}
/* Sources toolbar */
#sources-toolbar {
border: none; /* Remove the devtools-toolbar's black bottom border. */
-moz-border-end: 1px solid #222426; /* Match the sources list's dark margin. */
}
#sources-toolbar > .devtools-toolbarbutton,
#sources-controls > .devtools-toolbarbutton {
min-width: 32px;
}
#black-box {
list-style-image: url(debugger-blackbox.png);
}
#pretty-print {
font-weight: bold;
}
#toggle-breakpoints {
list-style-image: url(debugger-toggleBreakpoints.png);
}
#sources-toolbar .devtools-toolbarbutton:not([label]) {
-moz-image-region: rect(0px,16px,16px,0px);
}
#sources-toolbar .devtools-toolbarbutton:not([label])[checked] {
-moz-image-region: rect(0px,32px,16px,16px);
}
#sources .black-boxed {
color: #888;
}
#sources .black-boxed > .dbg-breakpoint {
display: none;
}
#sources .black-boxed + .side-menu-widget-item-arrow:-moz-locale-dir(ltr) {
background-image: none;
box-shadow: inset -1px 0 0 #222426;
}
#sources .black-boxed + .side-menu-widget-item-arrow:-moz-locale-dir(rtl) {
background-image: none;
box-shadow: inset 1px 0 0 #222426;
}
/* Black box message and source progress meter */
#black-boxed-message,
#source-progress-container {
background: url(background-noise-toolbar.png) rgb(61,69,76);
/* Prevent the container deck from aquiring the size from this message. */
min-width: 1px;
min-height: 1px;
color: white;
}
#source-progress {
min-height: 2em;
min-width: 40em;
}
#black-boxed-message-label,
#black-boxed-message-button {
text-align: center;
font-size: 120%;
}
#black-boxed-message-button {
margin-top: 1em;
padding: .25em;
}
/* Tracer */
#trace {
list-style-image: url(tracer-icon.png);
-moz-image-region: rect(0px,16px,16px,0px);
}
#trace[checked] {
-moz-image-region: rect(0px,32px,16px,16px);
}
#clear-tracer {
/* Make this button as narrow as the text inside it. */
min-width: 1px;
}
.trace-name {
-moz-padding-start: 4px !important;
}
/* Tracer dark theme */
.theme-dark .trace-item {
color: #f5f7fa; /* Light foreground text */
}
.theme-dark .trace-item.selected-matching {
background-color: rgba(29, 79, 115, .4); /* Select highlight blue at 40% alpha */
}
.theme-dark .selected > .trace-item {
background-color: rgba(29, 79, 115, .75); /* Select highlight blue at 75% alpha */
}
.theme-dark .trace-call {
color: #46afe3; /* highlight blue */
}
.theme-dark .trace-return,
.theme-dark .trace-yield {
color: #70bf53; /* highlight green */
}
.theme-dark .trace-throw {
color: #eb5368; /* highlight red */
}
.theme-dark .trace-param {
color: #b8c8d9; /* Content text light */
}
.theme-dark .trace-syntax {
color: #8fa1b2; /* Content text grey */
}
/* Tracer light theme */
.theme-light .trace-item {
color: #292e33; /* Dark foreground text */
}
.theme-light .trace-item.selected-matching {
background-color: rgba(76, 158, 217, .4); /* Select highlight blue at 40% alpha */
}
.theme-light .selected > .trace-item {
background-color: rgba(76, 158, 217, .75); /* Select highlight blue at 75% alpha */
}
.theme-light .trace-call {
color: #0088cc; /* highlight blue */
}
.theme-light .trace-return,
.theme-light .trace-yield {
color: #2cbb0f; /* highlight green */
}
.theme-light .trace-throw {
color: #ed2655; /* highlight red */
}
.theme-light .trace-param {
color: #667380; /* Content text dark grey */
}
.theme-light .trace-syntax {
color: #8fa1b2; /* Content text grey */
}
/* Breadcrumbs stack frames view */
.breadcrumbs-widget-item {
max-width: none;
}
.dbg-stackframe-details {
-moz-padding-start: 4px;
}
/* Classic stack frames view */
.dbg-classic-stackframe {
display: block;
padding: 0px 4px;
}
.dbg-classic-stackframe-title {
font-weight: 600;
color: #046;
}
.dbg-classic-stackframe-details:-moz-locale-dir(ltr) {
float: right;
}
.dbg-classic-stackframe-details:-moz-locale-dir(rtl) {
float: left;
}
.dbg-classic-stackframe-details-url {
max-width: 90%;
text-align: end;
color: #666;
}
.dbg-classic-stackframe-details-sep {
color: #aaa;
}
.dbg-classic-stackframe-details-line {
color: #58b;
}
#callstack-list .side-menu-widget-item.selected label {
color: #fff;
}
/* Sources and breakpoints view */
.dbg-breakpoint {
-moz-margin-start: 4px;
}
.dbg-breakpoint-line {
font-weight: 600;
}
.dbg-breakpoint-text {
-moz-margin-start: 10px !important;
font-style: italic;
font-size: 90%;
}
.dbg-breakpoint-checkbox {
width: 16px;
height: 16px;
margin: 2px;
}
/* Variable bubble view */
.devtools-tooltip-simple-text.token-undefined,
.devtools-tooltip-simple-text.token-null {
text-align: center;
color: #666 !important; /* Override the theme's color. */
}
.devtools-tooltip-simple-text.token-boolean {
text-align: center;
color: #10c !important;
}
.devtools-tooltip-simple-text.token-number {
text-align: center;
color: #c00 !important;
}
.devtools-tooltip-simple-text.token-string {
text-align: start;
color: #282 !important;
}
.devtools-tooltip-simple-text.token-other {
text-align: center;
color: #333 !important;
}
/* Instruments pane (watch expressions, variables, event listeners...) */
#instruments-pane .side-menu-widget-container,
#instruments-pane .side-menu-widget-empty-text {
box-shadow: none !important;
}
/* Watch expressions view */
#expressions {
min-height: 10px;
max-height: 125px;
}
.dbg-expression {
height: 20px;
}
.dbg-expression-arrow {
width: 16px;
height: auto;
margin: 2px;
background: -moz-image-rect(url(commandline-icon.png), 0, 32, 16, 16);
}
.dbg-expression-input {
color: inherit;
}
/* Event listeners view */
.dbg-event-listener {
padding: 0px 8px;
}
.dbg-event-listener-type {
font-weight: 600;
}
.dbg-event-listener-separator {
color: #999;
}
.dbg-event-listener-targets {
color: #046;
}
.dbg-event-listener-location {
color: #666;
}
#event-listeners .side-menu-widget-item.selected {
background: none !important;
}
/* Searchbox and the search operations help panel */
#searchbox {
min-width: 220px;
-moz-margin-start: 1px;
}
#filter-label {
-moz-margin-start: 2px;
}
#searchbox-panel-operators {
margin-top: 5px;
margin-bottom: 8px;
-moz-margin-start: 2px;
}
.searchbox-panel-operator-button {
min-width: 26px;
margin-top: 0;
margin-bottom: 0;
-moz-margin-start: 2px;
-moz-margin-end: 6px;
text-align: center;
}
.searchbox-panel-operator-label {
padding-bottom: 2px;
}
/* Searchbox results panel */
.results-panel {
padding: 4px;
}
.results-panel-item {
background: #f4f4f4;
border: 1px solid #ddd;
border-top-color: #fff;
padding: 5px;
cursor: pointer;
}
.results-panel-item:first-of-type {
border-top-color: #ddd;
border-radius: 4px 4px 0 0;
}
.results-panel-item:last-of-type {
border-radius: 0 0 4px 4px;
}
.results-panel-item:only-of-type {
border-radius: 4px;
}
.results-panel-item:not(.selected):not(:hover) {
text-shadow: 0 1px #fff;
}
.results-panel-item-label-before {
-moz-margin-end: 5px !important;
color: #444;
cursor: inherit;
}
.results-panel-item-label {
color: #111;
font-weight: 600;
cursor: inherit;
}
.results-panel-item-label-below {
color: #7f7f7f;
cursor: inherit;
}
/* Sources search view */
#globalsearch {
min-height: 10px;
max-height: 125px;
box-shadow: inset 0 -4px 8px #eee;
background: url(background-noise-toolbar.png);
}
#globalsearch + .devtools-horizontal-splitter {
border-color: #bfbfbf;
}
.dbg-source-results {
padding: 0;
background: none !important;
}
.dbg-results-header {
-moz-padding-start: 6px;
}
.dbg-results-header-location {
font-weight: 600;
}
.dbg-results-header-match-count {
-moz-padding-start: 6px;
color: GrayText;
}
.dbg-results-line-number {
background: #e2e2e2;
min-width: 40px;
-moz-border-end: 1px solid #b4c4d3;
-moz-padding-end: 4px;
padding-top: 2px;
text-align: end;
color: #8c8c8c;
}
.dbg-results-line-contents {
-moz-padding-start: 4px;
padding-top: 1px;
padding-bottom: 1px;
}
.dbg-results-line-contents-string {
padding: 1px;
}
.dbg-results-line-contents-string[match=true] {
background: rgba(255,255,0,0.5);
padding: 0;
border: 1px solid #aaa;
border-radius: 4px;
cursor: pointer;
}
.dbg-results-line-contents-string[match=true][focusing] {
transition: transform 0.3s ease-in-out;
}
.dbg-results-line-contents-string[match=true][focused] {
transition-duration: 0.1s;
transform: scale(1.75, 1.75);
}
/* Toolbar controls */
%include ../../shared/devtools/debugger.inc.css
.devtools-sidebar-tabs > tabs > tab {
min-height: 25px !important;
padding: 0 !important;
}
#resumption-panel-desc {
width: 200px;
}
#resumption-order-panel {
-moz-margin-start: -8px;
}
#resume {
list-style-image: url("chrome://browser/skin/devtools/debugger-pause.png");
-moz-image-region: rect(0px,16px,16px,0px);
transition: background 0.15s ease-in-out;
}
#resume[checked] {
background: none;
list-style-image: url("chrome://browser/skin/devtools/debugger-play.png");
-moz-image-region: rect(0px,32px,16px,16px);
}
#resume ~ toolbarbutton {
transition: opacity 0.15s ease-in-out;
}
#resume:not([checked]) ~ toolbarbutton {
opacity: 0.5;
}
#step-over {
list-style-image: url("chrome://browser/skin/devtools/debugger-step-over.png");
}
#step-in {
list-style-image: url("chrome://browser/skin/devtools/debugger-step-in.png");
}
#step-out {
list-style-image: url("chrome://browser/skin/devtools/debugger-step-out.png");
}
#debugger-controls > toolbarbutton,
#sources-controls > toolbarbutton {
margin: 0;
box-shadow: none;
border-radius: 0;
border-width: 0;
-moz-border-end-width: 1px;
outline-offset: -3px;
}
#debugger-controls > toolbarbutton:last-of-type,
#sources-controls > toolbarbutton:last-of-type {
-moz-border-end-width: 0;
}
#debugger-controls,
#sources-controls {
box-shadow: 0 1px 0 hsla(210,16%,76%,.15) inset,
0 0 0 1px hsla(210,16%,76%,.15) inset,
0 1px 0 hsla(210,16%,76%,.15);
border: 1px solid hsla(210,8%,5%,.45);
border-radius: 3px;
margin: 0 3px;
}
#instruments-pane-toggle {
background: none;
box-shadow: none;
border: none;
list-style-image: url("chrome://browser/skin/devtools/debugger-collapse.png");
-moz-image-region: rect(0px,16px,16px,0px);
}
#instruments-pane-toggle[pane-collapsed] {
list-style-image: url("chrome://browser/skin/devtools/debugger-expand.png");
}
#instruments-pane-toggle:active {
-moz-image-region: rect(0px,32px,16px,16px);
}
/* Horizontal vs. vertical layout */
#vertical-layout-panes-container {
min-height: 35vh;
max-height: 80vh;
}
#body[layout=vertical] #sources-pane > tabs {
-moz-border-end: none;
}
#body[layout=vertical] #instruments-pane {
margin: 0 !important;
/* To prevent all the margin hacks to hide the sidebar. */
}
#body[layout=vertical] .side-menu-widget-container,
#body[layout=vertical] .side-menu-widget-empty-text {
box-shadow: none !important;
}
#body[layout=vertical] .side-menu-widget-item-arrow {
background-image: none !important;
}
#body[layout=vertical] .side-menu-widget-group,
#body[layout=vertical] .side-menu-widget-item {
-moz-margin-end: 0;
min-height: 24px !important;
}

View File

@ -1,554 +1,28 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#body {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
}
%include ../../shared/devtools/netmonitor.inc.css
/* Network requests table */
#requests-menu-empty-notice {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
padding: 12px;
font-size: 110%;
color: #fff;
}
#requests-menu-toolbar {
height: 32px;
padding: 0;
}
.requests-menu-header:first-child {
-moz-padding-start: 4px;
}
.requests-menu-subitem {
#headers-summary-resend {
padding: 4px;
}
.requests-menu-header:not(:last-child):-moz-locale-dir(ltr),
.requests-menu-subitem:not(:last-child):-moz-locale-dir(ltr) {
-moz-border-end: 1px solid hsla(210,8%,5%,.25);
box-shadow: 1px 0 0 hsla(210,16%,76%,.1);
}
.requests-menu-header:not(:last-child):-moz-locale-dir(rtl),
.requests-menu-subitem:not(:last-child):-moz-locale-dir(rtl) {
-moz-border-end: 1px solid hsla(210,8%,5%,.25);
box-shadow: -1px 0 0 hsla(210,16%,76%,.1);
}
.requests-menu-header-button {
-moz-appearance: none;
background: none;
min-width: 20px;
min-height: 32px;
margin: 0;
border: none;
padding: 0;
color: inherit;
font-weight: inherit !important;
transition: background-color 0.1s ease-in-out;
}
.requests-menu-header-button:hover {
background: rgba(0,0,0,0.10);
}
.requests-menu-header-button:hover:active {
background: rgba(0,0,0,0.25);
}
.requests-menu-header-button:not(:active)[sorted] {
background: rgba(0,0,0,0.15);
}
.requests-menu-header-button:not(:active)[sorted=ascending] {
background-image: radial-gradient(farthest-side at center top, hsla(200,100%,70%,.7), hsla(200,100%,70%,0.3));
background-size: 100% 1px;
background-repeat: no-repeat;
}
.requests-menu-header-button:not(:active)[sorted=descending] {
background-image: radial-gradient(farthest-side at center bottom, hsla(200,100%,70%,.7), hsla(200,100%,70%,0.3));
background-size: 100% 1px;
background-repeat: no-repeat;
background-position: bottom;
}
/* Network requests table: specific column dimensions */
.requests-menu-status-and-method {
width: 7em;
}
.requests-menu-status {
width: 10px;
height: 10px;
}
.requests-menu-method {
text-align: center;
font-weight: 600;
}
.requests-menu-file {
width: 20vw;
min-width: 4em;
}
.requests-menu-domain {
width: 16vw;
min-width: 10em;
}
.requests-menu-type {
text-align: center;
width: 4em;
}
.requests-menu-size {
text-align: center;
width: 6em;
}
/* Network requests table: status codes */
box.requests-menu-status {
background: #fff;
-moz-margin-start: 5px;
-moz-margin-end: 5px;
border-radius: 20px;
box-shadow:
0 0 0 1px rgba(255,255,255,0.4) inset,
0 -6px 4px 0 rgba(32,32,32,1.0) inset,
0 0 8px 0 rgba(32,0,0,0.4);
transition: box-shadow 0.5s ease-in-out;
}
box.requests-menu-status[code^="1"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(0,0,64,1.0) inset,
0 0 8px 0 rgba(0,0,128,1.0);
}
box.requests-menu-status[code^="2"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(0,64,0,1.0) inset,
0 0 8px 0 rgba(0,128,0,1.0);
}
box.requests-menu-status[code^="3"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(64,32,0,1.0) inset,
0 0 8px 0 rgba(128,128,0,1.0);
}
box.requests-menu-status[code^="4"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(64,0,0,1.0) inset,
0 0 8px 0 rgba(128,0,0,1.0);
}
box.requests-menu-status[code^="5"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(64,0,64,1.0) inset,
0 0 8px 0 rgba(128,0,128,1.0);
}
/* Network requests table: waterfall header */
#requests-menu-waterfall-label {
-moz-padding-start: 8px;
-moz-padding-end: 8px;
}
.requests-menu-timings-division {
width: 100px;
padding-top: 2px;
-moz-padding-start: 4px;
-moz-border-start: 1px dotted #999;
font-size: 75%;
pointer-events: none;
}
.requests-menu-timings-division:not(:first-child) {
-moz-margin-start: -100px !important; /* Don't affect layout. */
}
.requests-menu-timings-division:-moz-locale-dir(ltr) {
transform-origin: left center;
}
.requests-menu-timings-division:-moz-locale-dir(rtl) {
transform-origin: right center;
}
/* Network requests table: waterfall items */
.requests-menu-subitem.requests-menu-waterfall {
-moz-padding-start: 4px;
-moz-padding-end: 4px;
background-repeat: repeat-y; /* Background created on a <canvas> in js. */
margin-top: -1px; /* Compensate borders. */
margin-bottom: -1px;
}
.requests-menu-subitem.requests-menu-waterfall:-moz-locale-dir(rtl) {
background-position: right center;
}
.requests-menu-timings:-moz-locale-dir(ltr) {
transform-origin: left center;
}
.requests-menu-timings:-moz-locale-dir(rtl) {
transform-origin: right center;
}
.requests-menu-timings-total:-moz-locale-dir(ltr) {
transform-origin: left center;
}
.requests-menu-timings-total:-moz-locale-dir(rtl) {
transform-origin: right center;
}
.requests-menu-timings-total {
-moz-padding-start: 8px;
font-size: 85%;
font-weight: 600;
}
.requests-menu-timings-cap {
width: 4px;
height: 10px;
border: 1px solid #fff;
}
.requests-menu-timings-cap.start {
-moz-border-end: none;
}
.requests-menu-timings-cap.end {
-moz-border-start: none;
}
.requests-menu-timings-cap.start:-moz-locale-dir(ltr) {
border-radius: 4px 0 0 4px;
transform-origin: right center;
}
.requests-menu-timings-cap.start:-moz-locale-dir(rtl) {
border-radius: 0 4px 4px 0;
transform-origin: left center;
}
.requests-menu-timings-cap.end:-moz-locale-dir(ltr) {
border-radius: 0 4px 4px 0;
transform-origin: left center;
}
.requests-menu-timings-cap.end:-moz-locale-dir(rtl) {
border-radius: 4px 0 0 4px;
transform-origin: right center;
}
.requests-menu-timings-box {
height: 10px;
border-top: 1px solid #fff;
border-bottom: 1px solid #fff;
}
.requests-menu-timings-box.blocked,
.requests-menu-timings-cap.blocked {
background-color: rgba(255,32,32,0.8);
box-shadow: 0 0 8px 0 rgba(128,32,32,0.8),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.dns,
.requests-menu-timings-cap.dns {
background-color: rgba(255,128,255,0.6);
box-shadow: 0 0 8px 0 rgba(128,128,255,1.0),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.connect,
.requests-menu-timings-cap.connect {
background-color: rgba(255,128,16,0.4);
box-shadow: 0 0 8px 0 rgba(128,128,16,0.8),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.send,
.requests-menu-timings-cap.send {
background-color: rgba(255,255,128,0.4);
box-shadow: 0 0 8px 0 rgba(128,255,128,0.8),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.wait,
.requests-menu-timings-cap.wait {
background-color: rgba(255,255,255,0.2);
box-shadow: 0 0 8px 0 rgba(128,255,255,0.4),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.receive,
.requests-menu-timings-cap.receive {
background-color: rgba(255,255,255,1.0);
box-shadow: 0 0 8px 0 rgba(128,255,255,1.0),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
/* SideMenuWidget */
.side-menu-widget-item-contents {
padding: 0px;
}
.side-menu-widget-container {
box-shadow: none !important;
}
.side-menu-widget-item[odd] {
background: rgba(255,255,255,0.05);
}
/* Network request details */
#details-pane {
background: hsl(208,11%,27%);
max-width: 500px;
}
#details-pane-toggle {
background: none;
box-shadow: none;
border-color: transparent;
list-style-image: url("chrome://browser/skin/devtools/debugger-collapse.png");
-moz-image-region: rect(0px,16px,16px,0px);
}
#details-pane-toggle[pane-collapsed] {
list-style-image: url("chrome://browser/skin/devtools/debugger-expand.png");
}
#details-pane-toggle:active {
-moz-image-region: rect(0px,32px,16px,16px);
}
/* Network request details tabpanels */
.tabpanel-content {
background: url(background-noise-toolbar.png), #3e4750;
box-shadow: 0 1px 0 hsla(204,45%,98%,.05) inset;
color: #fff;
}
.tabpanel-summary-container {
padding: 1px;
}
.tabpanel-summary-label {
-moz-padding-start: 4px;
-moz-padding-end: 3px;
font-weight: 600;
text-shadow: 0 1px 0 #000;
color: hsl(210,30%,85%);
}
.tabpanel-summary-value {
-moz-padding-start: 3px;
}
/* Headers tabpanel */
#headers-summary-status,
#headers-summary-version {
padding-bottom: 2px;
}
#headers-summary-size {
padding-top: 2px;
}
#headers-summary-resend {
margin: 0 6px;
min-height: 20px;
}
/* Response tabpanel */
#response-content-info-header {
background:
url(background-noise-toolbar.png),
linear-gradient(hsl(0,61%,40%), hsl(0,61%,31%)) repeat-x top left;
box-shadow:
inset 0 1px 0 hsla(210,40%,83%,.15),
inset 0 -1px 0 hsla(210,40%,83%,.05);
margin: 0;
padding: 5px 8px;
}
#response-content-image-box {
padding-top: 10px;
padding-bottom: 10px;
}
#response-content-image {
background: #fff;
border: 1px dashed GrayText;
margin-bottom: 10px;
}
/* Timings tabpanel */
#timings-tabpanel .tabpanel-summary-label {
width: 10em;
}
#timings-tabpanel .requests-menu-timings-box {
transition: transform 0.2s ease-out;
min-width: 1px;
}
#timings-tabpanel .requests-menu-timings-total {
transition: transform 0.2s ease-out;
}
/* Custom request form */
#custom-pane {
padding: 0.6em 0.5em;
}
.custom-header {
font-size: 1.1em;
}
.custom-section {
margin-top: 0.5em;
}
#custom-method-value {
width: 4.5em;
}
/* Footer */
#requests-menu-footer {
box-shadow: inset 0 1px 16px hsla(210,8%,5%,.3);
}
.requests-menu-footer-button,
.requests-menu-footer-label {
min-width: 1em;
margin: 0;
border: none;
padding: 2px 1.5vw;
color: #fff;
}
.requests-menu-footer-spacer {
min-width: 2px;
}
.requests-menu-footer-spacer,
.requests-menu-footer-button {
-moz-border-end: 1px solid hsla(210,8%,5%,.25);
box-shadow: 1px 0 0 hsla(210,16%,76%,.1);
}
.requests-menu-footer-button {
-moz-appearance: none;
background: rgba(0,0,0,0.025);
}
.requests-menu-footer-button:hover {
background: rgba(0,0,0,0.20);
}
.requests-menu-footer-button:hover:active {
background: rgba(0,0,0,0.35);
}
.requests-menu-footer-button:not(:active)[checked] {
background-color: rgba(0,0,0,0.25);
background-image: radial-gradient(farthest-side at center top, hsla(200,100%,70%,.7), hsla(200,100%,70%,0.3));
background-size: 100% 1px;
background-repeat: no-repeat;
}
.requests-menu-footer-label {
font-weight: 600;
}
/* Responsive sidebar */
@media (max-width: 700px) {
#requests-menu-toolbar {
height: 26px;
}
.requests-menu-header-button {
min-height: 26px;
font-size: 85%;
}
.requests-menu-footer-button,
.requests-menu-footer-label {
padding: 2px 2vw;
}
#details-pane {
max-width: none;
margin: 0 !important;
/* To prevent all the margin hacks to hide the sidebar. */
}
.requests-menu-status-and-method {
width: 16vw;
}
.requests-menu-file,
.requests-menu-domain {
width: 30vw;
}
.requests-menu-type {
width: 8vw;
}
.requests-menu-size {
width: 16vw;
border-width: 0 !important;
box-shadow: none !important;
/* The "Timeline" header is not visible anymore, and thus the
right border and box-shadow of "Size" column should be hidden. */
}
}
@media (min-width: 701px) {
#network-table[type-overflows] .requests-menu-domain {
border-width: 0 !important;
box-shadow: none !important;
/* The "Type" header is not visible anymore, and thus the
right border and box-shadow of "Domain" column should be hidden. */
}
#network-table[domain-overflows] .requests-menu-file {
border-width: 0 !important;
box-shadow: none !important;
/* The "Domain" header is not visible anymore, and thus the
right border and box-shadow of "File" column should be hidden. */
}
}

View File

@ -3,7 +3,3 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
%include ../../shared/devtools/shadereditor.inc.css
.side-menu-widget-item-checkbox > .checkbox-spacer-box {
-moz-appearance: none;
}

View File

@ -1,723 +1,11 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* Generic pane helpers */
.generic-toggled-side-pane {
-moz-margin-start: 0px !important;
/* Unfortunately, transitions don't work properly with locale-aware properties,
so both the left and right margins are set via js, while the start margin
is always overridden here. */
}
.generic-toggled-side-pane[animated] {
transition: margin 0.25s ease-in-out;
}
/* BreacrumbsWidget */
.breadcrumbs-widget-container {
-moz-margin-end: 3px;
/* A fake 1px-shadow is included in the border-images of the
breadcrumbs-widget-items, to match toolbar-buttons style.
This negative margin compensates the extra row of pixels created
by the shadow.*/
margin-bottom: -1px;
}
/* Preloading hack, LTR */
.breadcrumbs-widget-container:-moz-locale-dir(ltr)::after {
content: '';
display: block;
background-image:
url(breadcrumbs/ltr-start.png),
url(breadcrumbs/ltr-start-selected.png),
url(breadcrumbs/ltr-start-pressed.png),
url(breadcrumbs/ltr-start-selected-pressed.png),
url(breadcrumbs/ltr-middle.png),
url(breadcrumbs/ltr-middle-selected.png),
url(breadcrumbs/ltr-middle-pressed.png),
url(breadcrumbs/ltr-middle-selected-pressed.png),
url(breadcrumbs/ltr-end.png),
url(breadcrumbs/ltr-end-selected.png),
url(breadcrumbs/ltr-end-pressed.png),
url(breadcrumbs/ltr-end-selected-pressed.png);
}
/* Preloading hack, RTL */
.breadcrumbs-widget-container:-moz-locale-dir(rtl)::after {
content: '';
display: block;
background-image:
url(breadcrumbs/rtl-start.png),
url(breadcrumbs/rtl-start-selected.png),
url(breadcrumbs/rtl-start-pressed.png),
url(breadcrumbs/rtl-start-selected-pressed.png),
url(breadcrumbs/rtl-middle.png),
url(breadcrumbs/rtl-middle-selected.png),
url(breadcrumbs/rtl-middle-pressed.png),
url(breadcrumbs/rtl-middle-selected-pressed.png),
url(breadcrumbs/rtl-end.png),
url(breadcrumbs/rtl-end-selected.png),
url(breadcrumbs/rtl-end-pressed.png),
url(breadcrumbs/rtl-end-selected-pressed.png);
}
.scrollbutton-up,
.scrollbutton-down {
-moz-appearance: none;
background: linear-gradient(hsla(212,7%,57%,.35), hsla(212,7%,57%,.1)) padding-box;
box-shadow: 0 1px 0 hsla(210,16%,76%,.15) inset,
0 0 0 1px hsla(210,16%,76%,.15) inset,
0 1px 0 hsla(210,16%,76%,.15);
border: 1px solid hsla(210,8%,5%,.45);
margin: 0 0 1px;
}
.scrollbutton-up:not([disabled]):active:hover,
.scrollbutton-down:not([disabled]):active:hover {
background: linear-gradient(hsla(220,6%,10%,.3), hsla(212,7%,57%,.15) 65%, hsla(212,7%,57%,.3));
box-shadow: 0 0 3px hsla(210,8%,5%,.25) inset,
0 1px 3px hsla(210,8%,5%,.25) inset,
0 1px 0 hsla(210,16%,76%,.15);
border-color: hsla(210,8%,5%,.6);
}
.scrollbutton-up > .toolbarbutton-icon,
.scrollbutton-down > .toolbarbutton-icon {
-moz-appearance: none;
list-style-image: url("breadcrumbs-scrollbutton.png");
-moz-image-region: rect(0px,7px,16px,0px);
margin: 0 5px;
}
.scrollbutton-up:not([disabled]):active:hover > .toolbarbutton-icon,
.scrollbutton-down:not([disabled]):active:hover > .toolbarbutton-icon {
-moz-image-region: rect(0px,14px,16px,7px);
}
.scrollbutton-up[disabled] > .toolbarbutton-icon,
.scrollbutton-down[disabled] > .toolbarbutton-icon {
opacity: 0.5;
}
.scrollbutton-up > .toolbarbutton-icon:-moz-locale-dir(rtl),
.scrollbutton-down > .toolbarbutton-icon:-moz-locale-dir(ltr) {
transform: scaleX(-1);
}
.breadcrumbs-widget-item {
background-color: transparent;
-moz-appearance: none;
overflow: hidden;
min-width: 85px;
max-width: 250px;
min-height: 25px;
border-style: solid;
border-width: 1px 13px 2px 13px;
margin: 0 -11px 0 0;
padding: 0 9px;
outline: none;
color: hsl(210,30%,85%);
}
.breadcrumbs-widget-item:-moz-focusring > label {
border-bottom: 1px dotted hsla(210,30%,85%,0.4);
}
.breadcrumbs-widget-item[checked] .breadcrumbs-widget-item-tag {
color: hsl(208,100%,60%);
}
.breadcrumbs-widget-item[checked] .breadcrumbs-widget-item-id {
color: hsl(205,100%,70%);
}
.breadcrumbs-widget-item[checked] .breadcrumbs-widget-item-pseudo-classes {
color: hsl(20,100%,70%);
}
.breadcrumbs-widget-item-id,
.breadcrumbs-widget-item-classes {
color: #8d99a6;
}
.breadcrumbs-widget-item-pseudo-classes {
color: hsl(20,100%,85%);
}
/* Breadcrumbs LTR */
.breadcrumbs-widget-item:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:not([checked]):hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:not([checked]):hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:not([checked]):hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:first-of-type:-moz-locale-dir(ltr) {
border-left-width: 0;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:last-of-type:-moz-locale-dir(ltr) {
border-right-width: 0;
}
/* Breadcrumbs RTL */
.breadcrumbs-widget-item:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:not([checked]):hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:first-of-type:-moz-locale-dir(rtl) {
border-right-width: 0;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:last-of-type:-moz-locale-dir(rtl) {
border-left-width: 0;
}
/* SimpleListWidget */
.simple-list-widget-item:not(.selected):hover {
background: linear-gradient(rgba(255,255,255,0.9), rgba(255,255,255,0.85)), Highlight;
}
.simple-list-widget-item.selected {
background: linear-gradient(rgba(255,255,255,0.85), rgba(255,255,255,0.8)), Highlight;
color: #000;
}
.simple-list-widget-perma-text,
.simple-list-widget-empty-text {
color: GrayText;
padding: 4px 8px;
}
/* FastListWidget */
.fast-list-widget-container {
/* Hack: force hardware acceleration */
transform: translateZ(1px);
}
.theme-dark .fast-list-widget-empty-text {
padding: 12px;
font-weight: 600;
color: #fff;
}
.theme-light .fast-list-widget-empty-text {
padding: 4px 8px;
color: GrayText;
}
/* SideMenuWidget */
.side-menu-widget-container {
/* Hack: force hardware acceleration */
transform: translateZ(1px);
}
.side-menu-widget-container[theme="dark"] {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
color: #fff;
}
.side-menu-widget-container[theme="light"] {
background: #fff;
color: #000;
}
/* SideMenuWidget container */
.side-menu-widget-container:-moz-locale-dir(ltr),
.side-menu-widget-empty-text:-moz-locale-dir(ltr) {
box-shadow: inset -1px 0 0 #222426;
}
.side-menu-widget-container:-moz-locale-dir(rtl),
.side-menu-widget-empty-text:-moz-locale-dir(rtl) {
box-shadow: inset 1px 0 0 #222426;
}
.side-menu-widget-group {
/* To allow visibility of the dark margin shadow. */
-moz-margin-end: 1px;
}
.side-menu-widget-container[with-arrows=true] .side-menu-widget-item {
/* To compensate for the arrow image's dark margin. */
-moz-margin-end: -1px;
}
/* SideMenuWidget groups */
.side-menu-widget-group-title {
padding: 4px;
}
.side-menu-widget-group-title[theme="dark"] {
background-image: linear-gradient(#1f3e4f, #1b3243);
text-shadow: 0 -1px 0 hsla(210,8%,5%,.45);
box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
0 -2px 0 hsla(206,37%,4%,.05) inset,
0 -1px 1px hsla(206,37%,4%,.1) inset;
}
.side-menu-widget-group-title[theme="light"] {
background-image: linear-gradient(#fff, #eee);
}
/* SideMenuWidget items */
.side-menu-widget-item[theme="dark"] {
border-top: 1px solid hsla(210,8%,5%,.25);
border-bottom: 1px solid hsla(210,16%,76%,.1);
margin-top: -1px;
margin-bottom: -1px;
}
.side-menu-widget-item[theme="light"] {
border-top: 1px solid hsla(210,8%,75%,.25);
border-bottom: 1px solid hsla(210,16%,76%,.1);
margin-top: -1px;
margin-bottom: -1px;
}
.side-menu-widget-item[theme="dark"]:last-of-type {
box-shadow: inset 0 -1px 0 hsla(210,8%,5%,.25);
}
.side-menu-widget-item[theme="light"]:last-of-type {
box-shadow: inset 0 -1px 0 hsla(210,8%,75%,.25);
}
.side-menu-widget-item.selected {
background: linear-gradient(hsl(206,61%,40%), hsl(206,61%,31%)) repeat-x top left !important;
box-shadow: inset 0 1px 0 hsla(210,40%,83%,.15);
}
.side-menu-widget-item.selected > .side-menu-widget-item-arrow {
background-size: auto, 1px 100%;
background-repeat: no-repeat;
}
.side-menu-widget-item.selected > .side-menu-widget-item-arrow:-moz-locale-dir(ltr) {
background-image: url(itemArrow-ltr.png), linear-gradient(to right, #222426, #222426);
background-position: center right, top right;
}
.side-menu-widget-item.selected > .side-menu-widget-item-arrow:-moz-locale-dir(rtl) {
background-image: url(itemArrow-rtl.png), linear-gradient(to right, #222426, #222426);
background-position: center left, top left;
}
/* SideMenuWidget items contents */
.side-menu-widget-item-contents {
padding: 4px 0px;
}
.side-menu-widget-item-arrow {
-moz-margin-start: -8px;
width: 8px;
}
.side-menu-widget-item-other {
background: url(background-noise-toolbar.png), hsla(208,11%,27%, 0.65);
}
.side-menu-widget-item-other.selected {
background: url(background-noise-toolbar.png), hsla(208,11%,27%, 0.15);
box-shadow: inset 0 1px 0 hsla(210,40%,83%,.07),
inset 0 -1px 0 hsla(210,40%,83%,.07);
}
.side-menu-widget-item-other:first-of-type {
margin-bottom: 4px;
border-top-left-radius: 4px;
}
.side-menu-widget-item-other:last-of-type {
margin-bottom: -4px;
}
.side-menu-widget-item-other > label {
color: #f5f7fa;
text-shadow: 0 1px 1px #111;
}
/* SideMenuWidget checkboxes */
.side-menu-widget-group-checkbox {
margin: 0;
-moz-margin-end: 4px;
}
.side-menu-widget-item-checkbox {
margin: 0;
-moz-margin-start: 4px;
-moz-margin-end: -4px;
}
%include ../../shared/devtools/widgets.inc.css
.side-menu-widget-group-checkbox .checkbox-spacer-box,
.side-menu-widget-item-checkbox .checkbox-spacer-box {
margin: 0;
border: none;
}
/* SideMenuWidget misc */
.side-menu-widget-empty-text[theme="dark"] {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
padding: 12px;
font-weight: 600;
color: #fff;
}
.side-menu-widget-empty-text[theme="light"] {
background: #fff;
padding: 4px 8px;
color: GrayText;
}
/* VariablesView */
.variables-view-container {
/* Hack: force hardware acceleration */
transform: translateZ(1px);
}
.variables-view-empty-notice {
color: GrayText;
padding: 2px;
}
.variables-view-scope > .title {
color: #fff;
}
/* Generic variables traits */
.variables-view-variable:not(:last-child) {
border-bottom: 1px solid rgba(128, 128, 128, .15);
}
.variables-view-variable > .title > .name {
font-weight: 600;
}
/* Generic variables *and* properties traits */
.variable-or-property:focus > .title > label {
color: inherit !important;
}
.variable-or-property > .title > .value {
-moz-box-flex: 1;
}
.variable-or-property > .title > .arrow {
-moz-margin-start: 3px;
}
.variable-or-property:not([untitled]) > .variables-view-element-details {
-moz-margin-start: 7px;
}
/* Traits applied when variables or properties are changed or overridden */
.variable-or-property:not([overridden]) {
transition: background 1s ease-in-out;
}
.variable-or-property:not([overridden])[changed] {
transition-duration: .4s;
}
.variable-or-property[overridden] {
background: rgba(128,128,128,0.05);
}
.variable-or-property[overridden] .title > label {
/* Cross out the title for this variable and all child properties. */
font-style: italic;
text-decoration: line-through;
border-bottom: none !important;
color: rgba(128,128,128,0.9);
opacity: 0.7;
}
/* Traits applied when variables or properties are editable */
.variable-or-property[editable] > .title > .value {
cursor: text;
}
.variable-or-property[overridden] .title > .value {
/* Disallow editing this variable and all child properties. */
pointer-events: none;
}
/* Custom configurable/enumerable/writable or frozen/sealed/extensible
* variables and properties */
.variable-or-property[non-enumerable]:not([self]):not([pseudo-item]) > .title > .name {
opacity: 0.6;
}
.variable-or-property[non-configurable]:not([pseudo-item]) > .title > .name {
border-bottom: 1px dashed #99f;
}
.variable-or-property[non-writable]:not([pseudo-item]) > .title > .name {
border-bottom: 1px dashed #f99;
}
.variable-or-property[safe-getter]:not([pseudo-item]) > .title > .name {
border-bottom: 1px dashed #8b0;
}
.variable-or-property-non-writable-icon {
background: url("chrome://browser/skin/identity-icons-https.png") no-repeat;
width: 16px;
height: 16px;
opacity: 0.5;
}
@media (min-resolution: 2dppx) {
.variable-or-property-non-writable-icon {
background-image: url("chrome://browser/skin/identity-icons-https@2x.png");
background-size: 32px;
}
}
.variable-or-property-frozen-label,
.variable-or-property-sealed-label,
.variable-or-property-non-extensible-label {
-moz-padding-end: 4px;
}
.variable-or-property:not(:focus) > .title > .variable-or-property-frozen-label,
.variable-or-property:not(:focus) > .title > .variable-or-property-sealed-label,
.variable-or-property:not(:focus) > .title > .variable-or-property-non-extensible-label {
color: #666;
}
/* Aligned values */
.variables-view-container[aligned-values] .title > .separator {
-moz-box-flex: 1;
}
.variables-view-container[aligned-values] .title > .value {
-moz-box-flex: 0;
width: 70vw;
}
.variables-view-container[aligned-values] .title > .element-value-input {
width: calc(70vw - 10px);
}
/* Actions first */
.variables-view-container[actions-first] .variables-view-delete,
.variables-view-container[actions-first] .variables-view-add-property {
-moz-box-ordinal-group: 0;
}
.variables-view-container[actions-first] [invisible] {
visibility: hidden;
}
/* Variables and properties tooltips */
.variable-or-property > tooltip > label {
margin: 0 2px 0 2px;
}
.variable-or-property[non-enumerable] > tooltip > label.enumerable,
.variable-or-property[non-configurable] > tooltip > label.configurable,
.variable-or-property[non-writable] > tooltip > label.writable,
.variable-or-property[non-extensible] > tooltip > label.extensible {
color: #800;
text-decoration: line-through;
}
.variable-or-property[overridden] > tooltip > label.overridden {
-moz-padding-start: 4px;
-moz-border-start: 1px dotted #000;
}
.variable-or-property[safe-getter] > tooltip > label.WebIDL {
-moz-padding-start: 4px;
-moz-border-start: 1px dotted #000;
color: #080;
}
/* Variables and properties editing */
.variables-view-delete {
list-style-image: url("chrome://browser/skin/devtools/vview-delete.png");
-moz-image-region: rect(0,16px,16px,0);
}
.variables-view-delete:hover {
-moz-image-region: rect(0,32px,16px,16px);
}
.variables-view-delete:active {
-moz-image-region: rect(0,48px,16px,32px);
}
.variables-view-edit {
background: url("chrome://browser/skin/devtools/vview-edit.png") center no-repeat;
width: 20px;
height: 16px;
cursor: pointer;
}
.variables-view-throbber {
background: url("chrome://global/skin/icons/loading_16.png") center no-repeat;
width: 16px;
height: 16px;
}
.element-value-input {
-moz-margin-start: -2px !important;
-moz-margin-end: 2px !important;
}
.element-name-input {
-moz-margin-start: -2px !important;
-moz-margin-end: 2px !important;
font-weight: 600;
}
.element-value-input,
.element-name-input {
border: 1px solid rgba(128, 128, 128, .5) !important;
border-radius: 0;
color: inherit;
}
/* Variables and properties searching */
.variables-view-searchinput {
min-height: 24px;
}
.variable-or-property[unmatched] {
border: none;
margin: 0;
}
/* Expand/collapse arrow */
.arrow {
-moz-appearance: treetwisty;
height: 20px;
margin-top: 1px;
-moz-margin-start: 10px;
-moz-margin-end: 5px;
}
.arrow[open] {
-moz-appearance: treetwistyopen;
}
.arrow[invisible] {
visibility: hidden;
}
%include ../../shared/devtools/app-manager/manifest-editor.inc.css

View File

@ -196,15 +196,17 @@ browser.jar:
skin/classic/browser/devtools/splitview.css (devtools/splitview.css)
skin/classic/browser/devtools/styleeditor.css (devtools/styleeditor.css)
* skin/classic/browser/devtools/shadereditor.css (devtools/shadereditor.css)
skin/classic/browser/devtools/debugger.css (devtools/debugger.css)
* skin/classic/browser/devtools/debugger.css (devtools/debugger.css)
* skin/classic/browser/devtools/profiler.css (devtools/profiler.css)
skin/classic/browser/devtools/netmonitor.css (devtools/netmonitor.css)
* skin/classic/browser/devtools/netmonitor.css (devtools/netmonitor.css)
* skin/classic/browser/devtools/scratchpad.css (devtools/scratchpad.css)
skin/classic/browser/devtools/magnifying-glass.png (devtools/magnifying-glass.png)
skin/classic/browser/devtools/option-icon.png (devtools/option-icon.png)
skin/classic/browser/devtools/itemToggle.png (devtools/itemToggle.png)
skin/classic/browser/devtools/itemArrow-rtl.png (devtools/itemArrow-rtl.png)
skin/classic/browser/devtools/itemArrow-ltr.png (devtools/itemArrow-ltr.png)
skin/classic/browser/devtools/itemArrow-dark-rtl.png (../shared/devtools/images/itemArrow-dark-rtl.png)
skin/classic/browser/devtools/itemArrow-dark-ltr.png (../shared/devtools/images/itemArrow-dark-ltr.png)
skin/classic/browser/devtools/itemArrow-rtl.png (../shared/devtools/images/itemArrow-rtl.png)
skin/classic/browser/devtools/itemArrow-ltr.png (../shared/devtools/images/itemArrow-ltr.png)
skin/classic/browser/devtools/background-noise-toolbar.png (devtools/background-noise-toolbar.png)
skin/classic/browser/devtools/noise.png (devtools/noise.png)
skin/classic/browser/devtools/inspect-button.png (devtools/inspect-button.png)

View File

@ -1,600 +1,6 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
%include ../shared.inc
/* Sources and breakpoints pane */
#sources-pane > tabs {
-moz-border-end: 1px solid #222426; /* Match the sources list's dark margin. */
}
#sources-pane[selectedIndex="0"] + #sources-and-editor-splitter {
border-color: transparent;
}
/* Sources toolbar */
#sources-toolbar {
border: none; /* Remove the devtools-toolbar's black bottom border. */
-moz-border-end: 1px solid #222426; /* Match the sources list's dark margin. */
}
#sources-toolbar > .devtools-toolbarbutton,
#sources-controls > .devtools-toolbarbutton {
min-width: 32px;
}
#black-box {
list-style-image: url(debugger-blackbox.png);
}
#pretty-print {
font-weight: bold;
}
#toggle-breakpoints {
list-style-image: url(debugger-toggleBreakpoints.png);
}
#sources-toolbar .devtools-toolbarbutton:not([label]) {
-moz-image-region: rect(0px,16px,16px,0px);
}
#sources-toolbar .devtools-toolbarbutton:not([label])[checked] {
-moz-image-region: rect(0px,32px,16px,16px);
}
#sources .black-boxed {
color: #888;
}
#sources .black-boxed > .dbg-breakpoint {
display: none;
}
#sources .black-boxed + .side-menu-widget-item-arrow:-moz-locale-dir(ltr) {
background-image: none;
box-shadow: inset -1px 0 0 #222426;
}
#sources .black-boxed + .side-menu-widget-item-arrow:-moz-locale-dir(rtl) {
background-image: none;
box-shadow: inset 1px 0 0 #222426;
}
/* Black box message and source progress meter */
#black-boxed-message,
#source-progress-container {
background: url(background-noise-toolbar.png) rgb(61,69,76);
/* Prevent the container deck from aquiring the size from this message. */
min-width: 1px;
min-height: 1px;
color: white;
}
#source-progress {
min-height: 2em;
min-width: 40em;
}
#black-boxed-message-label,
#black-boxed-message-button {
text-align: center;
font-size: 120%;
}
#black-boxed-message-button {
margin-top: 1em;
padding: .25em;
}
/* Tracer */
#trace {
list-style-image: url(tracer-icon.png);
-moz-image-region: rect(0px,16px,16px,0px);
}
#trace[checked] {
-moz-image-region: rect(0px,32px,16px,16px);
}
#clear-tracer {
/* Make this button as narrow as the text inside it. */
min-width: 1px;
}
.trace-name {
-moz-padding-start: 4px !important;
}
/* Tracer dark theme */
.theme-dark .trace-item {
color: #f5f7fa; /* Light foreground text */
}
.theme-dark .trace-item.selected-matching {
background-color: rgba(29, 79, 115, .4); /* Select highlight blue at 40% alpha */
}
.theme-dark .selected > .trace-item {
background-color: rgba(29, 79, 115, .75); /* Select highlight blue at 75% alpha */
}
.theme-dark .trace-call {
color: #46afe3; /* highlight blue */
}
.theme-dark .trace-return,
.theme-dark .trace-yield {
color: #70bf53; /* highlight green */
}
.theme-dark .trace-throw {
color: #eb5368; /* highlight red */
}
.theme-dark .trace-param {
color: #b8c8d9; /* Content text light */
}
.theme-dark .trace-syntax {
color: #8fa1b2; /* Content text grey */
}
/* Tracer light theme */
.theme-light .trace-item {
color: #292e33; /* Dark foreground text */
}
.theme-light .trace-item.selected-matching {
background-color: rgba(76, 158, 217, .4); /* Select highlight blue at 40% alpha */
}
.theme-light .selected > .trace-item {
background-color: rgba(76, 158, 217, .75); /* Select highlight blue at 75% alpha */
}
.theme-light .trace-call {
color: #0088cc; /* highlight blue */
}
.theme-light .trace-return,
.theme-light .trace-yield {
color: #2cbb0f; /* highlight green */
}
.theme-light .trace-throw {
color: #ed2655; /* highlight red */
}
.theme-light .trace-param {
color: #667380; /* Content text dark grey */
}
.theme-light .trace-syntax {
color: #8fa1b2; /* Content text grey */
}
/* Breadcrumbs stack frames view */
.breadcrumbs-widget-item {
max-width: none;
}
.dbg-stackframe-details {
-moz-padding-start: 4px;
}
/* Classic stack frames view */
.dbg-classic-stackframe {
display: block;
padding: 0px 4px;
}
.dbg-classic-stackframe-title {
font-weight: 600;
color: #046;
}
.dbg-classic-stackframe-details:-moz-locale-dir(ltr) {
float: right;
}
.dbg-classic-stackframe-details:-moz-locale-dir(rtl) {
float: left;
}
.dbg-classic-stackframe-details-url {
max-width: 90%;
text-align: end;
color: #666;
}
.dbg-classic-stackframe-details-sep {
color: #aaa;
}
.dbg-classic-stackframe-details-line {
color: #58b;
}
#callstack-list .side-menu-widget-item.selected label {
color: #fff;
}
/* Sources and breakpoints view */
.dbg-breakpoint {
-moz-margin-start: 4px;
}
.dbg-breakpoint-line {
font-weight: 600;
}
.dbg-breakpoint-text {
-moz-margin-start: 10px !important;
font-style: italic;
font-size: 90%;
}
.dbg-breakpoint-checkbox {
width: 16px;
height: 16px;
margin: 2px;
}
/* Variable bubble view */
.devtools-tooltip-simple-text.token-undefined,
.devtools-tooltip-simple-text.token-null {
text-align: center;
color: #666 !important; /* Override the theme's color. */
}
.devtools-tooltip-simple-text.token-boolean {
text-align: center;
color: #10c !important;
}
.devtools-tooltip-simple-text.token-number {
text-align: center;
color: #c00 !important;
}
.devtools-tooltip-simple-text.token-string {
text-align: start;
color: #282 !important;
}
.devtools-tooltip-simple-text.token-other {
text-align: center;
color: #333 !important;
}
/* Instruments pane (watch expressions, variables, event listeners...) */
#instruments-pane .side-menu-widget-container,
#instruments-pane .side-menu-widget-empty-text {
box-shadow: none !important;
}
/* Watch expressions view */
#expressions {
min-height: 10px;
max-height: 125px;
}
.dbg-expression {
height: 20px;
}
.dbg-expression-arrow {
width: 16px;
height: auto;
margin: 2px;
background: -moz-image-rect(url(commandline-icon.png), 0, 32, 16, 16);
}
.dbg-expression-input {
color: inherit;
}
/* Event listeners view */
.dbg-event-listener {
padding: 0px 8px;
}
.dbg-event-listener-type {
font-weight: 600;
}
.dbg-event-listener-separator {
color: #999;
}
.dbg-event-listener-targets {
color: #046;
}
.dbg-event-listener-location {
color: #666;
}
#event-listeners .side-menu-widget-item.selected {
background: none !important;
}
/* Searchbox and the search operations help panel */
#searchbox {
min-width: 220px;
-moz-margin-start: 1px;
}
#filter-label {
-moz-margin-start: 2px;
}
#searchbox-panel-operators {
margin-top: 5px;
margin-bottom: 8px;
-moz-margin-start: 2px;
}
.searchbox-panel-operator-button {
min-width: 26px;
margin-top: 0;
margin-bottom: 0;
-moz-margin-start: 2px;
-moz-margin-end: 6px;
text-align: center;
}
.searchbox-panel-operator-label {
padding-bottom: 2px;
}
/* Searchbox results panel */
.results-panel {
padding: 4px;
}
.results-panel-item {
background: #f4f4f4;
border: 1px solid #ddd;
border-top-color: #fff;
padding: 5px;
cursor: pointer;
}
.results-panel-item:first-of-type {
border-top-color: #ddd;
border-radius: 4px 4px 0 0;
}
.results-panel-item:last-of-type {
border-radius: 0 0 4px 4px;
}
.results-panel-item:only-of-type {
border-radius: 4px;
}
.results-panel-item:not(.selected):not(:hover) {
text-shadow: 0 1px #fff;
}
.results-panel-item-label-before {
-moz-margin-end: 5px !important;
color: #444;
cursor: inherit;
}
.results-panel-item-label {
color: #111;
font-weight: 600;
cursor: inherit;
}
.results-panel-item-label-below {
color: #7f7f7f;
cursor: inherit;
}
/* Sources search view */
#globalsearch {
min-height: 10px;
max-height: 125px;
box-shadow: inset 0 -4px 8px #eee;
background: url(background-noise-toolbar.png);
}
#globalsearch + .devtools-horizontal-splitter {
border-color: #bfbfbf;
}
.dbg-source-results {
padding: 0;
background: none !important;
}
.dbg-results-header {
-moz-padding-start: 6px;
}
.dbg-results-header-location {
font-weight: 600;
}
.dbg-results-header-match-count {
-moz-padding-start: 6px;
color: GrayText;
}
.dbg-results-line-number {
background: #e2e2e2;
min-width: 40px;
-moz-border-end: 1px solid #b4c4d3;
-moz-padding-end: 4px;
padding-top: 2px;
text-align: end;
color: #8c8c8c;
}
.dbg-results-line-contents {
-moz-padding-start: 4px;
padding-top: 1px;
padding-bottom: 1px;
}
.dbg-results-line-contents-string {
padding: 1px;
}
.dbg-results-line-contents-string[match=true] {
background: rgba(255,255,0,0.5);
padding: 0;
border: 1px solid #aaa;
border-radius: 4px;
cursor: pointer;
}
.dbg-results-line-contents-string[match=true][focusing] {
transition: transform 0.3s ease-in-out;
}
.dbg-results-line-contents-string[match=true][focused] {
transition-duration: 0.1s;
transform: scale(1.75, 1.75);
}
/* Toolbar controls */
.devtools-sidebar-tabs > tabs > tab {
min-height: 1em !important;
padding: 0 !important;
}
#resumption-panel-desc {
width: 200px;
}
#resumption-order-panel {
-moz-margin-start: -8px;
}
#resume {
list-style-image: url("chrome://browser/skin/devtools/debugger-pause.png");
-moz-image-region: rect(0px,16px,16px,0px);
transition: background 0.15s ease-in-out;
}
#resume[checked] {
background: none;
list-style-image: url("chrome://browser/skin/devtools/debugger-play.png");
-moz-image-region: rect(0px,32px,16px,16px);
}
#resume ~ toolbarbutton {
transition: opacity 0.15s ease-in-out;
}
#resume:not([checked]) ~ toolbarbutton {
opacity: 0.5;
}
#step-over {
list-style-image: url("chrome://browser/skin/devtools/debugger-step-over.png");
}
#step-in {
list-style-image: url("chrome://browser/skin/devtools/debugger-step-in.png");
}
#step-out {
list-style-image: url("chrome://browser/skin/devtools/debugger-step-out.png");
}
#debugger-controls > toolbarbutton,
#sources-controls > toolbarbutton {
margin: 0;
box-shadow: none;
border-radius: 0;
border-width: 0;
-moz-border-end-width: 1px;
outline-offset: -3px;
}
#debugger-controls > toolbarbutton:last-of-type,
#sources-controls > toolbarbutton:last-of-type {
-moz-border-end-width: 0;
}
#debugger-controls,
#sources-controls {
box-shadow: 0 1px 0 hsla(210,16%,76%,.15) inset,
0 0 0 1px hsla(210,16%,76%,.15) inset,
0 1px 0 hsla(210,16%,76%,.15);
border: 1px solid hsla(210,8%,5%,.45);
border-radius: @toolbarbuttonCornerRadius@;
margin: 0 3px;
}
#instruments-pane-toggle {
background: none;
box-shadow: none;
border: none;
list-style-image: url("chrome://browser/skin/devtools/debugger-collapse.png");
-moz-image-region: rect(0px,16px,16px,0px);
}
#instruments-pane-toggle[pane-collapsed] {
list-style-image: url("chrome://browser/skin/devtools/debugger-expand.png");
}
#instruments-pane-toggle:active {
-moz-image-region: rect(0px,32px,16px,16px);
}
/* Horizontal vs. vertical layout */
#vertical-layout-panes-container {
min-height: 35vh;
max-height: 80vh;
}
#body[layout=vertical] #sources-pane > tabs {
-moz-border-end: none;
}
#body[layout=vertical] #instruments-pane {
margin: 0 !important;
/* To prevent all the margin hacks to hide the sidebar. */
}
#body[layout=vertical] .side-menu-widget-container,
#body[layout=vertical] .side-menu-widget-empty-text {
box-shadow: none !important;
}
#body[layout=vertical] .side-menu-widget-item-arrow {
background-image: none !important;
}
#body[layout=vertical] .side-menu-widget-group,
#body[layout=vertical] .side-menu-widget-item {
-moz-margin-end: 0;
}
%include ../../shared/devtools/debugger.inc.css

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,553 +1,6 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#body {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
}
/* Network requests table */
#requests-menu-empty-notice {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
padding: 12px;
font-size: 110%;
color: #fff;
}
#requests-menu-toolbar {
height: 32px;
padding: 0;
}
.requests-menu-header:first-child {
-moz-padding-start: 4px;
}
.requests-menu-subitem {
padding: 4px;
}
.requests-menu-header:not(:last-child):-moz-locale-dir(ltr),
.requests-menu-subitem:not(:last-child):-moz-locale-dir(ltr) {
-moz-border-end: 1px solid hsla(210,8%,5%,.25);
box-shadow: 1px 0 0 hsla(210,16%,76%,.1);
}
.requests-menu-header:not(:last-child):-moz-locale-dir(rtl),
.requests-menu-subitem:not(:last-child):-moz-locale-dir(rtl) {
-moz-border-end: 1px solid hsla(210,8%,5%,.25);
box-shadow: -1px 0 0 hsla(210,16%,76%,.1);
}
.requests-menu-header-button {
-moz-appearance: none;
background: none;
min-width: 20px;
min-height: 32px;
margin: 0;
border: none;
padding: 0;
color: inherit;
font-weight: inherit !important;
transition: background-color 0.1s ease-in-out;
}
.requests-menu-header-button:hover {
background: rgba(0,0,0,0.10);
}
.requests-menu-header-button:hover:active {
background: rgba(0,0,0,0.25);
}
.requests-menu-header-button:not(:active)[sorted] {
background: rgba(0,0,0,0.15);
}
.requests-menu-header-button:not(:active)[sorted=ascending] {
background-image: radial-gradient(farthest-side at center top, hsla(200,100%,70%,.7), hsla(200,100%,70%,0.3));
background-size: 100% 1px;
background-repeat: no-repeat;
}
.requests-menu-header-button:not(:active)[sorted=descending] {
background-image: radial-gradient(farthest-side at center bottom, hsla(200,100%,70%,.7), hsla(200,100%,70%,0.3));
background-size: 100% 1px;
background-repeat: no-repeat;
background-position: bottom;
}
/* Network requests table: specific column dimensions */
.requests-menu-status-and-method {
width: 8em;
}
.requests-menu-status {
width: 10px;
height: 10px;
}
.requests-menu-method {
text-align: center;
font-weight: 600;
}
.requests-menu-file {
width: 20vw;
min-width: 4em;
}
.requests-menu-domain {
width: 14vw;
min-width: 10em;
}
.requests-menu-type {
text-align: center;
width: 4em;
}
.requests-menu-size {
text-align: center;
width: 8em;
}
/* Network requests table: status codes */
box.requests-menu-status {
background: #fff;
-moz-margin-start: 5px;
-moz-margin-end: 5px;
border-radius: 20px;
box-shadow:
0 0 0 1px rgba(255,255,255,0.4) inset,
0 -6px 4px 0 rgba(32,32,32,1.0) inset,
0 0 8px 0 rgba(32,0,0,0.4);
transition: box-shadow 0.5s ease-in-out;
}
box.requests-menu-status[code^="1"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(0,0,64,1.0) inset,
0 0 8px 0 rgba(0,0,128,1.0);
}
box.requests-menu-status[code^="2"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(0,64,0,1.0) inset,
0 0 8px 0 rgba(0,128,0,1.0);
}
box.requests-menu-status[code^="3"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(64,32,0,1.0) inset,
0 0 8px 0 rgba(128,128,0,1.0);
}
box.requests-menu-status[code^="4"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(64,0,0,1.0) inset,
0 0 8px 0 rgba(128,0,0,1.0);
}
box.requests-menu-status[code^="5"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(64,0,64,1.0) inset,
0 0 8px 0 rgba(128,0,128,1.0);
}
/* Network requests table: waterfall header */
#requests-menu-waterfall-label {
-moz-padding-start: 8px;
-moz-padding-end: 8px;
}
.requests-menu-timings-division {
width: 100px;
padding-top: 2px;
-moz-padding-start: 4px;
-moz-border-start: 1px dotted #999;
font-size: 75%;
pointer-events: none;
}
.requests-menu-timings-division:not(:first-child) {
-moz-margin-start: -100px !important; /* Don't affect layout. */
}
.requests-menu-timings-division:-moz-locale-dir(ltr) {
transform-origin: left center;
}
.requests-menu-timings-division:-moz-locale-dir(rtl) {
transform-origin: right center;
}
/* Network requests table: waterfall items */
.requests-menu-subitem.requests-menu-waterfall {
-moz-padding-start: 4px;
-moz-padding-end: 4px;
background-repeat: repeat-y; /* Background created on a <canvas> in js. */
margin-top: -1px; /* Compensate borders. */
margin-bottom: -1px;
}
.requests-menu-subitem.requests-menu-waterfall:-moz-locale-dir(rtl) {
background-position: right center;
}
.requests-menu-timings:-moz-locale-dir(ltr) {
transform-origin: left center;
}
.requests-menu-timings:-moz-locale-dir(rtl) {
transform-origin: right center;
}
.requests-menu-timings-total:-moz-locale-dir(ltr) {
transform-origin: left center;
}
.requests-menu-timings-total:-moz-locale-dir(rtl) {
transform-origin: right center;
}
.requests-menu-timings-total {
-moz-padding-start: 8px;
font-size: 85%;
font-weight: 600;
}
.requests-menu-timings-cap {
width: 4px;
height: 10px;
border: 1px solid #fff;
}
.requests-menu-timings-cap.start {
-moz-border-end: none;
}
.requests-menu-timings-cap.end {
-moz-border-start: none;
}
.requests-menu-timings-cap.start:-moz-locale-dir(ltr) {
border-radius: 4px 0 0 4px;
transform-origin: right center;
}
.requests-menu-timings-cap.start:-moz-locale-dir(rtl) {
border-radius: 0 4px 4px 0;
transform-origin: left center;
}
.requests-menu-timings-cap.end:-moz-locale-dir(ltr) {
border-radius: 0 4px 4px 0;
transform-origin: left center;
}
.requests-menu-timings-cap.end:-moz-locale-dir(rtl) {
border-radius: 4px 0 0 4px;
transform-origin: right center;
}
.requests-menu-timings-box {
height: 10px;
border-top: 1px solid #fff;
border-bottom: 1px solid #fff;
}
.requests-menu-timings-box.blocked,
.requests-menu-timings-cap.blocked {
background-color: rgba(255,32,32,0.8);
box-shadow: 0 0 8px 0 rgba(128,32,32,0.8),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.dns,
.requests-menu-timings-cap.dns {
background-color: rgba(255,128,255,0.6);
box-shadow: 0 0 8px 0 rgba(128,128,255,1.0),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.connect,
.requests-menu-timings-cap.connect {
background-color: rgba(255,128,16,0.4);
box-shadow: 0 0 8px 0 rgba(128,128,16,0.8),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.send,
.requests-menu-timings-cap.send {
background-color: rgba(255,255,128,0.4);
box-shadow: 0 0 8px 0 rgba(128,255,128,0.8),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.wait,
.requests-menu-timings-cap.wait {
background-color: rgba(255,255,255,0.2);
box-shadow: 0 0 8px 0 rgba(128,255,255,0.4),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.receive,
.requests-menu-timings-cap.receive {
background-color: rgba(255,255,255,1.0);
box-shadow: 0 0 8px 0 rgba(128,255,255,1.0),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
/* SideMenuWidget */
.side-menu-widget-item-contents {
padding: 0px;
}
.side-menu-widget-container {
box-shadow: none !important;
}
.side-menu-widget-item[odd] {
background: rgba(255,255,255,0.05);
}
/* Network request details */
#details-pane {
background: hsl(208,11%,27%);
max-width: 500px;
}
#details-pane-toggle {
background: none;
box-shadow: none;
border-color: transparent;
list-style-image: url("chrome://browser/skin/devtools/debugger-collapse.png");
-moz-image-region: rect(0px,16px,16px,0px);
}
#details-pane-toggle[pane-collapsed] {
list-style-image: url("chrome://browser/skin/devtools/debugger-expand.png");
}
#details-pane-toggle:active {
-moz-image-region: rect(0px,32px,16px,16px);
}
/* Network request details tabpanels */
.tabpanel-content {
background: url(background-noise-toolbar.png), #3e4750;
box-shadow: 0 1px 0 hsla(204,45%,98%,.05) inset;
color: #fff;
}
.tabpanel-summary-container {
padding: 1px;
}
.tabpanel-summary-label {
-moz-padding-start: 4px;
-moz-padding-end: 3px;
font-weight: 600;
text-shadow: 0 1px 0 #000;
color: hsl(210,30%,85%);
}
.tabpanel-summary-value {
-moz-padding-start: 3px;
}
/* Headers tabpanel */
#headers-summary-status,
#headers-summary-version {
padding-bottom: 2px;
}
#headers-summary-size {
padding-top: 2px;
}
#headers-summary-resend {
margin: 0 6px;
min-height: 20px;
}
/* Response tabpanel */
#response-content-info-header {
background:
url(background-noise-toolbar.png),
linear-gradient(hsl(0,61%,40%), hsl(0,61%,31%)) repeat-x top left;
box-shadow:
inset 0 1px 0 hsla(210,40%,83%,.15),
inset 0 -1px 0 hsla(210,40%,83%,.05);
margin: 0;
padding: 5px 8px;
}
#response-content-image-box {
padding-top: 10px;
padding-bottom: 10px;
}
#response-content-image {
background: #fff;
border: 1px dashed GrayText;
margin-bottom: 10px;
}
/* Timings tabpanel */
#timings-tabpanel .tabpanel-summary-label {
width: 10em;
}
#timings-tabpanel .requests-menu-timings-box {
transition: transform 0.2s ease-out;
min-width: 1px;
}
#timings-tabpanel .requests-menu-timings-total {
transition: transform 0.2s ease-out;
}
/* Custom request form */
#custom-pane {
padding: 0.6em 0.5em;
}
.custom-header {
font-size: 1.1em;
}
.custom-section {
margin-top: 0.5em;
}
#custom-method-value {
width: 4.5em;
}
/* Footer */
#requests-menu-footer {
box-shadow: inset 0 1px 16px hsla(210,8%,5%,.3);
}
.requests-menu-footer-button,
.requests-menu-footer-label {
min-width: 1em;
margin: 0;
border: none;
padding: 2px 1.5vw;
color: #fff;
}
.requests-menu-footer-spacer {
min-width: 2px;
}
.requests-menu-footer-spacer,
.requests-menu-footer-button {
-moz-border-end: 1px solid hsla(210,8%,5%,.25);
box-shadow: 1px 0 0 hsla(210,16%,76%,.1);
}
.requests-menu-footer-button {
-moz-appearance: none;
background: rgba(0,0,0,0.025);
}
.requests-menu-footer-button:hover {
background: rgba(0,0,0,0.20);
}
.requests-menu-footer-button:hover:active {
background: rgba(0,0,0,0.35);
}
.requests-menu-footer-button:not(:active)[checked] {
background-color: rgba(0,0,0,0.25);
background-image: radial-gradient(farthest-side at center top, hsla(200,100%,70%,.7), hsla(200,100%,70%,0.3));
background-size: 100% 1px;
background-repeat: no-repeat;
}
.requests-menu-footer-label {
font-weight: 600;
}
/* Responsive sidebar */
@media (max-width: 700px) {
#requests-menu-toolbar {
height: 24px;
}
.requests-menu-header-button {
min-height: 24px;
}
.requests-menu-footer-button,
.requests-menu-footer-label {
padding: 2px 2vw;
}
#details-pane {
max-width: none;
margin: 0 !important;
/* To prevent all the margin hacks to hide the sidebar. */
}
.requests-menu-status-and-method {
width: 16vw;
}
.requests-menu-file,
.requests-menu-domain {
width: 30vw;
}
.requests-menu-type {
width: 8vw;
}
.requests-menu-size {
width: 16vw;
border-width: 0 !important;
box-shadow: none !important;
/* The "Timeline" header is not visible anymore, and thus the
right border and box-shadow of "Size" column should be hidden. */
}
}
@media (min-width: 701px) {
#network-table[type-overflows] .requests-menu-domain {
border-width: 0 !important;
box-shadow: none !important;
/* The "Type" header is not visible anymore, and thus the
right border and box-shadow of "Domain" column should be hidden. */
}
#network-table[domain-overflows] .requests-menu-file {
border-width: 0 !important;
box-shadow: none !important;
/* The "Domain" header is not visible anymore, and thus the
right border and box-shadow of "File" column should be hidden. */
}
}
%include ../shared.inc
%include ../../shared/devtools/netmonitor.inc.css

View File

@ -1,713 +1,6 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* Generic pane helpers */
.generic-toggled-side-pane {
-moz-margin-start: 0px !important;
/* Unfortunately, transitions don't work properly with locale-aware properties,
so both the left and right margins are set via js, while the start margin
is always overridden here. */
}
.generic-toggled-side-pane[animated] {
transition: margin 0.25s ease-in-out;
}
/* BreacrumbsWidget */
.breadcrumbs-widget-container {
-moz-margin-end: 3px;
/* A fake 1px-shadow is included in the border-images of the
breadcrumbs-widget-items, to match toolbar-buttons style.
This negative margin compensates the extra row of pixels created
by the shadow.*/
margin-bottom: -1px;
}
/* Preloading hack, LTR */
.breadcrumbs-widget-container:-moz-locale-dir(ltr)::after {
content: '';
display: block;
background-image:
url(breadcrumbs/ltr-start.png),
url(breadcrumbs/ltr-start-selected.png),
url(breadcrumbs/ltr-start-pressed.png),
url(breadcrumbs/ltr-start-selected-pressed.png),
url(breadcrumbs/ltr-middle.png),
url(breadcrumbs/ltr-middle-selected.png),
url(breadcrumbs/ltr-middle-pressed.png),
url(breadcrumbs/ltr-middle-selected-pressed.png),
url(breadcrumbs/ltr-end.png),
url(breadcrumbs/ltr-end-selected.png),
url(breadcrumbs/ltr-end-pressed.png),
url(breadcrumbs/ltr-end-selected-pressed.png);
}
/* Preloading hack, RTL */
.breadcrumbs-widget-container:-moz-locale-dir(rtl)::after {
content: '';
display: block;
background-image:
url(breadcrumbs/rtl-start.png),
url(breadcrumbs/rtl-start-selected.png),
url(breadcrumbs/rtl-start-pressed.png),
url(breadcrumbs/rtl-start-selected-pressed.png),
url(breadcrumbs/rtl-middle.png),
url(breadcrumbs/rtl-middle-selected.png),
url(breadcrumbs/rtl-middle-pressed.png),
url(breadcrumbs/rtl-middle-selected-pressed.png),
url(breadcrumbs/rtl-end.png),
url(breadcrumbs/rtl-end-selected.png),
url(breadcrumbs/rtl-end-pressed.png),
url(breadcrumbs/rtl-end-selected-pressed.png);
}
.scrollbutton-up,
.scrollbutton-down {
-moz-appearance: none;
background: linear-gradient(hsla(212,7%,57%,.35), hsla(212,7%,57%,.1)) padding-box;
box-shadow: 0 1px 0 hsla(210,16%,76%,.15) inset,
0 0 0 1px hsla(210,16%,76%,.15) inset,
0 1px 0 hsla(210,16%,76%,.15);
border: 1px solid hsla(210,8%,5%,.45);
margin: 0 0 1px;
}
.scrollbutton-up:not([disabled]):active:hover,
.scrollbutton-down:not([disabled]):active:hover {
background: linear-gradient(hsla(220,6%,10%,.3), hsla(212,7%,57%,.15) 65%, hsla(212,7%,57%,.3));
box-shadow: 0 0 3px hsla(210,8%,5%,.25) inset,
0 1px 3px hsla(210,8%,5%,.25) inset,
0 1px 0 hsla(210,16%,76%,.15);
border-color: hsla(210,8%,5%,.6);
}
.scrollbutton-up > .toolbarbutton-icon,
.scrollbutton-down > .toolbarbutton-icon {
-moz-appearance: none;
list-style-image: url("breadcrumbs-scrollbutton.png");
-moz-image-region: rect(0px,7px,16px,0px);
margin: 0 5px;
}
.scrollbutton-up:not([disabled]):active:hover > .toolbarbutton-icon,
.scrollbutton-down:not([disabled]):active:hover > .toolbarbutton-icon {
-moz-image-region: rect(0px,14px,16px,7px);
}
.scrollbutton-up[disabled] > .toolbarbutton-icon,
.scrollbutton-down[disabled] > .toolbarbutton-icon {
opacity: 0.5;
}
.scrollbutton-up > .toolbarbutton-icon:-moz-locale-dir(rtl),
.scrollbutton-down > .toolbarbutton-icon:-moz-locale-dir(ltr) {
transform: scaleX(-1);
}
.breadcrumbs-widget-item {
background-color: transparent;
-moz-appearance: none;
overflow: hidden;
min-width: 85px;
max-width: 250px;
min-height: 25px;
border-style: solid;
border-width: 1px 13px 2px 13px;
margin: 0 -11px 0 0;
padding: 0 9px;
outline: none;
color: hsl(210,30%,85%);
}
.breadcrumbs-widget-item:-moz-focusring > label {
border-bottom: 1px dotted hsla(210,30%,85%,0.4);
}
.breadcrumbs-widget-item[checked] .breadcrumbs-widget-item-tag {
color: hsl(208,100%,60%);
}
.breadcrumbs-widget-item[checked] .breadcrumbs-widget-item-id {
color: hsl(205,100%,70%);
}
.breadcrumbs-widget-item[checked] .breadcrumbs-widget-item-pseudo-classes {
color: hsl(20,100%,70%);
}
.breadcrumbs-widget-item-id,
.breadcrumbs-widget-item-classes {
color: #8d99a6;
}
.breadcrumbs-widget-item-pseudo-classes {
color: hsl(20,100%,85%);
}
/* Breadcrumbs LTR */
.breadcrumbs-widget-item:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:not([checked]):hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:not([checked]):hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:not([checked]):hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:first-of-type:-moz-locale-dir(ltr) {
border-left-width: 0;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:last-of-type:-moz-locale-dir(ltr) {
border-right-width: 0;
}
/* Breadcrumbs RTL */
.breadcrumbs-widget-item:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:not([checked]):hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:first-of-type:-moz-locale-dir(rtl) {
border-right-width: 0;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:last-of-type:-moz-locale-dir(rtl) {
border-left-width: 0;
}
/* SimpleListWidget */
.simple-list-widget-item:not(.selected):hover {
background: linear-gradient(rgba(255,255,255,0.9), rgba(255,255,255,0.85)), Highlight;
}
.simple-list-widget-item.selected {
background: linear-gradient(rgba(255,255,255,0.85), rgba(255,255,255,0.8)), Highlight;
color: #000;
}
.simple-list-widget-perma-text,
.simple-list-widget-empty-text {
color: GrayText;
padding: 4px 8px;
}
/* FastListWidget */
.fast-list-widget-container {
/* Hack: force hardware acceleration */
transform: translateZ(1px);
}
.theme-dark .fast-list-widget-empty-text {
padding: 12px;
font-weight: 600;
color: #fff;
}
.theme-light .fast-list-widget-empty-text {
padding: 4px 8px;
color: GrayText;
}
/* SideMenuWidget */
.side-menu-widget-container {
/* Hack: force hardware acceleration */
transform: translateZ(1px);
}
.side-menu-widget-container[theme="dark"] {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
color: #fff;
}
.side-menu-widget-container[theme="light"] {
background: #fff;
color: #000;
}
/* SideMenuWidget container */
.side-menu-widget-container:-moz-locale-dir(ltr),
.side-menu-widget-empty-text:-moz-locale-dir(ltr) {
box-shadow: inset -1px 0 0 #222426;
}
.side-menu-widget-container:-moz-locale-dir(rtl),
.side-menu-widget-empty-text:-moz-locale-dir(rtl) {
box-shadow: inset 1px 0 0 #222426;
}
.side-menu-widget-group {
/* To allow visibility of the dark margin shadow. */
-moz-margin-end: 1px;
}
.side-menu-widget-container[with-arrows=true] .side-menu-widget-item {
/* To compensate for the arrow image's dark margin. */
-moz-margin-end: -1px;
}
/* SideMenuWidget groups */
.side-menu-widget-group-title {
padding: 4px;
}
.side-menu-widget-group-title[theme="dark"] {
background-image: linear-gradient(#1f3e4f, #1b3243);
text-shadow: 0 -1px 0 hsla(210,8%,5%,.45);
box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
0 -2px 0 hsla(206,37%,4%,.05) inset,
0 -1px 1px hsla(206,37%,4%,.1) inset;
}
.side-menu-widget-group-title[theme="light"] {
background-image: linear-gradient(#fff, #eee);
}
/* SideMenuWidget items */
.side-menu-widget-item[theme="dark"] {
border-top: 1px solid hsla(210,8%,5%,.25);
border-bottom: 1px solid hsla(210,16%,76%,.1);
margin-top: -1px;
margin-bottom: -1px;
}
.side-menu-widget-item[theme="light"] {
border-top: 1px solid hsla(210,8%,75%,.25);
border-bottom: 1px solid hsla(210,16%,76%,.1);
margin-top: -1px;
margin-bottom: -1px;
}
.side-menu-widget-item[theme="dark"]:last-of-type {
box-shadow: inset 0 -1px 0 hsla(210,8%,5%,.25);
}
.side-menu-widget-item[theme="light"]:last-of-type {
box-shadow: inset 0 -1px 0 hsla(210,8%,75%,.25);
}
.side-menu-widget-item.selected {
background: linear-gradient(hsl(206,61%,40%), hsl(206,61%,31%)) repeat-x top left !important;
box-shadow: inset 0 1px 0 hsla(210,40%,83%,.15);
}
.side-menu-widget-item.selected > .side-menu-widget-item-arrow {
background-size: auto, 1px 100%;
background-repeat: no-repeat;
}
.side-menu-widget-item.selected > .side-menu-widget-item-arrow:-moz-locale-dir(ltr) {
background-image: url(itemArrow-ltr.png), linear-gradient(to right, #222426, #222426);
background-position: center right, top right;
}
.side-menu-widget-item.selected > .side-menu-widget-item-arrow:-moz-locale-dir(rtl) {
background-image: url(itemArrow-rtl.png), linear-gradient(to right, #222426, #222426);
background-position: center left, top left;
}
/* SideMenuWidget items contents */
.side-menu-widget-item-contents {
padding: 4px 0px;
}
.side-menu-widget-item-arrow {
-moz-margin-start: -8px;
width: 8px;
}
.side-menu-widget-item-other {
background: url(background-noise-toolbar.png), hsla(208,11%,27%, 0.65);
}
.side-menu-widget-item-other.selected {
background: url(background-noise-toolbar.png), hsla(208,11%,27%, 0.15);
box-shadow: inset 0 1px 0 hsla(210,40%,83%,.07),
inset 0 -1px 0 hsla(210,40%,83%,.07);
}
.side-menu-widget-item-other:first-of-type {
margin-top: 4px;
border-top-left-radius: 4px;
}
.side-menu-widget-item-other:last-of-type {
margin-bottom: -4px;
}
.side-menu-widget-item-other > label {
color: #f5f7fa;
text-shadow: 0 1px 1px #111;
}
/* SideMenuWidget checkboxes */
.side-menu-widget-group-checkbox {
margin: 0;
-moz-margin-end: 4px;
}
.side-menu-widget-item-checkbox {
margin: 0;
-moz-margin-start: 4px;
-moz-margin-end: -4px;
}
/* SideMenuWidget misc */
.side-menu-widget-empty-text[theme="dark"] {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
padding: 12px;
font-weight: 600;
color: #fff;
}
.side-menu-widget-empty-text[theme="light"] {
background: #fff;
padding: 4px 8px;
color: GrayText;
}
/* VariablesView */
.variables-view-container {
/* Hack: force hardware acceleration */
transform: translateZ(1px);
}
.variables-view-empty-notice {
color: GrayText;
padding: 2px;
}
.variables-view-scope > .title {
color: #fff;
}
/* Generic variables traits */
.variables-view-variable:not(:last-child) {
border-bottom: 1px solid rgba(128, 128, 128, .15);
}
.variables-view-variable > .title > .name {
font-weight: 600;
}
/* Generic variables *and* properties traits */
.variable-or-property:focus > .title > label {
color: inherit !important;
}
.variable-or-property > .title > .value {
-moz-box-flex: 1;
}
.variable-or-property > .title > .arrow {
-moz-margin-start: 3px;
}
.variable-or-property:not([untitled]) > .variables-view-element-details {
-moz-margin-start: 7px;
}
/* Traits applied when variables or properties are changed or overridden */
.variable-or-property:not([overridden]) {
transition: background 1s ease-in-out;
}
.variable-or-property:not([overridden])[changed] {
transition-duration: .4s;
}
.variable-or-property[overridden] {
background: rgba(128,128,128,0.05);
}
.variable-or-property[overridden] .title > label {
/* Cross out the title for this variable and all child properties. */
font-style: italic;
text-decoration: line-through;
border-bottom: none !important;
color: rgba(128,128,128,0.9);
opacity: 0.7;
}
/* Traits applied when variables or properties are editable */
.variable-or-property[editable] > .title > .value {
cursor: text;
}
.variable-or-property[overridden] .title > .value {
/* Disallow editing this variable and all child properties. */
pointer-events: none;
}
/* Custom configurable/enumerable/writable or frozen/sealed/extensible
* variables and properties */
.variable-or-property[non-enumerable]:not([self]):not([pseudo-item]) > .title > .name {
opacity: 0.6;
}
.variable-or-property[non-configurable]:not([pseudo-item]) > .title > .name {
border-bottom: 1px dashed #99f;
}
.variable-or-property[non-writable]:not([pseudo-item]) > .title > .name {
border-bottom: 1px dashed #f99;
}
.variable-or-property[safe-getter]:not([pseudo-item]) > .title > .name {
border-bottom: 1px dashed #8b0;
}
.variable-or-property-non-writable-icon {
background: url("chrome://browser/skin/identity-icons-https.png") no-repeat;
width: 16px;
height: 16px;
opacity: 0.5;
}
@media (min-resolution: 2dppx) {
.variable-or-property-non-writable-icon {
background-image: url("chrome://browser/skin/identity-icons-https@2x.png");
background-size: 32px;
}
}
.variable-or-property-frozen-label,
.variable-or-property-sealed-label,
.variable-or-property-non-extensible-label {
-moz-padding-end: 4px;
}
.variable-or-property:not(:focus) > .title > .variable-or-property-frozen-label,
.variable-or-property:not(:focus) > .title > .variable-or-property-sealed-label,
.variable-or-property:not(:focus) > .title > .variable-or-property-non-extensible-label {
color: #666;
}
/* Aligned values */
.variables-view-container[aligned-values] .title > .separator {
-moz-box-flex: 1;
}
.variables-view-container[aligned-values] .title > .value {
-moz-box-flex: 0;
width: 70vw;
}
.variables-view-container[aligned-values] .title > .element-value-input {
width: calc(70vw - 10px);
}
/* Actions first */
.variables-view-container[actions-first] .variables-view-delete,
.variables-view-container[actions-first] .variables-view-add-property {
-moz-box-ordinal-group: 0;
}
.variables-view-container[actions-first] [invisible] {
visibility: hidden;
}
/* Variables and properties tooltips */
.variable-or-property > tooltip > label {
margin: 0 2px 0 2px;
}
.variable-or-property[non-enumerable] > tooltip > label.enumerable,
.variable-or-property[non-configurable] > tooltip > label.configurable,
.variable-or-property[non-writable] > tooltip > label.writable,
.variable-or-property[non-extensible] > tooltip > label.extensible {
color: #800;
text-decoration: line-through;
}
.variable-or-property[overridden] > tooltip > label.overridden {
-moz-padding-start: 4px;
-moz-border-start: 1px dotted #000;
}
.variable-or-property[safe-getter] > tooltip > label.WebIDL {
-moz-padding-start: 4px;
-moz-border-start: 1px dotted #000;
color: #080;
}
/* Variables and properties editing */
.variables-view-delete {
list-style-image: url("chrome://browser/skin/devtools/vview-delete.png");
-moz-image-region: rect(0,16px,16px,0);
}
.variables-view-delete:hover {
-moz-image-region: rect(0,32px,16px,16px);
}
.variables-view-delete:active {
-moz-image-region: rect(0,48px,16px,32px);
}
.variables-view-edit {
background: url("chrome://browser/skin/devtools/vview-edit.png") center no-repeat;
width: 20px;
height: 16px;
cursor: pointer;
}
.variables-view-throbber {
background: url("chrome://global/skin/icons/loading_16.png") center no-repeat;
width: 16px;
height: 16px;
}
.element-value-input {
-moz-margin-start: -2px !important;
-moz-margin-end: 2px !important;
}
.element-name-input {
-moz-margin-start: -2px !important;
-moz-margin-end: 2px !important;
font-weight: 600;
}
.element-value-input,
.element-name-input {
border: 1px solid rgba(128, 128, 128, .5) !important;
border-radius: 0;
color: inherit;
}
/* Variables and properties searching */
.variables-view-searchinput {
min-height: 24px;
}
.variable-or-property[unmatched] {
border: none;
margin: 0;
}
/* Expand/collapse arrow */
.arrow {
-moz-appearance: treetwisty;
}
.arrow[open] {
-moz-appearance: treetwistyopen;
}
.arrow[invisible] {
visibility: hidden;
}
%include ../../shared/devtools/app-manager/manifest-editor.inc.css
%include ../shared.inc
%include ../../shared/devtools/widgets.inc.css

View File

@ -301,13 +301,15 @@ browser.jar:
* skin/classic/browser/devtools/shadereditor.css (devtools/shadereditor.css)
* skin/classic/browser/devtools/debugger.css (devtools/debugger.css)
* skin/classic/browser/devtools/profiler.css (devtools/profiler.css)
skin/classic/browser/devtools/netmonitor.css (devtools/netmonitor.css)
* skin/classic/browser/devtools/netmonitor.css (devtools/netmonitor.css)
* skin/classic/browser/devtools/scratchpad.css (devtools/scratchpad.css)
skin/classic/browser/devtools/magnifying-glass.png (devtools/magnifying-glass.png)
skin/classic/browser/devtools/option-icon.png (devtools/option-icon.png)
skin/classic/browser/devtools/itemToggle.png (devtools/itemToggle.png)
skin/classic/browser/devtools/itemArrow-rtl.png (devtools/itemArrow-rtl.png)
skin/classic/browser/devtools/itemArrow-ltr.png (devtools/itemArrow-ltr.png)
skin/classic/browser/devtools/itemArrow-dark-rtl.png (../shared/devtools/images/itemArrow-dark-rtl.png)
skin/classic/browser/devtools/itemArrow-dark-ltr.png (../shared/devtools/images/itemArrow-dark-ltr.png)
skin/classic/browser/devtools/itemArrow-rtl.png (../shared/devtools/images/itemArrow-rtl.png)
skin/classic/browser/devtools/itemArrow-ltr.png (../shared/devtools/images/itemArrow-ltr.png)
skin/classic/browser/devtools/background-noise-toolbar.png (devtools/background-noise-toolbar.png)
skin/classic/browser/devtools/noise.png (devtools/noise.png)
skin/classic/browser/devtools/inspect-button.png (devtools/inspect-button.png)

View File

@ -176,7 +176,9 @@
}
.devtools-tooltip[clamped-dimensions] {
min-height: 100px;
max-height: 400px;
min-width: 100px;
max-width: 400px;
}
.devtools-tooltip[clamped-dimensions] .panel-arrowcontent {

View File

@ -0,0 +1,623 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* Sources and breakpoints pane */
#sources-pane > tabs {
-moz-border-end: 1px solid #222426; /* Match the sources list's dark margin. */
}
#sources-pane[selectedIndex="0"] + #sources-and-editor-splitter {
border-color: transparent;
}
#sources-pane .devtools-toolbar {
border: none; /* Remove the devtools-toolbar's black bottom border. */
-moz-border-end: 1px solid #222426; /* Match the sources list's dark margin. */
}
/* Sources and breakpoints list */
.dbg-source-item {
padding: 2px 0px;
}
.dbg-breakpoint-line {
font-weight: 600;
}
.dbg-breakpoint-text {
-moz-padding-start: 6px;
font-style: italic;
font-size: 90%;
}
.dbg-breakpoint-checkbox {
width: 16px;
height: 16px;
margin: 2px;
}
/* Sources toolbar */
#sources-toolbar > .devtools-toolbarbutton,
#sources-controls > .devtools-toolbarbutton {
min-width: 32px;
}
#black-box {
list-style-image: url(debugger-blackbox.png);
}
#pretty-print {
font-weight: bold;
}
#toggle-breakpoints {
list-style-image: url(debugger-toggleBreakpoints.png);
}
#sources-toolbar .devtools-toolbarbutton:not([label]) {
-moz-image-region: rect(0px,16px,16px,0px);
}
#sources-toolbar .devtools-toolbarbutton:not([label])[checked] {
-moz-image-region: rect(0px,32px,16px,16px);
}
#sources .black-boxed {
color: rgba(255,255,255,0.4);
}
#sources .black-boxed > .dbg-breakpoint {
display: none;
}
/* Black box message and source progress meter */
#black-boxed-message,
#source-progress-container {
background: url(background-noise-toolbar.png);
/* Prevent the container deck from aquiring the size from this message. */
min-width: 1px;
min-height: 1px;
}
#source-progress {
min-height: 2em;
min-width: 40em;
}
#black-boxed-message-label,
#black-boxed-message-button {
text-align: center;
font-size: 120%;
}
#black-boxed-message-button {
margin-top: 1em;
padding: .25em;
}
/* Breadcrumbs stack frames view */
.breadcrumbs-widget-item {
max-width: none;
}
.dbg-stackframe-details {
-moz-padding-start: 4px;
}
/* Classic stack frames view */
.dbg-classic-stackframe {
display: block;
}
.dbg-classic-stackframe-title {
font-weight: 600;
}
.dbg-classic-stackframe-details:-moz-locale-dir(ltr) {
float: right;
}
.dbg-classic-stackframe-details:-moz-locale-dir(rtl) {
float: left;
}
.dbg-classic-stackframe-details-url {
max-width: 90%;
text-align: end;
}
.theme-dark .dbg-classic-stackframe-details-url {
color: #b8c8d9; /* Light content text */
}
.theme-light .dbg-classic-stackframe-details-url {
color: #667380; /* Dark grey content text */
}
.theme-dark .dbg-classic-stackframe-details-sep {
color: #b6babf; /* Grey foreground text */
}
.theme-light .dbg-classic-stackframe-details-sep {
color: #585959; /* Grey foreground text */
}
.theme-dark .dbg-classic-stackframe-details-line {
color: #5e88b0; /* Highlight blue grey */
}
.theme-light .dbg-classic-stackframe-details-line {
color: #5f88b0; /* Highlight blue grey */
}
#callstack-list .selected label {
/* Text inside a selected item should not be custom colored. */
color: inherit !important;
}
/* Tracer */
#trace {
list-style-image: url(tracer-icon.png);
-moz-image-region: rect(0px,16px,16px,0px);
}
#trace[checked] {
-moz-image-region: rect(0px,32px,16px,16px);
}
#clear-tracer {
/* Make this button as narrow as the text inside it. */
min-width: 1px;
}
.trace-name {
-moz-padding-start: 4px;
}
/* Tracer dark theme */
.theme-dark .trace-item {
color: #f5f7fa; /* Light foreground text */
}
.theme-dark .trace-item.selected-matching {
background-color: rgba(29,79,115,.4); /* Select highlight blue at 40% alpha */
}
.theme-dark .selected > .trace-item {
background-color: rgba(29,79,115,.6); /* Select highlight blue at 60% alpha */
}
.theme-dark .trace-call {
color: #46afe3; /* Highlight blue */
}
.theme-dark .trace-return,
.theme-dark .trace-yield {
color: #70bf53; /* Highlight green */
}
.theme-dark .trace-throw {
color: #eb5368; /* Highlight red */
}
.theme-dark .trace-param {
color: #b8c8d9; /* Content text light */
}
.theme-dark .trace-syntax {
color: #8fa1b2; /* Content text grey */
}
/* Tracer light theme */
.theme-light .trace-item {
color: #292e33; /* Dark foreground text */
}
.theme-light .trace-item.selected-matching {
background-color: rgba(76,158,217,.4); /* Select highlight blue at 40% alpha */
}
.theme-light .selected > .trace-item {
background-color: rgba(76,158,217,.6); /* Select highlight blue at 60% alpha */
}
.theme-light .trace-call {
color: #0088cc; /* Highlight blue */
}
.theme-light .trace-return,
.theme-light .trace-yield {
color: #2cbb0f; /* Highlight green */
}
.theme-light .trace-throw {
color: #ed2655; /* Highlight red */
}
.theme-light .trace-param {
color: #667380; /* Content text dark grey */
}
.theme-light .trace-syntax {
color: #8fa1b2; /* Content text grey */
}
#tracer-traces .selected label {
/* Text inside a selected item should not be custom colored. */
color: inherit !important;
}
/* Watch expressions view */
#expressions {
min-height: 10px;
max-height: 125px;
}
.dbg-expression {
height: 20px;
}
.dbg-expression-arrow {
width: 16px;
height: auto;
margin: 2px;
background: -moz-image-rect(url(commandline-icon.png), 0, 32, 16, 16);
}
.dbg-expression-input {
color: inherit;
}
/* Event listeners view */
.dbg-event-listener-type {
font-weight: 600;
}
.theme-dark .dbg-event-listener-location {
color: #b8c8d9; /* Light content text */
}
.theme-light .dbg-event-listener-location {
color: #667380; /* Dark grey content text */
}
.theme-dark .dbg-event-listener-separator {
color: #b6babf; /* Grey foreground text */
}
.theme-light .dbg-event-listener-separator {
color: #585959; /* Grey foreground text */
}
.theme-dark .dbg-event-listener-targets {
color: #5e88b0; /* Highlight blue grey */
}
.theme-light .dbg-event-listener-targets {
color: #5f88b0; /* Highlight blue grey */
}
.theme-dark #event-listeners .selected {
/* Selected items shouldn't be displayed differently. */
background: none;
color: #fff;
}
.theme-light #event-listeners .selected {
/* Selected items shouldn't be displayed differently. */
background: none;
color: #000;
}
/* Searchbox and the search operations help panel */
#searchbox {
min-width: 220px;
-moz-margin-start: 1px;
}
#filter-label {
-moz-margin-start: 2px;
}
#searchbox-panel-operators {
margin-top: 5px;
margin-bottom: 8px;
-moz-margin-start: 2px;
}
.searchbox-panel-operator-button {
min-width: 26px;
margin-top: 0;
margin-bottom: 0;
-moz-margin-start: 2px;
-moz-margin-end: 6px;
text-align: center;
}
.searchbox-panel-operator-label {
padding-bottom: 2px;
}
/* Searchbox results panel */
#results-panel {
border: none;
}
.results-panel-item {
padding: 6px 8px;
border-top: 1px solid rgba(128,128,128,0.2);
}
.results-panel-item:first-of-type {
border-top: none;
}
.results-panel-item-label {
font-weight: 600;
}
.results-panel-item-label-before {
-moz-padding-end: 6px;
}
.theme-dark .results-panel-item-label {
color: #f5f7fa; /* Light foreground text */
}
.theme-light .results-panel-item-label {
color: #18191a; /* Dark foreground text */
}
.theme-dark .results-panel-item-label-before {
color: #5e88b0; /* Highlight blue grey */
}
.theme-light .results-panel-item-label-before {
color: #5f88b0; /* Highlight blue grey */
}
.theme-dark .results-panel-item-label-below {
color: #5f7387; /* Dark grey content text */
}
.theme-light .results-panel-item-label-below {
color: #667380; /* Dark grey content text */
}
#results-panel .selected label {
/* Text inside a selected item should not be custom colored. */
color: inherit !important;
}
/* Sources search view */
#globalsearch {
min-height: 10px;
max-height: 50vh;
}
.dbg-results-header {
-moz-padding-start: 6px;
}
.dbg-results-header-location {
font-weight: 600;
}
.dbg-results-header-match-count {
-moz-padding-start: 6px;
}
.dbg-results-line-number {
min-width: 3em;
-moz-border-end: 1px solid rgba(128,128,128,0.2);
-moz-padding-end: 4px;
text-align: end;
}
.dbg-results-line-contents {
-moz-padding-start: 4px;
}
.dbg-results-line-contents-string[match=true] {
background-color: rgba(255,255,0,0.2);
border: 1px solid rgba(128,128,128,0.7);
border-radius: 4px;
margin-top: -1px !important;
margin-bottom: -1px !important;
cursor: pointer;
}
.dbg-results-line-contents-string[match=true][focusing] {
transition: transform 0.3s ease-in-out;
}
.dbg-results-line-contents-string[match=true][focused] {
transition-duration: 0.1s;
transform: scale(1.75, 1.75);
}
.theme-dark .dbg-results-header {
background-color: #252c33; /* Tab toolbar */
color: #b8c8d9; /* Light content text */
}
.theme-light .dbg-results-header {
background-color: #ebeced; /* Tab toolbar */
color: #667380; /* Dark grey content text */
}
.theme-dark .dbg-search-result:hover {
background-color: rgba(29,79,115,.2); /* Select highlight blue at 40% alpha */
}
.theme-light .dbg-search-result:hover {
background-color: rgba(76,158,217,.2); /* Select highlight blue at 40% alpha */
}
.theme-dark .dbg-results-header-match-count {
color: #5f7387; /* Dark grey content text */
}
.theme-light .dbg-results-header-match-count {
color: #667380; /* Dark grey content text */
}
.theme-dark .dbg-results-line-number {
background-color: #252c33; /* Tab toolbars */
color: #b6babf; /* Grey foreground text */
}
.theme-light .dbg-results-line-number {
background-color: #ebeced; /* Tab toolbars */
color: #585959; /* Grey foreground text */
}
.theme-dark .dbg-results-line-contents-string {
color: #b6babf; /* Grey foreground text */
}
.theme-light .dbg-results-line-contents-string {
color: #585959; /* Grey foreground text */
}
.theme-dark .dbg-results-line-contents-string[match=true] {
color: #f5f7fa; /* Light foreground text */
}
.theme-light .dbg-results-line-contents-string[match=true] {
color: #18191a; /* Dark foreground text */
}
/* Toolbar controls */
.devtools-sidebar-tabs > tabs > tab {
min-height: 1em !important;
padding: 0 !important;
}
#resumption-panel-desc {
width: 200px;
}
#resumption-order-panel {
-moz-margin-start: -8px;
}
#resume {
list-style-image: url(debugger-pause.png);
-moz-image-region: rect(0px,16px,16px,0px);
transition: background 0.15s ease-in-out;
}
#resume[checked] {
background: none;
list-style-image: url(debugger-play.png);
-moz-image-region: rect(0px,32px,16px,16px);
}
#resume ~ toolbarbutton {
transition: opacity 0.15s ease-in-out;
}
#resume:not([checked]) ~ toolbarbutton {
opacity: 0.5;
}
#step-over {
list-style-image: url(debugger-step-over.png);
}
#step-in {
list-style-image: url(debugger-step-in.png);
}
#step-out {
list-style-image: url(debugger-step-out.png);
}
#debugger-controls > toolbarbutton,
#sources-controls > toolbarbutton {
margin: 0;
box-shadow: none;
border-radius: 0;
border-width: 0;
-moz-border-end-width: 1px;
outline-offset: -3px;
}
#debugger-controls > toolbarbutton:last-of-type,
#sources-controls > toolbarbutton:last-of-type {
-moz-border-end-width: 0;
}
#debugger-controls,
#sources-controls {
box-shadow: 0 1px 0 hsla(210,16%,76%,.15) inset,
0 0 0 1px hsla(210,16%,76%,.15) inset,
0 1px 0 hsla(210,16%,76%,.15);
border: 1px solid hsla(210,8%,5%,.45);
border-radius: 3px;
margin: 0 3px;
}
#instruments-pane-toggle {
background: none;
box-shadow: none;
border: none;
list-style-image: url(debugger-collapse.png);
-moz-image-region: rect(0px,16px,16px,0px);
}
#instruments-pane-toggle[pane-collapsed] {
list-style-image: url(debugger-expand.png);
}
#instruments-pane-toggle:active {
-moz-image-region: rect(0px,32px,16px,16px);
}
/* Horizontal vs. vertical layout */
#vertical-layout-panes-container {
min-height: 35vh;
max-height: 80vh;
}
#body[layout=vertical] #sources-pane > tabs {
-moz-border-end: none;
}
#body[layout=vertical] #instruments-pane {
margin: 0 !important;
/* To prevent all the margin hacks to hide the sidebar. */
}
#body[layout=vertical] .side-menu-widget-container,
#body[layout=vertical] .side-menu-widget-empty-text {
box-shadow: none !important;
}
#body[layout=vertical] .side-menu-widget-item-arrow {
background-image: none !important;
}
#body[layout=vertical] .side-menu-widget-group,
#body[layout=vertical] .side-menu-widget-item {
-moz-margin-end: 0;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1,584 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#body {
background: url(background-noise-toolbar.png), #343c45; /* Dark toolbars */
}
#requests-menu-empty-notice {
background: url(background-noise-toolbar.png), #343c45; /* Dark toolbars */
padding: 12px;
font-size: 110%;
color: #f5f7fa; /* Light foreground text */
}
%filter substitution
%define tableBorderLight rgba(0,0,0,0.2)
%define tableBorderDark rgba(128,128,128,0.15)
/* Network requests table */
#requests-menu-toolbar {
padding: 0;
}
.requests-menu-header:first-child,
.requests-menu-subitem:first-child {
-moz-padding-start: 6px;
}
.requests-menu-subitem {
padding: 3px;
}
.requests-menu-header:not(:last-child):-moz-locale-dir(ltr),
.requests-menu-subitem:not(:last-child):-moz-locale-dir(ltr) {
-moz-border-end: 1px solid @tableBorderLight@;
box-shadow: 1px 0 0 @tableBorderDark@;
}
.requests-menu-header:not(:last-child):-moz-locale-dir(rtl),
.requests-menu-subitem:not(:last-child):-moz-locale-dir(rtl) {
-moz-border-end: 1px solid @tableBorderLight@;
box-shadow: -1px 0 0 @tableBorderDark@;
}
.requests-menu-header-button {
-moz-appearance: none;
background: none;
min-width: 1px;
min-height: 32px;
margin: 0;
border: none;
padding: 0;
color: inherit;
font-weight: inherit !important;
transition: background-color 0.1s ease-in-out;
}
.requests-menu-header-button:hover {
background: rgba(0,0,0,0.10);
}
.requests-menu-header-button:hover:active {
background: rgba(0,0,0,0.25);
}
.requests-menu-header-button:not(:active)[sorted] {
background: rgba(0,0,0,0.15);
}
.requests-menu-header-button:not(:active)[sorted=ascending] {
background-image: radial-gradient(farthest-side at center top, hsla(200,100%,70%,.7), hsla(200,100%,70%,0.3));
background-size: 100% 1px;
background-repeat: no-repeat;
}
.requests-menu-header-button:not(:active)[sorted=descending] {
background-image: radial-gradient(farthest-side at center bottom, hsla(200,100%,70%,.7), hsla(200,100%,70%,0.3));
background-size: 100% 1px;
background-repeat: no-repeat;
background-position: bottom;
}
/* Network requests table: specific column dimensions */
.requests-menu-status-and-method {
width: 8em;
}
.requests-menu-status {
width: 20px;
height: 10px;
}
.requests-menu-method {
text-align: center;
font-weight: 600;
}
.requests-menu-file {
width: 20vw;
min-width: 4em;
}
.requests-menu-domain {
width: 14vw;
min-width: 10em;
}
.requests-menu-type {
text-align: center;
width: 4em;
}
.requests-menu-size {
text-align: center;
width: 8em;
}
/* Network requests table: status codes */
box.requests-menu-status {
background: #fff;
width: 10px;
-moz-margin-start: 5px;
-moz-margin-end: 5px;
border-radius: 10px;
transition: box-shadow 0.5s ease-in-out;
}
box.requests-menu-status:not([code]) {
box-shadow:
0 0 0 1px rgba(255,255,255,0.4) inset,
0 -6px 4px 0 rgba(32,32,32,1.0) inset,
0 0 8px 0 rgba(32,0,0,0.4);
}
box.requests-menu-status[code^="1"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(0,0,64,1.0) inset,
0 0 8px 0 rgba(0,0,128,1.0);
}
box.requests-menu-status[code^="2"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(0,64,0,1.0) inset,
0 0 8px 0 rgba(0,128,0,1.0);
}
box.requests-menu-status[code^="3"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(64,32,0,1.0) inset,
0 0 8px 0 rgba(128,128,0,1.0);
}
box.requests-menu-status[code^="4"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(64,0,0,1.0) inset,
0 0 8px 0 rgba(128,0,0,1.0);
}
box.requests-menu-status[code^="5"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(64,0,64,1.0) inset,
0 0 8px 0 rgba(128,0,128,1.0);
}
/* Network requests table: waterfall header */
#requests-menu-waterfall-label {
-moz-padding-start: 8px;
-moz-padding-end: 8px;
}
.requests-menu-timings-division {
width: 100px;
padding-top: 2px;
-moz-padding-start: 4px;
-moz-border-start: 1px dotted #999;
font-size: 75%;
pointer-events: none;
}
.requests-menu-timings-division:not(:first-child) {
-moz-margin-start: -100px !important; /* Don't affect layout. */
}
.requests-menu-timings-division:-moz-locale-dir(ltr) {
transform-origin: left center;
}
.requests-menu-timings-division:-moz-locale-dir(rtl) {
transform-origin: right center;
}
.requests-menu-timings-division[division-scale=millisecond] {
-moz-border-start-color: #f5f7fa !important; /* Light foreground text */
}
.requests-menu-timings-division[division-scale=second] {
-moz-border-start-color: #d99b28 !important; /* Light orange highlight color */
font-weight: 600;
}
.requests-menu-timings-division[division-scale=minute] {
-moz-border-start-color: #eb5368 !important; /* Red highlight color */
font-weight: 600;
}
/* Network requests table: waterfall items */
.requests-menu-subitem.requests-menu-waterfall {
-moz-padding-start: 4px;
-moz-padding-end: 4px;
background-repeat: repeat-y; /* Background created on a <canvas> in js. */
margin-top: -1px; /* Compensate borders. */
margin-bottom: -1px;
}
.requests-menu-subitem.requests-menu-waterfall:-moz-locale-dir(rtl) {
background-position: right center;
}
.requests-menu-timings:-moz-locale-dir(ltr) {
transform-origin: left center;
}
.requests-menu-timings:-moz-locale-dir(rtl) {
transform-origin: right center;
}
.requests-menu-timings-total:-moz-locale-dir(ltr) {
transform-origin: left center;
}
.requests-menu-timings-total:-moz-locale-dir(rtl) {
transform-origin: right center;
}
.requests-menu-timings-total {
-moz-padding-start: 8px;
font-size: 85%;
font-weight: 600;
}
.requests-menu-timings-cap {
width: 4px;
height: 9px;
border: 1px solid #fff;
}
.requests-menu-timings-cap.start {
-moz-border-end: none;
}
.requests-menu-timings-cap.end {
-moz-border-start: none;
}
.requests-menu-timings-cap.start:-moz-locale-dir(ltr) {
border-radius: 4px 0 0 4px;
transform-origin: right center;
}
.requests-menu-timings-cap.start:-moz-locale-dir(rtl) {
border-radius: 0 4px 4px 0;
transform-origin: left center;
}
.requests-menu-timings-cap.end:-moz-locale-dir(ltr) {
border-radius: 0 4px 4px 0;
transform-origin: left center;
}
.requests-menu-timings-cap.end:-moz-locale-dir(rtl) {
border-radius: 4px 0 0 4px;
transform-origin: right center;
}
.requests-menu-timings-box {
height: 9px;
border-top: 1px solid #fff;
border-bottom: 1px solid #fff;
}
.requests-menu-timings-box.blocked,
.requests-menu-timings-cap.blocked {
background-color: rgba(255,32,32,0.8);
box-shadow: 0 0 8px 0 rgba(128,32,32,0.8),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.dns,
.requests-menu-timings-cap.dns {
background-color: rgba(255,128,255,0.6);
box-shadow: 0 0 8px 0 rgba(128,128,255,1.0),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.connect,
.requests-menu-timings-cap.connect {
background-color: rgba(255,128,16,0.4);
box-shadow: 0 0 8px 0 rgba(128,128,16,0.8),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.send,
.requests-menu-timings-cap.send {
background-color: rgba(255,255,128,0.4);
box-shadow: 0 0 8px 0 rgba(128,255,128,0.8),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.wait,
.requests-menu-timings-cap.wait {
background-color: rgba(255,255,255,0.2);
box-shadow: 0 0 8px 0 rgba(128,255,255,0.4),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.receive,
.requests-menu-timings-cap.receive {
background-color: rgba(255,255,255,1.0);
box-shadow: 0 0 8px 0 rgba(128,255,255,1.0),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
/* SideMenuWidget */
.side-menu-widget-item-contents {
padding: 0px;
}
.side-menu-widget-item:not(.selected)[odd] {
background: rgba(255,255,255,0.05);
}
/* The network monitor table is temporarily always dark.
The redesign will be taken care of in bug 909251. */
.theme-light .side-menu-widget-container {
background: url(background-noise-toolbar.png), #343c45; /* Toolbars */
}
.theme-light .side-menu-widget-item {
border-top: 1px solid @tableBorderLight@;
border-bottom: 1px solid @tableBorderDark@;
color: #f5f7fa; /* Light foreground text */
}
.theme-light .side-menu-widget-item:last-of-type {
box-shadow: inset 0 -1px 0 @tableBorderLight@;
}
/* Network request details */
#details-pane {
background: #343c45; /* Dark toolbars */
max-width: 500px;
}
#details-pane-toggle {
background: none;
box-shadow: none;
border-color: transparent;
list-style-image: url("chrome://browser/skin/devtools/debugger-collapse.png");
-moz-image-region: rect(0px,16px,16px,0px);
}
#details-pane-toggle[pane-collapsed] {
list-style-image: url("chrome://browser/skin/devtools/debugger-expand.png");
}
#details-pane-toggle:active {
-moz-image-region: rect(0px,32px,16px,16px);
}
/* Network request details tabpanels */
.tabpanel-content {
background: url(background-noise-toolbar.png), #343c45; /* Dark toolbars */
color: #f5f7fa; /* Light foreground text */
}
.tabpanel-summary-container {
padding: 1px;
}
.tabpanel-summary-label {
-moz-padding-start: 4px;
-moz-padding-end: 3px;
font-weight: 600;
color: #f5f7fa; /* Dark foreground text */
}
.tabpanel-summary-value {
-moz-padding-start: 3px;
}
/* Headers tabpanel */
#headers-summary-status,
#headers-summary-version {
padding-bottom: 2px;
}
#headers-summary-size {
padding-top: 2px;
}
#headers-summary-resend {
margin-top: -10px;
-moz-margin-end: 6px;
}
/* Response tabpanel */
#response-content-info-header {
background: linear-gradient(hsl(0,60%,40%), hsl(0,60%,30%)) repeat-x top left;
box-shadow: inset 0 1px 0 hsla(210,40%,80%,.15),
inset 0 -1px 0 hsla(210,40%,80%,.05);
margin: 0;
padding: 5px 8px;
}
#response-content-image-box {
padding-top: 10px;
padding-bottom: 10px;
}
#response-content-image {
background: #fff;
border: 1px dashed GrayText;
margin-bottom: 10px;
}
/* Timings tabpanel */
#timings-tabpanel .tabpanel-summary-label {
width: 10em;
}
#timings-tabpanel .requests-menu-timings-box {
transition: transform 0.2s ease-out;
min-width: 1px;
}
#timings-tabpanel .requests-menu-timings-total {
transition: transform 0.2s ease-out;
}
/* Custom request form */
#custom-pane {
padding: 0.6em 0.5em;
}
.custom-header {
font-size: 1.1em;
}
.custom-section {
margin-top: 0.5em;
}
#custom-method-value {
width: 4.5em;
}
/* Footer */
#requests-menu-footer {
box-shadow: inset 0 1px 16px hsla(210,5%,5%,.3);
}
.requests-menu-footer-button,
.requests-menu-footer-label {
min-width: 1em;
margin: 0;
border: none;
padding: 2px 1.5vw;
color: #f5f7fa; /* Light foreground text */
}
.requests-menu-footer-spacer {
min-width: 2px;
}
.requests-menu-footer-spacer:not(:first-of-type),
.requests-menu-footer-button:not(:first-of-type) {
-moz-border-start: 1px solid @tableBorderDark@;
box-shadow: -1px 0 0 @tableBorderLight@;
}
.requests-menu-footer-button {
-moz-appearance: none;
background: rgba(0,0,0,0.025);
}
.requests-menu-footer-button:hover {
background: rgba(0,0,0,0.20);
}
.requests-menu-footer-button:hover:active {
background: rgba(0,0,0,0.35);
}
.requests-menu-footer-button:not(:active)[checked] {
background-color: rgba(0,0,0,0.25);
background-image: radial-gradient(farthest-side at center top, hsla(200,100%,70%,.7), hsla(200,100%,70%,0.3));
background-size: 100% 1px;
background-repeat: no-repeat;
}
.requests-menu-footer-label {
padding-top: 2px;
font-weight: 600;
}
/* Responsive sidebar */
@media (max-width: 700px) {
#requests-menu-toolbar {
height: 22px;
}
.requests-menu-header-button {
min-height: 20px;
}
.requests-menu-footer-button,
.requests-menu-footer-label {
padding: 2px 2vw;
}
#details-pane {
max-width: none;
margin: 0 !important;
/* To prevent all the margin hacks to hide the sidebar. */
}
.requests-menu-status-and-method {
width: 16vw;
}
.requests-menu-file,
.requests-menu-domain {
width: 30vw;
}
.requests-menu-type {
width: 8vw;
}
.requests-menu-size {
width: 16vw;
border-width: 0 !important;
box-shadow: none !important;
/* The "Timeline" header is not visible anymore, and thus the
right border and box-shadow of "Size" column should be hidden. */
}
}
@media (min-width: 701px) {
#network-table[type-overflows] .requests-menu-domain {
border-width: 0 !important;
box-shadow: none !important;
/* The "Type" header is not visible anymore, and thus the
right border and box-shadow of "Domain" column should be hidden. */
}
#network-table[domain-overflows] .requests-menu-file {
border-width: 0 !important;
box-shadow: none !important;
/* The "Domain" header is not visible anymore, and thus the
right border and box-shadow of "File" column should be hidden. */
}
}

View File

@ -12,10 +12,6 @@
font-weight: bold;
}
.devtools-toolbar {
min-height: 33px;
}
.profiler-sidebar {
min-width: 196px;
}
@ -49,7 +45,7 @@
cursor: pointer;
}
[state=completed].selected .profiler-sidebar-item > hbox > a {
.selected [state=completed] .profiler-sidebar-item > hbox > a {
display: block;
}

View File

@ -3,11 +3,7 @@
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#body {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
}
#content {
background: #fff;
background: url(background-noise-toolbar.png), #343c45; /* Dark toolbars */
}
/* Reload and waiting notices */
@ -49,6 +45,10 @@
border-color: transparent;
}
.program-item {
padding: 2px 0px;
}
.side-menu-widget-item-checkbox {
-moz-appearance: none;
opacity: 0;
@ -66,8 +66,7 @@
.side-menu-widget-item-checkbox .checkbox-check {
-moz-appearance: none;
background: none;
background-image: url(itemToggle.png);
background: url(itemToggle.png);
background-repeat: no-repeat;
background-clip: content-box;
background-size: 32px 16px;
@ -82,26 +81,20 @@
}
.side-menu-widget-item-checkbox:not([checked]) ~ .side-menu-widget-item-contents {
color: #888;
color: rgba(255,255,255,0.4);
}
/* Shader source editors */
#editors-splitter {
border-color: rgb(61,69,76);
}
.editor-label {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
background: url(background-noise-toolbar.png), #343c45; /* Dark toolbars */
border-top: 1px solid #222426;
padding: 1px 12px;
color: #fff;
}
.editor-label[selected] {
background: linear-gradient(hsl(206,61%,40%), hsl(206,61%,31%)) repeat-x top left;
box-shadow: inset 0 1px 0 hsla(210,40%,83%,.15),
inset 0 -1px 0 hsla(210,40%,83%,.05);
background: linear-gradient(hsl(206,59%,39%), hsl(206,59%,29%)) repeat-x top left;
}
/* Responsive sidebar */
@ -119,16 +112,7 @@
background-image: none !important;
}
.devtools-side-splitter {
border-top-color: transparent !important;
}
.editor-label {
-moz-box-ordinal-group: 0;
}
.editor-label:not([selected]) {
border-top: 1px solid hsla(210,8%,5%,.25);
box-shadow: inset 0 1px 0 hsla(210,40%,83%,.15);
}
}

View File

@ -214,6 +214,7 @@
.devtools-sidebar-tabs > tabpanels {
-moz-appearance: none;
background: transparent;
padding: 0;
border: 0;
}

View File

@ -0,0 +1,785 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* Generic pane helpers */
.generic-toggled-side-pane {
-moz-margin-start: 0 !important;
/* Unfortunately, transitions don't work properly with locale-aware properties,
so both the left and right margins are set via js, while the start margin
is always overridden here. */
}
.generic-toggled-side-pane[animated] {
transition: margin 0.25s ease-in-out;
}
/* BreacrumbsWidget */
.breadcrumbs-widget-container {
-moz-margin-end: 3px;
/* A fake 1px-shadow is included in the border-images of the
breadcrumbs-widget-items, to match toolbar-buttons style.
This negative margin compensates the extra row of pixels created
by the shadow.*/
margin-bottom: -1px;
}
/* Preloading hack, LTR */
.breadcrumbs-widget-container:-moz-locale-dir(ltr)::after {
content: '';
display: block;
background-image:
url(breadcrumbs/ltr-start.png),
url(breadcrumbs/ltr-start-selected.png),
url(breadcrumbs/ltr-start-pressed.png),
url(breadcrumbs/ltr-start-selected-pressed.png),
url(breadcrumbs/ltr-middle.png),
url(breadcrumbs/ltr-middle-selected.png),
url(breadcrumbs/ltr-middle-pressed.png),
url(breadcrumbs/ltr-middle-selected-pressed.png),
url(breadcrumbs/ltr-end.png),
url(breadcrumbs/ltr-end-selected.png),
url(breadcrumbs/ltr-end-pressed.png),
url(breadcrumbs/ltr-end-selected-pressed.png);
}
/* Preloading hack, RTL */
.breadcrumbs-widget-container:-moz-locale-dir(rtl)::after {
content: '';
display: block;
background-image:
url(breadcrumbs/rtl-start.png),
url(breadcrumbs/rtl-start-selected.png),
url(breadcrumbs/rtl-start-pressed.png),
url(breadcrumbs/rtl-start-selected-pressed.png),
url(breadcrumbs/rtl-middle.png),
url(breadcrumbs/rtl-middle-selected.png),
url(breadcrumbs/rtl-middle-pressed.png),
url(breadcrumbs/rtl-middle-selected-pressed.png),
url(breadcrumbs/rtl-end.png),
url(breadcrumbs/rtl-end-selected.png),
url(breadcrumbs/rtl-end-pressed.png),
url(breadcrumbs/rtl-end-selected-pressed.png);
}
.scrollbutton-up,
.scrollbutton-down {
-moz-appearance: none;
background: linear-gradient(hsla(212,7%,57%,.35), hsla(212,7%,57%,.1)) padding-box;
box-shadow: 0 1px 0 hsla(210,16%,76%,.15) inset,
0 0 0 1px hsla(210,16%,76%,.15) inset,
0 1px 0 hsla(210,16%,76%,.15);
border: 1px solid hsla(210,8%,5%,.45);
margin: 0 0 1px;
}
.scrollbutton-up:not([disabled]):active:hover,
.scrollbutton-down:not([disabled]):active:hover {
background: linear-gradient(hsla(220,6%,10%,.3), hsla(212,7%,57%,.15) 65%, hsla(212,7%,57%,.3));
box-shadow: 0 0 3px hsla(210,8%,5%,.25) inset,
0 1px 3px hsla(210,8%,5%,.25) inset,
0 1px 0 hsla(210,16%,76%,.15);
border-color: hsla(210,8%,5%,.6);
}
.scrollbutton-up > .toolbarbutton-icon,
.scrollbutton-down > .toolbarbutton-icon {
-moz-appearance: none;
list-style-image: url("breadcrumbs-scrollbutton.png");
-moz-image-region: rect(0px,7px,16px,0px);
margin: 0 5px;
}
.scrollbutton-up:not([disabled]):active:hover > .toolbarbutton-icon,
.scrollbutton-down:not([disabled]):active:hover > .toolbarbutton-icon {
-moz-image-region: rect(0px,14px,16px,7px);
}
.scrollbutton-up[disabled] > .toolbarbutton-icon,
.scrollbutton-down[disabled] > .toolbarbutton-icon {
opacity: 0.5;
}
.scrollbutton-up > .toolbarbutton-icon:-moz-locale-dir(rtl),
.scrollbutton-down > .toolbarbutton-icon:-moz-locale-dir(ltr) {
transform: scaleX(-1);
}
.breadcrumbs-widget-item {
background-color: transparent;
-moz-appearance: none;
overflow: hidden;
min-width: 85px;
max-width: 250px;
min-height: 25px;
border-style: solid;
border-width: 1px 13px 2px 13px;
margin: 0 -11px 0 0;
padding: 0 9px;
outline: none;
color: hsl(210,30%,85%);
}
.breadcrumbs-widget-item:-moz-focusring > label {
border-bottom: 1px dotted hsla(210,30%,85%,0.4);
}
.breadcrumbs-widget-item[checked] .breadcrumbs-widget-item-tag {
color: hsl(208,100%,60%);
}
.breadcrumbs-widget-item[checked] .breadcrumbs-widget-item-id {
color: hsl(205,100%,70%);
}
.breadcrumbs-widget-item[checked] .breadcrumbs-widget-item-pseudo-classes {
color: hsl(20,100%,70%);
}
.breadcrumbs-widget-item-id,
.breadcrumbs-widget-item-classes {
color: #8d99a6;
}
.breadcrumbs-widget-item-pseudo-classes {
color: hsl(20,100%,85%);
}
/* Breadcrumbs LTR */
.breadcrumbs-widget-item:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:not([checked]):hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:not([checked]):hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:not([checked]):hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:first-of-type:-moz-locale-dir(ltr) {
border-left-width: 0;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:last-of-type:-moz-locale-dir(ltr) {
border-right-width: 0;
}
/* Breadcrumbs RTL */
.breadcrumbs-widget-item:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:not([checked]):hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end-selected.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end-selected-pressed.png") 1 13 2 13 fill stretch;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:first-of-type:-moz-locale-dir(rtl) {
border-right-width: 0;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:last-of-type:-moz-locale-dir(rtl) {
border-left-width: 0;
}
/* SimpleListWidget */
%filter substitution
%define slw_selectionGradient linear-gradient(hsl(206,59%,39%), hsl(206,59%,29%))
%define slw_selectionTextColor #fff
.simple-list-widget-container {
/* Hack: force hardware acceleration */
transform: translateZ(1px);
}
.simple-list-widget-item.selected {
background: @slw_selectionGradient@;
color: @slw_selectionTextColor@;
}
.theme-dark .simple-list-widget-item:not(.selected):hover {
background-color: #181d20; /* Sidebar background */
}
.theme-light .simple-list-widget-item:not(.selected):hover {
background-color: #f7f7f7; /* Sidebar background */
}
.simple-list-widget-empty-text,
.simple-list-widget-perma-text {
padding: 4px 8px;
}
.theme-dark .simple-list-widget-empty-text,
.theme-dark .simple-list-widget-perma-text {
color: #b6babf; /* Light foreground text */
}
.theme-light .simple-list-widget-empty-text,
.theme-light .simple-list-widget-perma-text {
color: #585959; /* Grey foreground text */
}
/* FastListWidget */
.fast-list-widget-container {
/* Hack: force hardware acceleration */
transform: translateZ(1px);
}
.fast-list-widget-empty-text {
padding: 4px 8px;
}
.theme-dark .fast-list-widget-empty-text {
color: #b6babf; /* Light foreground text */
}
.theme-light .fast-list-widget-empty-text {
color: #585959; /* Grey foreground text */
}
/* SideMenuWidget */
%filter substitution
%define smw_selectionGradient linear-gradient(hsl(206,59%,39%), hsl(206,59%,29%))
%define smw_selectionTextColor #fff
%define smw_margin #222426
%define smw_itemDarkTopBorder rgba(0,0,0,0.2)
%define smw_itemDarkBottomBorder rgba(128,128,128,0.15)
%define smw_itemLightTopBorder rgba(128,128,128,0.15)
%define smw_itemLightBottomBorder transparent
.side-menu-widget-container {
/* Hack: force hardware acceleration */
transform: translateZ(1px);
}
.theme-dark .side-menu-widget-container,
.theme-dark .side-menu-widget-empty-text {
background: url(background-noise-toolbar.png), #343c45; /* Toolbars */
}
/* SideMenuWidget container */
.side-menu-widget-container:-moz-locale-dir(ltr),
.side-menu-widget-empty-text:-moz-locale-dir(ltr) {
box-shadow: inset -1px 0 0 @smw_margin@;
}
.side-menu-widget-container:-moz-locale-dir(rtl),
.side-menu-widget-empty-text:-moz-locale-dir(rtl) {
box-shadow: inset 1px 0 0 @smw_margin@;
}
.side-menu-widget-group {
/* To allow visibility of the dark margin shadow. */
-moz-margin-end: 1px;
}
.side-menu-widget-container[with-arrows=true] .side-menu-widget-item {
/* To compensate for the arrow image's dark margin. */
-moz-margin-end: -1px;
}
/* SideMenuWidget groups */
.side-menu-widget-group-title {
padding: 4px;
}
.theme-dark .side-menu-widget-group-title {
background-color: #252c33; /* Tab toolbar */
color: #b8c8d9; /* Light content text */
}
.theme-light .side-menu-widget-group-title {
background-color: #ebeced; /* Tab toolbar */
color: #667380; /* Dark grey content text */
}
/* SideMenuWidget items */
.side-menu-widget-item {
/* To compensate for the top and bottom borders */
margin-top: -1px;
margin-bottom: -1px;
}
.theme-dark .side-menu-widget-item {
border-top: 1px solid @smw_itemDarkTopBorder@;
border-bottom: 1px solid @smw_itemDarkBottomBorder@;
color: #f5f7fa; /* Light foreground text */
}
.theme-dark .side-menu-widget-item:last-of-type {
box-shadow: inset 0 -1px 0 @smw_itemDarkTopBorder@;
}
.theme-light .side-menu-widget-item {
border-top: 1px solid @smw_itemLightTopBorder@;
border-bottom: 1px solid @smw_itemLightBottomBorder@;
color: #18191a; /* Dark foreground text */
}
.theme-light .side-menu-widget-item:last-of-type {
box-shadow: inset 0 -1px 0 @smw_itemLightTopBorder@;
}
.side-menu-widget-item.selected {
background: @smw_selectionGradient@ repeat-x top left;
color: @smw_selectionTextColor@;
}
.side-menu-widget-item-arrow {
-moz-margin-start: -7px;
width: 7px; /* The image's width is 7 pixels */
}
.side-menu-widget-item.selected > .side-menu-widget-item-arrow {
background-size: auto, 1px 100%;
background-repeat: no-repeat;
}
.side-menu-widget-item.selected > .side-menu-widget-item-arrow:-moz-locale-dir(ltr) {
background-position: center right, top right;
}
.side-menu-widget-item.selected > .side-menu-widget-item-arrow:-moz-locale-dir(rtl) {
background-position: center left, top left;
}
.theme-dark .side-menu-widget-item.selected > .side-menu-widget-item-arrow:-moz-locale-dir(ltr) {
background-image: url(itemArrow-dark-ltr.png), linear-gradient(to right, @smw_margin@, @smw_margin@);
}
.theme-dark .side-menu-widget-item.selected > .side-menu-widget-item-arrow:-moz-locale-dir(rtl) {
background-image: url(itemArrow-dark-rtl.png), linear-gradient(to right, @smw_margin@, @smw_margin@);
}
.theme-light .side-menu-widget-item.selected > .side-menu-widget-item-arrow:-moz-locale-dir(ltr) {
background-image: url(itemArrow-ltr.png), linear-gradient(to right, @smw_margin@, @smw_margin@);
}
.theme-light .side-menu-widget-item.selected > .side-menu-widget-item-arrow:-moz-locale-dir(rtl) {
background-image: url(itemArrow-rtl.png), linear-gradient(to right, @smw_margin@, @smw_margin@);
}
/* SideMenuWidget items contents */
.side-menu-widget-item-contents {
padding: 4px;
/* To avoid having content overlapping the arrow image. */
-moz-padding-end: 8px;
}
.side-menu-widget-item-other {
/* To avoid having content overlapping the arrow image. */
-moz-padding-end: 8px;
/* To compensate for the .side-menu-widget-item-contents padding. */
-moz-margin-start: -4px;
-moz-margin-end: -8px;
}
.side-menu-widget-item-other:first-of-type {
margin-top: 4px;
}
.side-menu-widget-item-other:last-of-type {
margin-bottom: -4px;
}
.theme-dark .side-menu-widget-item-other {
background: url(background-noise-toolbar.png), rgba(0,0,0,.1);
}
.theme-light .side-menu-widget-item-other {
background: url(background-noise-toolbar.png), rgba(128,128,128,.1);
}
.theme-dark .side-menu-widget-item.selected .side-menu-widget-item-other {
background-color: rgba(0,0,0,.2); /* Darken the selection by 20% */
color: #f5f7fa; /* Light foreground text */
}
.theme-light .side-menu-widget-item.selected .side-menu-widget-item-other {
background-color: rgba(255,255,255,.8); /* Lighten the selection by 20% */
color: #18191a; /* Dark foreground text */
}
.theme-dark .side-menu-widget-item.selected .side-menu-widget-item-other.selected {
background-color: transparent;
color: @smw_selectionTextColor@;
}
.theme-light .side-menu-widget-item.selected .side-menu-widget-item-other.selected {
background-color: transparent;
color: @smw_selectionTextColor@;
}
/* SideMenuWidget checkboxes */
.side-menu-widget-group-checkbox {
margin: 0;
-moz-margin-end: 4px;
}
.side-menu-widget-item-checkbox {
margin: 0;
-moz-margin-start: 4px;
}
/* SideMenuWidget misc */
.side-menu-widget-empty-text {
padding: 4px 8px;
}
.theme-dark .side-menu-widget-empty-text {
color: #b6babf; /* Light foreground text */
}
.theme-light .side-menu-widget-empty-text {
color: #585959; /* Grey foreground text */
}
/* VariablesView */
.variables-view-container {
/* Hack: force hardware acceleration */
transform: translateZ(1px);
}
.variables-view-empty-notice {
padding: 2px;
}
.theme-dark .variables-view-empty-notice {
color: #b6babf; /* Light foreground text */
}
.theme-light .variables-view-empty-notice {
color: #585959; /* Grey foreground text */
}
.variables-view-scope > .title {
color: #fff;
}
/* Generic variables traits */
.variables-view-variable:not(:last-child) {
border-bottom: 1px solid rgba(128, 128, 128, .15);
}
.variables-view-variable > .title > .name {
font-weight: 600;
}
/* Generic variables *and* properties traits */
.variable-or-property:focus > .title > label {
color: inherit !important;
}
.variable-or-property > .title > .value {
-moz-box-flex: 1;
}
.variable-or-property > .title > .arrow {
-moz-margin-start: 3px;
}
.variable-or-property:not([untitled]) > .variables-view-element-details {
-moz-margin-start: 7px;
}
/* Traits applied when variables or properties are changed or overridden */
.variable-or-property:not([overridden]) {
transition: background 1s ease-in-out;
}
.variable-or-property:not([overridden])[changed] {
transition-duration: .4s;
}
.variable-or-property[overridden] {
background: rgba(128,128,128,0.05);
}
.variable-or-property[overridden] .title > label {
/* Cross out the title for this variable and all child properties. */
font-style: italic;
text-decoration: line-through;
border-bottom: none !important;
color: rgba(128,128,128,0.9);
opacity: 0.7;
}
/* Traits applied when variables or properties are editable */
.variable-or-property[editable] > .title > .value {
cursor: text;
}
.variable-or-property[overridden] .title > .value {
/* Disallow editing this variable and all child properties. */
pointer-events: none;
}
/* Custom configurable/enumerable/writable or frozen/sealed/extensible
* variables and properties */
.variable-or-property[non-enumerable]:not([self]):not([pseudo-item]) > .title > .name {
opacity: 0.6;
}
.variable-or-property[non-configurable]:not([pseudo-item]) > .title > .name {
border-bottom: 1px dashed #99f;
}
.variable-or-property[non-writable]:not([pseudo-item]) > .title > .name {
border-bottom: 1px dashed #f99;
}
.variable-or-property[safe-getter]:not([pseudo-item]) > .title > .name {
border-bottom: 1px dashed #8b0;
}
.variable-or-property-non-writable-icon {
background: url("chrome://browser/skin/identity-icons-https.png") no-repeat;
width: 16px;
height: 16px;
opacity: 0.5;
}
@media (min-resolution: 2dppx) {
.variable-or-property-non-writable-icon {
background-image: url("chrome://browser/skin/identity-icons-https@2x.png");
background-size: 32px;
}
}
.variable-or-property-frozen-label,
.variable-or-property-sealed-label,
.variable-or-property-non-extensible-label {
-moz-padding-end: 4px;
}
.variable-or-property:not(:focus) > .title > .variable-or-property-frozen-label,
.variable-or-property:not(:focus) > .title > .variable-or-property-sealed-label,
.variable-or-property:not(:focus) > .title > .variable-or-property-non-extensible-label {
color: #666;
}
/* Aligned values */
.variables-view-container[aligned-values] .title > .separator {
-moz-box-flex: 1;
}
.variables-view-container[aligned-values] .title > .value {
-moz-box-flex: 0;
width: 70vw;
}
.variables-view-container[aligned-values] .title > .element-value-input {
width: calc(70vw - 10px);
}
/* Actions first */
.variables-view-container[actions-first] .variables-view-delete,
.variables-view-container[actions-first] .variables-view-add-property {
-moz-box-ordinal-group: 0;
}
.variables-view-container[actions-first] [invisible] {
visibility: hidden;
}
/* Variables and properties tooltips */
.variable-or-property > tooltip > label {
margin: 0 2px 0 2px;
}
.variable-or-property[non-enumerable] > tooltip > label.enumerable,
.variable-or-property[non-configurable] > tooltip > label.configurable,
.variable-or-property[non-writable] > tooltip > label.writable,
.variable-or-property[non-extensible] > tooltip > label.extensible {
color: #800;
text-decoration: line-through;
}
.variable-or-property[overridden] > tooltip > label.overridden {
-moz-padding-start: 4px;
-moz-border-start: 1px dotted #000;
}
.variable-or-property[safe-getter] > tooltip > label.WebIDL {
-moz-padding-start: 4px;
-moz-border-start: 1px dotted #000;
color: #080;
}
/* Variables and properties editing */
.variables-view-delete {
list-style-image: url("chrome://browser/skin/devtools/vview-delete.png");
-moz-image-region: rect(0,16px,16px,0);
}
.variables-view-delete:hover {
-moz-image-region: rect(0,32px,16px,16px);
}
.variables-view-delete:active {
-moz-image-region: rect(0,48px,16px,32px);
}
.variables-view-edit {
background: url("chrome://browser/skin/devtools/vview-edit.png") center no-repeat;
width: 20px;
height: 16px;
cursor: pointer;
}
.variables-view-throbber {
background: url("chrome://global/skin/icons/loading_16.png") center no-repeat;
width: 16px;
height: 16px;
}
.element-value-input {
-moz-margin-start: -2px !important;
-moz-margin-end: 2px !important;
}
.element-name-input {
-moz-margin-start: -2px !important;
-moz-margin-end: 2px !important;
font-weight: 600;
}
.element-value-input,
.element-name-input {
border: 1px solid rgba(128, 128, 128, .5) !important;
border-radius: 0;
color: inherit;
}
/* Variables and properties searching */
.variables-view-searchinput {
min-height: 24px;
}
.variable-or-property[unmatched] {
border: none;
margin: 0;
}
/* Expand/collapse arrow */
.arrow {
-moz-appearance: treetwisty;
width: 20px;
height: 20px;
}
.arrow[open] {
-moz-appearance: treetwistyopen;
}
.arrow[invisible] {
visibility: hidden;
}
%include ../../shared/devtools/app-manager/manifest-editor.inc.css

View File

@ -24,6 +24,12 @@
-moz-box-flex: 1; /* make menu items expand to fill toolbar height */
}
/* Hides the titlebar-placeholder underneath the window caption buttons when we
are not autohiding the menubar. */
#toolbar-menubar:not([autohide="true"]) + #TabsToolbar > .titlebar-placeholder[type="caption-buttons"] {
display: none;
}
/* We want a 4px gap between the TabsToolbar and the toolbar-menubar when the
toolbar-menu is displayed, and a 16px gap when it is not. 1px is taken care
of by the (light) outer shadow of the tab, the remaining 3/15 are these margins. */

View File

@ -1,567 +1,11 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* Sources and breakpoints pane */
#sources-pane > tabs {
-moz-border-end: 1px solid #222426; /* Match the sources list's dark margin. */
}
#sources-pane[selectedIndex="0"] + #sources-and-editor-splitter {
border-color: transparent;
}
/* Sources toolbar */
#sources-toolbar {
border: none; /* Remove the devtools-toolbar's black bottom border. */
-moz-border-end: 1px solid #222426; /* Match the sources list's dark margin. */
}
#sources-toolbar > .devtools-toolbarbutton,
#sources-controls > .devtools-toolbarbutton {
min-width: 32px;
}
#black-box {
list-style-image: url(debugger-blackbox.png);
}
#pretty-print {
font-weight: bold;
}
#toggle-breakpoints {
list-style-image: url(debugger-toggleBreakpoints.png);
}
#sources-toolbar .devtools-toolbarbutton:not([label]) {
-moz-image-region: rect(0px,16px,16px,0px);
}
#sources-toolbar .devtools-toolbarbutton:not([label])[checked] {
-moz-image-region: rect(0px,32px,16px,16px);
}
#sources .black-boxed {
color: #888;
}
#sources .black-boxed > .dbg-breakpoint {
display: none;
}
#sources .black-boxed + .side-menu-widget-item-arrow:-moz-locale-dir(ltr) {
background-image: none;
box-shadow: inset -1px 0 0 #222426;
}
#sources .black-boxed + .side-menu-widget-item-arrow:-moz-locale-dir(rtl) {
background-image: none;
box-shadow: inset 1px 0 0 #222426;
}
/* Black box message and source progress meter */
#black-boxed-message,
#source-progress-container {
background: url(background-noise-toolbar.png) rgb(61,69,76);
/* Prevent the container deck from aquiring the size from this message. */
min-width: 1px;
min-height: 1px;
color: white;
}
#source-progress {
min-height: 2em;
min-width: 40em;
}
#black-boxed-message-label,
#black-boxed-message-button {
text-align: center;
font-size: 120%;
}
#black-boxed-message-button {
margin-top: 1em;
padding: .25em;
}
/* Tracer */
#trace {
list-style-image: url(tracer-icon.png);
-moz-image-region: rect(0px,16px,16px,0px);
}
#trace[checked] {
-moz-image-region: rect(0px,32px,16px,16px);
}
#clear-tracer {
/* Make this button as narrow as the text inside it. */
min-width: 1px;
}
.trace-name {
-moz-padding-start: 4px !important;
}
/* Tracer dark theme */
.theme-dark .trace-item {
color: #f5f7fa; /* Light foreground text */
}
.theme-dark .trace-item.selected-matching {
background-color: rgba(29, 79, 115, .4); /* Select highlight blue at 40% alpha */
}
.theme-dark .selected > .trace-item {
background-color: rgba(29, 79, 115, .75); /* Select highlight blue at 75% alpha */
}
.theme-dark .trace-call {
color: #46afe3; /* highlight blue */
}
.theme-dark .trace-return,
.theme-dark .trace-yield {
color: #70bf53; /* highlight green */
}
.theme-dark .trace-throw {
color: #eb5368; /* highlight red */
}
.theme-dark .trace-param {
color: #b8c8d9; /* Content text light */
}
.theme-dark .trace-syntax {
color: #8fa1b2; /* Content text grey */
}
/* Tracer light theme */
.theme-light .trace-item {
color: #292e33; /* Dark foreground text */
}
.theme-light .trace-item.selected-matching {
background-color: rgba(76, 158, 217, .4); /* Select highlight blue at 40% alpha */
}
.theme-light .selected > .trace-item {
background-color: rgba(76, 158, 217, .75); /* Select highlight blue at 75% alpha */
}
.theme-light .trace-call {
color: #0088cc; /* highlight blue */
}
.theme-light .trace-return,
.theme-light .trace-yield {
color: #2cbb0f; /* highlight green */
}
.theme-light .trace-throw {
color: #ed2655; /* highlight red */
}
.theme-light .trace-param {
color: #667380; /* Content text dark grey */
}
.theme-light .trace-syntax {
color: #8fa1b2; /* Content text grey */
}
/* Breadcrumbs stack frames view */
.breadcrumbs-widget-item {
max-width: none;
}
.dbg-stackframe-details {
-moz-padding-start: 4px;
}
/* Classic stack frames view */
.dbg-classic-stackframe {
display: block;
padding: 0px 4px;
}
.dbg-classic-stackframe-title {
font-weight: 600;
color: #046;
}
.dbg-classic-stackframe-details:-moz-locale-dir(ltr) {
float: right;
}
.dbg-classic-stackframe-details:-moz-locale-dir(rtl) {
float: left;
}
.dbg-classic-stackframe-details-url {
max-width: 90%;
text-align: end;
color: #666;
}
.dbg-classic-stackframe-details-sep {
color: #aaa;
}
.dbg-classic-stackframe-details-line {
color: #58b;
}
#callstack-list .side-menu-widget-item.selected label {
color: #fff;
}
/* Sources and breakpoints view */
.dbg-breakpoint {
-moz-margin-start: 4px;
}
.dbg-breakpoint-line {
font-weight: 600;
}
.dbg-breakpoint-text {
-moz-margin-start: 10px !important;
font-style: italic;
font-size: 90%;
}
.dbg-breakpoint-checkbox {
width: 16px;
height: 16px;
margin: 2px;
}
/* Variable bubble view */
.devtools-tooltip-simple-text.token-undefined,
.devtools-tooltip-simple-text.token-null {
text-align: center;
color: #666 !important; /* Override the theme's color. */
}
.devtools-tooltip-simple-text.token-boolean {
text-align: center;
color: #10c !important;
}
.devtools-tooltip-simple-text.token-number {
text-align: center;
color: #c00 !important;
}
.devtools-tooltip-simple-text.token-string {
text-align: start;
color: #282 !important;
}
.devtools-tooltip-simple-text.token-other {
text-align: center;
color: #333 !important;
}
/* Instruments pane (watch expressions, variables, event listeners...) */
#instruments-pane .side-menu-widget-container,
#instruments-pane .side-menu-widget-empty-text {
box-shadow: none !important;
}
/* Watch expressions view */
#expressions {
min-height: 10px;
max-height: 125px;
}
.dbg-expression {
height: 20px;
}
.dbg-expression-arrow {
width: 16px;
height: auto;
margin: 2px;
background: -moz-image-rect(url(commandline-icon.png), 0, 32, 16, 16);
}
.dbg-expression-input {
color: inherit;
}
/* Event listeners view */
.dbg-event-listener {
padding: 0px 8px;
}
.dbg-event-listener-type {
font-weight: 600;
}
.dbg-event-listener-separator {
color: #999;
}
.dbg-event-listener-targets {
color: #046;
}
.dbg-event-listener-location {
color: #666;
}
#event-listeners .side-menu-widget-item.selected {
background: none !important;
}
/* Searchbox and the search operations help panel */
#searchbox {
min-width: 220px;
-moz-margin-start: 1px;
}
#filter-label {
-moz-margin-start: 2px;
}
#searchbox-panel-operators {
margin-top: 5px;
margin-bottom: 8px;
-moz-margin-start: 2px;
}
.searchbox-panel-operator-button {
min-width: 26px;
margin-top: 0;
margin-bottom: 0;
-moz-margin-start: 2px;
-moz-margin-end: 6px;
text-align: center;
}
.searchbox-panel-operator-label {
padding-bottom: 2px;
}
/* Searchbox results panel */
.results-panel {
padding: 4px;
}
.results-panel-item {
background: #f4f4f4;
border: 1px solid #ddd;
border-top-color: #fff;
padding: 5px;
cursor: pointer;
}
.results-panel-item:first-of-type {
border-top-color: #ddd;
border-radius: 4px 4px 0 0;
}
.results-panel-item:last-of-type {
border-radius: 0 0 4px 4px;
}
.results-panel-item:only-of-type {
border-radius: 4px;
}
.results-panel-item:not(.selected):not(:hover) {
text-shadow: 0 1px #fff;
}
.results-panel-item-label-before {
-moz-margin-end: 5px !important;
color: #444;
cursor: inherit;
}
.results-panel-item-label {
color: #111;
font-weight: 600;
cursor: inherit;
}
.results-panel-item-label-below {
color: #7f7f7f;
cursor: inherit;
}
/* Sources search view */
#globalsearch {
min-height: 10px;
max-height: 125px;
box-shadow: inset 0 -4px 8px #eee;
background: url(background-noise-toolbar.png);
}
#globalsearch + .devtools-horizontal-splitter {
border-color: #bfbfbf;
}
.dbg-source-results {
padding: 0;
background: none !important;
}
.dbg-results-header {
-moz-padding-start: 6px;
}
.dbg-results-header-location {
font-weight: 600;
}
.dbg-results-header-match-count {
-moz-padding-start: 6px;
color: GrayText;
}
.dbg-results-line-number {
background: #e2e2e2;
min-width: 40px;
-moz-border-end: 1px solid #b4c4d3;
-moz-padding-end: 4px;
padding-top: 2px;
text-align: end;
color: #8c8c8c;
}
.dbg-results-line-contents {
-moz-padding-start: 4px;
padding-top: 1px;
padding-bottom: 1px;
}
.dbg-results-line-contents-string {
padding: 1px;
}
.dbg-results-line-contents-string[match=true] {
background: rgba(255,255,0,0.5);
padding: 0;
border: 1px solid #aaa;
border-radius: 4px;
cursor: pointer;
}
.dbg-results-line-contents-string[match=true][focusing] {
transition: transform 0.3s ease-in-out;
}
.dbg-results-line-contents-string[match=true][focused] {
transition-duration: 0.1s;
transform: scale(1.75, 1.75);
}
/* Toolbar controls */
%include ../../shared/devtools/debugger.inc.css
.devtools-sidebar-tabs > tabs > tab {
min-height: 25px !important;
padding: 0 !important;
}
#resumption-panel-desc {
width: 200px;
}
#resumption-order-panel {
-moz-margin-start: -8px;
}
#resume {
list-style-image: url("chrome://browser/skin/devtools/debugger-pause.png");
-moz-image-region: rect(0px,16px,16px,0px);
transition: background 0.15s ease-in-out;
}
#resume[checked] {
background: none;
list-style-image: url("chrome://browser/skin/devtools/debugger-play.png");
-moz-image-region: rect(0px,32px,16px,16px);
}
#resume ~ toolbarbutton {
transition: opacity 0.15s ease-in-out;
}
#resume:not([checked]) ~ toolbarbutton {
opacity: 0.5;
}
#step-over {
list-style-image: url("chrome://browser/skin/devtools/debugger-step-over.png");
}
#step-in {
list-style-image: url("chrome://browser/skin/devtools/debugger-step-in.png");
}
#step-out {
list-style-image: url("chrome://browser/skin/devtools/debugger-step-out.png");
}
#debugger-controls > toolbarbutton,
#sources-controls > toolbarbutton {
margin: 0;
box-shadow: none;
border-radius: 0;
border-width: 0;
-moz-border-end-width: 1px;
outline-offset: -3px;
}
#debugger-controls > toolbarbutton:last-of-type,
#sources-controls > toolbarbutton:last-of-type {
-moz-border-end-width: 0;
}
#debugger-controls,
#sources-controls {
box-shadow: 0 1px 0 hsla(209,29%,72%,.15) inset,
0 0 0 1px hsla(209,29%,72%,.1) inset,
0 0 0 1px hsla(209,29%,72%,.1),
0 1px 0 hsla(210,16%,76%,.1);
border: 1px solid hsla(210,8%,5%,.45);
border-radius: 3px;
margin: 0 3px;
}
#instruments-pane-toggle {
background: none;
box-shadow: none;
border: none;
list-style-image: url("chrome://browser/skin/devtools/debugger-collapse.png");
-moz-image-region: rect(0px,16px,16px,0px);
}
#instruments-pane-toggle[pane-collapsed] {
list-style-image: url("chrome://browser/skin/devtools/debugger-expand.png");
min-height: 22px !important;
}
#instruments-pane-toggle:hover {
@ -571,33 +15,3 @@
#instruments-pane-toggle:hover:active {
-moz-image-region: rect(0px,48px,16px,32px);
}
/* Horizontal vs. vertical layout */
#vertical-layout-panes-container {
min-height: 35vh;
max-height: 80vh;
}
#body[layout=vertical] #sources-pane > tabs {
-moz-border-end: none;
}
#body[layout=vertical] #instruments-pane {
margin: 0 !important;
/* To prevent all the margin hacks to hide the sidebar. */
}
#body[layout=vertical] .side-menu-widget-container,
#body[layout=vertical] .side-menu-widget-empty-text {
box-shadow: none !important;
}
#body[layout=vertical] .side-menu-widget-item-arrow {
background-image: none !important;
}
#body[layout=vertical] .side-menu-widget-group,
#body[layout=vertical] .side-menu-widget-item {
-moz-margin-end: 0;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,553 +1,29 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#body {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
}
%include ../../shared/devtools/netmonitor.inc.css
/* Network requests table */
#requests-menu-empty-notice {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
padding: 12px;
font-size: 110%;
color: #fff;
}
#requests-menu-toolbar {
height: 33px;
.requests-menu-header-button > .button-box {
padding: 0;
}
.requests-menu-header:first-child {
-moz-padding-start: 4px;
}
.requests-menu-subitem {
padding: 4px;
}
.requests-menu-header:not(:last-child):-moz-locale-dir(ltr),
.requests-menu-subitem:not(:last-child):-moz-locale-dir(ltr) {
-moz-border-end: 1px solid hsla(210,8%,5%,.25);
box-shadow: 1px 0 0 hsla(210,16%,76%,.1);
}
.requests-menu-header:not(:last-child):-moz-locale-dir(rtl),
.requests-menu-subitem:not(:last-child):-moz-locale-dir(rtl) {
-moz-border-end: 1px solid hsla(210,8%,5%,.25);
box-shadow: -1px 0 0 hsla(210,16%,76%,.1);
}
.requests-menu-header-button {
-moz-appearance: none;
background: none;
min-width: 20px;
min-height: 32px;
margin: 0;
border: none;
padding: 0;
color: inherit;
font-weight: inherit !important;
transition: background-color 0.1s ease-in-out;
}
.requests-menu-header-button:hover {
background: rgba(0,0,0,0.10);
}
.requests-menu-header-button:hover:active {
background: rgba(0,0,0,0.25);
}
.requests-menu-header-button:not(:active)[sorted] {
background: rgba(0,0,0,0.15);
}
.requests-menu-header-button:not(:active)[sorted=ascending] {
background-image: radial-gradient(farthest-side at center top, hsla(200,100%,70%,.7), hsla(200,100%,70%,0.3));
background-size: 100% 1px;
background-repeat: no-repeat;
}
.requests-menu-header-button:not(:active)[sorted=descending] {
background-image: radial-gradient(farthest-side at center bottom, hsla(200,100%,70%,.7), hsla(200,100%,70%,0.3));
background-size: 100% 1px;
background-repeat: no-repeat;
background-position: bottom;
}
/* Network requests table: specific column dimensions */
.requests-menu-status-and-method {
width: 8em;
}
.requests-menu-status {
width: 10px;
height: 10px;
}
.requests-menu-method {
text-align: center;
font-weight: 600;
}
.requests-menu-file {
width: 20vw;
min-width: 4em;
}
.requests-menu-domain {
width: 14vw;
min-width: 10em;
}
.requests-menu-type {
text-align: center;
width: 4em;
}
.requests-menu-size {
text-align: center;
width: 8em;
}
/* Network requests table: status codes */
box.requests-menu-status {
background: #fff;
-moz-margin-start: 5px;
-moz-margin-end: 5px;
border-radius: 20px;
box-shadow:
0 0 0 1px rgba(255,255,255,0.4) inset,
0 -6px 4px 0 rgba(32,32,32,1.0) inset,
0 0 8px 0 rgba(32,0,0,0.4);
transition: box-shadow 0.5s ease-in-out;
}
box.requests-menu-status[code^="1"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(0,0,64,1.0) inset,
0 0 8px 0 rgba(0,0,128,1.0);
}
box.requests-menu-status[code^="2"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(0,64,0,1.0) inset,
0 0 8px 0 rgba(0,128,0,1.0);
}
box.requests-menu-status[code^="3"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(64,32,0,1.0) inset,
0 0 8px 0 rgba(128,128,0,1.0);
}
box.requests-menu-status[code^="4"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(64,0,0,1.0) inset,
0 0 8px 0 rgba(128,0,0,1.0);
}
box.requests-menu-status[code^="5"] {
box-shadow:
0 0 2px 1px rgba(255,255,255,0.8) inset,
0 -6px 4px 0 rgba(64,0,64,1.0) inset,
0 0 8px 0 rgba(128,0,128,1.0);
}
/* Network requests table: waterfall header */
#requests-menu-waterfall-label {
-moz-padding-start: 8px;
-moz-padding-end: 8px;
}
.requests-menu-timings-division {
width: 100px;
padding-top: 1px;
-moz-padding-start: 4px;
-moz-border-start: 1px dotted #999;
font-size: 90%;
pointer-events: none;
}
.requests-menu-timings-division:not(:first-child) {
-moz-margin-start: -100px !important; /* Don't affect layout. */
}
.requests-menu-timings-division:-moz-locale-dir(ltr) {
transform-origin: left center;
}
.requests-menu-timings-division:-moz-locale-dir(rtl) {
transform-origin: right center;
}
/* Network requests table: waterfall items */
.requests-menu-subitem.requests-menu-waterfall {
-moz-padding-start: 4px;
-moz-padding-end: 4px;
background-repeat: repeat-y; /* Background created on a <canvas> in js. */
margin-top: -1px; /* Compensate borders. */
margin-bottom: -1px;
}
.requests-menu-subitem.requests-menu-waterfall:-moz-locale-dir(rtl) {
background-position: right center;
}
.requests-menu-timings:-moz-locale-dir(ltr) {
transform-origin: left center;
}
.requests-menu-timings:-moz-locale-dir(rtl) {
transform-origin: right center;
}
.requests-menu-timings-total:-moz-locale-dir(ltr) {
transform-origin: left center;
}
.requests-menu-timings-total:-moz-locale-dir(rtl) {
transform-origin: right center;
}
.requests-menu-timings-total {
-moz-padding-start: 8px;
font-size: 85%;
font-weight: 600;
}
.requests-menu-timings-cap {
width: 4px;
height: 10px;
border: 1px solid #fff;
}
.requests-menu-timings-cap.start {
-moz-border-end: none;
}
.requests-menu-timings-cap.end {
-moz-border-start: none;
}
.requests-menu-timings-cap.start:-moz-locale-dir(ltr) {
border-radius: 4px 0 0 4px;
transform-origin: right center;
}
.requests-menu-timings-cap.start:-moz-locale-dir(rtl) {
border-radius: 0 4px 4px 0;
transform-origin: left center;
}
.requests-menu-timings-cap.end:-moz-locale-dir(ltr) {
border-radius: 0 4px 4px 0;
transform-origin: left center;
}
.requests-menu-timings-cap.end:-moz-locale-dir(rtl) {
border-radius: 4px 0 0 4px;
transform-origin: right center;
}
.requests-menu-timings-box {
height: 10px;
border-top: 1px solid #fff;
border-bottom: 1px solid #fff;
}
.requests-menu-timings-box.blocked,
.requests-menu-timings-cap.blocked {
background-color: rgba(255,32,32,0.8);
box-shadow: 0 0 8px 0 rgba(128,32,32,0.8),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.dns,
.requests-menu-timings-cap.dns {
background-color: rgba(255,128,255,0.6);
box-shadow: 0 0 8px 0 rgba(128,128,255,1.0),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.connect,
.requests-menu-timings-cap.connect {
background-color: rgba(255,128,16,0.4);
box-shadow: 0 0 8px 0 rgba(128,128,16,0.8),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.send,
.requests-menu-timings-cap.send {
background-color: rgba(255,255,128,0.4);
box-shadow: 0 0 8px 0 rgba(128,255,128,0.8),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.wait,
.requests-menu-timings-cap.wait {
background-color: rgba(255,255,255,0.2);
box-shadow: 0 0 8px 0 rgba(128,255,255,0.4),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
.requests-menu-timings-box.receive,
.requests-menu-timings-cap.receive {
background-color: rgba(255,255,255,1.0);
box-shadow: 0 0 8px 0 rgba(128,255,255,1.0),
0 0 4px 0 rgba(255,255,255,1.0) inset;
}
/* SideMenuWidget */
.side-menu-widget-item-contents {
padding: 0px;
}
.side-menu-widget-container {
box-shadow: none !important;
}
.side-menu-widget-item[odd] {
background: rgba(255,255,255,0.05);
}
/* Network request details */
#details-pane {
background: hsl(208,11%,27%);
max-width: 500px;
}
#details-pane-toggle {
background: none;
box-shadow: none;
border-color: transparent;
list-style-image: url("chrome://browser/skin/devtools/debugger-collapse.png");
-moz-image-region: rect(0px,16px,16px,0px);
}
#details-pane-toggle[pane-collapsed] {
list-style-image: url("chrome://browser/skin/devtools/debugger-expand.png");
}
#details-pane-toggle:active {
-moz-image-region: rect(0px,32px,16px,16px);
}
/* Network request details tabpanels */
.tabpanel-content {
background: url(background-noise-toolbar.png), #3e4750;
box-shadow: 0 1px 0 hsla(204,45%,98%,.05) inset;
color: #fff;
}
.tabpanel-summary-container {
padding: 1px;
}
.tabpanel-summary-label {
-moz-padding-start: 4px;
-moz-padding-end: 3px;
font-weight: 600;
text-shadow: 0 1px 0 #000;
color: hsl(210,30%,85%);
}
.tabpanel-summary-value {
-moz-padding-start: 3px;
}
/* Headers tabpanel */
#headers-summary-status,
#headers-summary-version {
padding-bottom: 2px;
}
#headers-summary-size {
padding-top: 2px;
}
#headers-summary-resend {
margin: 0 6px;
min-height: 20px;
}
/* Response tabpanel */
#response-content-info-header {
background:
url(background-noise-toolbar.png),
linear-gradient(hsl(0,61%,40%), hsl(0,61%,31%)) repeat-x top left;
box-shadow:
inset 0 1px 0 hsla(210,40%,83%,.15),
inset 0 -1px 0 hsla(210,40%,83%,.05);
margin: 0;
padding: 5px 8px;
}
#response-content-image-box {
padding-top: 10px;
padding-bottom: 10px;
}
#response-content-image {
background: #fff;
border: 1px dashed GrayText;
margin-bottom: 10px;
}
/* Timings tabpanel */
#timings-tabpanel .tabpanel-summary-label {
width: 10em;
}
#timings-tabpanel .requests-menu-timings-box {
transition: transform 0.2s ease-out;
min-width: 1px;
}
#timings-tabpanel .requests-menu-timings-total {
transition: transform 0.2s ease-out;
}
/* Custom request form */
#custom-pane {
padding: 0.6em 0.5em;
}
.custom-header {
font-size: 1.1em;
}
.custom-section {
margin-top: 0.5em;
}
#custom-method-value {
width: 4.5em;
}
/* Footer */
#requests-menu-footer {
box-shadow: inset 0 1px 16px hsla(210,8%,5%,.3);
}
.requests-menu-footer-button,
.requests-menu-footer-label {
min-width: 1em;
margin: 0;
border: none;
padding: 0px 1.5vw;
color: #fff;
}
.requests-menu-footer-spacer {
min-width: 2px;
}
.requests-menu-footer-spacer,
.requests-menu-footer-button {
-moz-border-end: 1px solid hsla(210,8%,5%,.25);
box-shadow: 1px 0 0 hsla(210,16%,76%,.1);
}
.requests-menu-footer-button {
-moz-appearance: none;
background: rgba(0,0,0,0.025);
}
.requests-menu-footer-button:hover {
background: rgba(0,0,0,0.20);
}
.requests-menu-footer-button:hover:active {
background: rgba(0,0,0,0.35);
}
.requests-menu-footer-button:not(:active)[checked] {
background-color: rgba(0,0,0,0.25);
background-image: radial-gradient(farthest-side at center top, hsla(200,100%,70%,.7), hsla(200,100%,70%,0.3));
background-size: 100% 1px;
background-repeat: no-repeat;
}
.requests-menu-footer-label {
font-weight: 600;
padding-top: 0px;
padding-bottom: 0px;
}
/* Responsive sidebar */
@media (max-width: 700px) {
#requests-menu-toolbar {
height: 24px;
}
.requests-menu-header-button {
min-height: 24px;
}
.requests-menu-footer-button,
.requests-menu-footer-label {
padding: 0px 2vw;
}
#details-pane {
max-width: none;
margin: 0 !important;
/* To prevent all the margin hacks to hide the sidebar. */
}
.requests-menu-status-and-method {
width: 16vw;
}
.requests-menu-file,
.requests-menu-domain {
width: 30vw;
}
.requests-menu-type {
width: 8vw;
}
.requests-menu-size {
width: 16vw;
border-width: 0 !important;
box-shadow: none !important;
/* The "Timeline" header is not visible anymore, and thus the
right border and box-shadow of "Size" column should be hidden. */
}
}
@media (min-width: 701px) {
#network-table[type-overflows] .requests-menu-domain {
border-width: 0 !important;
box-shadow: none !important;
/* The "Type" header is not visible anymore, and thus the
right border and box-shadow of "Domain" column should be hidden. */
}
#network-table[domain-overflows] .requests-menu-file {
border-width: 0 !important;
box-shadow: none !important;
/* The "Domain" header is not visible anymore, and thus the
right border and box-shadow of "File" column should be hidden. */
padding-top: 0px;
padding-bottom: 0px;
}
}

View File

@ -1,720 +1,19 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* Generic pane helpers */
.generic-toggled-side-pane {
-moz-margin-start: 0px !important;
/* Unfortunately, transitions don't work properly with locale-aware properties,
so both the left and right margins are set via js, while the start margin
is always overridden here. */
}
.generic-toggled-side-pane[animated] {
transition: margin 0.25s ease-in-out;
}
/* BreacrumbsWidget */
.breadcrumbs-widget-container {
-moz-margin-end: 3px;
/* A fake 1px-shadow is included in the border-images of the
breadcrumbs-widget-items, to match toolbar-buttons style.
This negative margin compensates the extra row of pixels created
by the shadow.*/
margin: -1px 0;
}
/* Preloading hack, LTR */
.breadcrumbs-widget-container:-moz-locale-dir(ltr)::after {
content: '';
display: block;
background-image:
url(breadcrumbs/ltr-start.png),
url(breadcrumbs/ltr-start-selected.png),
url(breadcrumbs/ltr-start-pressed.png),
url(breadcrumbs/ltr-start-selected-pressed.png),
url(breadcrumbs/ltr-middle.png),
url(breadcrumbs/ltr-middle-selected.png),
url(breadcrumbs/ltr-middle-pressed.png),
url(breadcrumbs/ltr-middle-selected-pressed.png),
url(breadcrumbs/ltr-end.png),
url(breadcrumbs/ltr-end-selected.png),
url(breadcrumbs/ltr-end-pressed.png),
url(breadcrumbs/ltr-end-selected-pressed.png);
}
/* Preloading hack, RTL */
.breadcrumbs-widget-container:-moz-locale-dir(rtl)::after {
content: '';
display: block;
background-image:
url(breadcrumbs/rtl-start.png),
url(breadcrumbs/rtl-start-selected.png),
url(breadcrumbs/rtl-start-pressed.png),
url(breadcrumbs/rtl-start-selected-pressed.png),
url(breadcrumbs/rtl-middle.png),
url(breadcrumbs/rtl-middle-selected.png),
url(breadcrumbs/rtl-middle-pressed.png),
url(breadcrumbs/rtl-middle-selected-pressed.png),
url(breadcrumbs/rtl-end.png),
url(breadcrumbs/rtl-end-selected.png),
url(breadcrumbs/rtl-end-pressed.png),
url(breadcrumbs/rtl-end-selected-pressed.png);
}
.scrollbutton-up,
.scrollbutton-down {
-moz-appearance: none;
background: linear-gradient(hsla(212,7%,57%,.35), hsla(212,7%,57%,.1)) padding-box;
box-shadow: 0 1px 0 hsla(210,16%,76%,.15) inset,
0 0 0 1px hsla(210,16%,76%,.15) inset,
0 1px 0 hsla(210,16%,76%,.15);
border: 1px solid hsla(210,8%,5%,.45);
margin: 1px 0 1px;
}
.scrollbutton-up:not([disabled]):active:hover,
.scrollbutton-down:not([disabled]):active:hover {
background: linear-gradient(hsla(220,6%,10%,.3), hsla(212,7%,57%,.15) 65%, hsla(212,7%,57%,.3));
box-shadow: 0 0 3px hsla(210,8%,5%,.25) inset,
0 1px 3px hsla(210,8%,5%,.25) inset,
0 1px 0 hsla(210,16%,76%,.15);
border-color: hsla(210,8%,5%,.6);
}
.scrollbutton-up > .toolbarbutton-icon,
.scrollbutton-down > .toolbarbutton-icon {
-moz-appearance: none;
list-style-image: url("breadcrumbs-scrollbutton.png");
-moz-image-region: rect(0px,7px,16px,0px);
margin: 0 5px;
}
.scrollbutton-up:not([disabled]):active:hover > .toolbarbutton-icon,
.scrollbutton-down:not([disabled]):active:hover > .toolbarbutton-icon {
-moz-image-region: rect(0px,14px,16px,7px);
}
.scrollbutton-up[disabled] > .toolbarbutton-icon,
.scrollbutton-down[disabled] > .toolbarbutton-icon {
opacity: 0.5;
}
.scrollbutton-up > .toolbarbutton-icon:-moz-locale-dir(rtl),
.scrollbutton-down > .toolbarbutton-icon:-moz-locale-dir(ltr) {
transform: scaleX(-1);
}
.breadcrumbs-widget-item {
background-color: transparent;
-moz-appearance: none;
overflow: hidden;
min-width: 85px;
max-width: 250px;
min-height: 25px;
border-style: solid;
border-width: 2px 13px;
margin: 0 -11px 0 0;
padding: 0 9px;
outline: none;
color: hsl(210,30%,85%);
}
.breadcrumbs-widget-item:-moz-focusring > label {
border-bottom: 1px dotted hsla(210,30%,85%,0.4);
}
%include ../../shared/devtools/widgets.inc.css
.breadcrumbs-widget-item:-moz-focusring > .button-box {
border-width: 0;
}
.breadcrumbs-widget-item[checked] .breadcrumbs-widget-item-tag {
color: hsl(208,100%,60%);
}
.breadcrumbs-widget-item[checked] .breadcrumbs-widget-item-id {
color: hsl(205,100%,70%);
}
.breadcrumbs-widget-item[checked] .breadcrumbs-widget-item-pseudo-classes {
color: hsl(20,100%,70%);
}
.breadcrumbs-widget-item-id,
.breadcrumbs-widget-item-classes {
color: #8d99a6;
}
.breadcrumbs-widget-item-pseudo-classes {
color: hsl(20,100%,85%);
}
/* Breadcrumbs LTR */
.breadcrumbs-widget-item:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:not([checked]):hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle-pressed.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle-selected.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-middle-selected-pressed.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:not([checked]):hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start-pressed.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start-selected.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-start-selected-pressed.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:not([checked]):hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end-pressed.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end-selected.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:hover:active:-moz-locale-dir(ltr) {
border-image: url("breadcrumbs/ltr-end-selected-pressed.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:first-of-type:-moz-locale-dir(ltr) {
border-left-width: 0;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:last-of-type:-moz-locale-dir(ltr) {
border-right-width: 0;
}
/* Breadcrumbs RTL */
.breadcrumbs-widget-item:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:not([checked]):hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle-pressed.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle-selected.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item[checked]:hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-middle-selected-pressed.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start-pressed.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start-selected.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:first-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-start-selected-pressed.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end-pressed.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end-selected.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-item:last-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
border-image: url("breadcrumbs/rtl-end-selected-pressed.png") 2 13 2 13 fill stretch;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:first-of-type:-moz-locale-dir(rtl) {
border-right-width: 0;
}
.breadcrumbs-widget-container[overflows] > .breadcrumbs-widget-item:last-of-type:-moz-locale-dir(rtl) {
border-left-width: 0;
}
/* SimpleListWidget */
.simple-list-widget-item:not(.selected):hover {
background: linear-gradient(rgba(255,255,255,0.9), rgba(255,255,255,0.85)), Highlight;
}
.simple-list-widget-item.selected {
background: linear-gradient(rgba(255,255,255,0.85), rgba(255,255,255,0.8)), Highlight;
color: #000;
}
.simple-list-widget-perma-text,
.simple-list-widget-empty-text {
color: GrayText;
padding: 4px 8px;
}
/* FastListWidget */
.fast-list-widget-container {
/* Hack: force hardware acceleration */
transform: translateZ(1px);
}
.theme-dark .fast-list-widget-empty-text {
padding: 12px;
font-weight: 600;
color: #fff;
}
.theme-light .fast-list-widget-empty-text {
padding: 4px 8px;
color: GrayText;
}
/* SideMenuWidget */
.side-menu-widget-container {
/* Hack: force hardware acceleration */
transform: translateZ(1px);
}
.side-menu-widget-container[theme="dark"] {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
color: #fff;
}
.side-menu-widget-container[theme="light"] {
background: #fff;
color: #000;
}
/* SideMenuWidget container */
.side-menu-widget-container:-moz-locale-dir(ltr),
.side-menu-widget-empty-text:-moz-locale-dir(ltr) {
box-shadow: inset -1px 0 0 #222426;
}
.side-menu-widget-container:-moz-locale-dir(rtl),
.side-menu-widget-empty-text:-moz-locale-dir(rtl) {
box-shadow: inset 1px 0 0 #222426;
}
.side-menu-widget-group {
/* To allow visibility of the dark margin shadow. */
-moz-margin-end: 1px;
}
.side-menu-widget-container[with-arrows=true] .side-menu-widget-item {
/* To compensate for the arrow image's dark margin. */
-moz-margin-end: -1px;
}
/* SideMenuWidget groups */
.side-menu-widget-group-title {
padding: 4px;
}
.side-menu-widget-group-title[theme="dark"] {
background-image: linear-gradient(#1f3e4f, #1b3243);
text-shadow: 0 -1px 0 hsla(210,8%,5%,.45);
box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
0 -2px 0 hsla(206,37%,4%,.05) inset,
0 -1px 1px hsla(206,37%,4%,.1) inset;
}
.side-menu-widget-group-title[theme="light"] {
background-image: linear-gradient(#fff, #eee);
}
/* SideMenuWidget items */
.side-menu-widget-item[theme="dark"] {
border-top: 1px solid hsla(210,8%,5%,.25);
border-bottom: 1px solid hsla(210,16%,76%,.1);
margin-top: -1px;
margin-bottom: -1px;
}
.side-menu-widget-item[theme="light"] {
border-top: 1px solid hsla(210,8%,75%,.25);
border-bottom: 1px solid hsla(210,16%,76%,.1);
margin-top: -1px;
margin-bottom: -1px;
}
.side-menu-widget-item[theme="dark"]:last-of-type {
box-shadow: inset 0 -1px 0 hsla(210,8%,5%,.25);
}
.side-menu-widget-item[theme="light"]:last-of-type {
box-shadow: inset 0 -1px 0 hsla(210,8%,75%,.25);
}
.side-menu-widget-item.selected {
background: linear-gradient(hsl(206,61%,40%), hsl(206,61%,31%)) repeat-x top left !important;
box-shadow: inset 0 1px 0 hsla(210,40%,83%,.15);
}
.side-menu-widget-item.selected > .side-menu-widget-item-arrow {
background-size: auto, 1px 100%;
background-repeat: no-repeat;
}
.side-menu-widget-item.selected > .side-menu-widget-item-arrow:-moz-locale-dir(ltr) {
background-image: url(itemArrow-ltr.png), linear-gradient(to right, #222426, #222426);
background-position: center right, top right;
}
.side-menu-widget-item.selected > .side-menu-widget-item-arrow:-moz-locale-dir(rtl) {
background-image: url(itemArrow-rtl.png), linear-gradient(to right, #222426, #222426);
background-position: center left, top left;
}
/* SideMenuWidget items contents */
.side-menu-widget-item-contents {
padding: 4px 0px;
}
.side-menu-widget-item-arrow {
-moz-margin-start: -8px;
width: 8px;
}
.side-menu-widget-item-other {
background: url(background-noise-toolbar.png), hsla(208,11%,27%, 0.65);
}
.side-menu-widget-item-other.selected {
background: url(background-noise-toolbar.png), hsla(208,11%,27%, 0.15);
box-shadow: inset 0 1px 0 hsla(210,40%,83%,.07),
inset 0 -1px 0 hsla(210,40%,83%,.07);
}
.side-menu-widget-item-other:first-of-type {
margin-top: 4px;
border-top-left-radius: 4px;
}
.side-menu-widget-item-other:last-of-type {
margin-bottom: -4px;
}
.side-menu-widget-item-other > label {
color: #f5f7fa;
}
/* SideMenuWidget checkboxes */
.side-menu-widget-group-checkbox {
margin: 0;
-moz-margin-end: 4px;
}
.side-menu-widget-item-checkbox {
margin: 0;
-moz-margin-start: 4px;
-moz-margin-end: -4px;
}
/* SideMenuWidget misc */
.side-menu-widget-empty-text[theme="dark"] {
background: url(background-noise-toolbar.png), hsl(208,11%,27%);
padding: 12px;
font-weight: 600;
color: #fff;
}
.side-menu-widget-empty-text[theme="light"] {
background: #fff;
padding: 4px 8px;
color: GrayText;
}
/* VariablesView */
.variables-view-container {
/* Hack: force hardware acceleration */
transform: translateZ(1px);
}
.variables-view-empty-notice {
color: GrayText;
padding: 2px;
}
.variables-view-scope > .title {
color: #fff;
}
/* Generic variables traits */
.variables-view-variable:not(:last-child) {
border-bottom: 1px solid rgba(128, 128, 128, .15);
}
.variables-view-variable > .title > .name {
font-weight: 600;
}
/* Generic variables *and* properties traits */
.variable-or-property:focus > .title > label {
color: inherit !important;
}
.variable-or-property > .title > .value {
-moz-box-flex: 1;
}
.variable-or-property > .title > .arrow {
-moz-margin-start: 3px;
}
.variable-or-property:not([untitled]) > .variables-view-element-details {
-moz-margin-start: 7px;
}
/* Traits applied when variables or properties are changed or overridden */
.variable-or-property:not([overridden]) {
transition: background 1s ease-in-out;
}
.variable-or-property:not([overridden])[changed] {
transition-duration: .4s;
}
.variable-or-property[overridden] {
background: rgba(128,128,128,0.05);
}
.variable-or-property[overridden] .title > label {
/* Cross out the title for this variable and all child properties. */
font-style: italic;
text-decoration: line-through;
border-bottom: none !important;
color: rgba(128,128,128,0.9);
opacity: 0.7;
}
/* Traits applied when variables or properties are editable */
.variable-or-property[editable] > .title > .value {
cursor: text;
}
.variable-or-property[overridden] .title > .value {
/* Disallow editing this variable and all child properties. */
pointer-events: none;
}
/* Custom configurable/enumerable/writable or frozen/sealed/extensible
* variables and properties */
.variable-or-property[non-enumerable]:not([self]):not([pseudo-item]) > .title > .name {
opacity: 0.6;
}
.variable-or-property[non-configurable]:not([pseudo-item]) > .title > .name {
border-bottom: 1px dashed #99f;
}
.variable-or-property[non-writable]:not([pseudo-item]) > .title > .name {
border-bottom: 1px dashed #f99;
}
.variable-or-property[safe-getter]:not([pseudo-item]) > .title > .name {
border-bottom: 1px dashed #8b0;
}
.variable-or-property-non-writable-icon {
background: url("chrome://browser/skin/identity-icons-https.png") no-repeat;
width: 16px;
height: 16px;
opacity: 0.5;
}
@media (min-resolution: 2dppx) {
.variable-or-property-non-writable-icon {
background-image: url("chrome://browser/skin/identity-icons-https@2x.png");
background-size: 32px;
}
}
.variable-or-property-frozen-label,
.variable-or-property-sealed-label,
.variable-or-property-non-extensible-label {
-moz-padding-end: 4px;
}
.variable-or-property:not(:focus) > .title > .variable-or-property-frozen-label,
.variable-or-property:not(:focus) > .title > .variable-or-property-sealed-label,
.variable-or-property:not(:focus) > .title > .variable-or-property-non-extensible-label {
color: #666;
}
/* Aligned values */
.variables-view-container[aligned-values] .title > .separator {
-moz-box-flex: 1;
}
.variables-view-container[aligned-values] .title > .value {
-moz-box-flex: 0;
width: 70vw;
}
.variables-view-container[aligned-values] .title > .element-value-input {
width: calc(70vw - 10px);
}
/* Actions first */
.variables-view-container[actions-first] .variables-view-delete,
.variables-view-container[actions-first] .variables-view-add-property {
-moz-box-ordinal-group: 0;
}
.variables-view-container[actions-first] [invisible] {
visibility: hidden;
}
/* Variables and properties tooltips */
.variable-or-property > tooltip > label {
margin: 0 2px 0 2px;
}
.variable-or-property[non-enumerable] > tooltip > label.enumerable,
.variable-or-property[non-configurable] > tooltip > label.configurable,
.variable-or-property[non-writable] > tooltip > label.writable,
.variable-or-property[non-extensible] > tooltip > label.extensible {
color: #800;
text-decoration: line-through;
}
.variable-or-property[overridden] > tooltip > label.overridden {
-moz-padding-start: 4px;
-moz-border-start: 1px dotted #000;
}
.variable-or-property[safe-getter] > tooltip > label.WebIDL {
-moz-padding-start: 4px;
-moz-border-start: 1px dotted #000;
color: #080;
}
/* Variables and properties editing */
.variables-view-delete {
list-style-image: url("chrome://browser/skin/devtools/vview-delete.png");
-moz-image-region: rect(0,16px,16px,0);
}
.variables-view-delete:hover {
-moz-image-region: rect(0,32px,16px,16px);
}
.variables-view-delete:active {
-moz-image-region: rect(0,48px,16px,32px);
}
.variables-view-edit {
background: url("chrome://browser/skin/devtools/vview-edit.png") center no-repeat;
width: 20px;
height: 16px;
cursor: pointer;
}
.variables-view-throbber {
background: url("chrome://global/skin/icons/loading_16.png") center no-repeat;
width: 16px;
height: 16px;
}
.element-value-input {
-moz-margin-start: -2px !important;
-moz-margin-end: 2px !important;
}
.element-name-input {
-moz-margin-start: -2px !important;
-moz-margin-end: 2px !important;
font-weight: 600;
}
.element-value-input,
.element-name-input {
border: 1px solid rgba(128, 128, 128, .5) !important;
border-radius: 0;
color: inherit;
}
/* Variables and properties searching */
.variables-view-searchinput {
min-height: 24px;
}
.variable-or-property[unmatched] {
border: none;
margin: 0;
}
/* Expand/collapse arrow */
.arrow {
-moz-appearance: none;
background: url("chrome://global/skin/tree/twisty-clsd.png") center center no-repeat;
width: 9px;
height: 20px;
-moz-margin-start: 5px;
-moz-margin-end: 5px;
}
.arrow[open] {
-moz-appearance: none;
background-image: url("chrome://global/skin/tree/twisty-open.png");
}
.arrow[invisible] {
visibility: hidden;
}
%include ../../shared/devtools/app-manager/manifest-editor.inc.css

View File

@ -224,15 +224,17 @@ browser.jar:
skin/classic/browser/devtools/splitview.css (devtools/splitview.css)
skin/classic/browser/devtools/styleeditor.css (devtools/styleeditor.css)
* skin/classic/browser/devtools/shadereditor.css (devtools/shadereditor.css)
skin/classic/browser/devtools/debugger.css (devtools/debugger.css)
* skin/classic/browser/devtools/debugger.css (devtools/debugger.css)
* skin/classic/browser/devtools/profiler.css (devtools/profiler.css)
skin/classic/browser/devtools/netmonitor.css (devtools/netmonitor.css)
* skin/classic/browser/devtools/netmonitor.css (devtools/netmonitor.css)
* skin/classic/browser/devtools/scratchpad.css (devtools/scratchpad.css)
skin/classic/browser/devtools/magnifying-glass.png (devtools/magnifying-glass.png)
skin/classic/browser/devtools/option-icon.png (devtools/option-icon.png)
skin/classic/browser/devtools/itemToggle.png (devtools/itemToggle.png)
skin/classic/browser/devtools/itemArrow-rtl.png (devtools/itemArrow-rtl.png)
skin/classic/browser/devtools/itemArrow-ltr.png (devtools/itemArrow-ltr.png)
skin/classic/browser/devtools/itemArrow-dark-rtl.png (../shared/devtools/images/itemArrow-dark-rtl.png)
skin/classic/browser/devtools/itemArrow-dark-ltr.png (../shared/devtools/images/itemArrow-dark-ltr.png)
skin/classic/browser/devtools/itemArrow-rtl.png (../shared/devtools/images/itemArrow-rtl.png)
skin/classic/browser/devtools/itemArrow-ltr.png (../shared/devtools/images/itemArrow-ltr.png)
skin/classic/browser/devtools/background-noise-toolbar.png (devtools/background-noise-toolbar.png)
skin/classic/browser/devtools/noise.png (devtools/noise.png)
skin/classic/browser/devtools/inspect-button.png (devtools/inspect-button.png)
@ -535,17 +537,19 @@ browser.jar:
skin/classic/aero/browser/devtools/splitview.css (devtools/splitview.css)
skin/classic/aero/browser/devtools/styleeditor.css (devtools/styleeditor.css)
* skin/classic/aero/browser/devtools/shadereditor.css (devtools/shadereditor.css)
skin/classic/aero/browser/devtools/debugger.css (devtools/debugger.css)
* skin/classic/aero/browser/devtools/debugger.css (devtools/debugger.css)
* skin/classic/aero/browser/devtools/profiler.css (devtools/profiler.css)
skin/classic/aero/browser/devtools/netmonitor.css (devtools/netmonitor.css)
* skin/classic/aero/browser/devtools/netmonitor.css (devtools/netmonitor.css)
* skin/classic/aero/browser/devtools/scratchpad.css (devtools/scratchpad.css)
skin/classic/aero/browser/devtools/magnifying-glass.png (devtools/magnifying-glass.png)
skin/classic/aero/browser/devtools/option-icon.png (devtools/option-icon.png)
skin/classic/aero/browser/devtools/itemToggle.png (devtools/itemToggle.png)
skin/classic/aero/browser/devtools/itemArrow-rtl.png (devtools/itemArrow-rtl.png)
skin/classic/aero/browser/devtools/itemArrow-dark-rtl.png (../shared/devtools/images/itemArrow-dark-rtl.png)
skin/classic/aero/browser/devtools/itemArrow-dark-ltr.png (../shared/devtools/images/itemArrow-dark-ltr.png)
skin/classic/aero/browser/devtools/itemArrow-rtl.png (../shared/devtools/images/itemArrow-rtl.png)
skin/classic/aero/browser/devtools/itemArrow-ltr.png (../shared/devtools/images/itemArrow-ltr.png)
skin/classic/aero/browser/devtools/background-noise-toolbar.png (devtools/background-noise-toolbar.png)
skin/classic/aero/browser/devtools/noise.png (devtools/noise.png)
skin/classic/aero/browser/devtools/itemArrow-ltr.png (devtools/itemArrow-ltr.png)
skin/classic/aero/browser/devtools/inspect-button.png (devtools/inspect-button.png)
skin/classic/aero/browser/devtools/dropmarker.png (devtools/dropmarker.png)
skin/classic/aero/browser/devtools/layout-background-grid.png (devtools/layout-background-grid.png)

View File

@ -287,8 +287,8 @@ OpusTrackEncoder::GetEncodedTrack(EncodedFrameContainer& aData)
if (!chunk.IsNull()) {
// Append the interleaved data to the end of pcm buffer.
InterleaveTrackData(chunk, frameToCopy, mChannels,
pcm.Elements() + frameCopied * mChannels);
AudioTrackEncoder::InterleaveTrackData(chunk, frameToCopy, mChannels,
pcm.Elements() + frameCopied * mChannels);
} else {
memset(pcm.Elements() + frameCopied * mChannels, 0,
frameToCopy * mChannels * sizeof(AudioDataValue));

View File

@ -106,6 +106,7 @@ AudioTrackEncoder::AppendAudioSegment(const AudioSegment& aSegment)
static const int AUDIO_PROCESSING_FRAMES = 640; /* > 10ms of 48KHz audio */
static const uint8_t gZeroChannel[MAX_AUDIO_SAMPLE_SIZE*AUDIO_PROCESSING_FRAMES] = {0};
/*static*/
void
AudioTrackEncoder::InterleaveTrackData(AudioChunk& aChunk,
int32_t aDuration,
@ -119,11 +120,11 @@ AudioTrackEncoder::InterleaveTrackData(AudioChunk& aChunk,
if (aChunk.mChannelData.Length() > aOutputChannels) {
DownmixAndInterleave(aChunk.mChannelData, aChunk.mBufferFormat, aDuration,
aChunk.mVolume, mChannels, aOutput);
aChunk.mVolume, aOutputChannels, aOutput);
} else {
InterleaveAndConvertBuffer(aChunk.mChannelData.Elements(),
aChunk.mBufferFormat, aDuration, aChunk.mVolume,
mChannels, aOutput);
aOutputChannels, aOutput);
}
}

View File

@ -148,6 +148,16 @@ public:
uint32_t aTrackEvents,
const MediaSegment& aQueuedMedia) MOZ_OVERRIDE;
/**
* Interleaves the track data and stores the result into aOutput. Might need
* to up-mix or down-mix the channel data if the channels number of this chunk
* is different from aOutputChannels. The channel data from aChunk might be
* modified by up-mixing.
*/
static void InterleaveTrackData(AudioChunk& aChunk, int32_t aDuration,
uint32_t aOutputChannels,
AudioDataValue* aOutput);
protected:
/**
* Number of samples per channel in a pcm buffer. This is also the value of
@ -179,15 +189,6 @@ protected:
*/
virtual void NotifyEndOfStream() MOZ_OVERRIDE;
/**
* Interleaves the track data and stores the result into aOutput. Might need
* to up-mix or down-mix the channel data if the channels number of this chunk
* is different from mChannels. The channel data from aChunk might be modified
* by up-mixing.
*/
void InterleaveTrackData(AudioChunk& aChunk, int32_t aDuration,
uint32_t aOutputChannels, AudioDataValue* aOutput);
/**
* The number of channels are used for processing PCM data in the audio encoder.
* This value comes from the first valid audio chunk. If encoder can't support

View File

@ -87,23 +87,6 @@ ThrowInvalidThis(JSContext* aCx, const JS::CallArgs& aArgs,
return false;
}
bool
ThrowInvalidThis(JSContext* aCx, const JS::CallArgs& aArgs,
const ErrNum aErrorNumber,
prototypes::ID aProtoId)
{
return ThrowInvalidThis(aCx, aArgs, aErrorNumber,
NamesOfInterfacesWithProtos[aProtoId]);
}
bool
ThrowNoSetterArg(JSContext* aCx, prototypes::ID aProtoId)
{
nsPrintfCString errorMessage("%s attribute setter",
NamesOfInterfacesWithProtos[aProtoId]);
return ThrowErrorMessage(aCx, MSG_MISSING_ARGUMENTS, errorMessage.get());
}
} // namespace dom
struct ErrorResult::Message {
@ -2202,94 +2185,5 @@ EnumerateGlobal(JSContext* aCx, JS::Handle<JSObject*> aObj)
return JS_EnumerateStandardClasses(aCx, aObj);
}
bool
GenericBindingGetter(JSContext* cx, unsigned argc, JS::Value* vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
const JSJitInfo *info = FUNCTION_VALUE_TO_JITINFO(args.calleev());
prototypes::ID protoID = static_cast<prototypes::ID>(info->protoID);
if (!args.thisv().isObject()) {
return ThrowInvalidThis(cx, args,
MSG_GETTER_THIS_DOES_NOT_IMPLEMENT_INTERFACE,
protoID);
}
JS::Rooted<JSObject*> obj(cx, &args.thisv().toObject());
void* self;
{
nsresult rv = UnwrapObject<void>(obj, self, protoID, info->depth);
if (NS_FAILED(rv)) {
return ThrowInvalidThis(cx, args,
GetInvalidThisErrorForGetter(rv == NS_ERROR_XPC_SECURITY_MANAGER_VETO),
protoID);
}
}
MOZ_ASSERT(info->type == JSJitInfo::Getter);
JSJitGetterOp getter = info->getter;
return getter(cx, obj, self, JSJitGetterCallArgs(args));
}
bool
GenericBindingSetter(JSContext* cx, unsigned argc, JS::Value* vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
const JSJitInfo *info = FUNCTION_VALUE_TO_JITINFO(args.calleev());
prototypes::ID protoID = static_cast<prototypes::ID>(info->protoID);
if (!args.thisv().isObject()) {
return ThrowInvalidThis(cx, args,
MSG_SETTER_THIS_DOES_NOT_IMPLEMENT_INTERFACE,
protoID);
}
JS::Rooted<JSObject*> obj(cx, &args.thisv().toObject());
void* self;
{
nsresult rv = UnwrapObject<void>(obj, self, protoID, info->depth);
if (NS_FAILED(rv)) {
return ThrowInvalidThis(cx, args,
GetInvalidThisErrorForSetter(rv == NS_ERROR_XPC_SECURITY_MANAGER_VETO),
protoID);
}
}
if (args.length() == 0) {
return ThrowNoSetterArg(cx, protoID);
}
MOZ_ASSERT(info->type == JSJitInfo::Setter);
JSJitSetterOp setter = info->setter;
if (!setter(cx, obj, self, JSJitSetterCallArgs(args))) {
return false;
}
args.rval().set(JSVAL_VOID);
return true;
}
bool
GenericBindingMethod(JSContext* cx, unsigned argc, JS::Value* vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
const JSJitInfo *info = FUNCTION_VALUE_TO_JITINFO(args.calleev());
prototypes::ID protoID = static_cast<prototypes::ID>(info->protoID);
if (!args.thisv().isObject()) {
return ThrowInvalidThis(cx, args,
MSG_METHOD_THIS_DOES_NOT_IMPLEMENT_INTERFACE,
protoID);
}
JS::Rooted<JSObject*> obj(cx, &args.thisv().toObject());
void* self;
{
nsresult rv = UnwrapObject<void>(obj, self, protoID, info->depth);
if (NS_FAILED(rv)) {
return ThrowInvalidThis(cx, args,
GetInvalidThisErrorForMethod(rv == NS_ERROR_XPC_SECURITY_MANAGER_VETO),
protoID);
}
}
MOZ_ASSERT(info->type == JSJitInfo::Method);
JSJitMethodOp method = info->method;
return method(cx, obj, self, JSJitMethodCallArgs(args));
}
} // namespace dom
} // namespace mozilla

View File

@ -93,11 +93,6 @@ ThrowInvalidThis(JSContext* aCx, const JS::CallArgs& aArgs,
const ErrNum aErrorNumber,
const char* aInterfaceName);
bool
ThrowInvalidThis(JSContext* aCx, const JS::CallArgs& aArgs,
const ErrNum aErrorNumber,
prototypes::ID aProtoId);
inline bool
ThrowMethodFailedWithDetails(JSContext* cx, ErrorResult& rv,
const char* ifaceName,
@ -207,10 +202,9 @@ IsDOMObject(JSObject* obj)
// (for example, overload resolution uses unwrapping to tell what sort
// of thing it's looking at).
// U must be something that a T* can be assigned to (e.g. T* or an nsRefPtr<T>).
template <class T, typename U>
template <prototypes::ID PrototypeID, class T, typename U>
MOZ_ALWAYS_INLINE nsresult
UnwrapObject(JSObject* obj, U& value, prototypes::ID protoID,
uint32_t protoDepth)
UnwrapObject(JSObject* obj, U& value)
{
/* First check to see whether we have a DOM object */
const DOMClass* domClass = GetDOMClass(obj);
@ -236,7 +230,8 @@ UnwrapObject(JSObject* obj, U& value, prototypes::ID protoID,
/* This object is a DOM object. Double-check that it is safely
castable to T by checking whether it claims to inherit from the
class identified by protoID. */
if (domClass->mInterfaceChain[protoDepth] == protoID) {
if (domClass->mInterfaceChain[PrototypeTraits<PrototypeID>::Depth] ==
PrototypeID) {
value = UnwrapDOMObject<T>(obj);
return NS_OK;
}
@ -245,14 +240,6 @@ UnwrapObject(JSObject* obj, U& value, prototypes::ID protoID,
return NS_ERROR_XPC_BAD_CONVERT_JS;
}
template <prototypes::ID PrototypeID, class T, typename U>
MOZ_ALWAYS_INLINE nsresult
UnwrapObject(JSObject* obj, U& value)
{
return UnwrapObject<T>(obj, value, PrototypeID,
PrototypeTraits<PrototypeID>::Depth);
}
inline bool
IsNotDateOrRegExp(JSContext* cx, JS::Handle<JSObject*> obj)
{
@ -2363,15 +2350,6 @@ CreateGlobal(JSContext* aCx, T* aObject, nsWrapperCache* aCache,
return global;
}
bool
GenericBindingGetter(JSContext* cx, unsigned argc, JS::Value* vp);
bool
GenericBindingSetter(JSContext* cx, unsigned argc, JS::Value* vp);
bool
GenericBindingMethod(JSContext* cx, unsigned argc, JS::Value* vp);
} // namespace dom
} // namespace mozilla

View File

@ -1588,10 +1588,8 @@ class MethodDefiner(PropertyDefiner):
jitinfo = ("&%s_methodinfo" % accessor)
if m.get("allowCrossOriginThis", False):
accessor = "genericCrossOriginMethod"
elif self.descriptor.needsSpecialGenericOps():
accessor = "genericMethod"
else:
accessor = "GenericBindingMethod"
accessor = "genericMethod"
else:
jitinfo = "nullptr"
@ -1648,10 +1646,8 @@ class AttrDefiner(PropertyDefiner):
accessor = "genericLenientGetter"
elif attr.getExtendedAttribute("CrossOriginReadable"):
accessor = "genericCrossOriginGetter"
elif self.descriptor.needsSpecialGenericOps():
accessor = "genericGetter"
else:
accessor = "GenericBindingGetter"
accessor = "genericGetter"
jitinfo = "&%s_getterinfo" % attr.identifier.name
return "{ JS_CAST_NATIVE_TO(%s, JSPropertyOp), %s }" % \
(accessor, jitinfo)
@ -1669,10 +1665,8 @@ class AttrDefiner(PropertyDefiner):
accessor = "genericLenientSetter"
elif attr.getExtendedAttribute("CrossOriginWritable"):
accessor = "genericCrossOriginSetter"
elif self.descriptor.needsSpecialGenericOps():
accessor = "genericSetter"
else:
accessor = "GenericBindingSetter"
accessor = "genericSetter"
jitinfo = "&%s_setterinfo" % attr.identifier.name
return "{ JS_CAST_NATIVE_TO(%s, JSStrictPropertyOp), %s }" % \
(accessor, jitinfo)
@ -8635,7 +8629,7 @@ class CGDescriptor(CGThing):
continue
if (m.isMethod() and m == descriptor.operations['Jsonifier']):
hasJsonifier = True
hasMethod = descriptor.needsSpecialGenericOps()
hasMethod = True
jsonifierMethod = m
elif (m.isMethod() and
(not m.isIdentifierLess() or m == descriptor.operations['Stringifier'])):
@ -8647,7 +8641,7 @@ class CGDescriptor(CGThing):
cgThings.append(CGMemberJITInfo(descriptor, m))
if m.getExtendedAttribute("CrossOriginCallable"):
crossOriginMethods.add(m.identifier.name)
elif descriptor.needsSpecialGenericOps():
else:
hasMethod = True
elif m.isAttr():
if m.isStatic():
@ -8659,7 +8653,7 @@ class CGDescriptor(CGThing):
hasLenientGetter = True
elif m.getExtendedAttribute("CrossOriginReadable"):
crossOriginGetters.add(m.identifier.name)
elif descriptor.needsSpecialGenericOps():
else:
hasGetter = True
if not m.readonly:
if m.isStatic():
@ -8671,18 +8665,17 @@ class CGDescriptor(CGThing):
hasLenientSetter = True
elif m.getExtendedAttribute("CrossOriginWritable"):
crossOriginSetters.add(m.identifier.name)
elif descriptor.needsSpecialGenericOps():
else:
hasSetter = True
elif m.getExtendedAttribute("PutForwards"):
cgThings.append(CGSpecializedForwardingSetter(descriptor, m))
if m.getExtendedAttribute("CrossOriginWritable"):
crossOriginSetters.add(m.identifier.name)
elif descriptor.needsSpecialGenericOps():
else:
hasSetter = True
elif m.getExtendedAttribute("Replaceable"):
cgThings.append(CGSpecializedReplaceableSetter(descriptor, m))
if descriptor.needsSpecialGenericOps():
hasSetter = True
hasSetter = True
if (not m.isStatic() and
descriptor.interface.hasInterfacePrototypeObject()):
cgThings.append(CGMemberJITInfo(descriptor, m))
@ -8902,7 +8895,7 @@ class CGNamespacedEnum(CGThing):
def declare(self):
return self.node.declare()
def define(self):
return ""
assert False # Only for headers.
class CGDictionary(CGThing):
def __init__(self, dictionary, descriptorProvider):
@ -11418,14 +11411,11 @@ class GlobalGenRoots():
remaining = [CGGeneric(declare="prototypes::id::_ID_Count")] * (config.maxProtoChainLength - ifaceCount)
macro = CGWrapper(CGList(supplied, ", "),
pre="#define INTERFACE_CHAIN_" + str(ifaceCount) + "(",
post=") \\\n",
declareOnly=True)
post=") \\\n")
macroContent = CGIndenter(CGList(supplied + remaining, ", \\\n"))
macroContent = CGIndenter(CGWrapper(macroContent, pre="{ \\\n",
post=" \\\n}",
declareOnly=True))
return CGWrapper(CGList([macro, macroContent]), post="\n\n",
declareOnly=True)
post=" \\\n}"))
return CGWrapper(CGList([macro, macroContent]), post="\n\n")
idEnum.append(ifaceChainMacro(1))
@ -11458,18 +11448,6 @@ struct PrototypeTraits;
""")]
traitsDecls.extend(CGPrototypeTraitsClass(d) for d in descriptorsWithPrototype)
ifaceNamesWithProto = [' "%s"' % d.interface.identifier.name
for d in descriptorsWithPrototype]
traitsDecls.append(CGGeneric(
declare=("extern const char* const NamesOfInterfacesWithProtos[%d];\n\n" %
len(ifaceNamesWithProto)),
define=("\n"
"extern const char* const NamesOfInterfacesWithProtos[%d] = {\n"
"%s"
"\n};\n\n" %
(len(ifaceNamesWithProto),
",\n".join(ifaceNamesWithProto)))))
traitsDecl = CGNamespace.build(['mozilla', 'dom'],
CGList(traitsDecls, "\n"))

View File

@ -494,16 +494,6 @@ class Descriptor(DescriptorProvider):
any((m.isAttr() or m.isMethod()) and m.isStatic() for m
in self.interface.members))
def needsSpecialGenericOps(self):
"""
Returns true if this descriptor requires generic ops other than
GenericBindingMethod/GenericBindingGetter/GenericBindingSetter.
In practice we need to do this if our this value might be an XPConnect
object or if we need to coerce null/undefined to the global.
"""
return self.hasXPConnectImpls or self.interface.isOnGlobalProtoChain()
# Some utility methods
def getTypesFromDescriptor(descriptor):
"""

View File

@ -138,7 +138,6 @@ class WebIDLCodegenManager(LoggingMixin):
GLOBAL_DEFINE_FILES = {
'RegisterBindings.cpp',
'UnionTypes.cpp',
'PrototypeList.cpp',
}
def __init__(self, config_path, inputs, exported_header_dir,

View File

@ -10,7 +10,9 @@
#include <hardware/bluetooth.h>
#include <hardware/bt_av.h>
#if ANDROID_VERSION > 17
#include <hardware/bt_rc.h>
#endif
#include "BluetoothCommon.h"
#include "BluetoothService.h"
@ -31,7 +33,9 @@ namespace {
StaticRefPtr<BluetoothA2dpManager> sBluetoothA2dpManager;
bool sInShutdown = false;
static const btav_interface_t* sBtA2dpInterface;
#if ANDROID_VERSION > 17
static const btrc_interface_t* sBtAvrcpInterface;
#endif
} // anonymous namespace
class SinkPropertyChangedHandler : public nsRunnable
@ -82,6 +86,7 @@ public:
}
};
#if ANDROID_VERSION > 17
class UpdateRegisterNotificationTask : public nsRunnable
{
public:
@ -173,6 +178,7 @@ private:
uint8_t mNumAttr;
btrc_media_attr_t* mPlayerAttrs;
};
#endif
NS_IMETHODIMP
BluetoothA2dpManager::Observe(nsISupports* aSubject,
@ -264,6 +270,7 @@ A2dpAudioStateCallback(btav_audio_state_t aState,
NS_DispatchToMainThread(new SinkPropertyChangedHandler(signal));
}
#if ANDROID_VERSION > 17
/*
* Avrcp 1.3 callbacks
*/
@ -369,6 +376,42 @@ AvrcpSetPlayerAppValueCallback(btrc_player_settings_t* aPlayerVals)
// TODO: Support avrcp application setting related functions
}
#endif
#if ANDROID_VERSION > 18
/*
* This callback function is to get CT features from Feature Bit Mask.
* If Advanced Control Player bit is set, CT supports
* volume sync (absolute volume feature). If Browsing bit is set, Avrcp 1.4
* Browse feature will be supported
*/
static void
AvrcpRemoteFeaturesCallback(bt_bdaddr_t* aBdAddress,
btrc_remote_features_t aFeatures)
{
// TODO: Support avrcp 1.4 absolute volume/browse
}
/*
* This callback function is to get notification that volume changed on the
* remote car kit (if it supports Avrcp 1.4), not notification from phone.
*/
static void
AvrcpRemoteVolumeChangedCallback(uint8_t aVolume, uint8_t aCType)
{
// TODO: Support avrcp 1.4 absolute volume/browse
}
/*
* This callback function is to get notification that volume changed on the
* remote car kit (if it supports Avrcp 1.4), not notification from phone.
*/
static void
AvrcpPassThroughCallback(int id, int key_state)
{
// TODO: Support avrcp 1.4 absolute volume/browse
}
#endif
static btav_callbacks_t sBtA2dpCallbacks = {
sizeof(sBtA2dpCallbacks),
@ -376,8 +419,12 @@ static btav_callbacks_t sBtA2dpCallbacks = {
A2dpAudioStateCallback
};
#if ANDROID_VERSION > 17
static btrc_callbacks_t sBtAvrcpCallbacks = {
sizeof(sBtAvrcpCallbacks),
#if ANDROID_VERSION > 18
AvrcpRemoteFeaturesCallback,
#endif
AvrcpGetPlayStatusCallback,
AvrcpListPlayerAppAttributeCallback,
AvrcpListPlayerAppValuesCallback,
@ -386,8 +433,13 @@ static btrc_callbacks_t sBtAvrcpCallbacks = {
AvrcpGetPlayerAppValuesTextCallback,
AvrcpSetPlayerAppValueCallback,
AvrcpGetElementAttrCallback,
AvrcpRegisterNotificationCallback
AvrcpRegisterNotificationCallback,
#if ANDROID_VERSION > 18
AvrcpRemoteVolumeChangedCallback,
AvrcpPassThroughCallback
#endif
};
#endif
/*
* This function will be only called when Bluetooth is turning on.
@ -411,6 +463,7 @@ BluetoothA2dpManager::Init()
return false;
}
#if ANDROID_VERSION > 17
sBtAvrcpInterface = (btrc_interface_t *)btInf->
get_profile_interface(BT_PROFILE_AV_RC_ID);
NS_ENSURE_TRUE(sBtAvrcpInterface, false);
@ -420,6 +473,7 @@ BluetoothA2dpManager::Init()
BT_LOGR("Warning: failed to init avrcp module");
return false;
}
#endif
return true;
}
@ -768,6 +822,7 @@ BluetoothA2dpManager::UpdateMetaData(const nsAString& aTitle,
{
MOZ_ASSERT(NS_IsMainThread());
#if ANDROID_VERSION > 17
NS_ENSURE_TRUE_VOID(sBtAvrcpInterface);
// Send track changed and position changed if track num is not the same.
@ -802,6 +857,7 @@ BluetoothA2dpManager::UpdateMetaData(const nsAString& aTitle,
mMediaNumber = aMediaNumber;
mTotalMediaCount = aTotalMediaCount;
mDuration = aDuration;
#endif
}
/*
@ -815,6 +871,7 @@ BluetoothA2dpManager::UpdatePlayStatus(uint32_t aDuration,
{
MOZ_ASSERT(NS_IsMainThread());
#if ANDROID_VERSION > 17
NS_ENSURE_TRUE_VOID(sBtAvrcpInterface);
// when play status changed, send both play status and position
if (mPlayStatus != aPlayStatus &&
@ -842,6 +899,7 @@ BluetoothA2dpManager::UpdatePlayStatus(uint32_t aDuration,
mDuration = aDuration;
mPosition = aPosition;
mPlayStatus = aPlayStatus;
#endif
}
/*
@ -856,6 +914,7 @@ BluetoothA2dpManager::UpdateRegisterNotification(int aEventId, int aParam)
{
MOZ_ASSERT(NS_IsMainThread());
#if ANDROID_VERSION > 17
NS_ENSURE_TRUE_VOID(sBtAvrcpInterface);
btrc_register_notification_t param;
@ -885,6 +944,7 @@ BluetoothA2dpManager::UpdateRegisterNotification(int aEventId, int aParam)
sBtAvrcpInterface->register_notification_rsp((btrc_event_id_t)aEventId,
BTRC_NOTIFICATION_TYPE_INTERIM,
&param);
#endif
}
void

View File

@ -35,7 +35,7 @@ interface nsIMobileConnectionListener : nsISupports
* XPCOM component (in the content process) that provides the mobile
* network information.
*/
[scriptable, uuid(0e027520-dd87-461d-88a6-c3e46369c03c)]
[scriptable, uuid(55b8d918-8631-4d72-a9d7-f8c9536d6e6f)]
interface nsIMobileConnectionProvider : nsISupports
{
/**
@ -48,6 +48,15 @@ interface nsIMobileConnectionProvider : nsISupports
void unregisterMobileConnectionMsg(in unsigned long clientId,
in nsIMobileConnectionListener listener);
/**
* These two fields require the 'mobilenetwork' permission.
*/
DOMString getLastKnownNetwork(in unsigned long clientId);
DOMString getLastKnownHomeNetwork(in unsigned long clientId);
/**
* All fields below require the 'mobileconnection' permission.
*/
nsIDOMMozMobileConnectionInfo getVoiceConnectionInfo(in unsigned long clientId);
nsIDOMMozMobileConnectionInfo getDataConnectionInfo(in unsigned long clientId);
DOMString getIccId(in unsigned long clientId);

View File

@ -133,8 +133,7 @@ MobileConnection::GetLastKnownNetwork(nsAString& aNetwork)
return NS_OK;
}
aNetwork = mozilla::Preferences::GetString("ril.lastKnownNetwork");
return NS_OK;
return mProvider->GetLastKnownNetwork(mClientId, aNetwork);
}
NS_IMETHODIMP
@ -146,8 +145,7 @@ MobileConnection::GetLastKnownHomeNetwork(nsAString& aNetwork)
return NS_OK;
}
aNetwork = mozilla::Preferences::GetString("ril.lastKnownHomeNetwork");
return NS_OK;
return mProvider->GetLastKnownHomeNetwork(mClientId, aNetwork);
}
// All fields below require the "mobileconnection" permission.

View File

@ -19,3 +19,4 @@ disabled = Bug 808783
[test_call_barring_set_error.js]
[test_call_barring_change_password.js]
[test_mobile_set_radio.js]
[test_mobile_last_known_network.js]

View File

@ -0,0 +1,47 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 30000;
SpecialPowers.addPermission("mobilenetwork", true, document);
let connection = navigator.mozMobileConnections[0];
ok(connection instanceof MozMobileConnection,
"connection is instanceof " + connection.constructor);
function testLastKnownNetwork() {
log("testLastKnownNetwork: " + connection.lastKnownNetwork);
// The emulator's hard coded operatoer's mcc and mnc codes.
is(connection.lastKnownNetwork, "310-260");
runNextTest();
}
function testLastKnownHomeNetwork() {
log("testLastKnownHomeNetwork: " + connection.lastKnownHomeNetwork);
// The emulator's hard coded icc's mcc and mnc codes.
is(connection.lastKnownHomeNetwork, "310-260");
runNextTest();
}
let tests = [
testLastKnownNetwork,
testLastKnownHomeNetwork
];
function runNextTest() {
let test = tests.shift();
if (!test) {
cleanUp();
return;
}
test();
}
function cleanUp() {
SpecialPowers.removePermission("mobilenetwork", document);
finish();
}
runNextTest();

View File

@ -643,6 +643,18 @@ RILContentHelper.prototype = {
* nsIMobileConnectionProvider
*/
getLastKnownNetwork: function getLastKnownNetwork(clientId) {
return cpmm.sendSyncMessage("RIL:GetLastKnownNetwork", {
clientId: clientId
})[0];
},
getLastKnownHomeNetwork: function getLastKnownHomeNetwork(clientId) {
return cpmm.sendSyncMessage("RIL:GetLastKnownHomeNetwork", {
clientId: clientId
})[0];
},
getVoiceConnectionInfo: function getVoiceConnectionInfo(clientId) {
let context = this.getRilContext(clientId);
return context && context.voiceConnectionInfo;

View File

@ -118,6 +118,11 @@ const RIL_IPC_MOBILECONNECTION_MSG_NAMES = [
"RIL:GetVoicePrivacyMode"
];
const RIL_IPC_MOBILENETWORK_MSG_NAMES = [
"RIL:GetLastKnownNetwork",
"RIL:GetLastKnownHomeNetwork"
];
const RIL_IPC_ICCMANAGER_MSG_NAMES = [
"RIL:SendStkResponse",
"RIL:SendStkMenuSelection",
@ -235,6 +240,9 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () {
for (let msgname of RIL_IPC_MOBILECONNECTION_MSG_NAMES) {
ppmm.addMessageListener(msgname, this);
}
for (let msgname of RIL_IPC_MOBILENETWORK_MSG_NAMES) {
ppmm.addMessageListener(msgname, this);
}
for (let msgName of RIL_IPC_ICCMANAGER_MSG_NAMES) {
ppmm.addMessageListener(msgName, this);
}
@ -251,6 +259,9 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () {
for (let msgname of RIL_IPC_MOBILECONNECTION_MSG_NAMES) {
ppmm.removeMessageListener(msgname, this);
}
for (let msgname of RIL_IPC_MOBILENETWORK_MSG_NAMES) {
ppmm.removeMessageListener(msgname, this);
}
for (let msgName of RIL_IPC_ICCMANAGER_MSG_NAMES) {
ppmm.removeMessageListener(msgName, this);
}
@ -375,6 +386,14 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () {
}
return null;
}
} else if (RIL_IPC_MOBILENETWORK_MSG_NAMES.indexOf(msg.name) != -1) {
if (!msg.target.assertPermission("mobilenetwork")) {
if (DEBUG) {
debug("MobileNetwork message " + msg.name +
" from a content process with no 'mobilenetwork' privileges.");
}
return null;
}
} else if (RIL_IPC_ICCMANAGER_MSG_NAMES.indexOf(msg.name) != -1) {
if (!msg.target.assertPermission("mobileconnection")) {
if (DEBUG) {
@ -1217,6 +1236,12 @@ RadioInterface.prototype = {
case "RIL:GetRilContext":
// This message is sync.
return this.rilContext;
case "RIL:GetLastKnownNetwork":
// This message is sync.
return this._lastKnownNetwork;
case "RIL:GetLastKnownHomeNetwork":
// This message is sync.
return this._lastKnownHomeNetwork;
case "RIL:GetAvailableNetworks":
this.workerMessenger.sendWithIPCMessage(msg, "getAvailableNetworks");
break;
@ -1824,10 +1849,8 @@ RadioInterface.prototype = {
// Update lastKnownNetwork
if (message.mcc && message.mnc) {
try {
Services.prefs.setCharPref("ril.lastKnownNetwork",
message.mcc + "-" + message.mnc);
} catch (e) {}
this._lastKnownNetwork = message.mcc + "-" + message.mnc;
if (DEBUG) this.debug("_lastKnownNetwork: " + this._lastKnownNetwork);
}
// If the voice is unregistered, no need to send RIL:VoiceInfoChanged.
@ -2529,10 +2552,8 @@ RadioInterface.prototype = {
// Update lastKnownHomeNetwork.
if (message.mcc && message.mnc) {
try {
Services.prefs.setCharPref("ril.lastKnownHomeNetwork",
message.mcc + "-" + message.mnc);
} catch (e) {}
this._lastKnownHomeNetwork = message.mcc + "-" + message.mnc;
this.debug("_lastKnownHomeNetwork: " + this._lastKnownHomeNetwork);
}
// If spn becomes available, we should check roaming again.
@ -2660,6 +2681,12 @@ RadioInterface.prototype = {
// Cell Broadcast settings values.
_cellBroadcastSearchListStr: null,
// Operator's mcc-mnc.
_lastKnownNetwork: null,
// ICC's mcc-mnc.
_lastKnownHomeNetwork: null,
handleSettingsChange: function handleSettingsChange(aName, aResult, aMessage) {
// Don't allow any content processes to modify the setting
// "time.clock.automatic-update.available" except for the chrome process.

View File

@ -501,7 +501,10 @@ sync_java_files = [
'background/db/Tab.java',
'background/fxa/FxAccount10AuthDelegate.java',
'background/fxa/FxAccount10CreateDelegate.java',
'background/fxa/FxAccount20CreateDelegate.java',
'background/fxa/FxAccount20LoginDelegate.java',
'background/fxa/FxAccountClient.java',
'background/fxa/FxAccountClient20.java',
'background/fxa/FxAccountClientException.java',
'background/fxa/FxAccountUtils.java',
'background/healthreport/Environment.java',
@ -549,6 +552,7 @@ sync_java_files = [
'fxa/sync/FxAccountSyncService.java',
'fxa/sync/FxAccountTabsSyncService.java',
'sync/AlreadySyncingException.java',
'sync/BadRequiredFieldJSONException.java',
'sync/CollectionKeys.java',
'sync/CommandProcessor.java',
'sync/CommandRunner.java',
@ -564,6 +568,7 @@ sync_java_files = [
'sync/crypto/KeyBundle.java',
'sync/crypto/MissingCryptoInputException.java',
'sync/crypto/NoKeyBundleException.java',
'sync/crypto/PBKDF2.java',
'sync/crypto/PersistedCrypto5Keys.java',
'sync/CryptoRecord.java',
'sync/DelayedWorkTracker.java',

View File

@ -0,0 +1,40 @@
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.background.fxa;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import org.json.simple.JSONObject;
public class FxAccount20CreateDelegate extends FxAccount20LoginDelegate {
protected final boolean preVerified;
/**
* Make a new "create account" delegate.
*
* @param emailUTF8
* email as UTF-8 bytes.
* @param passwordUTF8
* password as UTF-8 bytes.
* @param preVerified
* true if account should be marked already verified; only effective
* for non-production auth servers.
* @throws UnsupportedEncodingException
* @throws GeneralSecurityException
*/
public FxAccount20CreateDelegate(byte[] emailUTF8, byte[] passwordUTF8, boolean preVerified) throws UnsupportedEncodingException, GeneralSecurityException {
super(emailUTF8, passwordUTF8);
this.preVerified = preVerified;
}
@SuppressWarnings("unchecked")
@Override
public JSONObject getCreateBody() throws FxAccountClientException {
final JSONObject body = super.getCreateBody();
body.put("preVerified", preVerified);
return body;
}
}

View File

@ -0,0 +1,41 @@
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.background.fxa;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import org.json.simple.JSONObject;
import org.mozilla.gecko.background.fxa.FxAccountClient.CreateDelegate;
import org.mozilla.gecko.sync.Utils;
/**
* An abstraction around providing an email and authorization token to the auth
* server.
*/
public class FxAccount20LoginDelegate implements CreateDelegate {
protected final byte[] emailUTF8;
protected final byte[] passwordUTF8;
protected final byte[] authPW;
public FxAccount20LoginDelegate(byte[] emailUTF8, byte[] passwordUTF8) throws UnsupportedEncodingException, GeneralSecurityException {
this.emailUTF8 = emailUTF8;
this.passwordUTF8 = passwordUTF8;
this.authPW = FxAccountUtils.generateAuthPW(FxAccountUtils.generateQuickStretchedPW(emailUTF8, passwordUTF8));
}
@SuppressWarnings("unchecked")
@Override
public JSONObject getCreateBody() throws FxAccountClientException {
final JSONObject body = new JSONObject();
try {
body.put("email", new String(emailUTF8, "UTF-8"));
body.put("authPW", Utils.byte2Hex(authPW));
return body;
} catch (UnsupportedEncodingException e) {
throw new FxAccountClientException(e);
}
}
}

View File

@ -52,6 +52,12 @@ public class FxAccountClient {
protected static final String VERSION_FRAGMENT = "v1/";
public static final String JSON_KEY_EMAIL = "email";
public static final String JSON_KEY_KEYFETCHTOKEN = "keyFetchToken";
public static final String JSON_KEY_SESSIONTOKEN = "sessionToken";
public static final String JSON_KEY_UID = "uid";
public static final String JSON_KEY_VERIFIED = "verified";
protected final String serverURI;
protected final Executor executor;
@ -534,6 +540,69 @@ public class FxAccountClient {
resource.get();
}
/**
* Thin container for status response.
*/
public static class StatusResponse {
public final String email;
public final boolean verified;
public StatusResponse(String email, boolean verified) {
this.email = email;
this.verified = verified;
}
}
/**
* Query the status of an account given a valid session token.
* <p>
* This API is a little odd: the auth server returns the email and
* verification state of the account that corresponds to the (opaque) session
* token. It might fail if the session token is unknown (or invalid, or
* revoked).
*
* @param sessionToken
* to query.
* @param delegate
* to invoke callbacks.
*/
public void status(byte[] sessionToken, final RequestDelegate<StatusResponse> delegate) {
final byte[] tokenId = new byte[32];
final byte[] reqHMACKey = new byte[32];
final byte[] requestKey = new byte[32];
try {
HKDF.deriveMany(sessionToken, new byte[0], FxAccountUtils.KW("sessionToken"), tokenId, reqHMACKey, requestKey);
} catch (Exception e) {
invokeHandleError(delegate, e);
return;
}
BaseResource resource;
try {
resource = new BaseResource(new URI(serverURI + "recovery_email/status"));
} catch (URISyntaxException e) {
invokeHandleError(delegate, e);
return;
}
resource.delegate = new ResourceDelegate<StatusResponse>(resource, delegate, tokenId, reqHMACKey, false) {
@Override
public void handleSuccess(int status, HttpResponse response, ExtendedJSONObject body) {
try {
String[] requiredStringFields = new String[] { JSON_KEY_EMAIL };
body.throwIfFieldsMissingOrMisTyped(requiredStringFields, String.class);
String email = body.getString(JSON_KEY_EMAIL);
Boolean verified = body.getBoolean(JSON_KEY_VERIFIED);
delegate.handleSuccess(new StatusResponse(email, verified));
return;
} catch (Exception e) {
delegate.handleError(e);
return;
}
}
};
resource.get();
}
@SuppressWarnings("unchecked")
public void sign(final byte[] sessionToken, final ExtendedJSONObject publicKey, long durationInSeconds, final RequestDelegate<String> delegate) {
final JSONObject body = new JSONObject();

View File

@ -0,0 +1,118 @@
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.background.fxa;
import java.net.URI;
import java.util.concurrent.Executor;
import org.json.simple.JSONObject;
import org.mozilla.gecko.sync.ExtendedJSONObject;
import org.mozilla.gecko.sync.Utils;
import org.mozilla.gecko.sync.net.BaseResource;
import ch.boye.httpclientandroidlib.HttpResponse;
public class FxAccountClient20 extends FxAccountClient {
protected static final String[] LOGIN_RESPONSE_REQUIRED_STRING_FIELDS = new String[] { JSON_KEY_UID, JSON_KEY_SESSIONTOKEN };
protected static final String[] LOGIN_RESPONSE_REQUIRED_STRING_FIELDS_KEYS = new String[] { JSON_KEY_UID, JSON_KEY_SESSIONTOKEN, JSON_KEY_KEYFETCHTOKEN, };
protected static final String[] LOGIN_RESPONSE_REQUIRED_BOOLEAN_FIELDS = new String[] { JSON_KEY_VERIFIED };
public FxAccountClient20(String serverURI, Executor executor) {
super(serverURI, executor);
}
public void createAccount(final byte[] emailUTF8, final byte[] passwordUTF8, final boolean preVerified,
final RequestDelegate<String> delegate) {
try {
createAccount(new FxAccount20CreateDelegate(emailUTF8, passwordUTF8, preVerified), delegate);
} catch (final Exception e) {
invokeHandleError(delegate, e);
return;
}
}
/**
* Thin container for login response.
*/
public static class LoginResponse {
public final String serverURI;
public final String uid;
public final byte[] sessionToken;
public final boolean verified;
public final byte[] keyFetchToken;
public LoginResponse(String serverURI, String uid, boolean verified, byte[] sessionToken, byte[] keyFetchToken) {
// This is pretty awful.
this.serverURI = serverURI.endsWith(VERSION_FRAGMENT) ?
serverURI.substring(0, serverURI.length() - VERSION_FRAGMENT.length()) :
serverURI;
this.uid = uid;
this.verified = verified;
this.sessionToken = sessionToken;
this.keyFetchToken = keyFetchToken;
}
}
public void login(final byte[] emailUTF8, final byte[] passwordUTF8,
final RequestDelegate<LoginResponse> delegate) {
login(emailUTF8, passwordUTF8, false, delegate);
}
public void loginAndGetKeys(final byte[] emailUTF8, final byte[] passwordUTF8,
final RequestDelegate<LoginResponse> delegate) {
login(emailUTF8, passwordUTF8, true, delegate);
}
// Public for testing only; prefer login and loginAndGetKeys (without boolean parameter).
public void login(final byte[] emailUTF8, final byte[] passwordUTF8, final boolean getKeys,
final RequestDelegate<LoginResponse> delegate) {
BaseResource resource;
JSONObject body;
final String path = getKeys ? "account/login?keys=true" : "account/login";
try {
resource = new BaseResource(new URI(serverURI + path));
body = new FxAccount20LoginDelegate(emailUTF8, passwordUTF8).getCreateBody();
} catch (Exception e) {
invokeHandleError(delegate, e);
return;
}
resource.delegate = new ResourceDelegate<LoginResponse>(resource, delegate) {
@Override
public void handleSuccess(int status, HttpResponse response, ExtendedJSONObject body) {
try {
String[] requiredStringFields;
if (!getKeys) {
requiredStringFields = LOGIN_RESPONSE_REQUIRED_STRING_FIELDS;
} else {
requiredStringFields = LOGIN_RESPONSE_REQUIRED_STRING_FIELDS_KEYS;
}
String[] requiredBooleanFields = LOGIN_RESPONSE_REQUIRED_BOOLEAN_FIELDS;
body.throwIfFieldsMissingOrMisTyped(requiredStringFields, String.class);
body.throwIfFieldsMissingOrMisTyped(requiredBooleanFields, Boolean.class);
LoginResponse loginResponse;
String uid = body.getString(JSON_KEY_UID);
boolean verified = body.getBoolean(JSON_KEY_VERIFIED);
byte[] sessionToken = Utils.hex2Byte(body.getString(JSON_KEY_SESSIONTOKEN));
byte[] keyFetchToken = null;
if (getKeys) {
keyFetchToken = Utils.hex2Byte(body.getString(JSON_KEY_KEYFETCHTOKEN));
}
loginResponse = new LoginResponse(serverURI, uid, verified, sessionToken, keyFetchToken);
delegate.handleSuccess(loginResponse);
return;
} catch (Exception e) {
delegate.handleError(e);
return;
}
}
};
post(resource, body, delegate);
}
}

View File

@ -6,12 +6,14 @@ package org.mozilla.gecko.background.fxa;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.GeneralSecurityException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import org.mozilla.gecko.sync.Utils;
import org.mozilla.gecko.sync.crypto.HKDF;
import org.mozilla.gecko.sync.crypto.KeyBundle;
import org.mozilla.gecko.sync.crypto.PBKDF2;
public class FxAccountUtils {
public static final int SALT_LENGTH_BYTES = 32;
@ -22,6 +24,8 @@ public class FxAccountUtils {
public static final String KW_VERSION_STRING = "identity.mozilla.com/picl/v1/";
public static final int NUMBER_OF_QUICK_STRETCH_ROUNDS = 1000;
public static String bytes(String string) throws UnsupportedEncodingException {
return Utils.byte2Hex(string.getBytes("UTF-8"));
}
@ -72,6 +76,12 @@ public class FxAccountUtils {
return Utils.byte2Hex(Utils.hex2Byte((x.mod(N)).toString(16), byteLength), hexLength);
}
/**
* The first engineering milestone of PICL (Profile-in-the-Cloud) was
* comprised of Sync 1.1 fronted by a Firefox Account. The sync key was
* generated from the Firefox Account password-derived kB value using this
* method.
*/
public static KeyBundle generateSyncKeyBundle(final byte[] kB) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
byte[] encryptionKey = new byte[32];
byte[] hmacKey = new byte[32];
@ -80,4 +90,33 @@ public class FxAccountUtils {
System.arraycopy(derived, 1*32, hmacKey, 0, 1*32);
return new KeyBundle(encryptionKey, hmacKey);
}
/**
* Firefox Accounts are password authenticated, but clients should not store
* the plain-text password for any amount of time. Equivalent, but slightly
* more secure, is the quickly client-side stretched password.
* <p>
* We separate this since multiple login-time operations want it, and the
* PBKDF2 operation is computationally expensive.
*/
public static byte[] generateQuickStretchedPW(byte[] emailUTF8, byte[] passwordUTF8) throws GeneralSecurityException, UnsupportedEncodingException {
byte[] S = FxAccountUtils.KWE("quickStretch", emailUTF8);
return PBKDF2.pbkdf2SHA256(passwordUTF8, S, NUMBER_OF_QUICK_STRETCH_ROUNDS, 32);
}
/**
* The password-derived credential used to authenticate to the Firefox Account
* auth server.
*/
public static byte[] generateAuthPW(byte[] quickStretchedPW) throws GeneralSecurityException, UnsupportedEncodingException {
return HKDF.derive(quickStretchedPW, new byte[0], FxAccountUtils.KW("authPW"), 32);
}
/**
* The password-derived credential used to unwrap keys managed by the Firefox
* Account auth server.
*/
public static byte[] generateUnwrapBKey(byte[] quickStretchedPW) throws GeneralSecurityException, UnsupportedEncodingException {
return HKDF.derive(quickStretchedPW, new byte[0], FxAccountUtils.KW("unwrapBkey"), 32);
}
}

View File

@ -4,7 +4,12 @@
package org.mozilla.gecko.browserid;
import org.mozilla.gecko.sync.ExtendedJSONObject;
public class BrowserIDKeyPair {
public static final String JSON_KEY_PRIVATEKEY = "privateKey";
public static final String JSON_KEY_PUBLICKEY = "publicKey";
protected final SigningPrivateKey privateKey;
protected final VerifyingPublicKey publicKey;
@ -20,4 +25,11 @@ public class BrowserIDKeyPair {
public VerifyingPublicKey getPublic() {
return this.publicKey;
}
public ExtendedJSONObject toJSONObject() {
ExtendedJSONObject o = new ExtendedJSONObject();
o.put(JSON_KEY_PRIVATEKEY, privateKey.toJSONObject());
o.put(JSON_KEY_PUBLICKEY, publicKey.toJSONObject());
return o;
}
}

View File

@ -20,12 +20,21 @@ import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import org.mozilla.gecko.sync.ExtendedJSONObject;
import org.mozilla.gecko.sync.NonObjectJSONException;
import org.mozilla.gecko.sync.Utils;
public class DSACryptoImplementation {
public static final String SIGNATURE_ALGORITHM = "SHA1withDSA";
public static final int SIGNATURE_LENGTH_BYTES = 40; // DSA signatures are always 40 bytes long.
/**
* Parameters are serialized as hex strings. Hex-versus-decimal was
* reverse-engineered from what the Persona public verifier accepted. We
* expect to follow the JOSE/JWT spec as it solidifies, and that will probably
* mean unifying this base.
*/
protected static final int SERIALIZATION_BASE = 16;
protected static class DSAVerifyingPublicKey implements VerifyingPublicKey {
protected final DSAPublicKey publicKey;
@ -33,16 +42,22 @@ public class DSACryptoImplementation {
this.publicKey = publicKey;
}
/**
* Serialize to a JSON object.
* <p>
* Parameters are serialized as hex strings. Hex-versus-decimal was
* reverse-engineered from what the Persona public verifier accepted.
*/
@Override
public String serialize() {
public ExtendedJSONObject toJSONObject() {
DSAParams params = publicKey.getParams();
ExtendedJSONObject o = new ExtendedJSONObject();
o.put("algorithm", "DS");
o.put("y", publicKey.getY().toString(16));
o.put("g", params.getG().toString(16));
o.put("p", params.getP().toString(16));
o.put("q", params.getQ().toString(16));
return o.toJSONString();
o.put("y", publicKey.getY().toString(SERIALIZATION_BASE));
o.put("g", params.getG().toString(SERIALIZATION_BASE));
o.put("p", params.getP().toString(SERIALIZATION_BASE));
o.put("q", params.getQ().toString(SERIALIZATION_BASE));
return o;
}
@Override
@ -87,16 +102,22 @@ public class DSACryptoImplementation {
return "DS" + (privateKey.getParams().getP().bitLength() + 7)/8;
}
/**
* Serialize to a JSON object.
* <p>
* Parameters are serialized as decimal strings. Hex-versus-decimal was
* reverse-engineered from what the Persona public verifier accepted.
*/
@Override
public String serialize() {
public ExtendedJSONObject toJSONObject() {
DSAParams params = privateKey.getParams();
ExtendedJSONObject o = new ExtendedJSONObject();
o.put("algorithm", "DS");
o.put("x", privateKey.getX().toString(16));
o.put("g", params.getG().toString(16));
o.put("p", params.getP().toString(16));
o.put("q", params.getQ().toString(16));
return o.toJSONString();
o.put("x", privateKey.getX().toString(SERIALIZATION_BASE));
o.put("g", params.getG().toString(SERIALIZATION_BASE));
o.put("p", params.getP().toString(SERIALIZATION_BASE));
o.put("q", params.getQ().toString(SERIALIZATION_BASE));
return o;
}
@Override
@ -121,7 +142,7 @@ public class DSACryptoImplementation {
}
}
public static BrowserIDKeyPair generateKeypair(int keysize)
public static BrowserIDKeyPair generateKeyPair(int keysize)
throws NoSuchAlgorithmException {
final KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
keyPairGenerator.initialize(keysize);
@ -168,4 +189,56 @@ public class DSACryptoImplementation {
DSAPublicKey publicKey = (DSAPublicKey) keyFactory.generatePublic(keySpec);
return new DSAVerifyingPublicKey(publicKey);
}
public static SigningPrivateKey createPrivateKey(ExtendedJSONObject o) throws InvalidKeySpecException, NoSuchAlgorithmException {
String algorithm = o.getString("algorithm");
if (!"DS".equals(algorithm)) {
throw new InvalidKeySpecException("algorithm must equal DS, was " + algorithm);
}
try {
BigInteger x = new BigInteger(o.getString("x"), SERIALIZATION_BASE);
BigInteger p = new BigInteger(o.getString("p"), SERIALIZATION_BASE);
BigInteger q = new BigInteger(o.getString("q"), SERIALIZATION_BASE);
BigInteger g = new BigInteger(o.getString("g"), SERIALIZATION_BASE);
return createPrivateKey(x, p, q, g);
} catch (NullPointerException e) {
throw new InvalidKeySpecException("x, p, q, and g must be integers encoded as strings, base " + SERIALIZATION_BASE);
} catch (NumberFormatException e) {
throw new InvalidKeySpecException("x, p, q, and g must be integers encoded as strings, base " + SERIALIZATION_BASE);
}
}
public static VerifyingPublicKey createPublicKey(ExtendedJSONObject o) throws InvalidKeySpecException, NoSuchAlgorithmException {
String algorithm = o.getString("algorithm");
if (!"DS".equals(algorithm)) {
throw new InvalidKeySpecException("algorithm must equal DS, was " + algorithm);
}
try {
BigInteger y = new BigInteger(o.getString("y"), SERIALIZATION_BASE);
BigInteger p = new BigInteger(o.getString("p"), SERIALIZATION_BASE);
BigInteger q = new BigInteger(o.getString("q"), SERIALIZATION_BASE);
BigInteger g = new BigInteger(o.getString("g"), SERIALIZATION_BASE);
return createPublicKey(y, p, q, g);
} catch (NullPointerException e) {
throw new InvalidKeySpecException("y, p, q, and g must be integers encoded as strings, base " + SERIALIZATION_BASE);
} catch (NumberFormatException e) {
throw new InvalidKeySpecException("y, p, q, and g must be integers encoded as strings, base " + SERIALIZATION_BASE);
}
}
public static BrowserIDKeyPair fromJSONObject(ExtendedJSONObject o) throws InvalidKeySpecException, NoSuchAlgorithmException {
try {
ExtendedJSONObject privateKey = o.getObject(BrowserIDKeyPair.JSON_KEY_PRIVATEKEY);
ExtendedJSONObject publicKey = o.getObject(BrowserIDKeyPair.JSON_KEY_PUBLICKEY);
if (privateKey == null) {
throw new InvalidKeySpecException("privateKey must not be null");
}
if (publicKey == null) {
throw new InvalidKeySpecException("publicKey must not be null");
}
return new BrowserIDKeyPair(createPrivateKey(privateKey), createPublicKey(publicKey));
} catch (NonObjectJSONException e) {
throw new InvalidKeySpecException("privateKey and publicKey must be JSON objects");
}
}
}

View File

@ -93,7 +93,7 @@ public class JSONWebTokenUtils {
ExtendedJSONObject principal = new ExtendedJSONObject();
principal.put("email", email);
payload.put("principal", principal);
payload.put("public-key", new ExtendedJSONObject(publicKeyToSign.serialize()));
payload.put("public-key", publicKeyToSign.toJSONObject());
return payload.toJSONString();
}

View File

@ -19,10 +19,19 @@ import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import org.mozilla.gecko.sync.ExtendedJSONObject;
import org.mozilla.gecko.sync.NonObjectJSONException;
public class RSACryptoImplementation {
public static final String SIGNATURE_ALGORITHM = "SHA256withRSA";
/**
* Parameters are serialized as decimal strings. Hex-versus-decimal was
* reverse-engineered from what the Persona public verifier accepted. We
* expect to follow the JOSE/JWT spec as it solidifies, and that will probably
* mean unifying this base.
*/
protected static final int SERIALIZATION_BASE = 10;
protected static class RSAVerifyingPublicKey implements VerifyingPublicKey {
protected final RSAPublicKey publicKey;
@ -30,13 +39,19 @@ public class RSACryptoImplementation {
this.publicKey = publicKey;
}
/**
* Serialize to a JSON object.
* <p>
* Parameters are serialized as decimal strings. Hex-versus-decimal was
* reverse-engineered from what the Persona public verifier accepted.
*/
@Override
public String serialize() {
public ExtendedJSONObject toJSONObject() {
ExtendedJSONObject o = new ExtendedJSONObject();
o.put("algorithm", "RS");
o.put("n", publicKey.getModulus().toString(10));
o.put("e", publicKey.getPublicExponent().toString(10));
return o.toJSONString();
o.put("n", publicKey.getModulus().toString(SERIALIZATION_BASE));
o.put("e", publicKey.getPublicExponent().toString(SERIALIZATION_BASE));
return o;
}
@Override
@ -61,13 +76,19 @@ public class RSACryptoImplementation {
return "RS" + (privateKey.getModulus().bitLength() + 7)/8;
}
/**
* Serialize to a JSON object.
* <p>
* Parameters are serialized as decimal strings. Hex-versus-decimal was
* reverse-engineered from what the Persona public verifier accepted.
*/
@Override
public String serialize() {
public ExtendedJSONObject toJSONObject() {
ExtendedJSONObject o = new ExtendedJSONObject();
o.put("algorithm", "RS");
o.put("n", privateKey.getModulus().toString(10));
o.put("e", privateKey.getPrivateExponent().toString(10));
return o.toJSONString();
o.put("n", privateKey.getModulus().toString(SERIALIZATION_BASE));
o.put("d", privateKey.getPrivateExponent().toString(SERIALIZATION_BASE));
return o;
}
@Override
@ -80,7 +101,7 @@ public class RSACryptoImplementation {
}
}
public static BrowserIDKeyPair generateKeypair(final int keysize) throws NoSuchAlgorithmException {
public static BrowserIDKeyPair generateKeyPair(final int keysize) throws NoSuchAlgorithmException {
final KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(keysize);
final KeyPair keyPair = keyPairGenerator.generateKeyPair();
@ -114,4 +135,52 @@ public class RSACryptoImplementation {
RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);
return new RSAVerifyingPublicKey(publicKey);
}
public static SigningPrivateKey createPrivateKey(ExtendedJSONObject o) throws InvalidKeySpecException, NoSuchAlgorithmException {
String algorithm = o.getString("algorithm");
if (!"RS".equals(algorithm)) {
throw new InvalidKeySpecException("algorithm must equal RS, was " + algorithm);
}
try {
BigInteger n = new BigInteger(o.getString("n"), SERIALIZATION_BASE);
BigInteger d = new BigInteger(o.getString("d"), SERIALIZATION_BASE);
return createPrivateKey(n, d);
} catch (NullPointerException e) {
throw new InvalidKeySpecException("n and d must be integers encoded as strings, base " + SERIALIZATION_BASE);
} catch (NumberFormatException e) {
throw new InvalidKeySpecException("n and d must be integers encoded as strings, base " + SERIALIZATION_BASE);
}
}
public static VerifyingPublicKey createPublicKey(ExtendedJSONObject o) throws InvalidKeySpecException, NoSuchAlgorithmException {
String algorithm = o.getString("algorithm");
if (!"RS".equals(algorithm)) {
throw new InvalidKeySpecException("algorithm must equal RS, was " + algorithm);
}
try {
BigInteger n = new BigInteger(o.getString("n"), SERIALIZATION_BASE);
BigInteger e = new BigInteger(o.getString("e"), SERIALIZATION_BASE);
return createPublicKey(n, e);
} catch (NullPointerException e) {
throw new InvalidKeySpecException("n and e must be integers encoded as strings, base " + SERIALIZATION_BASE);
} catch (NumberFormatException e) {
throw new InvalidKeySpecException("n and e must be integers encoded as strings, base " + SERIALIZATION_BASE);
}
}
public static BrowserIDKeyPair fromJSONObject(ExtendedJSONObject o) throws InvalidKeySpecException, NoSuchAlgorithmException {
try {
ExtendedJSONObject privateKey = o.getObject(BrowserIDKeyPair.JSON_KEY_PRIVATEKEY);
ExtendedJSONObject publicKey = o.getObject(BrowserIDKeyPair.JSON_KEY_PUBLICKEY);
if (privateKey == null) {
throw new InvalidKeySpecException("privateKey must not be null");
}
if (publicKey == null) {
throw new InvalidKeySpecException("publicKey must not be null");
}
return new BrowserIDKeyPair(createPrivateKey(privateKey), createPublicKey(publicKey));
} catch (NonObjectJSONException e) {
throw new InvalidKeySpecException("privateKey and publicKey must be JSON objects");
}
}
}

View File

@ -6,6 +6,8 @@ package org.mozilla.gecko.browserid;
import java.security.GeneralSecurityException;
import org.mozilla.gecko.sync.ExtendedJSONObject;
public interface SigningPrivateKey {
/**
* Return the JSON Web Token "alg" header corresponding to this private key.
@ -18,16 +20,16 @@ public interface SigningPrivateKey {
public String getAlgorithm();
/**
* Generate a printable representation of a private key.
* Generate a JSON representation of a private key.
* <p>
* <b>This should only be used for debugging. No private keys should go over
* the wire at any time.</b>
*
* @param privateKey
* to represent.
* @return printable representation.
* @return JSON representation.
*/
public String serialize();
public ExtendedJSONObject toJSONObject();
/**
* Sign a message.

View File

@ -6,16 +6,18 @@ package org.mozilla.gecko.browserid;
import java.security.GeneralSecurityException;
import org.mozilla.gecko.sync.ExtendedJSONObject;
public interface VerifyingPublicKey {
/**
* Generate a printable representation of a public key.
* Generate a JSON representation of a public key.
*
* @param publicKey
* to represent.
* @return printable representation.
* @return JSON representation.
*/
public String serialize();
public ExtendedJSONObject toJSONObject();
/**
* Verify a signature.

View File

@ -9,7 +9,7 @@ public class FxAccountConstants {
public static final String GLOBAL_LOG_TAG = "FxAccounts";
public static final String ACCOUNT_TYPE = "@MOZ_ANDROID_SHARED_FXACCOUNT_TYPE@";
public static final String DEFAULT_IDP_ENDPOINT = "https://api-accounts.dev.lcip.org";
public static final String DEFAULT_IDP_ENDPOINT = "https://api-accounts-onepw.dev.lcip.org";
public static final String DEFAULT_AUTH_ENDPOINT = "http://auth.oldsync.dev.lcip.org";
public static final String PREFS_PATH = "fxa.v1";

View File

@ -155,9 +155,9 @@ public class FxAccount {
*/
public void login(final Context context, final String tokenServerEndpoint,
final BrowserIDKeyPair keyPair, final Delegate delegate) {
ExtendedJSONObject keyPairObject;
ExtendedJSONObject publicKeyObject;
try {
keyPairObject = new ExtendedJSONObject(keyPair.getPublic().serialize());
publicKeyObject = keyPair.getPublic().toJSONObject();
} catch (Exception e) {
delegate.handleError(e);
return;
@ -168,7 +168,7 @@ public class FxAccount {
// inner FxAccountClient delegate, the outer TokenServerClient delegate, and
// the user supplied delegate.
FxAccountClient fxAccountClient = new FxAccountClient(idpEndpoint, executor);
fxAccountClient.sign(sessionTokenBytes, keyPairObject,
fxAccountClient.sign(sessionTokenBytes, publicKeyObject,
JSONWebTokenUtils.DEFAULT_CERTIFICATE_DURATION_IN_MILLISECONDS,
new InnerFxAccountClientRequestDelegate(executor, authEndpoint, tokenServerEndpoint, keyPair, delegate));
}

View File

@ -113,7 +113,7 @@ public class FxAccountSyncAdapter extends AbstractThreadedSyncAdapter {
final CountDownLatch latch = new CountDownLatch(1);
try {
final BrowserIDKeyPair keyPair = RSACryptoImplementation.generateKeypair(1024);
final BrowserIDKeyPair keyPair = RSACryptoImplementation.generateKeyPair(1024);
Logger.info(LOG_TAG, "Generated keypair. ");
final FxAccount fxAccount = FxAccountAuthenticator.fromAndroidAccount(getContext(), account);

View File

@ -0,0 +1,5 @@
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.sync;

View File

@ -15,6 +15,7 @@ import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.mozilla.gecko.sync.UnexpectedJSONException.BadRequiredFieldJSONException;
/**
* Extend JSONObject to do little things, like, y'know, accessing members.
@ -84,7 +85,7 @@ public class ExtendedJSONObject {
return (JSONArray) o;
}
throw new NonArrayJSONException(o);
throw new NonArrayJSONException("value must be a JSON array");
}
/**
@ -109,7 +110,7 @@ public class ExtendedJSONObject {
return (JSONArray) o;
}
throw new NonArrayJSONException(o);
throw new NonArrayJSONException("value must be a JSON array");
}
/**
@ -171,7 +172,7 @@ public class ExtendedJSONObject {
if (obj instanceof JSONObject) {
this.object = ((JSONObject) obj);
} else {
throw new NonObjectJSONException(obj);
throw new NonObjectJSONException("value must be a JSON object");
}
}
@ -183,13 +184,19 @@ public class ExtendedJSONObject {
public Object get(String key) {
return this.object.get(key);
}
public Long getLong(String key) {
return (Long) this.get(key);
}
public String getString(String key) {
return (String) this.get(key);
}
public Boolean getBoolean(String key) {
return (Boolean) this.get(key);
}
/**
* Return an Integer if the value for this key is an Integer, Long, or String
* that can be parsed as a base 10 Integer.
@ -286,7 +293,7 @@ public class ExtendedJSONObject {
if (o instanceof JSONObject) {
return new ExtendedJSONObject((JSONObject) o);
}
throw new NonObjectJSONException(o);
throw new NonObjectJSONException("key must be a JSON object: " + key);
}
@SuppressWarnings("unchecked")
@ -307,7 +314,7 @@ public class ExtendedJSONObject {
if (o instanceof JSONArray) {
return (JSONArray) o;
}
throw new NonArrayJSONException(o);
throw new NonArrayJSONException("key must be a JSON array: " + key);
}
public int size() {
@ -336,4 +343,24 @@ public class ExtendedJSONObject {
}
return this.object.equals(other.object);
}
/**
* Throw if keys are missing or values have wrong types.
*
* @param requiredFields list of required keys.
* @param requiredFieldClass class that values must be coercable to; may be null, which means don't check.
* @throws UnexpectedJSONException
*/
public void throwIfFieldsMissingOrMisTyped(String[] requiredFields, Class<?> requiredFieldClass) throws BadRequiredFieldJSONException {
// Defensive as possible: verify object has expected key(s) with string value.
for (String k : requiredFields) {
Object value = get(k);
if (value == null) {
throw new BadRequiredFieldJSONException("Expected key not present in result: " + k);
}
if (requiredFieldClass != null && !(requiredFieldClass.isInstance(value))) {
throw new BadRequiredFieldJSONException("Value for key not an instance of " + requiredFieldClass + ": " + k);
}
}
}
}

View File

@ -7,7 +7,7 @@ package org.mozilla.gecko.sync;
public class NonArrayJSONException extends UnexpectedJSONException {
private static final long serialVersionUID = 5582918057432365749L;
public NonArrayJSONException(Object object) {
super(object);
public NonArrayJSONException(String detailMessage) {
super(detailMessage);
}
}

View File

@ -7,7 +7,7 @@ package org.mozilla.gecko.sync;
public class NonObjectJSONException extends UnexpectedJSONException {
private static final long serialVersionUID = 2214238763035650087L;
public NonObjectJSONException(Object object) {
super(object);
public NonObjectJSONException(String detailMessage) {
super(detailMessage);
}
}

View File

@ -7,8 +7,15 @@ package org.mozilla.gecko.sync;
public class UnexpectedJSONException extends Exception {
private static final long serialVersionUID = 4797570033096443169L;
public Object obj;
public UnexpectedJSONException(Object object) {
obj = object;
public UnexpectedJSONException(String detailMessage) {
super(detailMessage);
}
public static class BadRequiredFieldJSONException extends UnexpectedJSONException {
private static final long serialVersionUID = -9207736984784497612L;
public BadRequiredFieldJSONException(String string) {
super(string);
}
}
}

View File

@ -0,0 +1,87 @@
/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.sync.crypto;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
public class PBKDF2 {
public static byte[] pbkdf2SHA1(byte[] password, byte[] salt, int c, int dkLen)
throws GeneralSecurityException {
// Won't work on API level 8, but this is trivial.
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec keySpec;
try {
keySpec = new PBEKeySpec(new String(password, "UTF-8").toCharArray(), salt, c, dkLen * 8);
} catch (UnsupportedEncodingException e) {
throw new GeneralSecurityException(e);
}
SecretKey key = factory.generateSecret(keySpec);
return key.getEncoded();
}
public static byte[] pbkdf2SHA256(byte[] password, byte[] salt, int c, int dkLen)
throws GeneralSecurityException {
final String algorithm = "HmacSHA256";
SecretKeySpec keyspec = new SecretKeySpec(password, algorithm);
Mac prf = Mac.getInstance(algorithm);
prf.init(keyspec);
int hLen = prf.getMacLength();
int l = Math.max(dkLen, hLen);
int r = dkLen - (l - 1) * hLen;
byte T[] = new byte[l * hLen];
int ti_offset = 0;
for (int i = 1; i <= l; i++) {
F(T, ti_offset, prf, salt, c, i);
ti_offset += hLen;
}
if (r < hLen) {
// Incomplete last block.
byte DK[] = new byte[dkLen];
System.arraycopy(T, 0, DK, 0, dkLen);
return DK;
}
return T;
}
private static void F(byte[] dest, int offset, Mac prf, byte[] S, int c, int blockIndex) {
final int hLen = prf.getMacLength();
byte U_r[] = new byte[hLen];
// U0 = S || INT (i);
byte U_i[] = new byte[S.length + 4];
System.arraycopy(S, 0, U_i, 0, S.length);
INT(U_i, S.length, blockIndex);
for (int i = 0; i < c; i++) {
U_i = prf.doFinal(U_i);
xor(U_r, U_i);
}
System.arraycopy(U_r, 0, dest, offset, hLen);
}
private static void xor(byte[] dest, byte[] src) {
for (int i = 0; i < dest.length; i++) {
dest[i] ^= src[i];
}
}
private static void INT(byte[] dest, int offset, int i) {
dest[offset + 0] = (byte) (i / (256 * 256 * 256));
dest[offset + 1] = (byte) (i / (256 * 256));
dest[offset + 2] = (byte) (i / (256));
dest[offset + 3] = (byte) (i);
}
}

View File

@ -19,6 +19,9 @@ public class ClientRecord extends Record {
public static final long CLIENTS_TTL = 21 * 24 * 60 * 60; // 21 days in seconds.
public static final String DEFAULT_CLIENT_NAME = "Default Name";
public static final String PROTOCOL_LEGACY_SYNC = "1.1";
// public static final String PROTOCOL_FXA_SYNC = "1.5";
/**
* Each of these fields is 'owned' by the client it represents. For example,
* the "version" field is the Firefox version of that client; some time after
@ -36,6 +39,7 @@ public class ClientRecord extends Record {
public String type = ClientRecord.CLIENT_TYPE;
public String version = null; // Free-form string, optional.
public JSONArray commands;
public JSONArray protocols;
public ClientRecord(String guid, String collection, long lastModified, boolean deleted) {
super(guid, collection, lastModified, deleted);
@ -74,6 +78,13 @@ public class ClientRecord extends Record {
Logger.debug(LOG_TAG, "Got non-array commands in client record " + guid, e);
commands = null;
}
try {
protocols = payload.getArray("protocols");
} catch (NonArrayJSONException e) {
Logger.debug(LOG_TAG, "Got non-array protocols in client record " + guid, e);
protocols = null;
}
}
@Override
@ -86,6 +97,10 @@ public class ClientRecord extends Record {
if (this.commands != null) {
payload.put("commands", this.commands);
}
if (this.protocols != null) {
payload.put("protocols", this.protocols);
}
}
@Override
@ -103,7 +118,8 @@ public class ClientRecord extends Record {
return false;
}
// Don't compare versions.
// Don't compare versions or protocols, no matter how much we might want to.
// They're not required by the spec.
ClientRecord other = (ClientRecord) o;
if (!RepoUtils.stringsEqual(other.name, this.name) ||
!RepoUtils.stringsEqual(other.type, this.type)) {
@ -122,6 +138,7 @@ public class ClientRecord extends Record {
out.name = this.name;
out.type = this.type;
out.version = this.version;
out.protocols = this.protocols;
return out;
}

View File

@ -360,6 +360,13 @@ public class SyncClientsEngineStage extends AbstractSessionManagingSyncStage {
return GlobalConstants.MOZ_APP_VERSION;
}
@SuppressWarnings("unchecked")
protected JSONArray getLocalClientProtocols() {
final JSONArray protocols = new JSONArray();
protocols.add(ClientRecord.PROTOCOL_LEGACY_SYNC);
return protocols;
}
protected ClientRecord newLocalClientRecord(ClientsDataDelegate delegate) {
final String ourGUID = delegate.getAccountGUID();
final String ourName = delegate.getClientName();
@ -367,6 +374,7 @@ public class SyncClientsEngineStage extends AbstractSessionManagingSyncStage {
ClientRecord r = new ClientRecord(ourGUID);
r.name = ourName;
r.version = getLocalClientVersion();
r.protocols = getLocalClientProtocols();
return r;
}
@ -397,7 +405,8 @@ public class SyncClientsEngineStage extends AbstractSessionManagingSyncStage {
protected void handleDownloadedLocalRecord(ClientRecord r) {
session.config.persistServerClientRecordTimestamp(r.lastModified);
if (!getLocalClientVersion().equals(r.version)) {
if (!getLocalClientVersion().equals(r.version) ||
!getLocalClientProtocols().equals(r.protocols)) {
shouldUploadLocalRecord = true;
}
processCommands(r.commands);

View File

@ -145,13 +145,13 @@ abstract class UITest extends ActivityInstrumentationTestCase2<Activity>
}
@Override
public void dumpLog(final String message) {
mAsserter.dumpLog(message);
public void dumpLog(final String logtag, final String message) {
mAsserter.dumpLog(logtag + ": " + message);
}
@Override
public void dumpLog(final String message, final Throwable t) {
mAsserter.dumpLog(message, t);
public void dumpLog(final String logtag, final String message, final Throwable t) {
mAsserter.dumpLog(logtag + ": " + message, t);
}
@Override

View File

@ -31,8 +31,8 @@ public interface UITestContext {
public Actions getActions();
public Instrumentation getInstrumentation();
public void dumpLog(final String message);
public void dumpLog(final String message, final Throwable t);
public void dumpLog(final String logtag, final String message);
public void dumpLog(final String logtag, final String message, final Throwable t);
/**
* Returns the absolute version of the given URL using the host's hostname.

View File

@ -22,6 +22,8 @@ import android.view.View;
* A class representing any interactions that take place on the Awesomescreen.
*/
public class AboutHomeComponent extends BaseComponent {
private static final String LOGTAG = AboutHomeComponent.class.getSimpleName();
// The different types of pages that can be present on about:home
public enum PageType {
HISTORY,
@ -82,13 +84,13 @@ public class AboutHomeComponent extends BaseComponent {
}
public AboutHomeComponent swipeToPageOnRight() {
mTestContext.dumpLog("Swiping to the page on the right.");
mTestContext.dumpLog(LOGTAG, "Swiping to the page on the right.");
swipeToPage(Solo.RIGHT);
return this;
}
public AboutHomeComponent swipeToPageOnLeft() {
mTestContext.dumpLog("Swiping to the page on the left.");
mTestContext.dumpLog(LOGTAG, "Swiping to the page on the left.");
swipeToPage(Solo.LEFT);
return this;
}

Some files were not shown because too many files have changed in this diff Show More