Merge m-c to inbound.
@ -1,4 +1,4 @@
|
||||
{
|
||||
"revision": "65400ea2bb3e99ad717f4b99e24ebbfa23b05b58",
|
||||
"revision": "3b850fa17c888bdd31f1a163fd7b92f6f020449d",
|
||||
"repo_path": "/integration/gaia-central"
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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)
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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>
|
||||
|
@ -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]
|
||||
|
118
browser/devtools/debugger/test/browser_dbg_search-popup-jank.js
Normal 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;
|
||||
});
|
@ -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.
|
||||
}
|
||||
|
@ -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]
|
||||
|
@ -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;
|
||||
}
|
@ -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);
|
||||
|
@ -8,6 +8,7 @@
|
||||
}
|
||||
|
||||
#details-pane-toggle[disabled] {
|
||||
/* Don't use display: none; to avoid collapsing #requests-menu-toolbar */
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
|
@ -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]
|
||||
|
@ -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]
|
||||
|
@ -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);
|
||||
});
|
||||
}
|
@ -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>
|
||||
|
@ -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");
|
||||
|
@ -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");
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
});
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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()
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
},
|
||||
|
||||
|
@ -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()",
|
||||
},
|
||||
|
@ -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]",
|
||||
|
@ -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",
|
||||
},
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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. */
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
Before Width: | Height: | Size: 2.8 KiB |
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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 {
|
||||
|
623
browser/themes/shared/devtools/debugger.inc.css
Normal 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;
|
||||
}
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
584
browser/themes/shared/devtools/netmonitor.inc.css
Normal 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. */
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -214,6 +214,7 @@
|
||||
|
||||
.devtools-sidebar-tabs > tabpanels {
|
||||
-moz-appearance: none;
|
||||
background: transparent;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
785
browser/themes/shared/devtools/widgets.inc.css
Normal 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
|
@ -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. */
|
||||
|
@ -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;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.8 KiB |
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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"))
|
||||
|
||||
|
@ -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):
|
||||
"""
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
¶m);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
@ -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]
|
||||
|
@ -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();
|
@ -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;
|
||||
|
@ -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.
|
||||
|
@ -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',
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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();
|
||||
|
118
mobile/android/base/background/fxa/FxAccountClient20.java
Normal 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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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";
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
87
mobile/android/base/sync/crypto/PBKDF2.java
Normal 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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|