mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-25 16:47:29 +09:00
Merge remote-tracking branch 'origin/master' into custom
This commit is contained in:
commit
18869d3807
54 changed files with 362 additions and 1459 deletions
|
|
@ -1006,12 +1006,7 @@ pref("services.sync.syncedTabs.showRemoteIcons", true);
|
|||
|
||||
pref("services.sync.sendTabToDevice.enabled", true);
|
||||
|
||||
// Developer edition preferences
|
||||
#ifdef MOZ_DEV_EDITION
|
||||
sticky_pref("lightweightThemes.selectedThemeID", "firefox-devedition@mozilla.org");
|
||||
#else
|
||||
sticky_pref("lightweightThemes.selectedThemeID", "");
|
||||
#endif
|
||||
|
||||
// Whether the character encoding menu is under the main Firefox button. This
|
||||
// preference is a string so that localizers can alter it.
|
||||
|
|
|
|||
|
|
@ -1,142 +0,0 @@
|
|||
/* 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/. */
|
||||
|
||||
/**
|
||||
* Listeners for the DevEdition theme. This adds an extra stylesheet
|
||||
* to browser.xul if a pref is set and no other themes are applied.
|
||||
*/
|
||||
var DevEdition = {
|
||||
_devtoolsThemePrefName: "devtools.theme",
|
||||
styleSheetLocation: "chrome://browser/skin/devedition.css",
|
||||
styleSheet: null,
|
||||
initialized: false,
|
||||
|
||||
get isStyleSheetEnabled() {
|
||||
return this.styleSheet && !this.styleSheet.sheet.disabled;
|
||||
},
|
||||
|
||||
get isThemeCurrentlyApplied() {
|
||||
let theme = LightweightThemeManager.currentTheme;
|
||||
return theme && theme.id == "firefox-devedition@mozilla.org";
|
||||
},
|
||||
|
||||
init: function () {
|
||||
this.initialized = true;
|
||||
Services.prefs.addObserver(this._devtoolsThemePrefName, this, false);
|
||||
Services.obs.addObserver(this, "lightweight-theme-styling-update", false);
|
||||
Services.obs.addObserver(this, "lightweight-theme-window-updated", false);
|
||||
this._updateDevtoolsThemeAttribute();
|
||||
|
||||
if (this.isThemeCurrentlyApplied) {
|
||||
this._toggleStyleSheet(true);
|
||||
}
|
||||
},
|
||||
|
||||
createStyleSheet: function() {
|
||||
let styleSheetAttr = `href="${this.styleSheetLocation}" type="text/css"`;
|
||||
this.styleSheet = document.createProcessingInstruction(
|
||||
"xml-stylesheet", styleSheetAttr);
|
||||
this.styleSheet.addEventListener("load", this);
|
||||
document.insertBefore(this.styleSheet, document.documentElement);
|
||||
this.styleSheet.sheet.disabled = true;
|
||||
},
|
||||
|
||||
observe: function (subject, topic, data) {
|
||||
if (topic == "lightweight-theme-styling-update") {
|
||||
let newTheme = JSON.parse(data);
|
||||
if (newTheme && newTheme.id == "firefox-devedition@mozilla.org") {
|
||||
this._toggleStyleSheet(true);
|
||||
} else {
|
||||
this._toggleStyleSheet(false);
|
||||
}
|
||||
} else if (topic == "lightweight-theme-window-updated" && subject == window) {
|
||||
this._updateLWTBrightness();
|
||||
}
|
||||
|
||||
if (topic == "nsPref:changed" && data == this._devtoolsThemePrefName) {
|
||||
this._updateDevtoolsThemeAttribute();
|
||||
}
|
||||
},
|
||||
|
||||
_inferBrightness: function() {
|
||||
ToolbarIconColor.inferFromText();
|
||||
// Get an inverted full screen button if the dark theme is applied.
|
||||
if (this.isStyleSheetEnabled &&
|
||||
document.documentElement.getAttribute("devtoolstheme") == "dark") {
|
||||
document.documentElement.setAttribute("brighttitlebarforeground", "true");
|
||||
} else {
|
||||
document.documentElement.removeAttribute("brighttitlebarforeground");
|
||||
}
|
||||
},
|
||||
|
||||
_updateLWTBrightness() {
|
||||
if (this.isThemeCurrentlyApplied) {
|
||||
let devtoolsTheme = Services.prefs.getCharPref(this._devtoolsThemePrefName);
|
||||
let textColor = devtoolsTheme == "dark" ? "bright" : "dark";
|
||||
document.documentElement.setAttribute("lwthemetextcolor", textColor);
|
||||
}
|
||||
},
|
||||
|
||||
_updateDevtoolsThemeAttribute: function() {
|
||||
// Set an attribute on root element to make it possible
|
||||
// to change colors based on the selected devtools theme.
|
||||
let devtoolsTheme = Services.prefs.getCharPref(this._devtoolsThemePrefName);
|
||||
if (devtoolsTheme != "dark") {
|
||||
devtoolsTheme = "light";
|
||||
}
|
||||
document.documentElement.setAttribute("devtoolstheme", devtoolsTheme);
|
||||
this._updateLWTBrightness();
|
||||
this._inferBrightness();
|
||||
},
|
||||
|
||||
handleEvent: function(e) {
|
||||
if (e.type === "load") {
|
||||
this.styleSheet.removeEventListener("load", this);
|
||||
this.refreshBrowserDisplay();
|
||||
}
|
||||
},
|
||||
|
||||
refreshBrowserDisplay: function() {
|
||||
// Don't touch things on the browser if gBrowserInit.onLoad hasn't
|
||||
// yet fired.
|
||||
if (this.initialized) {
|
||||
gBrowser.tabContainer._positionPinnedTabs();
|
||||
this._inferBrightness();
|
||||
}
|
||||
},
|
||||
|
||||
_toggleStyleSheet: function(deveditionThemeEnabled) {
|
||||
let wasEnabled = this.isStyleSheetEnabled;
|
||||
if (deveditionThemeEnabled && !wasEnabled) {
|
||||
// The stylesheet may not have been created yet if it wasn't
|
||||
// needed on initial load. Make it now.
|
||||
if (!this.styleSheet) {
|
||||
this.createStyleSheet();
|
||||
}
|
||||
this.styleSheet.sheet.disabled = false;
|
||||
this.refreshBrowserDisplay();
|
||||
} else if (!deveditionThemeEnabled && wasEnabled) {
|
||||
this.styleSheet.sheet.disabled = true;
|
||||
this.refreshBrowserDisplay();
|
||||
}
|
||||
},
|
||||
|
||||
uninit: function () {
|
||||
Services.prefs.removeObserver(this._devtoolsThemePrefName, this);
|
||||
Services.obs.removeObserver(this, "lightweight-theme-styling-update", false);
|
||||
Services.obs.removeObserver(this, "lightweight-theme-window-updated", false);
|
||||
if (this.styleSheet) {
|
||||
this.styleSheet.removeEventListener("load", this);
|
||||
}
|
||||
this.styleSheet = null;
|
||||
}
|
||||
};
|
||||
|
||||
// If the DevEdition theme is going to be applied in gBrowserInit.onLoad,
|
||||
// then preload it now. This prevents a flash of unstyled content where the
|
||||
// normal theme is applied while the DevEdition stylesheet is loading.
|
||||
if (!AppConstants.RELEASE_OR_BETA &&
|
||||
this != Services.appShell.hiddenDOMWindow && DevEdition.isThemeCurrentlyApplied) {
|
||||
DevEdition.createStyleSheet();
|
||||
}
|
||||
|
|
@ -984,7 +984,6 @@ var gBrowserInit = {
|
|||
gPageStyleMenu.init();
|
||||
BrowserOnClick.init();
|
||||
FeedHandler.init();
|
||||
DevEdition.init();
|
||||
AboutPrivateBrowsingListener.init();
|
||||
TrackingProtection.init();
|
||||
RefreshBlocker.init();
|
||||
|
|
@ -1517,8 +1516,6 @@ var gBrowserInit = {
|
|||
|
||||
FeedHandler.uninit();
|
||||
|
||||
DevEdition.uninit();
|
||||
|
||||
TrackingProtection.uninit();
|
||||
|
||||
RefreshBlocker.uninit();
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@
|
|||
<script type="application/javascript" src="chrome://browser/content/browser-captivePortal.js"/>
|
||||
<script type="application/javascript" src="chrome://browser/content/browser-ctrlTab.js"/>
|
||||
<script type="application/javascript" src="chrome://browser/content/browser-customization.js"/>
|
||||
<script type="application/javascript" src="chrome://browser/content/browser-devedition.js"/>
|
||||
<script type="application/javascript" src="chrome://browser/content/browser-feeds.js"/>
|
||||
<script type="application/javascript" src="chrome://browser/content/browser-fullScreenAndPointerLock.js"/>
|
||||
<script type="application/javascript" src="chrome://browser/content/browser-fullZoom.js"/>
|
||||
|
|
|
|||
|
|
@ -66,7 +66,6 @@ browser.jar:
|
|||
content/browser/browser-ctrlTab.js (content/browser-ctrlTab.js)
|
||||
content/browser/browser-customization.js (content/browser-customization.js)
|
||||
content/browser/browser-data-submission-info-bar.js (content/browser-data-submission-info-bar.js)
|
||||
content/browser/browser-devedition.js (content/browser-devedition.js)
|
||||
content/browser/browser-feeds.js (content/browser-feeds.js)
|
||||
content/browser/browser-fullScreenAndPointerLock.js (content/browser-fullScreenAndPointerLock.js)
|
||||
content/browser/browser-fullZoom.js (content/browser-fullZoom.js)
|
||||
|
|
|
|||
|
|
@ -198,9 +198,7 @@ var CustomizableUIInternal = {
|
|||
"add-ons-button",
|
||||
];
|
||||
|
||||
if (!AppConstants.MOZ_DEV_EDITION) {
|
||||
panelPlacements.splice(-1, 0, "developer-button");
|
||||
}
|
||||
panelPlacements.splice(-1, 0, "developer-button");
|
||||
|
||||
let showCharacterEncoding = Services.prefs.getComplexValue(
|
||||
"browser.menu.showCharacterEncoding",
|
||||
|
|
@ -225,10 +223,6 @@ var CustomizableUIInternal = {
|
|||
"home-button",
|
||||
];
|
||||
|
||||
if (AppConstants.MOZ_DEV_EDITION) {
|
||||
navbarPlacements.splice(2, 0, "developer-button");
|
||||
}
|
||||
|
||||
// Place this last, when createWidget is called for pocket, it will
|
||||
// append to the toolbar.
|
||||
if (Services.prefs.getPrefType("extensions.pocket.enabled") != Services.prefs.PREF_INVALID &&
|
||||
|
|
|
|||
|
|
@ -676,19 +676,6 @@ BrowserGlue.prototype = {
|
|||
// Ensure we keep track of places/pw-mananager undo by init'ing this early.
|
||||
Cu.import("resource:///modules/AutoMigrate.jsm");
|
||||
|
||||
if (!AppConstants.RELEASE_OR_BETA) {
|
||||
let themeName = gBrowserBundle.GetStringFromName("deveditionTheme.name");
|
||||
let vendorShortName = gBrandBundle.GetStringFromName("vendorShortName");
|
||||
|
||||
LightweightThemeManager.addBuiltInTheme({
|
||||
id: "firefox-devedition@mozilla.org",
|
||||
name: themeName,
|
||||
headerURL: "resource:///chrome/browser/content/browser/defaultthemes/devedition.header.png",
|
||||
iconURL: "resource:///chrome/browser/content/browser/defaultthemes/devedition.icon.png",
|
||||
author: vendorShortName,
|
||||
});
|
||||
}
|
||||
|
||||
TabCrashHandler.init();
|
||||
|
||||
Services.obs.notifyObservers(null, "browser-ui-startup-complete", "");
|
||||
|
|
@ -1054,10 +1041,6 @@ BrowserGlue.prototype = {
|
|||
|
||||
// All initial windows have opened.
|
||||
_onWindowsRestored: function BG__onWindowsRestored() {
|
||||
if (AppConstants.MOZ_DEV_EDITION) {
|
||||
this._createExtraDefaultProfile();
|
||||
}
|
||||
|
||||
this._initServiceDiscovery();
|
||||
|
||||
// Show update notification, if needed.
|
||||
|
|
@ -1193,40 +1176,6 @@ BrowserGlue.prototype = {
|
|||
E10SAccessibilityCheck.onWindowsRestored();
|
||||
},
|
||||
|
||||
_createExtraDefaultProfile: function () {
|
||||
if (!AppConstants.MOZ_DEV_EDITION) {
|
||||
return;
|
||||
}
|
||||
// If Developer Edition is the only installed Firefox version and no other
|
||||
// profiles are present, create a second one for use by other versions.
|
||||
// This helps Firefox versions earlier than 35 avoid accidentally using the
|
||||
// unsuitable Developer Edition profile.
|
||||
let profileService = Cc["@mozilla.org/toolkit/profile-service;1"]
|
||||
.getService(Ci.nsIToolkitProfileService);
|
||||
let profileCount = profileService.profileCount;
|
||||
if (profileCount == 1 && profileService.selectedProfile.name != "default") {
|
||||
let newProfile;
|
||||
try {
|
||||
newProfile = profileService.createProfile(null, "default");
|
||||
profileService.defaultProfile = newProfile;
|
||||
profileService.flush();
|
||||
} catch (e) {
|
||||
Cu.reportError("Could not create profile 'default': " + e);
|
||||
}
|
||||
if (newProfile) {
|
||||
// We don't want a default profile with Developer Edition settings, an
|
||||
// empty profile directory will do. The profile service of the other
|
||||
// Firefox will populate it with its own stuff.
|
||||
let newProfilePath = newProfile.rootDir.path;
|
||||
OS.File.removeDir(newProfilePath).then(() => {
|
||||
return OS.File.makeDir(newProfilePath);
|
||||
}).then(null, e => {
|
||||
Cu.reportError("Could not empty profile 'default': " + e);
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_onQuitRequest: function BG__onQuitRequest(aCancelQuit, aQuitType) {
|
||||
// If user has already dismissed quit request, then do nothing
|
||||
if ((aCancelQuit instanceof Ci.nsISupportsPRBool) && aCancelQuit.data)
|
||||
|
|
@ -1981,14 +1930,8 @@ BrowserGlue.prototype = {
|
|||
defaultThemeSelected = Services.prefs.getCharPref("general.skins.selectedSkin") == "classic/1.0";
|
||||
} catch (e) {}
|
||||
|
||||
// If we are on the devedition channel, the devedition theme is on by
|
||||
// default. But we need to handle the case where they didn't want it
|
||||
// applied, and unapply the theme.
|
||||
let userChoseToNotUseDeveditionTheme =
|
||||
!defaultThemeSelected ||
|
||||
(lightweightThemeSelected && selectedThemeID != "firefox-devedition@mozilla.org");
|
||||
|
||||
if (userChoseToNotUseDeveditionTheme && selectedThemeID == "firefox-devedition@mozilla.org") {
|
||||
// If we have the dev edition theme selected, reset it.
|
||||
if (selectedThemeID == "firefox-devedition@mozilla.org") {
|
||||
Services.prefs.setCharPref("lightweightThemes.selectedThemeID", "");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -461,7 +461,11 @@ PlacesController.prototype = {
|
|||
if (parentNode) {
|
||||
if (PlacesUtils.nodeIsTagQuery(parentNode))
|
||||
nodeData["tagChild"] = true;
|
||||
else if (this.hasCachedLivemarkInfo(parentNode))
|
||||
}
|
||||
} else {
|
||||
var parentNode = node.parent;
|
||||
if (parentNode) {
|
||||
if (this.hasCachedLivemarkInfo(parentNode))
|
||||
nodeData["livemarkChild"] = true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -198,7 +198,7 @@
|
|||
accesskey="&cmd.delete.accesskey;"
|
||||
closemenu="single"
|
||||
selection="link"
|
||||
forcehideselection="bookmark"/>
|
||||
forcehideselection="bookmark|livemarkChild"/>
|
||||
<menuitem id="placesContext_deleteHost"
|
||||
command="placesCmd_deleteDataHost"
|
||||
label="&cmd.deleteDomainData.label;"
|
||||
|
|
@ -207,7 +207,7 @@
|
|||
selection="link|host"
|
||||
selectiontype="single"
|
||||
hideifprivatebrowsing="true"
|
||||
forcehideselection="bookmark"/>
|
||||
forcehideselection="bookmark|livemarkChild"/>
|
||||
<menuseparator id="placesContext_deleteSeparator"/>
|
||||
<menuitem id="placesContext_sortBy:name"
|
||||
command="placesCmd_sortBy:name"
|
||||
|
|
|
|||
|
|
@ -78,18 +78,6 @@ var gMainPane = {
|
|||
setEventListener("chooseFolder", "command",
|
||||
gMainPane.chooseFolder);
|
||||
|
||||
if (AppConstants.MOZ_DEV_EDITION) {
|
||||
let uAppData = OS.Constants.Path.userApplicationDataDir;
|
||||
let ignoreSeparateProfile = OS.Path.join(uAppData, "ignore-dev-edition-profile");
|
||||
|
||||
setEventListener("separateProfileMode", "command", gMainPane.separateProfileModeChange);
|
||||
let separateProfileModeCheckbox = document.getElementById("separateProfileMode");
|
||||
setEventListener("getStarted", "click", gMainPane.onGetStarted);
|
||||
|
||||
OS.File.stat(ignoreSeparateProfile).then(() => separateProfileModeCheckbox.checked = false,
|
||||
() => separateProfileModeCheckbox.checked = true);
|
||||
}
|
||||
|
||||
// Notify observers that the UI is now ready
|
||||
Components.classes["@mozilla.org/observer-service;1"]
|
||||
.getService(Components.interfaces.nsIObserverService)
|
||||
|
|
@ -101,71 +89,6 @@ var gMainPane = {
|
|||
// **STUB**
|
||||
},
|
||||
|
||||
separateProfileModeChange: function ()
|
||||
{
|
||||
if (AppConstants.MOZ_DEV_EDITION) {
|
||||
function quitApp() {
|
||||
Services.startup.quit(Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestartNotSameProfile);
|
||||
}
|
||||
function revertCheckbox(error) {
|
||||
separateProfileModeCheckbox.checked = !separateProfileModeCheckbox.checked;
|
||||
if (error) {
|
||||
Cu.reportError("Failed to toggle separate profile mode: " + error);
|
||||
}
|
||||
}
|
||||
function createOrRemoveSpecialDevEditionFile(onSuccess) {
|
||||
let uAppData = OS.Constants.Path.userApplicationDataDir;
|
||||
let ignoreSeparateProfile = OS.Path.join(uAppData, "ignore-dev-edition-profile");
|
||||
|
||||
if (separateProfileModeCheckbox.checked) {
|
||||
OS.File.remove(ignoreSeparateProfile).then(onSuccess, revertCheckbox);
|
||||
} else {
|
||||
OS.File.writeAtomic(ignoreSeparateProfile, new Uint8Array()).then(onSuccess, revertCheckbox);
|
||||
}
|
||||
}
|
||||
|
||||
let separateProfileModeCheckbox = document.getElementById("separateProfileMode");
|
||||
let button_index = confirmRestartPrompt(separateProfileModeCheckbox.checked,
|
||||
0, false, true);
|
||||
switch (button_index) {
|
||||
case CONFIRM_RESTART_PROMPT_CANCEL:
|
||||
revertCheckbox();
|
||||
return;
|
||||
case CONFIRM_RESTART_PROMPT_RESTART_NOW:
|
||||
const Cc = Components.classes, Ci = Components.interfaces;
|
||||
let cancelQuit = Cc["@mozilla.org/supports-PRBool;1"]
|
||||
.createInstance(Ci.nsISupportsPRBool);
|
||||
Services.obs.notifyObservers(cancelQuit, "quit-application-requested",
|
||||
"restart");
|
||||
if (!cancelQuit.data) {
|
||||
createOrRemoveSpecialDevEditionFile(quitApp);
|
||||
return;
|
||||
}
|
||||
|
||||
// Revert the checkbox in case we didn't quit
|
||||
revertCheckbox();
|
||||
return;
|
||||
case CONFIRM_RESTART_PROMPT_RESTART_LATER:
|
||||
createOrRemoveSpecialDevEditionFile();
|
||||
return;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
onGetStarted: function (aEvent) {
|
||||
if (AppConstants.MOZ_DEV_EDITION) {
|
||||
const Cc = Components.classes, Ci = Components.interfaces;
|
||||
let wm = Cc["@mozilla.org/appshell/window-mediator;1"]
|
||||
.getService(Ci.nsIWindowMediator);
|
||||
let win = wm.getMostRecentWindow("navigator:browser");
|
||||
|
||||
if (win) {
|
||||
let accountsTab = win.gBrowser.addTab("about:accounts?action=signin&entrypoint=dev-edition-setup");
|
||||
win.gBrowser.selectedTab = accountsTab;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// HOME PAGE
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -112,17 +112,6 @@
|
|||
hidden="true">
|
||||
<caption><label>&startup.label;</label></caption>
|
||||
|
||||
#ifdef MOZ_DEV_EDITION
|
||||
<vbox id="separateProfileBox">
|
||||
<checkbox id="separateProfileMode"
|
||||
label="&separateProfileMode.label;"/>
|
||||
<hbox align="center" class="indent">
|
||||
<label id="useFirefoxSync">&useFirefoxSync.label;</label>
|
||||
<label id="getStarted" class="text-link">&getStarted.label;</label>
|
||||
</hbox>
|
||||
</vbox>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SHELL_SERVICE
|
||||
<vbox id="defaultBrowserBox">
|
||||
<hbox align="center">
|
||||
|
|
|
|||
|
|
@ -304,16 +304,6 @@ var ProcessHangMonitor = {
|
|||
}
|
||||
}];
|
||||
|
||||
if (AppConstants.MOZ_DEV_EDITION && report.hangType == report.SLOW_SCRIPT) {
|
||||
buttons.push({
|
||||
label: bundle.getString("processHang.button_debug.label"),
|
||||
accessKey: bundle.getString("processHang.button_debug.accessKey"),
|
||||
callback: function() {
|
||||
ProcessHangMonitor.debugScript(win);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
nb.appendNotification(bundle.getString("processHang.label"),
|
||||
"process-hang",
|
||||
"chrome://browser/skin/slowStartup-16.png",
|
||||
|
|
|
|||
|
|
@ -1,106 +0,0 @@
|
|||
% 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/devedition.inc.css
|
||||
|
||||
:root {
|
||||
--forwardbutton-width: 29px;
|
||||
}
|
||||
|
||||
:root[devtoolstheme="light"] {
|
||||
--urlbar-dropmarker-url: url("chrome://browser/skin/devedition/urlbar-history-dropmarker.svg");
|
||||
--urlbar-dropmarker-region: rect(0px, 11px, 14px, 0px);
|
||||
--urlbar-dropmarker-hover-region: rect(0, 22px, 14px, 11px);
|
||||
--urlbar-dropmarker-active-region: rect(0px, 33px, 14px, 22px);
|
||||
--urlbar-dropmarker-2x-url: url("chrome://browser/skin/devedition/urlbar-history-dropmarker.svg");
|
||||
--urlbar-dropmarker-2x-region: rect(0px, 11px, 14px, 0px);
|
||||
--urlbar-dropmarker-hover-2x-region: rect(0, 22px, 14px, 11px);
|
||||
--urlbar-dropmarker-active-2x-region: rect(0px, 33px, 14px, 22px);
|
||||
}
|
||||
|
||||
:root[devtoolstheme="dark"] .findbar-closebutton:not(:hover),
|
||||
:root[devtoolstheme="dark"] #sidebar-header > .close-icon:not(:hover),
|
||||
.tab-close-button[selected]:not(:hover) {
|
||||
background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 80, 16, 64);
|
||||
}
|
||||
|
||||
/* The menubar and tabs toolbar should match the devedition theme */
|
||||
#TabsToolbar,
|
||||
#toolbar-menubar {
|
||||
-moz-appearance: none !important;
|
||||
}
|
||||
#main-menubar {
|
||||
color: var(--chrome-color);
|
||||
}
|
||||
#main-menubar > menu:not([open]) {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
/* Allow buttons with -moz-appearance set to look normal on hover and open states */
|
||||
#navigator-toolbox .toolbarbutton-1:-moz-any(:hover, [open="true"]),
|
||||
#PlacesToolbar toolbarbutton.bookmark-item:-moz-any(:hover, [open="true"]) {
|
||||
color: initial;
|
||||
}
|
||||
|
||||
/* Square back and forward buttons */
|
||||
#back-button > .toolbarbutton-icon,
|
||||
#forward-button > .toolbarbutton-icon {
|
||||
margin: 0;
|
||||
border: 1px solid var(--chrome-nav-bar-controls-border-color);
|
||||
padding: 2px 5px;
|
||||
background: var(--chrome-nav-buttons-background);
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
#forward-button > .toolbarbutton-icon {
|
||||
border-inline-start: none;
|
||||
}
|
||||
|
||||
/* Override a box shadow for disabled back button */
|
||||
#main-window:not([customizing]) #back-button[disabled] > .toolbarbutton-icon {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
#back-button:hover:not([disabled="true"]) > .toolbarbutton-icon,
|
||||
#forward-button:hover:not([disabled="true"]) > .toolbarbutton-icon {
|
||||
background: var(--chrome-nav-buttons-hover-background) !important;
|
||||
}
|
||||
|
||||
#back-button > .toolbarbutton-icon {
|
||||
border-radius: 2px 0 0 2px !important;
|
||||
}
|
||||
|
||||
.urlbar-history-dropmarker {
|
||||
-moz-appearance: none;
|
||||
padding: 0 3px;
|
||||
list-style-image: var(--urlbar-dropmarker-url);
|
||||
-moz-image-region: var(--urlbar-dropmarker-region);
|
||||
}
|
||||
|
||||
/* Add the proper background for tab overflow */
|
||||
#alltabs-button,
|
||||
#new-tab-button {
|
||||
background: var(--chrome-background-color);
|
||||
}
|
||||
|
||||
#new-tab-button:hover > .toolbarbutton-icon {
|
||||
border-color: transparent !important;
|
||||
}
|
||||
|
||||
/* Prevent double border below tabs toolbar */
|
||||
#TabsToolbar:not([collapsed="true"]) + #nav-bar {
|
||||
border-top-width: 0 !important;
|
||||
}
|
||||
|
||||
/* Fix the bad-looking text-shadow in the sidebar header: */
|
||||
.sidebar-header,
|
||||
#sidebar-header {
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
.ac-type-icon {
|
||||
/* Left-align the type icon in awesomebar popup results with the icon in the
|
||||
urlbar. */
|
||||
margin-inline-start: 11px;
|
||||
}
|
||||
|
|
@ -13,7 +13,6 @@ browser.jar:
|
|||
#endif
|
||||
skin/classic/browser/actionicon-tab.png
|
||||
* skin/classic/browser/browser.css
|
||||
* skin/classic/browser/devedition.css
|
||||
* skin/classic/browser/browser-lightweightTheme.css
|
||||
skin/classic/browser/click-to-play-warning-stripes.png
|
||||
skin/classic/browser/Info.png
|
||||
|
|
|
|||
|
|
@ -1,121 +0,0 @@
|
|||
% 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/devedition.inc.css
|
||||
|
||||
:root {
|
||||
--forwardbutton-width: 32px;
|
||||
}
|
||||
|
||||
/* Use only 1px separator between nav toolbox and page content */
|
||||
#navigator-toolbox::after {
|
||||
border-top-style: none;
|
||||
margin-top: -1px;
|
||||
}
|
||||
|
||||
/* Include extra space on left/right for dragging since there is no space above
|
||||
the tabs */
|
||||
#main-window[tabsintitlebar] #TabsToolbar {
|
||||
padding-left: 50px;
|
||||
padding-right: 50px;
|
||||
margin-bottom: 0; /* Don't overlap the inner highlight at the top of the nav-bar */
|
||||
}
|
||||
|
||||
/* Get rid of 1px bright strip at the top of window */
|
||||
#main-window[tabsintitlebar] #titlebar-content {
|
||||
background: var(--chrome-background-color);
|
||||
}
|
||||
|
||||
/* Resize things so that the native titlebar is in line with the tabs */
|
||||
#main-window[tabsintitlebar] > #titlebar > #titlebar-content > #titlebar-buttonbox-container,
|
||||
#main-window[tabsintitlebar] > #titlebar > #titlebar-content > #titlebar-secondary-buttonbox > #titlebar-fullscreen-button {
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
/* Square back and forward buttons. Need !important on these because there
|
||||
are a lot of more specific selectors sprinkled around elsewhere for changing
|
||||
background / shadows for different states */
|
||||
#back-button,
|
||||
#forward-button {
|
||||
height: 24px !important;
|
||||
box-shadow: none !important;
|
||||
border: 1px solid var(--chrome-nav-bar-controls-border-color) !important;
|
||||
background: var(--chrome-nav-buttons-background) !important;
|
||||
}
|
||||
|
||||
#forward-button {
|
||||
border-inline-start: none !important;
|
||||
/* browser.css and friends set up the width of the button to be 32px.
|
||||
* They then set margin-left to -2px to ensure the button is not too wide
|
||||
* compared to the back button, and set padding-left to center the icon
|
||||
* correctly.
|
||||
* In our theme, the back and forward buttons are the same width, with the
|
||||
* back button being 32px with 1px border on both sides. To ensure the
|
||||
* forward button's content box looks like it is the same size with width
|
||||
* set to 32px and a 1px border on only 1 side, we overlap by 1px, so both
|
||||
* buttons end up with a content box that looks like it's 30px.
|
||||
*/
|
||||
margin-left: -1px;
|
||||
padding-left: 1px;
|
||||
}
|
||||
|
||||
#forward-button > .toolbarbutton-icon {
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
#back-button:hover:not([disabled="true"]),
|
||||
#forward-button:hover:not([disabled="true"]) {
|
||||
background: var(--chrome-nav-buttons-hover-background) !important;
|
||||
}
|
||||
|
||||
#back-button {
|
||||
border-radius: 3px 0 0 3px !important;
|
||||
padding: 0 !important;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
#back-button:hover:active:not([disabled="true"]) {
|
||||
-moz-image-region: rect(18px, 54px, 36px, 36px);
|
||||
}
|
||||
|
||||
/* Use smaller back button icon */
|
||||
@media (min-resolution: 2dppx) {
|
||||
#back-button:hover:active:not([disabled="true"]) {
|
||||
-moz-image-region: rect(36px, 108px, 72px, 72px);
|
||||
}
|
||||
}
|
||||
|
||||
/* Don't use the default background for tabs toolbar */
|
||||
#TabsToolbar {
|
||||
-moz-appearance: none !important;
|
||||
}
|
||||
|
||||
/* Prevent the hover styling from on the identity icon from overlapping the
|
||||
urlbar border. */
|
||||
#identity-box {
|
||||
margin-top: -1px !important;
|
||||
margin-bottom: -1px !important;
|
||||
padding-top: 3px !important;
|
||||
padding-bottom: 3px !important;
|
||||
}
|
||||
|
||||
:root[devtoolstheme="dark"] .findbar-closebutton:not(:hover),
|
||||
/* Tab styling - make sure to use an inverted icon for the selected tab
|
||||
(brighttext only covers the unselected tabs) */
|
||||
.tab-close-button[selected=true]:not(:hover) {
|
||||
-moz-image-region: rect(0, 64px, 16px, 48px);
|
||||
}
|
||||
@media (min-resolution: 2dppx) {
|
||||
:root[devtoolstheme="dark"] .findbar-closebutton:not(:hover),
|
||||
.tab-close-button[selected=true]:not(:hover) {
|
||||
-moz-image-region: rect(0, 128px, 32px, 96px);
|
||||
}
|
||||
}
|
||||
|
||||
.ac-type-icon {
|
||||
/* Left-align the type icon in awesomebar popup results with the icon in the
|
||||
urlbar. */
|
||||
margin-inline-start: 14px;
|
||||
}
|
||||
|
|
@ -13,7 +13,6 @@ browser.jar:
|
|||
skin/classic/browser/actionicon-tab.png
|
||||
skin/classic/browser/actionicon-tab@2x.png
|
||||
* skin/classic/browser/browser.css
|
||||
* skin/classic/browser/devedition.css
|
||||
* skin/classic/browser/browser-lightweightTheme.css
|
||||
skin/classic/browser/click-to-play-warning-stripes.png
|
||||
skin/classic/browser/Info.png
|
||||
|
|
|
|||
|
|
@ -1,311 +0,0 @@
|
|||
% 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/.
|
||||
|
||||
/* devedition.css is loaded in browser.xul after browser.css when it is
|
||||
preffed on. The bulk of the styling is here in the shared file, but
|
||||
there are overrides for each platform in their devedition.css files. */
|
||||
|
||||
:root {
|
||||
--tab-toolbar-navbar-overlap: 0px;
|
||||
--navbar-tab-toolbar-highlight-overlap: 0px;
|
||||
--space-above-tabbar: 0px;
|
||||
--toolbarbutton-text-shadow: none;
|
||||
--backbutton-urlbar-overlap: 0px;
|
||||
}
|
||||
|
||||
:root[devtoolstheme="dark"] {
|
||||
/* Chrome */
|
||||
--chrome-background-color: #272b35;
|
||||
--chrome-color: #F5F7FA;
|
||||
--chrome-secondary-background-color: #393F4C;
|
||||
--chrome-navigator-toolbox-separator-color: rgba(0,0,0,.2);
|
||||
--chrome-nav-bar-separator-color: rgba(0,0,0,.2);
|
||||
--chrome-nav-buttons-background: #252C33;
|
||||
--chrome-nav-buttons-hover-background: #1B2127;
|
||||
--chrome-nav-bar-controls-border-color: #1D2328;
|
||||
--chrome-selection-color: #fff;
|
||||
--chrome-selection-background-color: #5675B9;
|
||||
|
||||
/* Tabs */
|
||||
--tabs-toolbar-color: #F5F7FA;
|
||||
--tab-background-color: #272b35;
|
||||
--tab-hover-background-color: #07090a;
|
||||
--tab-selection-color: #f5f7fa;
|
||||
--tab-selection-background-color: #5675B9;
|
||||
--tab-selection-box-shadow: none;
|
||||
--pinned-tab-glow: radial-gradient(22px at center calc(100% - 2px), rgba(76,158,217,0.9) 13%, rgba(0,0,0,0.4) 16%, transparent 70%);
|
||||
|
||||
/* Url and search bars */
|
||||
--url-and-searchbar-background-color: #171B1F;
|
||||
--urlbar-separator-color: #5F6670;
|
||||
--urlbar-dropmarker-url: url("chrome://browser/skin/devedition/urlbar-history-dropmarker.svg");
|
||||
--urlbar-dropmarker-region: rect(0px, 11px, 14px, 0px);
|
||||
--urlbar-dropmarker-hover-region: rect(0, 22px, 14px, 11px);
|
||||
--urlbar-dropmarker-active-region: rect(0px, 33px, 14px, 22px);
|
||||
--urlbar-dropmarker-2x-url: url("chrome://browser/skin/devedition/urlbar-history-dropmarker.svg");
|
||||
--urlbar-dropmarker-2x-region: rect(0px, 11px, 14px, 0px);
|
||||
--urlbar-dropmarker-hover-2x-region: rect(0, 22px, 14px, 11px);
|
||||
--urlbar-dropmarker-active-2x-region: rect(0px, 33px, 14px, 22px);
|
||||
}
|
||||
|
||||
/* Override the lwtheme-specific styling for toolbar buttons */
|
||||
:root[devtoolstheme="dark"],
|
||||
:root[devtoolstheme="dark"] toolbar:-moz-lwtheme {
|
||||
--toolbarbutton-hover-background: rgba(25,33, 38,.6) linear-gradient(rgba(25,33,38,.6), rgba(25,33,38,.6)) padding-box;
|
||||
--toolbarbutton-hover-boxshadow: none;
|
||||
--toolbarbutton-hover-bordercolor: rgba(25,33,38,.6);
|
||||
--toolbarbutton-active-background: rgba(25,33,38,1) linear-gradient(rgba(25,33,38,1), rgba(25,33,38,1)) border-box;
|
||||
--toolbarbutton-active-boxshadow: none;
|
||||
--toolbarbutton-active-bordercolor: rgba(25,33,38,.8);
|
||||
--toolbarbutton-checkedhover-backgroundcolor: #3C5283;
|
||||
|
||||
}
|
||||
|
||||
:root[devtoolstheme="light"] {
|
||||
--url-and-searchbar-background-color: #fff;
|
||||
|
||||
--chrome-background-color: #E3E4E6;
|
||||
--chrome-color: #18191a;
|
||||
--chrome-secondary-background-color: #f5f6f7;
|
||||
--chrome-navigator-toolbox-separator-color: #cccccc;
|
||||
--chrome-nav-bar-separator-color: #B6B6B8;
|
||||
--chrome-nav-buttons-background: #ffffff; /* --theme-body-background */
|
||||
--chrome-nav-buttons-hover-background: #DADBDB;
|
||||
--chrome-nav-bar-controls-border-color: #ccc;
|
||||
--chrome-selection-color: #f5f7fa;
|
||||
--chrome-selection-background-color: #4c9ed9;
|
||||
|
||||
--tab-background-color: #E3E4E6;
|
||||
--tab-hover-background-color: #D7D8DA;
|
||||
--tab-selection-color: #f5f7fa;
|
||||
--tab-selection-background-color: #4c9ed9;
|
||||
--tab-selection-box-shadow: none;
|
||||
--pinned-tab-glow: radial-gradient(22px at center calc(100% - 2px), rgba(76,158,217,0.9) 13%, transparent 16%);
|
||||
}
|
||||
|
||||
/* Override the lwtheme-specific styling for toolbar buttons */
|
||||
:root[devtoolstheme="light"],
|
||||
:root[devtoolstheme="light"] toolbar:-moz-lwtheme {
|
||||
--toolbarbutton-hover-background: #eaeaea;
|
||||
--toolbarbutton-hover-boxshadow: none;
|
||||
--toolbarbutton-hover-bordercolor: rgba(0,0,0,0.1);
|
||||
--toolbarbutton-active-background: #d7d7d8 border-box;
|
||||
--toolbarbutton-active-boxshadow: none;
|
||||
--toolbarbutton-active-bordercolor: rgba(0,0,0,0.15);
|
||||
--toolbarbutton-checkedhover-backgroundcolor: #d7d7d8;
|
||||
}
|
||||
|
||||
/* Give some space to drag the window around while customizing
|
||||
(normal space to left and right of tabs doesn't work in this case) */
|
||||
#main-window[tabsintitlebar][customizing] {
|
||||
--space-above-tabbar: 9px;
|
||||
}
|
||||
|
||||
/* Override @tabCurveHalfWidth@ and @tabCurveWidth@. XXX: Switch to a CSS variable once the perf is sorted out - bug 1088771 */
|
||||
.tab-background-middle {
|
||||
border-left-width: 0;
|
||||
border-right-width: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.tab-background,
|
||||
.tabs-newtab-button {
|
||||
margin-inline-end: 0;
|
||||
margin-inline-start: 0;
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .arrowscrollbox-scrollbox {
|
||||
padding-inline-end: 0;
|
||||
padding-inline-start: 0;
|
||||
}
|
||||
|
||||
.tab-background-start[selected=true]::after,
|
||||
.tab-background-start[selected=true]::before,
|
||||
.tab-background-start,
|
||||
.tab-background-end,
|
||||
.tab-background-end[selected=true]::after,
|
||||
.tab-background-end[selected=true]::before {
|
||||
width: 0;
|
||||
}
|
||||
|
||||
.tab-background-start[selected=true]::after,
|
||||
.tab-background-end[selected=true]::after {
|
||||
margin-inline-start: 0;
|
||||
}
|
||||
/* End override @tabCurveHalfWidth@ and @tabCurveWidth@ */
|
||||
|
||||
#urlbar ::-moz-selection,
|
||||
#navigator-toolbox .searchbar-textbox ::-moz-selection,
|
||||
.browserContainer > findbar ::-moz-selection {
|
||||
background-color: var(--chrome-selection-background-color);
|
||||
color: var(--chrome-selection-color);
|
||||
}
|
||||
|
||||
/* Change the base colors for the browser chrome */
|
||||
|
||||
#tabbrowser-tabs,
|
||||
#TabsToolbar,
|
||||
#browser-panel {
|
||||
background: var(--chrome-background-color);
|
||||
color: var(--chrome-color);
|
||||
}
|
||||
|
||||
#navigator-toolbox:-moz-lwtheme::after {
|
||||
border-bottom-color: var(--chrome-navigator-toolbox-separator-color);
|
||||
}
|
||||
|
||||
#navigator-toolbox > toolbar:not(#TabsToolbar):not(#toolbar-menubar),
|
||||
.browserContainer > findbar,
|
||||
#browser-bottombox {
|
||||
background-color: var(--chrome-secondary-background-color) !important;
|
||||
background-image: none !important;
|
||||
color: var(--chrome-color);
|
||||
}
|
||||
|
||||
/* Default findbar text color doesn't look good - Bug 1125677 */
|
||||
.browserContainer > findbar .findbar-find-status,
|
||||
.browserContainer > findbar .found-matches {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
#navigator-toolbox .toolbarbutton-1,
|
||||
.browserContainer > findbar .findbar-button,
|
||||
#PlacesToolbar toolbarbutton.bookmark-item {
|
||||
color: var(--chrome-color);
|
||||
text-shadow: var(--toolbarbutton-text-shadow);
|
||||
}
|
||||
|
||||
/* Using toolbar[brighttext] instead of important to override linux */
|
||||
toolbar[brighttext] #downloads-indicator-counter {
|
||||
text-shadow: var(--toolbarbutton-text-shadow);
|
||||
color: var(--chrome-color);
|
||||
}
|
||||
|
||||
#TabsToolbar {
|
||||
text-shadow: none !important;
|
||||
}
|
||||
|
||||
/* URL bar and search bar*/
|
||||
#urlbar,
|
||||
#navigator-toolbox .searchbar-textbox {
|
||||
background-color: var(--url-and-searchbar-background-color) !important;
|
||||
background-image: none !important;
|
||||
color: inherit !important;
|
||||
border: 1px solid var(--chrome-nav-bar-controls-border-color) !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
%filter substitution
|
||||
%define selectorPrefix :root[devtoolstheme="dark"]
|
||||
%define selectorSuffix :-moz-lwtheme
|
||||
%define iconVariant -white
|
||||
%include identity-block/icons.inc.css
|
||||
|
||||
#urlbar {
|
||||
border-inline-start: none !important;
|
||||
opacity: 1 !important;
|
||||
}
|
||||
|
||||
window:not([chromehidden~="toolbar"]) #urlbar-wrapper {
|
||||
overflow: -moz-hidden-unscrollable;
|
||||
clip-path: none;
|
||||
margin-inline-start: 0;
|
||||
}
|
||||
|
||||
:root[devtoolstheme="dark"] #urlbar-zoom-button:hover {
|
||||
background-color: rgba(255,255,255,.2);
|
||||
}
|
||||
|
||||
:root[devtoolstheme="dark"] #urlbar-zoom-button:hover:active {
|
||||
background-color: rgba(255,255,255,.3);
|
||||
}
|
||||
|
||||
/* Nav bar specific stuff */
|
||||
#nav-bar {
|
||||
margin-top: 0 !important;
|
||||
border-top: none !important;
|
||||
border-bottom: none !important;
|
||||
border-radius: 0 !important;
|
||||
box-shadow: 0 -1px var(--chrome-nav-bar-separator-color) !important;
|
||||
}
|
||||
|
||||
/* No extra vertical padding for nav bar */
|
||||
#nav-bar-customization-target,
|
||||
#nav-bar {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
/* Use smaller back button icon */
|
||||
#back-button {
|
||||
-moz-image-region: rect(0, 54px, 18px, 36px);
|
||||
}
|
||||
|
||||
@media (min-resolution: 1.1dppx) {
|
||||
#back-button {
|
||||
-moz-image-region: rect(0, 108px, 36px, 72px);
|
||||
}
|
||||
}
|
||||
|
||||
.tab-background {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
/* Tab separators */
|
||||
.tabbrowser-tab::after,
|
||||
.tabbrowser-tab::before {
|
||||
background: currentColor;
|
||||
opacity: 0.2 !important;
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down,
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up {
|
||||
background-color: var(--tab-background-color);
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.tabbrowser-tab {
|
||||
/* We normally rely on other tab elements for pointer events, but this
|
||||
theme hides those so we need it set here instead */
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
.tabbrowser-tab:-moz-any([image], [pinned]) > .tab-stack > .tab-content[attention]:not([selected="true"]),
|
||||
.tabbrowser-tab > .tab-stack > .tab-content[pinned][titlechanged]:not([selected="true"]) {
|
||||
background-image: var(--pinned-tab-glow);
|
||||
background-position: center;
|
||||
background-size: 100%;
|
||||
}
|
||||
|
||||
.tabbrowser-tab[image] > .tab-stack > .tab-content[attention]:not([pinned]):not([selected="true"]) {
|
||||
background-position: left bottom var(--tab-toolbar-navbar-overlap);
|
||||
background-size: 34px 100%;
|
||||
}
|
||||
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down:not([disabled]):hover,
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up:not([disabled]):hover,
|
||||
.tabbrowser-tab:hover {
|
||||
background-color: var(--tab-hover-background-color);
|
||||
}
|
||||
|
||||
.tabbrowser-tab[visuallyselected] {
|
||||
color: var(--tab-selection-color) !important; /* Override color: inherit */
|
||||
background-color: var(--tab-selection-background-color);
|
||||
}
|
||||
|
||||
.tab-icon-sound[soundplaying],
|
||||
.tab-icon-sound[muted] {
|
||||
filter: url(chrome://browser/skin/filters.svg#fill) !important; /* removes drop-shadow filter */
|
||||
}
|
||||
|
||||
/* Don't need space for the tab curves (66px - 30px) */
|
||||
.tabs-newtab-button {
|
||||
width: 36px;
|
||||
}
|
||||
|
||||
.tabs-newtab-button:hover {
|
||||
/* Important needed because !important is used in browser.css */
|
||||
background-color: var(--tab-hover-background-color) !important;
|
||||
background-image: none;
|
||||
}
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
<!-- 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/. -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="33" height="14" viewBox="0 0 33 14">
|
||||
<defs>
|
||||
<polygon points="0,0 5.5,7 11,0" id="dropmarker-shape"/>
|
||||
</defs>
|
||||
<style>
|
||||
use {
|
||||
fill: #b6babf;
|
||||
}
|
||||
.hover {
|
||||
fill: #61bdeb;
|
||||
}
|
||||
.active {
|
||||
fill: #39ace6;
|
||||
}
|
||||
</style>
|
||||
<use xlink:href="#dropmarker-shape" style="transform: translate(0, 4px)"/>
|
||||
<use xlink:href="#dropmarker-shape" style="transform: translate(11px, 4px)" class="hover"/>
|
||||
<use xlink:href="#dropmarker-shape" style="transform: translate(22px, 4px)" class="active"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 831 B |
|
|
@ -139,6 +139,5 @@
|
|||
skin/classic/browser/privatebrowsing/private-browsing.svg (../shared/privatebrowsing/private-browsing.svg)
|
||||
skin/classic/browser/privatebrowsing/tracking-protection-off.svg (../shared/privatebrowsing/tracking-protection-off.svg)
|
||||
skin/classic/browser/privatebrowsing/tracking-protection.svg (../shared/privatebrowsing/tracking-protection.svg)
|
||||
skin/classic/browser/devedition/urlbar-history-dropmarker.svg (../shared/devedition/urlbar-history-dropmarker.svg)
|
||||
skin/classic/browser/urlbar-star.svg (../shared/urlbar-star.svg)
|
||||
skin/classic/browser/urlbar-tab.svg (../shared/urlbar-tab.svg)
|
||||
|
|
|
|||
|
|
@ -196,9 +196,6 @@ toolbar:-moz-lwtheme {
|
|||
|
||||
@media not all and (-moz-windows-compositor),
|
||||
not all and (-moz-windows-default-theme) {
|
||||
/* Please keep the menu text colors in this media block in sync with
|
||||
* devedition.css, minus the :not(:-moz-lwtheme) condition - see Bug 1165718.
|
||||
*/
|
||||
:root[tabsintitlebar]:not([inFullscreen]):not(:-moz-lwtheme) {
|
||||
--titlebar-text-color: CaptionText;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,319 +0,0 @@
|
|||
% 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/devedition.inc.css
|
||||
|
||||
:root {
|
||||
--forwardbutton-width: 29px;
|
||||
}
|
||||
|
||||
:root[devtoolstheme="dark"],
|
||||
:root[devtoolstheme="light"] {
|
||||
/* Matches the #browser-border-start, #browser-border-end color */
|
||||
--chrome-nav-bar-separator-color: rgba(10, 31, 51, 0.35);
|
||||
}
|
||||
|
||||
/* The window background is white due to no accentcolor in the lightweight
|
||||
theme. It can't be changed to transparent when there is no compositor
|
||||
(Win XP or 7 in classic / basic theme), or else dragging and focus become
|
||||
broken. So instead just show the normal titlebar in that case, and override
|
||||
the window color as transparent when the compositor is available. */
|
||||
@media not all and (-moz-windows-compositor) {
|
||||
#main-window[tabsintitlebar] #titlebar:-moz-lwtheme {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
#main-window {
|
||||
background: var(--chrome-background-color) !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media (-moz-windows-compositor) {
|
||||
#main-window {
|
||||
background: transparent !important;
|
||||
}
|
||||
}
|
||||
|
||||
#TabsToolbar::after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#back-button > .toolbarbutton-icon,
|
||||
#forward-button > .toolbarbutton-icon {
|
||||
background: var(--chrome-nav-buttons-background) !important;
|
||||
border-radius: 0 !important;
|
||||
height: auto !important;
|
||||
padding: var(--toolbarbutton-vertical-inner-padding) 5px !important;
|
||||
margin: 0 !important;
|
||||
border: 1px solid var(--chrome-nav-bar-controls-border-color) !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
#back-button > .toolbarbutton-icon {
|
||||
/* 18px icon + 2 * 5px padding + 2 * 1px border */
|
||||
width: 30px !important;
|
||||
}
|
||||
|
||||
#forward-button > .toolbarbutton-icon {
|
||||
/* 18px icon + 2 * 5px padding + 1 * 1px border */
|
||||
width: 29px !important;
|
||||
}
|
||||
|
||||
/* the normal theme adds box-shadow: <stuff> !important when the back-button is [open]. Fix: */
|
||||
#back-button[open="true"] > .toolbarbutton-icon {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
#forward-button > .toolbarbutton-icon {
|
||||
border-inline-start: none !important;
|
||||
}
|
||||
|
||||
/* Override a box shadow for disabled back button */
|
||||
#main-window:not([customizing]) #back-button[disabled] > .toolbarbutton-icon {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
/* Override !important properties for hovered back button */
|
||||
#main-window #back-button:hover:not([disabled="true"]) > .toolbarbutton-icon,
|
||||
#main-window #forward-button:hover:not([disabled="true"]) > .toolbarbutton-icon {
|
||||
background: var(--chrome-nav-buttons-hover-background) !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
#back-button > .toolbarbutton-icon {
|
||||
border-radius: 2px 0 0 2px !important;
|
||||
}
|
||||
|
||||
#nav-bar .toolbarbutton-1:not([type=menu-button]),
|
||||
#nav-bar .toolbarbutton-1 > .toolbarbutton-menubutton-button,
|
||||
#nav-bar .toolbarbutton-1 > .toolbarbutton-menubutton-dropmarker {
|
||||
padding-top: 2px;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
|
||||
.tabbrowser-tab {
|
||||
background-color: var(--tab-background-color);
|
||||
}
|
||||
|
||||
#toolbar-menubar {
|
||||
text-shadow: none !important;
|
||||
}
|
||||
|
||||
:root[devtoolstheme="dark"] .findbar-closebutton,
|
||||
:root[devtoolstheme="dark"] #sidebar-header > .close-icon,
|
||||
/* Tab styling - make sure to use an inverted icon for the selected tab
|
||||
(brighttext only covers the unselected tabs) */
|
||||
.tab-close-button[selected=true] {
|
||||
list-style-image: url("chrome://global/skin/icons/close-inverted.png");
|
||||
}
|
||||
|
||||
@media (min-resolution: 1.1dppx) {
|
||||
:root[devtoolstheme="dark"] .findbar-closebutton,
|
||||
:root[devtoolstheme="dark"] #sidebar-header > .close-icon,
|
||||
.tab-close-button[selected=true] {
|
||||
list-style-image: url("chrome://global/skin/icons/close-inverted@2x.png");
|
||||
}
|
||||
}
|
||||
|
||||
@media (-moz-os-version: windows-xp),
|
||||
(-moz-os-version: windows-vista),
|
||||
(-moz-os-version: windows-win7),
|
||||
(-moz-os-version: windows-win8) {
|
||||
:root {
|
||||
--space-above-tabbar: 15px;
|
||||
}
|
||||
|
||||
/* It'd be nice if there was an element in the scrollbox's inner content
|
||||
that collapsed to the current width of the tabs. Since there isn't we
|
||||
need to handle overflowing and non-overflowing tabs separately.
|
||||
|
||||
In the case of overflowing tabs, set a border-top on the entire container,
|
||||
otherwise we need to set it on each element individually */
|
||||
#main-window[sizemode=normal] .tabbrowser-tabs[overflow="true"] {
|
||||
background-clip: padding-box;
|
||||
border-top: 1px solid var(--chrome-nav-bar-separator-color);
|
||||
border-inline-end: 1px solid var(--chrome-nav-bar-separator-color);
|
||||
background-color: var(--tab-background-color); /* Make sure there is no transparent gap during tab close animation */
|
||||
}
|
||||
|
||||
/* Add a border to the left of the first tab (or scroll arrow). Using .tabbrowser-tabs
|
||||
instead of #TabsToolbar because it will work even in customize mode. */
|
||||
#main-window[sizemode=normal] .tabbrowser-tabs {
|
||||
background-clip: padding-box;
|
||||
border-inline-start: 1px solid var(--chrome-nav-bar-separator-color);
|
||||
border-inline-end: 1px solid transparent;
|
||||
}
|
||||
|
||||
#main-window[sizemode=normal] .tabbrowser-tabs:not([overflow="true"]) .tabbrowser-tab,
|
||||
#main-window[sizemode=normal] .tabbrowser-tabs:not([overflow="true"]) .tabbrowser-arrowscrollbox > .scrollbutton-down,
|
||||
#main-window[sizemode=normal] .tabbrowser-tabs:not([overflow="true"]) .tabbrowser-arrowscrollbox > .scrollbutton-up,
|
||||
#main-window[sizemode=normal] .tabbrowser-tabs:not([overflow="true"]) .tabs-newtab-button {
|
||||
background-clip: padding-box;
|
||||
border-top: 1px solid var(--chrome-nav-bar-separator-color);
|
||||
}
|
||||
|
||||
/* Allow the border-top rule to take effect */
|
||||
#main-window[sizemode=normal] .tabbrowser-tabs:not([overflow="true"]) .tabbrowser-tab {
|
||||
-moz-border-top-colors: none;
|
||||
}
|
||||
|
||||
#main-window[sizemode=normal] .tabbrowser-tabs:not([overflow="true"]) .closing-tabs-spacer {
|
||||
background-clip: padding-box;
|
||||
border-inline-start: 1px solid var(--chrome-nav-bar-separator-color);
|
||||
}
|
||||
|
||||
.tabs-newtab-button {
|
||||
background: var(--tab-background-color);
|
||||
}
|
||||
|
||||
/* Use default window colors when in non-maximized mode */
|
||||
#tabbrowser-tabs,
|
||||
#TabsToolbar,
|
||||
#browser-panel,
|
||||
#titlebar-content {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
/* Ensure that the entire background is styled when maximized/fullscreen */
|
||||
#main-window:not([sizemode="normal"]):not([customizing]) #browser-panel {
|
||||
background: var(--chrome-background-color) !important;
|
||||
}
|
||||
|
||||
/* The menu items need to be visible when the entire background is styled */
|
||||
#main-window:not([sizemode="normal"]) #main-menubar {
|
||||
color: var(--chrome-color);
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
#main-window[sizemode="maximized"] #main-menubar > menu:not(:-moz-window-inactive) {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
/* Use proper menu text styling in Win7 classic mode (copied from browser.css) */
|
||||
@media not all and (-moz-windows-compositor),
|
||||
not all and (-moz-windows-default-theme) {
|
||||
:root[tabsintitlebar]:not([inFullscreen]) {
|
||||
--titlebar-text-color: CaptionText;
|
||||
}
|
||||
|
||||
:root[tabsintitlebar]:not([inFullscreen]):-moz-window-inactive {
|
||||
--titlebar-text-color: InactiveCaptionText;
|
||||
}
|
||||
|
||||
#main-window[tabsintitlebar] #main-menubar > menu {
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
/* Use less opacity than normal since this is very dark, and on top of the default toolbar color */
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up[disabled],
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down[disabled] {
|
||||
opacity: .6;
|
||||
}
|
||||
|
||||
/* Override scrollbutton gradients in normal and hover state */
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-down,
|
||||
.tabbrowser-arrowscrollbox > .scrollbutton-up {
|
||||
background-image: none !important;
|
||||
transition: none; /* scrollbutton-down has an unwanted transition on background color */
|
||||
}
|
||||
|
||||
/* Restore draggable space on the sides of tabs when maximized */
|
||||
#main-window[sizemode="maximized"] .tabbrowser-arrowscrollbox > .arrowscrollbox-scrollbox {
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
/* Override the padding that's intended to compensate for tabs that can overlap border-radius on nav-bar in default theme. */
|
||||
#main-window[sizemode=normal]:not([customizing]) #TabsToolbar {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Restored windows get an artificial border on windows, because the lwtheme background
|
||||
* overlaps the regular window border. That isn't the case for us, so we avoid painting
|
||||
* over the native border with our custom borders: */
|
||||
#browser-panel {
|
||||
/* These are !important to avoid specificity-wars with the selectors that add borders here. */
|
||||
background-image: none !important;
|
||||
border-top: none !important;
|
||||
}
|
||||
|
||||
#navigator-toolbox {
|
||||
/* The side borders on the toolbox also look out-of-place because we don't paint over
|
||||
* the native background color at all, and these are !important for the same reason as above. */
|
||||
border-left: none !important;
|
||||
border-right: none !important;
|
||||
}
|
||||
|
||||
/* Disable dragging like in the default theme: */
|
||||
#main-window[tabsintitlebar] #navigator-toolbox > toolbar:not(#toolbar-menubar):not(#TabsToolbar):-moz-lwtheme {
|
||||
-moz-window-dragging: no-drag;
|
||||
}
|
||||
|
||||
/* The sidebar header has no background now that the background of the #browser-panel
|
||||
* has no image and is transparent. Fix: */
|
||||
.sidebar-header:-moz-lwtheme,
|
||||
#sidebar-header {
|
||||
background-color: var(--chrome-background-color);
|
||||
color: var(--chrome-color);
|
||||
}
|
||||
|
||||
@media (-moz-os-version: windows-vista),
|
||||
(-moz-os-version: windows-win7),
|
||||
(-moz-os-version: windows-win8) {
|
||||
/* And then we add them back on toolbars so that they don't look borderless: */
|
||||
#main-window:not([customizing])[sizemode=normal] #navigator-toolbox::after,
|
||||
#main-window:not([customizing])[sizemode=normal] #navigator-toolbox > toolbar:not(#toolbar-menubar):not(#TabsToolbar) {
|
||||
border-left: 1px solid hsla(209,67%,12%,0.35);
|
||||
border-right: 1px solid hsla(209,67%,12%,0.35);
|
||||
}
|
||||
}
|
||||
|
||||
@media (-moz-os-version: windows-win10) {
|
||||
/* Always keep draggable space on the sides of tabs since there is no top margin on Win10 */
|
||||
#main-window .tabbrowser-arrowscrollbox > .arrowscrollbox-scrollbox {
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
/* Force white caption buttons for the dark theme on Windows 10 */
|
||||
:root[devtoolstheme="dark"] #titlebar-min {
|
||||
list-style-image: url(chrome://browser/skin/caption-buttons.svg#minimize-white);
|
||||
}
|
||||
:root[devtoolstheme="dark"] #titlebar-max {
|
||||
list-style-image: url(chrome://browser/skin/caption-buttons.svg#maximize-white);
|
||||
}
|
||||
#main-window[devtoolstheme="dark"][sizemode="maximized"] #titlebar-max {
|
||||
list-style-image: url(chrome://browser/skin/caption-buttons.svg#restore-white);
|
||||
}
|
||||
:root[devtoolstheme="dark"] #titlebar-close {
|
||||
list-style-image: url(chrome://browser/skin/caption-buttons.svg#close-white);
|
||||
}
|
||||
|
||||
/* ... and normal ones for the light theme on Windows 10 */
|
||||
:root[devtoolstheme="light"] #titlebar-min {
|
||||
list-style-image: url(chrome://browser/skin/caption-buttons.svg#minimize);
|
||||
}
|
||||
:root[devtoolstheme="light"] #titlebar-max {
|
||||
list-style-image: url(chrome://browser/skin/caption-buttons.svg#maximize);
|
||||
}
|
||||
#main-window[devtoolstheme="light"][sizemode="maximized"] #titlebar-max {
|
||||
list-style-image: url(chrome://browser/skin/caption-buttons.svg#restore);
|
||||
}
|
||||
:root[devtoolstheme="light"] #titlebar-close {
|
||||
list-style-image: url(chrome://browser/skin/caption-buttons.svg#close);
|
||||
}
|
||||
|
||||
:root[devtoolstheme="light"] #titlebar-close:hover {
|
||||
list-style-image: url(chrome://browser/skin/caption-buttons.svg#close-white);
|
||||
}
|
||||
}
|
||||
|
||||
.ac-type-icon {
|
||||
/* Left-align the type icon in awesomebar popup results with the icon in the
|
||||
urlbar. */
|
||||
margin-inline-start: 13px;
|
||||
}
|
||||
|
|
@ -14,7 +14,6 @@ browser.jar:
|
|||
skin/classic/browser/actionicon-tab@2x.png
|
||||
skin/classic/browser/actionicon-tab-XPVista7.png
|
||||
* skin/classic/browser/browser.css
|
||||
* skin/classic/browser/devedition.css
|
||||
* skin/classic/browser/browser-lightweightTheme.css
|
||||
skin/classic/browser/caption-buttons.svg
|
||||
skin/classic/browser/click-to-play-warning-stripes.png
|
||||
|
|
|
|||
|
|
@ -1,42 +0,0 @@
|
|||
/* 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/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
this.EXPORTED_SYMBOLS = ["DevEdition"];
|
||||
|
||||
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
|
||||
const THEME_ID = "firefox-devedition@mozilla.org";
|
||||
|
||||
Cu.import("resource://gre/modules/LightweightThemeManager.jsm");
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/Task.jsm");
|
||||
|
||||
this.DevEdition = {
|
||||
init(libDir) {},
|
||||
|
||||
configurations: {
|
||||
devEditionLight: {
|
||||
applyConfig: Task.async(() => {
|
||||
Services.prefs.setCharPref("devtools.theme", "light");
|
||||
LightweightThemeManager.currentTheme = LightweightThemeManager.getUsedTheme(THEME_ID);
|
||||
Services.prefs.setBoolPref("browser.devedition.theme.showCustomizeButton", true);
|
||||
}),
|
||||
},
|
||||
devEditionDark: {
|
||||
applyConfig: Task.async(() => {
|
||||
Services.prefs.setCharPref("devtools.theme", "dark");
|
||||
LightweightThemeManager.currentTheme = LightweightThemeManager.getUsedTheme(THEME_ID);
|
||||
Services.prefs.setBoolPref("browser.devedition.theme.showCustomizeButton", true);
|
||||
}),
|
||||
},
|
||||
devEditionOff: {
|
||||
applyConfig: Task.async(() => {
|
||||
Services.prefs.clearUserPref("devtools.theme");
|
||||
LightweightThemeManager.currentTheme = null;
|
||||
Services.prefs.clearUserPref("browser.devedition.theme.showCustomizeButton");
|
||||
}),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
@ -2445,16 +2445,12 @@ function BrowserOnAboutPageLoad(doc) {
|
|||
|
||||
// Inject search engine and snippets URL.
|
||||
let docElt = doc.documentElement;
|
||||
// set the following attributes BEFORE searchEngineURL, which triggers to
|
||||
// show the snippets when it's set.
|
||||
docElt.setAttribute("snippetsURL", AboutHomeUtils.snippetsURL);
|
||||
if (AboutHomeUtils.showKnowYourRights) {
|
||||
docElt.setAttribute("showKnowYourRights", "true");
|
||||
// Set pref to indicate we've shown the notification.
|
||||
let currentVersion = Services.prefs.getIntPref("browser.rights.version");
|
||||
Services.prefs.setBoolPref("browser.rights." + currentVersion + ".shown", true);
|
||||
}
|
||||
docElt.setAttribute("snippetsVersion", AboutHomeUtils.snippetsVersion);
|
||||
|
||||
function updateSearchEngine() {
|
||||
let engine = AboutHomeUtils.defaultSearchEngine;
|
||||
|
|
|
|||
|
|
@ -444,7 +444,11 @@ PlacesController.prototype = {
|
|||
if (parentNode) {
|
||||
if (PlacesUtils.nodeIsTagQuery(parentNode))
|
||||
nodeData["tagChild"] = true;
|
||||
else if (this.hasCachedLivemarkInfo(parentNode))
|
||||
}
|
||||
} else {
|
||||
var parentNode = node.parent;
|
||||
if (parentNode) {
|
||||
if (this.hasCachedLivemarkInfo(parentNode))
|
||||
nodeData["livemarkChild"] = true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -203,7 +203,7 @@
|
|||
accesskey="&cmd.delete.accesskey;"
|
||||
closemenu="single"
|
||||
selection="link"
|
||||
forcehideselection="bookmark"/>
|
||||
forcehideselection="bookmark|livemarkChild"/>
|
||||
<menuitem id="placesContext_deleteHost"
|
||||
command="placesCmd_deleteDataHost"
|
||||
label="&cmd.deleteDomainData.label;"
|
||||
|
|
@ -212,7 +212,7 @@
|
|||
selection="link|host"
|
||||
selectiontype="single"
|
||||
hideifprivatebrowsing="true"
|
||||
forcehideselection="bookmark"/>
|
||||
forcehideselection="bookmark|livemarkChild"/>
|
||||
<menuseparator id="placesContext_deleteSeparator"/>
|
||||
<menuitem id="placesContext_reload"
|
||||
command="placesCmd_reload"
|
||||
|
|
|
|||
|
|
@ -10,4 +10,4 @@
|
|||
# hardcoded milestones in the tree from these two files.
|
||||
#--------------------------------------------------------
|
||||
|
||||
4.4.0
|
||||
4.4.1
|
||||
|
|
@ -330,9 +330,7 @@ var gDevToolsBrowser = exports.gDevToolsBrowser = {
|
|||
viewId: "PanelUI-developer",
|
||||
shortcutId: "key_devToolboxMenuItem",
|
||||
tooltiptext: "developer-button.tooltiptext2",
|
||||
defaultArea: AppConstants.MOZ_DEV_EDITION ?
|
||||
CustomizableUI.AREA_NAVBAR :
|
||||
CustomizableUI.AREA_PANEL,
|
||||
defaultArea: CustomizableUI.AREA_PANEL,
|
||||
onViewShowing: function (aEvent) {
|
||||
// Populate the subview with whatever menuitems are in the developer
|
||||
// menu. We skip menu elements, because the menu panel has no way
|
||||
|
|
|
|||
|
|
@ -231,11 +231,7 @@ pref("devtools.dom.enabled", false);
|
|||
pref("devtools.webaudioeditor.inspectorWidth", 300);
|
||||
|
||||
// Default theme ("dark" or "light")
|
||||
#ifdef MOZ_DEV_EDITION
|
||||
sticky_pref("devtools.theme", "dark");
|
||||
#else
|
||||
sticky_pref("devtools.theme", "light");
|
||||
#endif
|
||||
|
||||
// Web console filters
|
||||
pref("devtools.webconsole.filter.error", true);
|
||||
|
|
@ -353,13 +349,8 @@ pref("devtools.editor.autocomplete", true);
|
|||
// version for each user.
|
||||
pref("devtools.telemetry.tools.opened.version", "{}");
|
||||
|
||||
// Enable the JSON View tool (an inspector for application/json documents) on
|
||||
// Nightly and Dev. Edition.
|
||||
#ifdef RELEASE_OR_BETA
|
||||
pref("devtools.jsonview.enabled", false);
|
||||
#else
|
||||
// Enable the JSON View tool (an inspector for application/json documents)
|
||||
pref("devtools.jsonview.enabled", true);
|
||||
#endif
|
||||
|
||||
// Enable the HTML responsive design mode for all channels.
|
||||
pref("devtools.responsive.html.enabled", true);
|
||||
|
|
|
|||
|
|
@ -112,6 +112,18 @@ public:
|
|||
_31 == 0.0 && _32 == 0.0;
|
||||
}
|
||||
|
||||
/* Returns true if the matrix is a rectilinear transformation (i.e.
|
||||
* grid-aligned rectangles are transformed to grid-aligned rectangles)
|
||||
*/
|
||||
bool IsRectilinear() const {
|
||||
if (FuzzyEqual(_12, 0) && FuzzyEqual(_21, 0)) {
|
||||
return true;
|
||||
} else if (FuzzyEqual(_22, 0) && FuzzyEqual(_11, 0)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inverts this matrix, if possible. Otherwise, the matrix is left
|
||||
* unchanged.
|
||||
|
|
|
|||
|
|
@ -202,7 +202,6 @@ public:
|
|||
|
||||
/**
|
||||
* Get a property value. This requires a linear search through
|
||||
* lookup (using the frame as the key) and a linear search through
|
||||
* the properties of the frame. If the frame has no such property,
|
||||
* returns zero-filled result, which means null for pointers and
|
||||
* zero for integers and floating point types.
|
||||
|
|
|
|||
|
|
@ -5708,7 +5708,7 @@ nsDisplayTransform::GetDeltaToTransformOrigin(const nsIFrame* aFrame,
|
|||
}
|
||||
|
||||
/* Allows us to access dimension getters by index. */
|
||||
float coords[2];
|
||||
float transformOrigin[2];
|
||||
TransformReferenceBox::DimensionGetter dimensionGetter[] =
|
||||
{ &TransformReferenceBox::Width, &TransformReferenceBox::Height };
|
||||
TransformReferenceBox::DimensionGetter offsetGetter[] =
|
||||
|
|
@ -5718,33 +5718,33 @@ nsDisplayTransform::GetDeltaToTransformOrigin(const nsIFrame* aFrame,
|
|||
/* If the transform-origin specifies a percentage, take the percentage
|
||||
* of the size of the box.
|
||||
*/
|
||||
const nsStyleCoord &coord = display->mTransformOrigin[index];
|
||||
if (coord.GetUnit() == eStyleUnit_Calc) {
|
||||
const nsStyleCoord::Calc *calc = coord.GetCalcValue();
|
||||
coords[index] =
|
||||
const nsStyleCoord &originValue = display->mTransformOrigin[index];
|
||||
if (originValue.GetUnit() == eStyleUnit_Calc) {
|
||||
const nsStyleCoord::Calc *calc = originValue.GetCalcValue();
|
||||
transformOrigin[index] =
|
||||
NSAppUnitsToFloatPixels((refBox.*dimensionGetter[index])(), aAppUnitsPerPixel) *
|
||||
calc->mPercent +
|
||||
NSAppUnitsToFloatPixels(calc->mLength, aAppUnitsPerPixel);
|
||||
} else if (coord.GetUnit() == eStyleUnit_Percent) {
|
||||
coords[index] =
|
||||
} else if (originValue.GetUnit() == eStyleUnit_Percent) {
|
||||
transformOrigin[index] =
|
||||
NSAppUnitsToFloatPixels((refBox.*dimensionGetter[index])(), aAppUnitsPerPixel) *
|
||||
coord.GetPercentValue();
|
||||
originValue.GetPercentValue();
|
||||
} else {
|
||||
MOZ_ASSERT(coord.GetUnit() == eStyleUnit_Coord, "unexpected unit");
|
||||
coords[index] =
|
||||
NSAppUnitsToFloatPixels(coord.GetCoordValue(), aAppUnitsPerPixel);
|
||||
MOZ_ASSERT(originValue.GetUnit() == eStyleUnit_Coord, "unexpected unit");
|
||||
transformOrigin[index] =
|
||||
NSAppUnitsToFloatPixels(originValue.GetCoordValue(), aAppUnitsPerPixel);
|
||||
}
|
||||
|
||||
if (aFrame->GetStateBits() & NS_FRAME_SVG_LAYOUT) {
|
||||
// SVG frames (unlike other frames) have a reference box that can be (and
|
||||
// typically is) offset from the TopLeft() of the frame. We need to
|
||||
// account for that here.
|
||||
coords[index] +=
|
||||
transformOrigin[index] +=
|
||||
NSAppUnitsToFloatPixels((refBox.*offsetGetter[index])(), aAppUnitsPerPixel);
|
||||
}
|
||||
}
|
||||
|
||||
return Point3D(coords[0], coords[1],
|
||||
return Point3D(transformOrigin[0], transformOrigin[1],
|
||||
NSAppUnitsToFloatPixels(display->mTransformOrigin[2].GetCoordValue(),
|
||||
aAppUnitsPerPixel));
|
||||
}
|
||||
|
|
@ -5917,6 +5917,17 @@ nsDisplayTransform::GetResultingTransformMatrixInternal(const FrameTransformProp
|
|||
frame && frame->IsSVGTransformed(&svgTransform, &transformFromSVGParent);
|
||||
bool hasTransformFromSVGParent =
|
||||
hasSVGTransforms && !transformFromSVGParent.IsIdentity();
|
||||
|
||||
bool shouldRound = true;
|
||||
|
||||
// An SVG frame should not have its translation rounded.
|
||||
// Note it's possible that the SVG frame doesn't have an SVG
|
||||
// transform but only has a CSS transform.
|
||||
if (frame && frame->HasAnyStateBits(NS_FRAME_SVG_LAYOUT) &&
|
||||
!(frame->GetType() == nsGkAtoms::svgOuterSVGAnonChildFrame)) {
|
||||
shouldRound = false;
|
||||
}
|
||||
|
||||
/* Transformed frames always have a transform, or are preserving 3d (and might still have perspective!) */
|
||||
if (aProperties.mTransformList) {
|
||||
result = nsStyleTransformMatrix::ReadTransforms(aProperties.mTransformList->mHead,
|
||||
|
|
@ -5994,7 +6005,7 @@ nsDisplayTransform::GetResultingTransformMatrixInternal(const FrameTransformProp
|
|||
// Otherwise we need to manually translate into our parent's coordinate
|
||||
// space.
|
||||
if (frame->IsTransformed()) {
|
||||
nsLayoutUtils::PostTranslate(result, frame->GetPosition(), aAppUnitsPerPixel, !hasSVGTransforms);
|
||||
nsLayoutUtils::PostTranslate(result, frame->GetPosition(), aAppUnitsPerPixel, shouldRound);
|
||||
}
|
||||
Matrix4x4 parent =
|
||||
GetResultingTransformMatrixInternal(props,
|
||||
|
|
@ -6005,7 +6016,7 @@ nsDisplayTransform::GetResultingTransformMatrixInternal(const FrameTransformProp
|
|||
}
|
||||
|
||||
if (aFlags & OFFSET_BY_ORIGIN) {
|
||||
nsLayoutUtils::PostTranslate(result, aOrigin, aAppUnitsPerPixel, !hasSVGTransforms);
|
||||
nsLayoutUtils::PostTranslate(result, aOrigin, aAppUnitsPerPixel, shouldRound);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
|
|||
10
layout/reftests/svg/css-transform-svg-ref.html
Normal file
10
layout/reftests/svg/css-transform-svg-ref.html
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<style>
|
||||
</style>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
|
||||
<rect id="a" x="0.49" y="0.51" width="2.5" height="2.5"/>
|
||||
<rect id="b" x="3.5" y="3.5" width="2.5" height="2.5"/>
|
||||
</svg>
|
||||
13
layout/reftests/svg/css-transform-svg.html
Normal file
13
layout/reftests/svg/css-transform-svg.html
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<style>
|
||||
#a {
|
||||
transform: scaleY(1);
|
||||
}
|
||||
</style>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
|
||||
<rect id="a" x="0.49" y="0.51" width="2.5" height="2.5"/>
|
||||
<rect id="b" x="3.5" y="3.5" width="2.5" height="2.5"/>
|
||||
</svg>
|
||||
|
|
@ -140,6 +140,7 @@ random == dynamic-use-nested-01b.svg dynamic-use-nested-01-ref.svg
|
|||
== fragmentIdentifier-01.xhtml pass.svg
|
||||
== linked-filter-01.svg pass.svg
|
||||
== linked-pattern-01.svg pass.svg
|
||||
pref(layout.css.devPixelsPerPx,"1.0") == svg-blurry-with-subpixel-position.html svg-blurry-with-subpixel-position-ref.html
|
||||
== use-01.svg pass.svg
|
||||
== use-01-extref.svg pass.svg
|
||||
== use-02-extref.svg use-02-extref-ref.svg
|
||||
|
|
@ -371,6 +372,7 @@ fuzzy-if(skiaContent,1,610) == textPath-03.svg pass.svg
|
|||
== text-white-space-01.svg text-white-space-01-ref.svg
|
||||
== thin-stroke-01.svg pass.svg
|
||||
== zero-stroke-01.svg pass.svg
|
||||
== css-transform-svg.html css-transform-svg-ref.html
|
||||
== tspan-dxdy-01.svg tspan-dxdy-ref.svg
|
||||
== tspan-dxdy-02.svg tspan-dxdy-ref.svg
|
||||
== tspan-dxdy-03.svg tspan-dxdy-ref.svg
|
||||
|
|
|
|||
|
|
@ -0,0 +1,13 @@
|
|||
<!doctype html>
|
||||
<style>
|
||||
svg {
|
||||
width:750px;
|
||||
height:750px;
|
||||
margin:3px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<svg viewBox="0.5 0.5 750 750">
|
||||
<path d="M3,6L277,6M3,12L277,12M3,18L277,18M3,24L277,24M3,30L277,30M3,36L277,36M3,42L277,42M3,48L277,48M3,54L277,54M3,60L277,60M3,66L277,66M3,72L277,72M3,78L277,78M3,84L277,84M3,90L277,90M3,96L277,96M3,102L277,102M3,108L277,108M3,114L277,114" style="stroke-width:1; stroke:black;" />
|
||||
<path d="M6,3L6,277M12,3L12,277M18,3L18,277M24,3L24,277M30,3L30,277M36,3L36,277M42,3L42,277M48,3L48,277M54,3L54,277M60,3L60,277M66,3L66,277M72,3L72,277M78,3L78,277M84,3L84,277M90,3L90,277M96,3L96,277M102,3L102,277M108,3L108,277M114,3L114,277" style="stroke-width:1; stroke:black;" />
|
||||
</svg>
|
||||
13
layout/reftests/svg/svg-blurry-with-subpixel-position.html
Normal file
13
layout/reftests/svg/svg-blurry-with-subpixel-position.html
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<!doctype html>
|
||||
<style>
|
||||
svg {
|
||||
width:750px;
|
||||
height:750px;
|
||||
margin:2.5px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<svg viewBox="0.5 0.5 750 750">
|
||||
<path d="M3,6L277,6M3,12L277,12M3,18L277,18M3,24L277,24M3,30L277,30M3,36L277,36M3,42L277,42M3,48L277,48M3,54L277,54M3,60L277,60M3,66L277,66M3,72L277,72M3,78L277,78M3,84L277,84M3,90L277,90M3,96L277,96M3,102L277,102M3,108L277,108M3,114L277,114" style="stroke-width:1; stroke:black;" />
|
||||
<path d="M6,3L6,277M12,3L12,277M18,3L18,277M24,3L24,277M30,3L30,277M36,3L36,277M42,3L42,277M48,3L48,277M54,3L54,277M60,3L60,277M66,3L66,277M72,3L72,277M78,3L78,277M84,3L84,277M90,3L90,277M96,3L96,277M102,3L102,277M108,3L108,277M114,3L114,277" style="stroke-width:1; stroke:black;" />
|
||||
</svg>
|
||||
|
|
@ -583,6 +583,19 @@ FontFaceSet::StartLoad(gfxUserFontEntry* aUserFontEntry,
|
|||
nsCOMPtr<nsIStreamLoader> streamLoader;
|
||||
nsCOMPtr<nsILoadGroup> loadGroup(mDocument->GetDocumentLoadGroup());
|
||||
|
||||
// We're determining the security flags for font loading here based on
|
||||
// scheme, because we want to allow fonts to be loaded using file:
|
||||
// even if unique origins for file: access is enforced (allow CORS
|
||||
// bypass in this case).
|
||||
uint32_t securityFlags = 0;
|
||||
bool isFile = false;
|
||||
if (NS_SUCCEEDED(aFontFaceSrc->mURI->SchemeIs("file", &isFile)) &&
|
||||
isFile) {
|
||||
securityFlags = nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_DATA_INHERITS;
|
||||
} else {
|
||||
securityFlags = nsILoadInfo::SEC_REQUIRE_CORS_DATA_INHERITS;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIChannel> channel;
|
||||
// Note we are calling NS_NewChannelWithTriggeringPrincipal() with both a
|
||||
// node and a principal. This is because the document where the font is
|
||||
|
|
@ -592,7 +605,7 @@ FontFaceSet::StartLoad(gfxUserFontEntry* aUserFontEntry,
|
|||
aFontFaceSrc->mURI,
|
||||
mDocument,
|
||||
aUserFontEntry->GetPrincipal(),
|
||||
nsILoadInfo::SEC_REQUIRE_CORS_DATA_INHERITS,
|
||||
securityFlags,
|
||||
nsIContentPolicy::TYPE_FONT,
|
||||
loadGroup);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
|
|
|||
|
|
@ -979,43 +979,56 @@ nsSVGOuterSVGAnonChildFrame::GetType() const
|
|||
return nsGkAtoms::svgOuterSVGAnonChildFrame;
|
||||
}
|
||||
|
||||
bool
|
||||
nsSVGOuterSVGAnonChildFrame::IsSVGTransformed(Matrix* aOwnTransform,
|
||||
Matrix* aFromParentTransform) const
|
||||
static Matrix
|
||||
ComputeOuterSVGAnonChildFrameTransform(const nsSVGOuterSVGAnonChildFrame* aFrame)
|
||||
{
|
||||
// Our elements 'transform' attribute is applied to our nsSVGOuterSVGFrame
|
||||
// parent, and the element's children-only transforms are applied to us, the
|
||||
// anonymous child frame. Since we are the child frame, we apply the
|
||||
// children-only transforms as if they are our own transform.
|
||||
|
||||
SVGSVGElement* content = static_cast<SVGSVGElement*>(mContent);
|
||||
SVGSVGElement* content = static_cast<SVGSVGElement*>(aFrame->GetContent());
|
||||
|
||||
if (!content->HasChildrenOnlyTransform()) {
|
||||
return false;
|
||||
return Matrix();
|
||||
}
|
||||
|
||||
// Outer-<svg> doesn't use x/y, so we can pass eChildToUserSpace here.
|
||||
gfxMatrix ownMatrix =
|
||||
content->PrependLocalTransformsTo(gfxMatrix(), eChildToUserSpace);
|
||||
|
||||
if (ownMatrix.IsIdentity()) {
|
||||
return false;
|
||||
if (ownMatrix.HasNonTranslation()) {
|
||||
// viewBox, currentScale and currentTranslate should only produce a
|
||||
// rectilinear transform.
|
||||
MOZ_ASSERT(ownMatrix.IsRectilinear(),
|
||||
"Non-rectilinear transform will break the following logic");
|
||||
|
||||
// The nsDisplayTransform code will apply this transform to our frame,
|
||||
// including to our frame position. We don't want our frame position to
|
||||
// be scaled though, so we need to correct for that in the transform.
|
||||
CSSPoint pos = CSSPixel::FromAppUnits(aFrame->GetPosition());
|
||||
CSSPoint scaledPos = CSSPoint(ownMatrix._11 * pos.x, ownMatrix._22 * pos.y);
|
||||
CSSPoint deltaPos = scaledPos - pos;
|
||||
ownMatrix *= gfxMatrix::Translation(-deltaPos.x, -deltaPos.y);
|
||||
}
|
||||
|
||||
if (aOwnTransform) {
|
||||
if (ownMatrix.HasNonTranslation()) {
|
||||
// Note: viewBox, currentScale and currentTranslate should only
|
||||
// produce a rectilinear transform.
|
||||
// The nsDisplayTransform code will apply this transform to our frame,
|
||||
// including to our frame position. We don't want our frame position to
|
||||
// be scaled though, so we need to correct for that in the transform.
|
||||
CSSPoint pos = CSSPixel::FromAppUnits(GetPosition());
|
||||
CSSPoint scaledPos = CSSPoint(ownMatrix._11 * pos.x, ownMatrix._22 * pos.y);
|
||||
CSSPoint deltaPos = scaledPos - pos;
|
||||
ownMatrix *= gfxMatrix::Translation(-deltaPos.x, -deltaPos.y);
|
||||
}
|
||||
return gfx::ToMatrix(ownMatrix);
|
||||
}
|
||||
|
||||
*aOwnTransform = gfx::ToMatrix(ownMatrix);
|
||||
// We want this frame to be a reference frame. An easy way to achieve that is
|
||||
// to always return true from this method, even for identity transforms.
|
||||
// This frame being a reference frame ensures that the offset between this
|
||||
// <svg> element and the parent reference frame is completely absorbed by the
|
||||
// nsDisplayTransform that's created for this frame, and that this offset does
|
||||
// not affect our descendants' transforms. Consequently, if the <svg> element
|
||||
// moves, e.g. during scrolling, the transform matrices of our contents are
|
||||
// unaffected. This simplifies invalidation.
|
||||
bool
|
||||
nsSVGOuterSVGAnonChildFrame::IsSVGTransformed(Matrix* aOwnTransform,
|
||||
Matrix* aFromParentTransform) const
|
||||
{
|
||||
if (aOwnTransform) {
|
||||
*aOwnTransform = ComputeOuterSVGAnonChildFrameTransform(this);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -4020,6 +4020,12 @@ pref("autocomplete.ungrab_during_mode_switch", true);
|
|||
// toggling to use the XUL filepicker
|
||||
pref("ui.allow_platform_file_picker", true);
|
||||
|
||||
// Allow for using the native GTK file picker. If the application is not run
|
||||
// with GTK_USE_PORTAL=1 this pref has no effect.
|
||||
#ifdef MOZ_WIDGET_GTK
|
||||
pref("widget.allow-gtk-native-file-chooser", false);
|
||||
#endif
|
||||
|
||||
pref("helpers.global_mime_types_file", "/etc/mime.types");
|
||||
pref("helpers.global_mailcap_file", "/etc/mailcap");
|
||||
pref("helpers.private_mime_types_file", "~/.mime.types");
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
interface nsIURI;
|
||||
interface nsIInputStream;
|
||||
|
||||
[scriptable, uuid(5799251f-5b55-4df7-a9e7-0c27812c469a)]
|
||||
[scriptable, uuid(72599f7a-3712-4b93-90e9-86127006cd68)]
|
||||
interface nsISearchSubmission : nsISupports
|
||||
{
|
||||
/**
|
||||
|
|
@ -20,6 +20,12 @@ interface nsISearchSubmission : nsISupports
|
|||
* The URI to submit a search to.
|
||||
*/
|
||||
readonly attribute nsIURI uri;
|
||||
|
||||
/**
|
||||
* The POST data associated with a search submission as an
|
||||
* application/x-www-form-urlencoded string. May be null.
|
||||
*/
|
||||
readonly attribute AString postDataString;
|
||||
};
|
||||
|
||||
[scriptable, uuid(620bd920-0491-48c8-99a8-d6047e64802d)]
|
||||
|
|
|
|||
|
|
@ -5569,10 +5569,6 @@ if test "$ACCESSIBILITY" -a "$MOZ_ENABLE_GTK" ; then
|
|||
AC_DEFINE_UNQUOTED(ATK_REV_VERSION, $ATK_REV_VERSION)
|
||||
fi
|
||||
|
||||
if test -n "$MOZ_DEV_EDITION"; then
|
||||
AC_DEFINE(MOZ_DEV_EDITION)
|
||||
fi
|
||||
|
||||
if test "$MOZ_DEBUG"; then
|
||||
A11Y_LOG=1
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -60,20 +60,60 @@ SyncScheduler.prototype = {
|
|||
},
|
||||
|
||||
// nextSync is in milliseconds, but prefs can't hold that much
|
||||
get nextSync() Svc.Prefs.get("nextSync", 0) * 1000,
|
||||
set nextSync(value) Svc.Prefs.set("nextSync", Math.floor(value / 1000)),
|
||||
get nextSync() {
|
||||
if (Svc.Prefs) {
|
||||
return Svc.Prefs.get("nextSync", 0) * 1000
|
||||
}
|
||||
},
|
||||
set nextSync(value) {
|
||||
if (Svc.Prefs) {
|
||||
Svc.Prefs.set("nextSync", Math.floor(value / 1000))
|
||||
}
|
||||
},
|
||||
|
||||
get syncInterval() Svc.Prefs.get("syncInterval", this.singleDeviceInterval),
|
||||
set syncInterval(value) Svc.Prefs.set("syncInterval", value),
|
||||
get syncInterval() {
|
||||
if (Svc.Prefs) {
|
||||
return Svc.Prefs.get("syncInterval", this.singleDeviceInterval)
|
||||
}
|
||||
},
|
||||
set syncInterval(value) {
|
||||
if (Svc.Prefs) {
|
||||
Svc.Prefs.set("syncInterval", value)
|
||||
}
|
||||
},
|
||||
|
||||
get syncThreshold() Svc.Prefs.get("syncThreshold", SINGLE_USER_THRESHOLD),
|
||||
set syncThreshold(value) Svc.Prefs.set("syncThreshold", value),
|
||||
get syncThreshold() {
|
||||
if (Svc.Prefs) {
|
||||
return Svc.Prefs.get("syncThreshold", SINGLE_USER_THRESHOLD)
|
||||
}
|
||||
},
|
||||
set syncThreshold(value) {
|
||||
if (Svc.Prefs) {
|
||||
Svc.Prefs.set("syncThreshold", value)
|
||||
}
|
||||
},
|
||||
|
||||
get globalScore() Svc.Prefs.get("globalScore", 0),
|
||||
set globalScore(value) Svc.Prefs.set("globalScore", value),
|
||||
get globalScore() {
|
||||
if (Svc.Prefs) {
|
||||
return Svc.Prefs.get("globalScore", 0)
|
||||
}
|
||||
},
|
||||
set globalScore(value) {
|
||||
if (Svc.Prefs) {
|
||||
Svc.Prefs.set("globalScore", value)
|
||||
}
|
||||
},
|
||||
|
||||
get numClients() Svc.Prefs.get("numClients", 0),
|
||||
set numClients(value) Svc.Prefs.set("numClients", value),
|
||||
get numClients() {
|
||||
if (Svc.Prefs) {
|
||||
return Svc.Prefs.get("numClients", 0)
|
||||
}
|
||||
},
|
||||
set numClients(value) {
|
||||
if (Svc.Prefs) {
|
||||
Svc.Prefs.set("numClients", value)
|
||||
}
|
||||
},
|
||||
|
||||
init: function init() {
|
||||
this._log.level = Log.Level[Svc.Prefs.get("log.logger.service.main")];
|
||||
|
|
@ -523,7 +563,7 @@ SyncScheduler.prototype = {
|
|||
},
|
||||
|
||||
get isBlocked() {
|
||||
let until = Svc.Prefs.get("scheduler.blocked-until");
|
||||
let until = Svc.Prefs ? Svc.Prefs.get("scheduler.blocked-until") : undefined;
|
||||
if (until === undefined) {
|
||||
return false;
|
||||
}
|
||||
|
|
@ -770,19 +810,19 @@ ErrorHandler.prototype = {
|
|||
},
|
||||
|
||||
get currentAlertMode() {
|
||||
return Svc.Prefs.get("errorhandler.alert.mode");
|
||||
return Svc.Prefs ? Svc.Prefs.get("errorhandler.alert.mode") : undefined;
|
||||
},
|
||||
|
||||
set currentAlertMode(str) {
|
||||
return Svc.Prefs.set("errorhandler.alert.mode", str);
|
||||
return Svc.Prefs ? Svc.Prefs.set("errorhandler.alert.mode", str) : undefined;
|
||||
},
|
||||
|
||||
get earliestNextAlert() {
|
||||
return Svc.Prefs.get("errorhandler.alert.earliestNext", 0) * 1000;
|
||||
return Svc.Prefs ? Svc.Prefs.get("errorhandler.alert.earliestNext", 0) * 1000 : undefined;
|
||||
},
|
||||
|
||||
set earliestNextAlert(msec) {
|
||||
return Svc.Prefs.set("errorhandler.alert.earliestNext", msec / 1000);
|
||||
return Svc.Prefs ? Svc.Prefs.set("errorhandler.alert.earliestNext", msec / 1000) : undefined;
|
||||
},
|
||||
|
||||
clearServerAlerts: function () {
|
||||
|
|
|
|||
|
|
@ -296,21 +296,6 @@ Sync11Service.prototype = {
|
|||
return false;
|
||||
},
|
||||
|
||||
// The global "enabled" state comes from prefs, and will be set to false
|
||||
// whenever the UI that exposes what to sync finds all Sync engines disabled.
|
||||
get enabled() {
|
||||
return Svc.Prefs.get("enabled");
|
||||
},
|
||||
set enabled(val) {
|
||||
// There's no real reason to impose this other than to catch someone doing
|
||||
// something we don't expect with bad consequences - all setting of this
|
||||
// pref are in the UI code and external to this module.
|
||||
if (val) {
|
||||
throw new Error("Only disabling via this setter is supported");
|
||||
}
|
||||
Svc.Prefs.set("enabled", val);
|
||||
},
|
||||
|
||||
/**
|
||||
* Prepare to initialize the rest of Weave after waiting a little bit
|
||||
*/
|
||||
|
|
@ -340,6 +325,8 @@ Sync11Service.prototype = {
|
|||
this._clusterManager = this.identity.createClusterManager(this);
|
||||
this.recordManager = new RecordManager(this);
|
||||
|
||||
this.enabled = true;
|
||||
|
||||
this._registerEngines();
|
||||
|
||||
let ua = Cc["@mozilla.org/network/protocol;1?name=http"].
|
||||
|
|
@ -1236,10 +1223,6 @@ Sync11Service.prototype = {
|
|||
},
|
||||
|
||||
sync: function sync() {
|
||||
if (!this.enabled) {
|
||||
this._log.debug("Not syncing as Sync is disabled.");
|
||||
return;
|
||||
}
|
||||
let dateStr = new Date().toLocaleFormat(LOG_DATE_FORMAT);
|
||||
this._log.debug("User-Agent: " + SyncStorageRequest.prototype.userAgent);
|
||||
this._log.info("Starting sync at " + dateStr);
|
||||
|
|
|
|||
|
|
@ -321,10 +321,17 @@ this.Utils = {
|
|||
* could not be loaded, the first argument will be undefined.
|
||||
*/
|
||||
jsonLoad: Task.async(function*(filePath, that, callback) {
|
||||
let path = OS.Path.join(OS.Constants.Path.profileDir, "weave", filePath + ".json");
|
||||
let path;
|
||||
try {
|
||||
path = OS.Path.normalize(OS.Path.join(OS.Constants.Path.profileDir, "weave", filePath + ".json"));
|
||||
} catch (e) {
|
||||
if (that._log) {
|
||||
that._log.debug("Path join error: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
if (that._log) {
|
||||
that._log.trace("Loading json from disk: " + filePath);
|
||||
that._log.trace("Loading json from disk: " + path);
|
||||
}
|
||||
|
||||
let json;
|
||||
|
|
@ -341,8 +348,9 @@ this.Utils = {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
callback.call(that, json);
|
||||
if (callback) {
|
||||
callback.call(that, json);
|
||||
}
|
||||
}),
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -24,10 +24,6 @@ pref("services.sync.scheduler.sync11.singleDeviceInterval", 86400); // 1 day
|
|||
|
||||
pref("services.sync.errorhandler.networkFailureReportTimeout", 1209600); // 2 weeks
|
||||
|
||||
// A "master" pref for Sync being enabled. Will be set to false if the sync
|
||||
// customization UI finds all our builtin engines disabled (and addons are
|
||||
// free to force this to true if they have their own engine)
|
||||
pref("services.sync.enabled", true);
|
||||
// Our engines.
|
||||
pref("services.sync.engine.addons", false);
|
||||
pref("services.sync.engine.bookmarks", true);
|
||||
|
|
|
|||
|
|
@ -183,7 +183,7 @@ add_test(function test_login_on_sync() {
|
|||
// This test exercises these two branches.
|
||||
|
||||
_("We're ready to sync if locked.");
|
||||
Svc.Prefs.set("enabled", true);
|
||||
Service.enabled = true;
|
||||
Services.io.offline = false;
|
||||
Service.scheduler.checkSyncStatus();
|
||||
do_check_true(scheduleCalled);
|
||||
|
|
|
|||
|
|
@ -780,6 +780,7 @@ EngineURL.prototype = {
|
|||
}
|
||||
|
||||
var postData = null;
|
||||
let postDataString = null;
|
||||
if (this.method == "GET") {
|
||||
// GET method requests have no post data, and append the encoded
|
||||
// query string to the url...
|
||||
|
|
@ -787,6 +788,7 @@ EngineURL.prototype = {
|
|||
url += "?";
|
||||
url += dataString;
|
||||
} else if (this.method == "POST") {
|
||||
postDataString = dataString;
|
||||
// POST method requests must wrap the encoded text in a MIME
|
||||
// stream and supply that as POSTDATA.
|
||||
var stringStream = Cc["@mozilla.org/io/string-input-stream;1"].
|
||||
|
|
@ -800,7 +802,7 @@ EngineURL.prototype = {
|
|||
postData.setData(stringStream);
|
||||
}
|
||||
|
||||
return new Submission(makeURI(url), postData);
|
||||
return new Submission(makeURI(url), postData, postDataString);
|
||||
},
|
||||
|
||||
_getTermsParameterName: function SRCH_EURL__getTermsParameterName() {
|
||||
|
|
@ -2409,9 +2411,10 @@ Engine.prototype = {
|
|||
};
|
||||
|
||||
// nsISearchSubmission
|
||||
function Submission(aURI, aPostData = null) {
|
||||
function Submission(aURI, aPostData = null, aPostDataString = null) {
|
||||
this._uri = aURI;
|
||||
this._postData = aPostData;
|
||||
this._postDataString = aPostDataString;
|
||||
}
|
||||
Submission.prototype = {
|
||||
get uri() {
|
||||
|
|
@ -2420,6 +2423,9 @@ Submission.prototype = {
|
|||
get postData() {
|
||||
return this._postData;
|
||||
},
|
||||
get postDataString() {
|
||||
return this._postDataString;
|
||||
},
|
||||
QueryInterface: function SRCH_SUBM_QI(aIID) {
|
||||
if (aIID.equals(Ci.nsISearchSubmission) ||
|
||||
aIID.equals(Ci.nsISupports))
|
||||
|
|
|
|||
|
|
@ -60,13 +60,6 @@ this.AppConstants = Object.freeze({
|
|||
false,
|
||||
#endif
|
||||
|
||||
MOZ_DEV_EDITION:
|
||||
#ifdef MOZ_DEV_EDITION
|
||||
true,
|
||||
#else
|
||||
false,
|
||||
#endif
|
||||
|
||||
MOZ_SERVICES_HEALTHREPORT:
|
||||
#ifdef MOZ_SERVICES_HEALTHREPORT
|
||||
true,
|
||||
|
|
|
|||
|
|
@ -425,22 +425,6 @@ nsToolkitProfileService::Init()
|
|||
|
||||
nsToolkitProfile* currentProfile = nullptr;
|
||||
|
||||
#ifdef MOZ_DEV_EDITION
|
||||
nsCOMPtr<nsIFile> ignoreSeparateProfile;
|
||||
rv = mAppData->Clone(getter_AddRefs(ignoreSeparateProfile));
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = ignoreSeparateProfile->AppendNative(NS_LITERAL_CSTRING("ignore-dev-edition-profile"));
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
bool shouldIgnoreSeparateProfile;
|
||||
rv = ignoreSeparateProfile->Exists(&shouldIgnoreSeparateProfile);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
#endif
|
||||
|
||||
unsigned int c = 0;
|
||||
bool foundAuroraDefault = false;
|
||||
for (c = 0; true; ++c) {
|
||||
|
|
@ -501,35 +485,8 @@ nsToolkitProfileService::Init()
|
|||
mChosen = currentProfile;
|
||||
this->SetDefaultProfile(currentProfile);
|
||||
}
|
||||
#ifdef MOZ_DEV_EDITION
|
||||
// Use the dev-edition-default profile if this is an Aurora build and
|
||||
// ignore-dev-edition-profile is not present.
|
||||
if (name.EqualsLiteral("dev-edition-default") && !shouldIgnoreSeparateProfile) {
|
||||
mChosen = currentProfile;
|
||||
foundAuroraDefault = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef MOZ_DEV_EDITION
|
||||
if (!foundAuroraDefault && !shouldIgnoreSeparateProfile) {
|
||||
// If a single profile exists, it may not be already marked as default.
|
||||
// Do it now to avoid problems when we create the dev-edition-default profile.
|
||||
if (!mChosen && mFirst && !mFirst->mNext)
|
||||
this->SetDefaultProfile(mFirst);
|
||||
|
||||
// Create a default profile for aurora, if none was found.
|
||||
nsCOMPtr<nsIToolkitProfile> profile;
|
||||
rv = CreateProfile(nullptr,
|
||||
NS_LITERAL_CSTRING("dev-edition-default"),
|
||||
getter_AddRefs(profile));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
mChosen = profile;
|
||||
rv = Flush();
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!mChosen && mFirst && !mFirst->mNext) // only one profile
|
||||
mChosen = mFirst;
|
||||
return NS_OK;
|
||||
|
|
|
|||
|
|
@ -2174,9 +2174,9 @@ SelectProfile(nsIProfileLock* *aResult, nsIToolkitProfileService* aProfileSvc, n
|
|||
return ShowProfileManager(aProfileSvc, aNative);
|
||||
}
|
||||
|
||||
#ifndef MOZ_DEV_EDITION
|
||||
// If the only existing profile is the dev-edition-profile and this is not
|
||||
// Developer Edition, then no valid profiles were found.
|
||||
// Dev edition leftovers:
|
||||
// If the only existing profile is the dev-edition-profile,
|
||||
// then no valid profiles were found.
|
||||
if (count == 1) {
|
||||
nsCOMPtr<nsIToolkitProfile> deProfile;
|
||||
// GetSelectedProfile will auto-select the only profile if there's just one
|
||||
|
|
@ -2187,7 +2187,6 @@ SelectProfile(nsIProfileLock* *aResult, nsIToolkitProfileService* aProfileSvc, n
|
|||
count = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!count) {
|
||||
gDoMigration = true;
|
||||
|
|
@ -2196,25 +2195,15 @@ SelectProfile(nsIProfileLock* *aResult, nsIToolkitProfileService* aProfileSvc, n
|
|||
// create a default profile
|
||||
nsCOMPtr<nsIToolkitProfile> profile;
|
||||
nsresult rv = aProfileSvc->CreateProfile(nullptr, // choose a default dir for us
|
||||
#ifdef MOZ_DEV_EDITION
|
||||
NS_LITERAL_CSTRING("dev-edition-default"),
|
||||
#else
|
||||
NS_LITERAL_CSTRING("default"),
|
||||
#endif
|
||||
getter_AddRefs(profile));
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
#ifndef MOZ_DEV_EDITION
|
||||
aProfileSvc->SetDefaultProfile(profile);
|
||||
#endif
|
||||
aProfileSvc->Flush();
|
||||
rv = profile->Lock(nullptr, aResult);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
if (aProfileName)
|
||||
#ifdef MOZ_DEV_EDITION
|
||||
aProfileName->AssignLiteral("dev-edition-default");
|
||||
#else
|
||||
aProfileName->AssignLiteral("default");
|
||||
#endif
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@ const SCRIPTS = [
|
|||
"browser/base/content/browser-addons.js",
|
||||
"browser/base/content/browser-ctrlTab.js",
|
||||
"browser/base/content/browser-customization.js",
|
||||
"browser/base/content/browser-devedition.js",
|
||||
"browser/base/content/browser-feeds.js",
|
||||
"browser/base/content/browser-fullScreenAndPointerLock.js",
|
||||
"browser/base/content/browser-fullZoom.js",
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
#include "nsNetUtil.h"
|
||||
#include "nsReadableUtils.h"
|
||||
#include "mozcontainer.h"
|
||||
#include "mozilla/Preferences.h"
|
||||
|
||||
#include "nsFilePicker.h"
|
||||
|
||||
|
|
@ -175,6 +176,7 @@ nsFilePicker::nsFilePicker()
|
|||
, mFileChooserDelegate(nullptr)
|
||||
#endif
|
||||
{
|
||||
mUseNativeFileChooser = Preferences::GetBool("widget.allow-gtk-native-file-chooser", false);
|
||||
}
|
||||
|
||||
nsFilePicker::~nsFilePicker()
|
||||
|
|
@ -197,7 +199,7 @@ ReadMultipleFiles(gpointer filename, gpointer array)
|
|||
}
|
||||
|
||||
void
|
||||
nsFilePicker::ReadValuesFromFileChooser(GtkWidget *file_chooser)
|
||||
nsFilePicker::ReadValuesFromFileChooser(void *file_chooser)
|
||||
{
|
||||
mFiles.Clear();
|
||||
|
||||
|
|
@ -389,19 +391,10 @@ nsFilePicker::Open(nsIFilePickerShownCallback *aCallback)
|
|||
if (!mOkButtonLabel.IsEmpty()) {
|
||||
accept_button = buttonLabel.get();
|
||||
} else {
|
||||
accept_button = (action == GTK_FILE_CHOOSER_ACTION_SAVE) ?
|
||||
GTK_STOCK_SAVE : GTK_STOCK_OPEN;
|
||||
accept_button = nullptr;
|
||||
}
|
||||
|
||||
GtkWidget *file_chooser =
|
||||
gtk_file_chooser_dialog_new(title, parent_widget, action,
|
||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||
accept_button, GTK_RESPONSE_ACCEPT,
|
||||
nullptr);
|
||||
gtk_dialog_set_alternative_button_order(GTK_DIALOG(file_chooser),
|
||||
GTK_RESPONSE_ACCEPT,
|
||||
GTK_RESPONSE_CANCEL,
|
||||
-1);
|
||||
void *file_chooser = GtkFileChooserNew(title.get(), parent_widget, action, accept_button);
|
||||
if (mAllowURLs) {
|
||||
gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(file_chooser), FALSE);
|
||||
}
|
||||
|
|
@ -412,11 +405,7 @@ nsFilePicker::Open(nsIFilePickerShownCallback *aCallback)
|
|||
g_signal_connect(file_chooser, "update-preview", G_CALLBACK(UpdateFilePreviewWidget), img_preview);
|
||||
}
|
||||
|
||||
GtkWindow *window = GTK_WINDOW(file_chooser);
|
||||
gtk_window_set_modal(window, TRUE);
|
||||
if (parent_widget) {
|
||||
gtk_window_set_destroy_with_parent(window, TRUE);
|
||||
}
|
||||
GtkFileChooserSetModal(file_chooser, parent_widget, TRUE);
|
||||
|
||||
NS_ConvertUTF16toUTF8 defaultName(mDefault);
|
||||
switch (mMode) {
|
||||
|
|
@ -454,18 +443,21 @@ nsFilePicker::Open(nsIFilePickerShownCallback *aCallback)
|
|||
// Otherwise, if our dialog gets destroyed, we'll lose the dialog's
|
||||
// delegate by the time this gets processed in the event loop.
|
||||
// See: https://bugzilla.mozilla.org/show_bug.cgi?id=1166741
|
||||
GtkDialog *dialog = GTK_DIALOG(file_chooser);
|
||||
GtkContainer *area = GTK_CONTAINER(gtk_dialog_get_content_area(dialog));
|
||||
gtk_container_forall(area, [](GtkWidget *widget,
|
||||
gpointer data) {
|
||||
if (GTK_IS_FILE_CHOOSER_WIDGET(widget)) {
|
||||
auto result = static_cast<GtkFileChooserWidget**>(data);
|
||||
*result = GTK_FILE_CHOOSER_WIDGET(widget);
|
||||
}
|
||||
}, &mFileChooserDelegate);
|
||||
if (GTK_IS_DIALOG(file_chooser)) {
|
||||
GtkDialog *dialog = GTK_DIALOG(file_chooser);
|
||||
GtkContainer *area = GTK_CONTAINER(gtk_dialog_get_content_area(dialog));
|
||||
gtk_container_forall(area, [](GtkWidget *widget,
|
||||
gpointer data) {
|
||||
if (GTK_IS_FILE_CHOOSER_WIDGET(widget)) {
|
||||
auto result = static_cast<GtkFileChooserWidget**>(data);
|
||||
*result = GTK_FILE_CHOOSER_WIDGET(widget);
|
||||
}
|
||||
}, &mFileChooserDelegate);
|
||||
|
||||
if (mFileChooserDelegate)
|
||||
g_object_ref(mFileChooserDelegate);
|
||||
if (mFileChooserDelegate) {
|
||||
g_object_ref(mFileChooserDelegate);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(file_chooser),
|
||||
|
|
@ -473,7 +465,9 @@ nsFilePicker::Open(nsIFilePickerShownCallback *aCallback)
|
|||
}
|
||||
}
|
||||
|
||||
gtk_dialog_set_default_response(GTK_DIALOG(file_chooser), GTK_RESPONSE_ACCEPT);
|
||||
if (GTK_IS_DIALOG(file_chooser)) {
|
||||
gtk_dialog_set_default_response(GTK_DIALOG(file_chooser), GTK_RESPONSE_ACCEPT);
|
||||
}
|
||||
|
||||
int32_t count = mFilters.Length();
|
||||
for (int32_t i = 0; i < count; ++i) {
|
||||
|
|
@ -517,14 +511,13 @@ nsFilePicker::Open(nsIFilePickerShownCallback *aCallback)
|
|||
mCallback = aCallback;
|
||||
NS_ADDREF_THIS();
|
||||
g_signal_connect(file_chooser, "response", G_CALLBACK(OnResponse), this);
|
||||
g_signal_connect(file_chooser, "destroy", G_CALLBACK(OnDestroy), this);
|
||||
gtk_widget_show(file_chooser);
|
||||
GtkFileChooserShow(file_chooser);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* static */ void
|
||||
nsFilePicker::OnResponse(GtkWidget* file_chooser, gint response_id,
|
||||
nsFilePicker::OnResponse(void* file_chooser, gint response_id,
|
||||
gpointer user_data)
|
||||
{
|
||||
static_cast<nsFilePicker*>(user_data)->
|
||||
|
|
@ -539,7 +532,7 @@ nsFilePicker::OnDestroy(GtkWidget* file_chooser, gpointer user_data)
|
|||
}
|
||||
|
||||
void
|
||||
nsFilePicker::Done(GtkWidget* file_chooser, gint response)
|
||||
nsFilePicker::Done(void* file_chooser, gint response)
|
||||
{
|
||||
mRunning = false;
|
||||
|
||||
|
|
@ -583,7 +576,7 @@ nsFilePicker::Done(GtkWidget* file_chooser, gint response)
|
|||
// requests that any remaining references be released, but the reference
|
||||
// count will not be decremented again if GtkWindow's reference has already
|
||||
// been released.
|
||||
gtk_widget_destroy(file_chooser);
|
||||
GtkFileChooserDestroy(file_chooser);
|
||||
|
||||
#if (MOZ_WIDGET_GTK == 3)
|
||||
if (mFileChooserDelegate) {
|
||||
|
|
@ -608,3 +601,73 @@ nsFilePicker::Done(GtkWidget* file_chooser, gint response)
|
|||
}
|
||||
NS_RELEASE_THIS();
|
||||
}
|
||||
|
||||
// All below functions available as of GTK 3.20+
|
||||
|
||||
void *
|
||||
nsFilePicker::GtkFileChooserNew(
|
||||
const gchar *title, GtkWindow *parent,
|
||||
GtkFileChooserAction action,
|
||||
const gchar *accept_label)
|
||||
{
|
||||
static auto sGtkFileChooserNativeNewPtr = (void * (*)(
|
||||
const gchar *, GtkWindow *,
|
||||
GtkFileChooserAction,
|
||||
const gchar *, const gchar *))
|
||||
dlsym(RTLD_DEFAULT, "gtk_file_chooser_native_new");
|
||||
if (mUseNativeFileChooser && sGtkFileChooserNativeNewPtr != nullptr) {
|
||||
return (*sGtkFileChooserNativeNewPtr)(title, parent, action, accept_label, nullptr);
|
||||
}
|
||||
if (accept_label == nullptr) {
|
||||
accept_label = (action == GTK_FILE_CHOOSER_ACTION_SAVE)
|
||||
? GTK_STOCK_SAVE : GTK_STOCK_OPEN;
|
||||
}
|
||||
GtkWidget *file_chooser = gtk_file_chooser_dialog_new(title, parent, action,
|
||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||
accept_label, GTK_RESPONSE_ACCEPT, nullptr);
|
||||
gtk_dialog_set_alternative_button_order(GTK_DIALOG(file_chooser),
|
||||
GTK_RESPONSE_ACCEPT, GTK_RESPONSE_CANCEL, -1);
|
||||
return file_chooser;
|
||||
}
|
||||
|
||||
void
|
||||
nsFilePicker::GtkFileChooserShow(void *file_chooser)
|
||||
{
|
||||
static auto sGtkNativeDialogShowPtr = (void (*)(void *))
|
||||
dlsym(RTLD_DEFAULT, "gtk_native_dialog_show");
|
||||
if (mUseNativeFileChooser && sGtkNativeDialogShowPtr != nullptr) {
|
||||
(*sGtkNativeDialogShowPtr)(file_chooser);
|
||||
} else {
|
||||
g_signal_connect(file_chooser, "destroy", G_CALLBACK(OnDestroy), this);
|
||||
gtk_widget_show(GTK_WIDGET(file_chooser));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsFilePicker::GtkFileChooserDestroy(void *file_chooser)
|
||||
{
|
||||
static auto sGtkNativeDialogDestroyPtr = (void (*)(void *))
|
||||
dlsym(RTLD_DEFAULT, "gtk_native_dialog_destroy");
|
||||
if (mUseNativeFileChooser && sGtkNativeDialogDestroyPtr != nullptr) {
|
||||
(*sGtkNativeDialogDestroyPtr)(file_chooser);
|
||||
} else {
|
||||
gtk_widget_destroy(GTK_WIDGET(file_chooser));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsFilePicker::GtkFileChooserSetModal(void *file_chooser,
|
||||
GtkWindow *parent_widget, gboolean modal)
|
||||
{
|
||||
static auto sGtkNativeDialogSetModalPtr = (void (*)(void *, gboolean))
|
||||
dlsym(RTLD_DEFAULT, "gtk_native_dialog_set_modal");
|
||||
if (mUseNativeFileChooser && sGtkNativeDialogSetModalPtr != nullptr) {
|
||||
(*sGtkNativeDialogSetModalPtr)(file_chooser, modal);
|
||||
} else {
|
||||
GtkWindow *window = GTK_WINDOW(file_chooser);
|
||||
gtk_window_set_modal(window, modal);
|
||||
if (parent_widget != nullptr) {
|
||||
gtk_window_set_destroy_with_parent(window, modal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -48,12 +48,12 @@ public:
|
|||
protected:
|
||||
virtual ~nsFilePicker();
|
||||
|
||||
void ReadValuesFromFileChooser(GtkWidget *file_chooser);
|
||||
void ReadValuesFromFileChooser(void *file_chooser);
|
||||
|
||||
static void OnResponse(GtkWidget* dialog, gint response_id,
|
||||
static void OnResponse(void* dialog, gint response_id,
|
||||
gpointer user_data);
|
||||
static void OnDestroy(GtkWidget* dialog, gpointer user_data);
|
||||
void Done(GtkWidget* dialog, gint response_id);
|
||||
static void OnDestroy(GtkWidget* file_chooser, gpointer user_data);
|
||||
void Done(void* file_chooser, gint response_id);
|
||||
|
||||
nsCOMPtr<nsIWidget> mParentWidget;
|
||||
nsCOMPtr<nsIFilePickerShownCallback> mCallback;
|
||||
|
|
@ -74,9 +74,19 @@ protected:
|
|||
private:
|
||||
static nsIFile *mPrevDisplayDirectory;
|
||||
|
||||
void *GtkFileChooserNew(
|
||||
const gchar *title, GtkWindow *parent,
|
||||
GtkFileChooserAction action,
|
||||
const gchar *accept_label);
|
||||
void GtkFileChooserShow(void *file_chooser);
|
||||
void GtkFileChooserDestroy(void *file_chooser);
|
||||
void GtkFileChooserSetModal(void *file_chooser, GtkWindow* parent_widget,
|
||||
gboolean modal);
|
||||
|
||||
#if (MOZ_WIDGET_GTK == 3)
|
||||
GtkFileChooserWidget *mFileChooserDelegate;
|
||||
#endif
|
||||
bool mUseNativeFileChooser;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue