--- a/accessible/jsat/ContentControl.jsm
+++ b/accessible/jsat/ContentControl.jsm
@@ -10,29 +10,30 @@ XPCOMUtils.defineLazyModuleGetter(this,
'resource://gre/modules/Services.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Utils',
'resource://gre/modules/accessibility/Utils.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Logger',
'resource://gre/modules/accessibility/Utils.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Roles',
'resource://gre/modules/accessibility/Constants.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'TraversalRules',
- 'resource://gre/modules/accessibility/TraversalRules.jsm');
+ 'resource://gre/modules/accessibility/Traversal.jsm');
+XPCOMUtils.defineLazyModuleGetter(this, 'TraversalHelper',
+ 'resource://gre/modules/accessibility/Traversal.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Presentation',
'resource://gre/modules/accessibility/Presentation.jsm');
this.EXPORTED_SYMBOLS = ['ContentControl'];
const MOVEMENT_GRANULARITY_CHARACTER = 1;
const MOVEMENT_GRANULARITY_WORD = 2;
const MOVEMENT_GRANULARITY_PARAGRAPH = 8;
this.ContentControl = function ContentControl(aContentScope) {
this._contentScope = Cu.getWeakReference(aContentScope);
- this._vcCache = new WeakMap();
this._childMessageSenders = new WeakMap();
};
this.ContentControl.prototype = {
messagesOfInterest: ['AccessFu:MoveCursor',
'AccessFu:ClearCursor',
'AccessFu:MoveToPoint',
'AccessFu:AutoMove',
@@ -123,17 +124,17 @@ this.ContentControl.prototype = {
// Forwarded succesfully to child cursor.
return;
}
if (adjustRange && this.adjustRange(vc.position, action === 'moveNext')) {
return;
}
- let moved = vc[action](TraversalRules[aMessage.json.rule]);
+ let moved = TraversalHelper.move(vc, action, aMessage.json.rule);
if (moved) {
if (origin === 'child') {
// We just stepped out of a child, clear child cursor.
Utils.getMessageManager(aMessage.target).sendAsyncMessage(
'AccessFu:ClearCursor', {});
} else {
// We potentially landed on a new child cursor. If so, we want to
--- a/accessible/jsat/EventManager.jsm
+++ b/accessible/jsat/EventManager.jsm
@@ -13,18 +13,16 @@ Cu.import('resource://gre/modules/XPCOMU
XPCOMUtils.defineLazyModuleGetter(this, 'Services',
'resource://gre/modules/Services.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Utils',
'resource://gre/modules/accessibility/Utils.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Logger',
'resource://gre/modules/accessibility/Utils.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Presentation',
'resource://gre/modules/accessibility/Presentation.jsm');
-XPCOMUtils.defineLazyModuleGetter(this, 'TraversalRules',
- 'resource://gre/modules/accessibility/TraversalRules.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Roles',
'resource://gre/modules/accessibility/Constants.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Events',
'resource://gre/modules/accessibility/Constants.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'States',
'resource://gre/modules/accessibility/Constants.jsm');
this.EXPORTED_SYMBOLS = ['EventManager'];
rename from accessible/jsat/TraversalRules.jsm
rename to accessible/jsat/Traversal.jsm
--- a/accessible/jsat/TraversalRules.jsm
+++ b/accessible/jsat/Traversal.jsm
@@ -1,50 +1,51 @@
/* 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/. */
/* global PrefCache, Roles, Prefilters, States, Filters, Utils,
TraversalRules, Components, XPCOMUtils */
-/* exported TraversalRules */
+/* exported TraversalRules, TraversalHelper */
'use strict';
const Ci = Components.interfaces;
const Cu = Components.utils;
-this.EXPORTED_SYMBOLS = ['TraversalRules']; // jshint ignore:line
+this.EXPORTED_SYMBOLS = ['TraversalRules', 'TraversalHelper']; // jshint ignore:line
Cu.import('resource://gre/modules/accessibility/Utils.jsm');
Cu.import('resource://gre/modules/XPCOMUtils.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Roles', // jshint ignore:line
'resource://gre/modules/accessibility/Constants.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Filters', // jshint ignore:line
'resource://gre/modules/accessibility/Constants.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'States', // jshint ignore:line
'resource://gre/modules/accessibility/Constants.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Prefilters', // jshint ignore:line
'resource://gre/modules/accessibility/Constants.jsm');
let gSkipEmptyImages = new PrefCache('accessibility.accessfu.skip_empty_images');
-function BaseTraversalRule(aRoles, aMatchFunc, aPreFilter) {
+function BaseTraversalRule(aRoles, aMatchFunc, aPreFilter, aContainerRule) {
this._explicitMatchRoles = new Set(aRoles);
this._matchRoles = aRoles;
if (aRoles.length) {
if (aRoles.indexOf(Roles.LABEL) < 0) {
this._matchRoles.push(Roles.LABEL);
}
if (aRoles.indexOf(Roles.INTERNAL_FRAME) < 0) {
// Used for traversing in to child OOP frames.
this._matchRoles.push(Roles.INTERNAL_FRAME);
}
}
this._matchFunc = aMatchFunc || function() { return Filters.MATCH; };
this.preFilter = aPreFilter || gSimplePreFilter;
+ this.containerRule = aContainerRule;
}
BaseTraversalRule.prototype = {
getMatchRoles: function BaseTraversalRule_getmatchRoles(aRoles) {
aRoles.value = this._matchRoles;
return aRoles.value.length;
},
@@ -216,18 +217,17 @@ this.TraversalRules = { // jshint ignore
[Roles.COMBOBOX,
Roles.LISTBOX]),
Landmark: new BaseTraversalRule(
[],
function Landmark_match(aAccessible) {
return Utils.getLandmarkName(aAccessible) ? Filters.MATCH :
Filters.IGNORE;
- }
- ),
+ }, null, true),
Entry: new BaseTraversalRule(
[Roles.ENTRY,
Roles.PASSWORD_TEXT]),
FormElement: new BaseTraversalRule(
[Roles.PUSHBUTTON,
Roles.SPINBUTTON,
@@ -271,17 +271,18 @@ this.TraversalRules = { // jshint ignore
return Filters.MATCH;
} else {
return Filters.IGNORE;
}
}),
List: new BaseTraversalRule(
[Roles.LIST,
- Roles.DEFINITION_LIST]),
+ Roles.DEFINITION_LIST],
+ null, null, true),
PageTab: new BaseTraversalRule(
[Roles.PAGETAB]),
Paragraph: new BaseTraversalRule(
[Roles.PARAGRAPH,
Roles.SECTION],
function Paragraph_match(aAccessible) {
@@ -311,8 +312,56 @@ this.TraversalRules = { // jshint ignore
_shouldSkipImage: function _shouldSkipImage(aAccessible) {
if (gSkipEmptyImages.value && aAccessible.name === '') {
return Filters.IGNORE;
}
return Filters.MATCH;
}
};
+
+this.TraversalHelper = {
+ _helperPivotCache: null,
+
+ get helperPivotCache() {
+ delete this.helperPivotCache;
+ this.helperPivotCache = new WeakMap();
+ return this.helperPivotCache;
+ },
+
+ getHelperPivot: function TraversalHelper_getHelperPivot(aRoot) {
+ let pivot = this.helperPivotCache.get(aRoot.DOMNode);
+ if (!pivot) {
+ pivot = Utils.AccRetrieval.createAccessiblePivot(aRoot);
+ this.helperPivotCache.set(aRoot.DOMNode, pivot);
+ }
+
+ return pivot;
+ },
+
+ move: function TraversalHelper_move(aVirtualCursor, aMethod, aRule) {
+ let rule = TraversalRules[aRule];
+
+ if (rule.containerRule) {
+ let moved = false;
+ let helperPivot = this.getHelperPivot(aVirtualCursor.root);
+ helperPivot.position = aVirtualCursor.position;
+
+ // We continue to step through containers until there is one with an
+ // atomic child (via 'Simple') on which we could land.
+ while (!moved) {
+ if (helperPivot[aMethod](rule)) {
+ aVirtualCursor.modalRoot = helperPivot.position;
+ moved = aVirtualCursor.moveFirst(TraversalRules.Simple);
+ aVirtualCursor.modalRoot = null;
+ } else {
+ // If we failed to step to another container, break and return false.
+ break;
+ }
+ }
+
+ return moved;
+ } else {
+ return aVirtualCursor[aMethod](rule);
+ }
+ }
+
+};
--- a/accessible/jsat/content-script.js
+++ b/accessible/jsat/content-script.js
@@ -5,18 +5,16 @@
let Ci = Components.interfaces;
let Cu = Components.utils;
Cu.import('resource://gre/modules/XPCOMUtils.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Logger',
'resource://gre/modules/accessibility/Utils.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Presentation',
'resource://gre/modules/accessibility/Presentation.jsm');
-XPCOMUtils.defineLazyModuleGetter(this, 'TraversalRules',
- 'resource://gre/modules/accessibility/TraversalRules.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Utils',
'resource://gre/modules/accessibility/Utils.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'EventManager',
'resource://gre/modules/accessibility/EventManager.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'ContentControl',
'resource://gre/modules/accessibility/ContentControl.jsm');
XPCOMUtils.defineLazyModuleGetter(this, 'Roles',
'resource://gre/modules/accessibility/Constants.jsm');
--- a/accessible/jsat/moz.build
+++ b/accessible/jsat/moz.build
@@ -8,13 +8,13 @@ EXTRA_JS_MODULES.accessibility += [
'AccessFu.jsm',
'Constants.jsm',
'ContentControl.jsm',
'EventManager.jsm',
'Gestures.jsm',
'OutputGenerator.jsm',
'PointerAdapter.jsm',
'Presentation.jsm',
- 'TraversalRules.jsm',
+ 'Traversal.jsm',
'Utils.jsm'
]
JAR_MANIFESTS += ['jar.mn']
\ No newline at end of file
--- a/accessible/tests/mochitest/jsat/a11y.ini
+++ b/accessible/tests/mochitest/jsat/a11y.ini
@@ -19,8 +19,9 @@ skip-if = buildapp == 'mulet'
[test_landmarks.html]
[test_live_regions.html]
[test_output_mathml.html]
[test_output.html]
[test_quicknav_modes.html]
[test_tables.html]
[test_pointer_relay.html]
[test_traversal.html]
+[test_traversal_helper.html]
--- a/accessible/tests/mochitest/jsat/test_traversal.html
+++ b/accessible/tests/mochitest/jsat/test_traversal.html
@@ -16,17 +16,17 @@
<script type="application/javascript" src="../browser.js"></script>
<script type="application/javascript" src="../events.js"></script>
<script type="application/javascript" src="../role.js"></script>
<script type="application/javascript" src="../states.js"></script>
<script type="application/javascript" src="../pivot.js"></script>
<script type="application/javascript" src="../layout.js"></script>
<script type="application/javascript">
- Components.utils.import("resource://gre/modules/accessibility/TraversalRules.jsm");
+ Components.utils.import("resource://gre/modules/accessibility/Traversal.jsm");
var gBrowserWnd = null;
var gQueue = null;
function doTest()
{
var doc = currentTabDocument();
var docAcc = getAccessible(doc, [nsIAccessibleDocument]);
new file mode 100644
--- /dev/null
+++ b/accessible/tests/mochitest/jsat/test_traversal_helper.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Tests AccessFu TraversalRules</title>
+ <meta charset="utf-8" />
+ <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
+
+ <script type="application/javascript"
+ src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js">
+ </script>
+ <script type="application/javascript"
+ src="chrome://mochikit/content/chrome-harness.js">
+ </script>
+
+ <script type="application/javascript" src="../common.js"></script>
+ <script type="application/javascript" src="../browser.js"></script>
+ <script type="application/javascript" src="../events.js"></script>
+ <script type="application/javascript" src="../role.js"></script>
+ <script type="application/javascript" src="../states.js"></script>
+ <script type="application/javascript" src="../pivot.js"></script>
+ <script type="application/javascript" src="../layout.js"></script>
+
+ <script type="application/javascript">
+ Components.utils.import("resource://gre/modules/accessibility/Traversal.jsm");
+
+ var vc;
+
+ function accessibleIs(aAccessible, aExpected, aMessage) {
+ if (!aAccessible && aAccessible == aExpected) {
+ ok(true, "Accessible is null. " + aMessage);
+ } else {
+ ok(aAccessible.DOMNode.id == aExpected || aAccessible.name == aExpected,
+ "expected '" + aExpected + "', got " + prettyName(vc.position) +
+ ". " + aMessage);
+ }
+ }
+
+ function walkSequence(aMethod, aRule, aExpectedSequence) {
+ for (var expected of aExpectedSequence) {
+ ok(TraversalHelper.move(vc, aMethod, aRule),
+ "successfully did " + aMethod + " with " + aRule);
+ accessibleIs(vc.position, expected, "landed on correct accessible");
+ }
+ }
+
+ function testTraversalHelper(aRule, aExpectedSequence) {
+ vc.position = null;
+
+ walkSequence('moveNext', aRule, aExpectedSequence);
+
+ ok(!TraversalHelper.move(vc, 'moveNext', aRule), "reached end");
+
+ TraversalHelper.move(vc, 'moveLast', 'Simple');
+
+ walkSequence('movePrevious', aRule,
+ Array.from(aExpectedSequence).reverse());
+
+ ok(!TraversalHelper.move(vc, 'movePrevious', aRule), "reached start");
+
+ vc.position = null;
+
+ ok(TraversalHelper.move(vc, 'moveFirst', aRule), "moveFirst");
+
+ accessibleIs(vc.position, aExpectedSequence[0],
+ "moveFirst to correct accessible");
+
+ ok(TraversalHelper.move(vc, 'moveLast', aRule), "moveLast");
+
+ accessibleIs(vc.position, aExpectedSequence[aExpectedSequence.length - 1],
+ "moveLast to correct accessible");
+ }
+
+
+ function doTest()
+ {
+ var doc = currentTabDocument();
+ var docAcc = getAccessible(doc, [nsIAccessibleDocument]);
+ vc = docAcc.virtualCursor;
+
+ testTraversalHelper('Landmark',
+ ['heading-1', 'heading-2', 'statusbar-1']);
+
+ testTraversalHelper('List',
+ ['Programming Language', 'listitem-2-1', 'listitem-3-1']);
+
+ vc.position = null;
+
+ SimpleTest.finish();
+ }
+
+ SimpleTest.waitForExplicitFinish();
+ addLoadEvent(function () {
+ /* We open a new browser because we need to test with a top-level content
+ document. */
+ openBrowserWindow(
+ doTest,
+ getRootDirectory(window.location.href) + "doc_traversal.html");
+ });
+ </script>
+</head>
+<body id="body">
+
+ <a target="_blank"
+ title="Add tests for AccessFu TraversalRules"
+ href="https://bugzilla.mozilla.org/show_bug.cgi?id=xxx">Mozilla Bug xxx</a>
+ <p id="display"></p>
+ <div id="content" style="display: none"></div>
+ <pre id="test">
+ </pre>
+</body>
+</html>
--- a/addon-sdk/source/lib/sdk/content/tab-events.js
+++ b/addon-sdk/source/lib/sdk/content/tab-events.js
@@ -1,15 +1,16 @@
/* 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";
const system = require('sdk/system/events');
const { frames } = require('sdk/remote/child');
+const { WorkerChild } = require('sdk/content/worker-child');
// map observer topics to tab event names
const EVENTS = {
'content-document-interactive': 'ready',
'chrome-document-interactive': 'ready',
'content-document-loaded': 'load',
'chrome-document-loaded': 'load',
// 'content-page-shown': 'pageshow', // bug 1024105
@@ -29,8 +30,13 @@ for (let topic in EVENTS)
// bug 1024105 - content-page-shown notification doesn't pass persisted param
function eventListener({target, type, persisted}) {
let frame = this;
if (target === frame.content.document)
frame.port.emit('sdk/tab/event', type, persisted);
}
frames.addEventListener('pageshow', eventListener, true);
+
+frames.port.on('sdk/tab/attach', (frame, options) => {
+ options.window = frame.content;
+ new WorkerChild(options);
+});
--- a/addon-sdk/source/lib/sdk/content/utils.js
+++ b/addon-sdk/source/lib/sdk/content/utils.js
@@ -7,16 +7,17 @@ module.metadata = {
'stability': 'unstable'
};
let { merge } = require('../util/object');
let { data } = require('../self');
let assetsURI = data.url();
let isArray = Array.isArray;
let method = require('../../method/core');
+let { uuid } = require('../util/uuid');
const isAddonContent = ({ contentURL }) =>
contentURL && data.url(contentURL).startsWith(assetsURI);
exports.isAddonContent = isAddonContent;
function hasContentScript({ contentScript, contentScriptFile }) {
return (isArray(contentScript) ? contentScript.length > 0 :
@@ -79,8 +80,26 @@ function WorkerHost (workerFor) {
return proto;
}, {});
function isDescriptor (prop) {
return ~['postMessage'].indexOf(prop);
}
}
exports.WorkerHost = WorkerHost;
+
+function makeChildOptions(options) {
+ function makeStringArray(arrayOrValue) {
+ if (!arrayOrValue)
+ return [];
+ return [String(v) for (v of [].concat(arrayOrValue))];
+ }
+
+ return {
+ id: String(uuid()),
+ contentScript: makeStringArray(options.contentScript),
+ contentScriptFile: makeStringArray(options.contentScriptFile),
+ contentScriptOptions: options.contentScriptOptions ?
+ JSON.stringify(options.contentScriptOptions) :
+ null,
+ }
+}
+exports.makeChildOptions = makeChildOptions;
--- a/addon-sdk/source/lib/sdk/content/worker.js
+++ b/addon-sdk/source/lib/sdk/content/worker.js
@@ -10,20 +10,19 @@ module.metadata = {
const { emit } = require('../event/core');
const { omit, merge } = require('../util/object');
const { Class } = require('../core/heritage');
const { method } = require('../lang/functional');
const { getInnerId } = require('../window/utils');
const { EventTarget } = require('../event/target');
const { isPrivate } = require('../private-browsing/utils');
const { getTabForBrowser, getTabForContentWindow, getBrowserForTab } = require('../tabs/utils');
-const { attach, connect, detach, destroy } = require('./utils');
+const { attach, connect, detach, destroy, makeChildOptions } = require('./utils');
const { ensure } = require('../system/unload');
const { on: observe } = require('../system/events');
-const { uuid } = require('../util/uuid');
const { Ci } = require('chrome');
const { modelFor: tabFor } = require('sdk/model/core');
const { remoteRequire, processes, frames } = require('../remote/parent');
remoteRequire('sdk/content/worker-child');
const workers = new WeakMap();
let modelFor = (worker) => workers.get(worker);
@@ -123,36 +122,22 @@ attach.define(Worker, function(worker, w
detach(worker);
model.window = window;
let frame = null;
let tab = getTabForContentWindow(window.top);
if (tab)
frame = frames.getFrameForBrowser(getBrowserForTab(tab));
- function makeStringArray(arrayOrValue) {
- if (!arrayOrValue)
- return [];
- return [String(v) for (v of [].concat(arrayOrValue))];
- }
-
- let id = String(uuid());
- let childOptions = {
- id,
- windowId: getInnerId(window),
- contentScript: makeStringArray(model.options.contentScript),
- contentScriptFile: makeStringArray(model.options.contentScriptFile),
- contentScriptOptions: model.options.contentScriptOptions ?
- JSON.stringify(model.options.contentScriptOptions) :
- null,
- }
+ let childOptions = makeChildOptions(model.options);
+ childOptions.windowId = getInnerId(window);
processes.port.emit('sdk/worker/create', childOptions);
- connect(worker, frame, { id, url: String(window.location) });
+ connect(worker, frame, { id: childOptions.id, url: String(window.location) });
})
connect.define(Worker, function(worker, frame, { id, url }) {
let model = modelFor(worker);
if (model.attached)
detach(worker);
model.id = id;
--- a/addon-sdk/source/lib/sdk/remote/parent.js
+++ b/addon-sdk/source/lib/sdk/remote/parent.js
@@ -234,17 +234,17 @@ const FrameList = Class({
// Returns the frame for a browser element
getFrameForBrowser: function(browser) {
for (let frame of this) {
if (frame.frameElement == browser)
return frame;
}
return null;
- }
+ },
});
let frames = exports.frames = new FrameList();
// Create the module loader in any existing processes
ppmm.broadcastAsyncMessage('sdk/remote/process/load', {
modulePath: PATH,
loaderID,
options: childOptions,
--- a/addon-sdk/source/lib/sdk/tabs/tab-firefox.js
+++ b/addon-sdk/source/lib/sdk/tabs/tab-firefox.js
@@ -186,20 +186,47 @@ const Tab = Class({
}
return getThumbnailURIForWindow(browser(this).contentWindow);
},
attach: function(options) {
if (isDestroyed(this))
return;
- // BUG 792946 https://bugzilla.mozilla.org/show_bug.cgi?id=792946
- // TODO: fix this circular dependency
- let { Worker } = require('./worker');
- return Worker(options, browser(this).contentWindow);
+ let { Worker } = require('../content/worker');
+ let { connect, makeChildOptions } = require('../content/utils');
+
+ let worker = Worker(options);
+ worker.once("detach", () => {
+ worker.destroy();
+ });
+
+ let attach = frame => {
+ let childOptions = makeChildOptions(options);
+ frame.port.emit("sdk/tab/attach", childOptions);
+ connect(worker, frame, { id: childOptions.id, url: this.url });
+ };
+
+ // Do this synchronously if possible
+ let frame = frames.getFrameForBrowser(browser(this));
+ if (frame) {
+ attach(frame);
+ }
+ else {
+ let listener = (frame) => {
+ if (frame.frameElement != browser(this))
+ return;
+
+ listener.off("attach", listener);
+ attach(frame);
+ };
+ frames.on("attach", listener);
+ }
+
+ return worker;
},
destroy: function() {
if (isDestroyed(this))
return;
destroyed.set(this, true);
}
--- a/addon-sdk/source/test/test-ui-sidebar.js
+++ b/addon-sdk/source/test/test-ui-sidebar.js
@@ -1295,17 +1295,17 @@ exports.testDestroyWhileNonBrowserWindow
let url = 'data:text/html;charset=utf-8,' + testName;
let sidebar = Sidebar({
id: testName,
title: testName,
url: url
});
- let window = yield open('chrome://browser/content/preferences/preferences.xul');
+ let window = yield open('chrome://browser/content/aboutDialog.xul');
yield sidebar.show();
assert.equal(isSidebarShowing(getMostRecentBrowserWindow()), true, 'the sidebar is showing');
sidebar.destroy();
assert.pass('sidebar was destroyed while a non browser window was open');
yield cleanUI();
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -850,19 +850,16 @@ pref("browser.preferences.animateFadeIn"
#endif
#ifdef XP_WIN
pref("browser.preferences.instantApply", false);
#else
pref("browser.preferences.instantApply", true);
#endif
-// Toggles between the two Preferences implementations, pop-up window and in-content
-pref("browser.preferences.inContent", true);
-
pref("browser.download.show_plugins_in_list", true);
pref("browser.download.hide_plugins_without_extensions", true);
// Backspace and Shift+Backspace behavior
// 0 goes Back/Forward
// 1 act like PgUp/PgDown
// 2 and other values, nothing
#ifdef UNIX_BUT_NOT_MAC
--- a/browser/base/content/test/general/browser_aboutHome.js
+++ b/browser/base/content/test/general/browser_aboutHome.js
@@ -614,43 +614,22 @@ function promiseWaitForEvent(node, type,
node.addEventListener(type, function listener(event) {
node.removeEventListener(type, listener, capturing);
resolve(event);
}, capturing);
});
}
let promisePrefsOpen = Task.async(function*() {
- if (Services.prefs.getBoolPref("browser.preferences.inContent")) {
- info("Waiting for the preferences tab to open...");
- let event = yield promiseWaitForEvent(gBrowser.tabContainer, "TabOpen", true);
- let tab = event.target;
- yield promiseTabLoadEvent(tab);
- is(tab.linkedBrowser.currentURI.spec, "about:preferences#search", "Should have seen the prefs tab");
- gBrowser.removeTab(tab);
- } else {
- info("Waiting for the preferences window to open...");
- yield new Promise(resolve => {
- let winWatcher = Cc["@mozilla.org/embedcomp/window-watcher;1"].
- getService(Ci.nsIWindowWatcher);
- winWatcher.registerNotification(function onWin(subj, topic, data) {
- if (topic == "domwindowopened" && subj instanceof Ci.nsIDOMWindow) {
- subj.addEventListener("load", function onLoad() {
- subj.removeEventListener("load", onLoad);
- is(subj.document.documentURI, "chrome://browser/content/preferences/preferences.xul", "Should have seen the prefs window");
- winWatcher.unregisterNotification(onWin);
- executeSoon(() => {
- subj.close();
- resolve();
- });
- });
- }
- });
- });
- }
+ info("Waiting for the preferences tab to open...");
+ let event = yield promiseWaitForEvent(gBrowser.tabContainer, "TabOpen", true);
+ let tab = event.target;
+ yield promiseTabLoadEvent(tab);
+ is(tab.linkedBrowser.currentURI.spec, "about:preferences#search", "Should have seen the prefs tab");
+ gBrowser.removeTab(tab);
});
function promiseContentSearchChange(newEngineName) {
return new Promise(resolve => {
content.addEventListener("ContentSearchService", function listener(aEvent) {
if (aEvent.detail.type == "CurrentState" &&
gBrowser.contentWindow.wrappedJSObject.gContentSearchController.defaultEngine.name == newEngineName) {
content.removeEventListener("ContentSearchService", listener);
--- a/browser/base/content/test/general/browser_bug735471.js
+++ b/browser/base/content/test/general/browser_bug735471.js
@@ -2,54 +2,22 @@
* 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/.
*/
function test() {
waitForExplicitFinish();
- registerCleanupFunction(function() {
- // Reset pref to its default
- Services.prefs.clearUserPref("browser.preferences.inContent");
- });
-
- // Verify that about:preferences tab is displayed when
- // browser.preferences.inContent is set to true
- Services.prefs.setBoolPref("browser.preferences.inContent", true);
-
// Open a new tab.
whenNewTabLoaded(window, testPreferences);
}
function testPreferences() {
whenTabLoaded(gBrowser.selectedTab, function () {
- is(Services.prefs.getBoolPref("browser.preferences.inContent"), true, "In-content prefs are enabled");
is(content.location.href, "about:preferences", "Checking if the preferences tab was opened");
gBrowser.removeCurrentTab();
- Services.prefs.setBoolPref("browser.preferences.inContent", false);
- openPreferences();
+ finish();
});
-
- let observer = {
- observe: function(aSubject, aTopic, aData) {
- if (aTopic == "domwindowopened") {
- windowWatcher.unregisterNotification(observer);
-
- let win = aSubject.QueryInterface(Components.interfaces.nsIDOMWindow);
- win.addEventListener("load", function() {
- win.removeEventListener("load", arguments.callee, false);
- is(Services.prefs.getBoolPref("browser.preferences.inContent"), false, "In-content prefs are disabled");
- is(win.location.href, "chrome://browser/content/preferences/preferences.xul", "Checking if the preferences window was opened");
- win.close();
- finish();
- }, false);
- }
- }
- }
-
- var windowWatcher = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
- .getService(Components.interfaces.nsIWindowWatcher);
- windowWatcher.registerNotification(observer);
-
+
openPreferences();
}
--- a/browser/base/content/test/general/browser_bug906190.js
+++ b/browser/base/content/test/general/browser_bug906190.js
@@ -65,16 +65,17 @@ let curTestName = null;
let curChildTabLink = null;
//------------------------ Helper Functions ---------------------
registerCleanupFunction(function() {
// Set preferences back to their original values
Services.prefs.setBoolPref(PREF_ACTIVE, origBlockActive);
});
+requestLongerTimeout(2);
/*
* Whenever we disable the Mixed Content Blocker of the page
* we have to make sure that our condition is properly loaded.
*/
function waitForCondition(condition, nextTest, errorMsg) {
var tries = 0;
var interval = setInterval(function() {
--- a/browser/base/content/test/general/browser_datachoices_notification.js
+++ b/browser/base/content/test/general/browser_datachoices_notification.js
@@ -95,21 +95,16 @@ let checkInfobarButton = Task.async(func
let paneLoadedPromise = promiseTopicObserved("advanced-pane-loaded");
// Click on the button.
button.click();
// Wait for the preferences panel to open.
let preferenceWindow = yield paneLoadedPromise;
yield promiseNextTick();
- // If the prefs are being displayed in a dialog we need to close it.
- // If in a tab (ie, in-content prefs) it closes with the window.
- if (!Services.prefs.getBoolPref("browser.preferences.inContent")) {
- prefWin.close();
- }
});
add_task(function* setup(){
const drsEnabled = Preferences.get(PREF_DRS_ENABLED, true);
const bypassNotification = Preferences.get(PREF_BYPASS_NOTIFICATION, true);
const currentPolicyVersion = Preferences.get(PREF_CURRENT_POLICY_VERSION, 1);
// Register a cleanup function to reset our preferences.
--- a/browser/base/content/test/general/browser_datareporting_notification.js
+++ b/browser/base/content/test/general/browser_datareporting_notification.js
@@ -172,21 +172,16 @@ function test_multiple_windows() {
// Add an observer to ensure the "advanced" pane opened (but don't bother
// closing it - we close the entire window when done.)
Services.obs.addObserver(function observer(prefWin, topic, data) {
Services.obs.removeObserver(observer, "advanced-pane-loaded");
ok(true, "Advanced preferences opened on info bar button press.");
executeSoon(function soon() {
prefWindowOpened = true;
- // If the prefs are being displayed in a dialog we need to close it.
- // If in a tab (ie, in-content prefs) it closes with the window.
- if (!Services.prefs.getBoolPref("browser.preferences.inContent")) {
- prefWin.close();
- }
maybeFinish();
});
}, "advanced-pane-loaded", false);
button.click();
}
notification1.addEventListener("AlertActive", function active1() {
--- a/browser/base/content/test/general/browser_offlineQuotaNotification.js
+++ b/browser/base/content/test/general/browser_offlineQuotaNotification.js
@@ -12,35 +12,16 @@ registerCleanupFunction(function() {
// Clean up after ourself
let uri = Services.io.newURI(URL, null, null);
let principal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {});
Services.perms.removeFromPrincipal(principal, "offline-app");
Services.prefs.clearUserPref("offline-apps.quota.warn");
Services.prefs.clearUserPref("offline-apps.allow_by_default");
});
-// Check that the "preferences" UI is opened and showing which websites have
-// offline storage permissions - currently this is the "network" tab in the
-// "advanced" pane.
-function checkPreferences(prefsWin) {
- // We expect a 'paneload' event for the 'advanced' pane, then
- // a 'select' event on the 'network' tab inside that pane.
- prefsWin.addEventListener("paneload", function paneload(evt) {
- prefsWin.removeEventListener("paneload", paneload);
- is(evt.target.id, "paneAdvanced", "advanced pane loaded");
- let tabPanels = evt.target.getElementsByTagName("tabpanels")[0];
- tabPanels.addEventListener("select", function tabselect() {
- tabPanels.removeEventListener("select", tabselect);
- is(tabPanels.selectedPanel.id, "networkPanel", "networkPanel is selected");
- // all good, we are done.
- prefsWin.close();
- finish();
- });
- });
-}
// Same as the other one, but for in-content preferences
function checkInContentPreferences(win) {
let doc = win.document;
let sel = doc.getElementById("categories").selectedItems[0].id;
let tab = doc.getElementById("advancedPrefs").selectedTab.id;
is(gBrowser.currentURI.spec, "about:preferences#advanced", "about:preferences loaded");
is(sel, "category-advanced", "Advanced pane was selected");
is(tab, "networkTab", "Network tab is selected");
@@ -66,37 +47,25 @@ function test() {
BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser)
]).then(() => {
gBrowser.selectedBrowser.contentWindow.applicationCache.oncached = function() {
executeSoon(function() {
// We got cached - now we should have provoked the quota warning.
let notification = PopupNotifications.getNotification('offline-app-usage');
ok(notification, "have offline-app-usage notification");
// select the default action - this should cause the preferences
- // window to open - which we track either via a window watcher (for
- // the window-based prefs) or via an "Initialized" event (for
- // in-content prefs.)
- if (!Services.prefs.getBoolPref("browser.preferences.inContent")) {
- Services.ww.registerNotification(function wwobserver(aSubject, aTopic, aData) {
- if (aTopic != "domwindowopened")
- return;
- Services.ww.unregisterNotification(wwobserver);
- checkPreferences(aSubject);
- });
- }
+ // tab to open - which we track via an "Initialized" event.
PopupNotifications.panel.firstElementChild.button.click();
- if (Services.prefs.getBoolPref("browser.preferences.inContent")) {
- let newTabBrowser = gBrowser.getBrowserForTab(gBrowser.selectedTab);
- newTabBrowser.addEventListener("Initialized", function PrefInit() {
- newTabBrowser.removeEventListener("Initialized", PrefInit, true);
- executeSoon(function() {
- checkInContentPreferences(newTabBrowser.contentWindow);
- })
- }, true);
- }
+ let newTabBrowser = gBrowser.getBrowserForTab(gBrowser.selectedTab);
+ newTabBrowser.addEventListener("Initialized", function PrefInit() {
+ newTabBrowser.removeEventListener("Initialized", PrefInit, true);
+ executeSoon(function() {
+ checkInContentPreferences(newTabBrowser.contentWindow);
+ })
+ }, true);
});
};
Services.prefs.setIntPref("offline-apps.quota.warn", 1);
// Click the notification panel's "Allow" button. This should kick
// off updates which will call our oncached handler above.
PopupNotifications.panel.firstElementChild.button.click();
});
--- a/browser/base/content/test/social/browser_addons.js
+++ b/browser/base/content/test/social/browser_addons.js
@@ -1,31 +1,32 @@
let AddonManager = Cu.import("resource://gre/modules/AddonManager.jsm", {}).AddonManager;
let SocialService = Cu.import("resource://gre/modules/SocialService.jsm", {}).SocialService;
-const ADDON_TYPE_SERVICE = "service";
-const ID_SUFFIX = "@services.mozilla.org";
-const STRING_TYPE_NAME = "type.%ID%.name";
-const XPINSTALL_URL = "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul";
-
let manifest = {
name: "provider 1",
origin: "https://example.com",
- sidebarURL: "https://example.com/browser/browser/base/content/test/social/social_sidebar.html",
- workerURL: "https://example.com/browser/browser/base/content/test/social/social_worker.js",
+ sidebarURL: "https://example.com/browser/browser/base/content/test/social/social_sidebar_empty.html",
iconURL: "https://example.com/browser/browser/base/content/test/general/moz.png"
};
let manifest2 = { // used for testing install
name: "provider 2",
origin: "https://test1.example.com",
- sidebarURL: "https://test1.example.com/browser/browser/base/content/test/social/social_sidebar.html",
- workerURL: "https://test1.example.com/browser/browser/base/content/test/social/social_worker.js",
+ sidebarURL: "https://test1.example.com/browser/browser/base/content/test/social/social_sidebar_empty.html",
iconURL: "https://test1.example.com/browser/browser/base/content/test/general/moz.png",
version: 1
};
+let manifestUpgrade = { // used for testing install
+ name: "provider 3",
+ origin: "https://test2.example.com",
+ sidebarURL: "https://test2.example.com/browser/browser/base/content/test/social/social_sidebar.html",
+ workerURL: "https://test2.example.com/browser/browser/base/content/test/social/social_worker.js",
+ iconURL: "https://test2.example.com/browser/browser/base/content/test/general/moz.png",
+ version: 1
+};
function test() {
waitForExplicitFinish();
let prefname = getManifestPrefname(manifest);
// ensure that manifest2 is NOT showing as builtin
is(SocialService.getOriginActivationType(manifest.origin), "foreign", "manifest is foreign");
is(SocialService.getOriginActivationType(manifest2.origin), "foreign", "manifest2 is foreign");
@@ -78,32 +79,27 @@ function installListener(next, aManifest
ok(!Services.prefs.prefHasUserValue(prefname), "manifest is not in user-prefs");
AddonManager.removeAddonListener(this);
}
};
}
var tests = {
testHTTPInstallFailure: function(next) {
- let activationURL = "http://example.com/browser/browser/base/content/test/social/social_activate.html"
- addTab(activationURL, function(tab) {
- let doc = tab.linkedBrowser.contentDocument;
- let installFrom = doc.nodePrincipal.origin;
- is(SocialService.getOriginActivationType(installFrom), "foreign", "testing foriegn install");
- let data = {
- origin: doc.nodePrincipal.origin,
- url: doc.location.href,
- manifest: manifest,
- window: window
- }
- Social.installProvider(data, function(addonManifest) {
- ok(!addonManifest, "unable to install provider over http");
- gBrowser.removeTab(tab);
- next();
- });
+ let installFrom = "http://example.com";
+ is(SocialService.getOriginActivationType(installFrom), "foreign", "testing foriegn install");
+ let data = {
+ origin: installFrom,
+ url: installFrom+"/activate",
+ manifest: manifest,
+ window: window
+ }
+ Social.installProvider(data, function(addonManifest) {
+ ok(!addonManifest, "unable to install provider over http");
+ next();
});
},
testAddonEnableToggle: function(next) {
let expectEvent;
let prefname = getManifestPrefname(manifest);
let listener = {
onEnabled: function(addon) {
is(expectEvent, "onEnabled", "provider onEnabled");
@@ -131,17 +127,17 @@ var tests = {
}
};
AddonManager.addAddonListener(listener);
// we're only testing enable disable, so we quickly set the user-level pref
// for this provider and test enable/disable toggling
setManifestPref(prefname, manifest);
ok(Services.prefs.prefHasUserValue(prefname), "manifest is in user-prefs");
- AddonManager.getAddonsByTypes([ADDON_TYPE_SERVICE], function(addons) {
+ AddonManager.getAddonsByTypes(["service"], function(addons) {
for (let addon of addons) {
if (addon.userDisabled) {
expectEvent = "onEnabling";
addon.userDisabled = false;
// only test with one addon
return;
}
}
@@ -186,99 +182,59 @@ var tests = {
expectEvent = "onDisabling";
SocialService.disableProvider(provider.origin, function() {
AddonManager.removeAddonListener(listener);
Services.prefs.clearUserPref(prefname);
next();
});
});
},
- testForeignInstall: function(next) {
+ testDirectoryInstall: function(next) {
AddonManager.addAddonListener(installListener(next, manifest2));
- // we expect the addon install dialog to appear, we need to accept the
- // install from the dialog.
- info("Waiting for install dialog");
- let panel = document.getElementById("servicesInstall-notification");
- PopupNotifications.panel.addEventListener("popupshown", function onpopupshown() {
- PopupNotifications.panel.removeEventListener("popupshown", onpopupshown);
- info("servicesInstall-notification panel opened");
- panel.button.click();
- })
-
- let activationURL = manifest2.origin + "/browser/browser/base/content/test/social/social_activate.html"
- addTab(activationURL, function(tab) {
- let doc = tab.linkedBrowser.contentDocument;
- let installFrom = doc.nodePrincipal.origin;
- Services.prefs.setCharPref("social.whitelist", "");
- is(SocialService.getOriginActivationType(installFrom), "foreign", "testing foriegn install");
- let data = {
- origin: doc.nodePrincipal.origin,
- url: doc.location.href,
- manifest: manifest2,
- window: window
- }
- Social.installProvider(data, function(addonManifest) {
- Services.prefs.clearUserPref("social.whitelist");
- SocialService.enableProvider(addonManifest.origin, function(provider) {
- Social.uninstallProvider(addonManifest.origin);
- gBrowser.removeTab(tab);
- });
- });
- });
- },
- testDirectoryInstall: function(next) {
- AddonManager.addAddonListener(installListener(next, manifest2));
- let panel = document.getElementById("servicesInstall-notification");
- PopupNotifications.panel.addEventListener("popupshown", function onpopupshown() {
- PopupNotifications.panel.removeEventListener("popupshown", onpopupshown);
+ ensureEventFired(PopupNotifications.panel, "popupshown").then(() => {
+ let panel = document.getElementById("servicesInstall-notification");
info("servicesInstall-notification panel opened");
panel.button.click();
});
let activationURL = manifest2.origin + "/browser/browser/base/content/test/social/social_activate.html"
- addTab(activationURL, function(tab) {
- let doc = tab.linkedBrowser.contentDocument;
- let installFrom = doc.nodePrincipal.origin;
- Services.prefs.setCharPref("social.directories", installFrom);
- is(SocialService.getOriginActivationType(installFrom), "directory", "testing directory install");
- let data = {
- origin: installFrom,
- url: doc.location.href,
- manifest: manifest2,
- window: window
- }
- Social.installProvider(data, function(addonManifest) {
- Services.prefs.clearUserPref("social.directories");
- SocialService.enableProvider(addonManifest.origin, function(provider) {
- Social.uninstallProvider(addonManifest.origin);
- gBrowser.removeTab(tab);
- });
+ Services.prefs.setCharPref("social.directories", manifest2.origin);
+ is(SocialService.getOriginActivationType(manifest2.origin), "directory", "testing directory install");
+ let data = {
+ origin: manifest2.origin,
+ url: manifest2.origin + "/directory",
+ manifest: manifest2,
+ window: window
+ }
+ Social.installProvider(data, function(addonManifest) {
+ Services.prefs.clearUserPref("social.directories");
+ SocialService.enableProvider(addonManifest.origin, function(provider) {
+ Social.uninstallProvider(addonManifest.origin);
});
});
},
testUpgradeProviderFromWorker: function(next) {
// add the provider, change the pref, add it again. The provider at that
// point should be upgraded
- let activationURL = manifest2.origin + "/browser/browser/base/content/test/social/social_activate.html"
- let panel = document.getElementById("servicesInstall-notification");
- PopupNotifications.panel.addEventListener("popupshown", function onpopupshown() {
- PopupNotifications.panel.removeEventListener("popupshown", onpopupshown);
+ let activationURL = manifestUpgrade.origin + "/browser/browser/base/content/test/social/social_activate.html"
+ ensureEventFired(PopupNotifications.panel, "popupshown").then(() => {
+ let panel = document.getElementById("servicesInstall-notification");
info("servicesInstall-notification panel opened");
panel.button.click();
});
addTab(activationURL, function(tab) {
let doc = tab.linkedBrowser.contentDocument;
let installFrom = doc.nodePrincipal.origin;
Services.prefs.setCharPref("social.whitelist", installFrom);
let data = {
origin: installFrom,
url: doc.location.href,
- manifest: manifest2,
+ manifest: manifestUpgrade,
window: window
}
Social.installProvider(data, function(addonManifest) {
SocialService.enableProvider(addonManifest.origin, function(provider) {
is(provider.manifest.version, 1, "manifest version is 1");
// watch for the provider-update and test the new version
SocialService.registerProviderListener(function providerListener(topic, origin, providers) {
@@ -301,18 +257,17 @@ var tests = {
let topic = e.data.topic;
switch (topic) {
case "social.manifest":
let manifest = e.data.data;
is(manifest.version, 2, "manifest version is 2");
port.close();
Social.uninstallProvider(origin, function() {
Services.prefs.clearUserPref("social.whitelist");
- gBrowser.removeTab(tab);
- next();
+ ensureBrowserTabClosed(tab).then(next);
});
break;
}
}
port.postMessage({topic: "test-init"});
port.postMessage({topic: "manifest-get"});
});
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -1855,17 +1855,23 @@ file, You can obtain one at http://mozil
// If nothing is selected yet, select the first result if it is a
// pre-selected "heuristic" result. (See UnifiedComplete.js.)
if (this._matchCount > 0 && this.selectedIndex == -1) {
let styles = this.input.mController.getStyleAt(0).split(/\s+/);
if (styles.indexOf("heuristic") >= 0) {
// Don't handle this as a user-initiated action.
this._ignoreNextSelect = true;
+
+ // Don't fire DOMMenuItemActive so that screen readers still see
+ // the input as being focused.
+ this.richlistbox.suppressMenuItemEvent = true;
+
this.selectedIndex = 0;
+ this.richlistbox.suppressMenuItemEvent = false;
this._ignoreNextSelect = false;
}
}
this.input.gotResultForCurrentQuery = true;
if (this.input.handleEnterWhenGotResult) {
this.input.handleEnterWhenGotResult = false;
this.input.mController.handleEnter(false);
--- a/browser/base/content/utilityOverlay.js
+++ b/browser/base/content/utilityOverlay.js
@@ -524,84 +524,65 @@ function openPreferences(paneID, extraAr
}
}
// This function is duplicated from preferences.js.
function internalPrefCategoryNameToFriendlyName(aName) {
return (aName || "").replace(/^pane./, function(toReplace) { return toReplace[4].toLowerCase(); });
}
- if (getBoolPref("browser.preferences.inContent")) {
- let win = Services.wm.getMostRecentWindow("navigator:browser");
- let friendlyCategoryName = internalPrefCategoryNameToFriendlyName(paneID);
- let params;
- if (extraArgs && extraArgs["urlParams"]) {
- params = new URLSearchParams();
- let urlParams = extraArgs["urlParams"];
- for (let name in urlParams) {
- if (urlParams[name] !== undefined) {
- params.set(name, urlParams[name]);
- }
+ let win = Services.wm.getMostRecentWindow("navigator:browser");
+ let friendlyCategoryName = internalPrefCategoryNameToFriendlyName(paneID);
+ let params;
+ if (extraArgs && extraArgs["urlParams"]) {
+ params = new URLSearchParams();
+ let urlParams = extraArgs["urlParams"];
+ for (let name in urlParams) {
+ if (urlParams[name] !== undefined) {
+ params.set(name, urlParams[name]);
}
}
- let preferencesURL = "about:preferences" + (params ? "?" + params : "") +
- (friendlyCategoryName ? "#" + friendlyCategoryName : "");
- let newLoad = true;
- let browser = null;
- if (!win) {
- const Cc = Components.classes;
- const Ci = Components.interfaces;
- let windowArguments = Cc["@mozilla.org/supports-array;1"]
- .createInstance(Ci.nsISupportsArray);
- let supportsStringPrefURL = Cc["@mozilla.org/supports-string;1"]
- .createInstance(Ci.nsISupportsString);
- supportsStringPrefURL.data = preferencesURL;
- windowArguments.AppendElement(supportsStringPrefURL);
-
- win = Services.ww.openWindow(null, Services.prefs.getCharPref("browser.chromeURL"),
- "_blank", "chrome,dialog=no,all", windowArguments);
- } else {
- newLoad = !win.switchToTabHavingURI(preferencesURL, true, {ignoreFragment: true});
- browser = win.gBrowser.selectedBrowser;
- }
+ }
+ let preferencesURL = "about:preferences" + (params ? "?" + params : "") +
+ (friendlyCategoryName ? "#" + friendlyCategoryName : "");
+ let newLoad = true;
+ let browser = null;
+ if (!win) {
+ const Cc = Components.classes;
+ const Ci = Components.interfaces;
+ let windowArguments = Cc["@mozilla.org/supports-array;1"]
+ .createInstance(Ci.nsISupportsArray);
+ let supportsStringPrefURL = Cc["@mozilla.org/supports-string;1"]
+ .createInstance(Ci.nsISupportsString);
+ supportsStringPrefURL.data = preferencesURL;
+ windowArguments.AppendElement(supportsStringPrefURL);
- if (newLoad) {
- Services.obs.addObserver(function advancedPaneLoadedObs(prefWin, topic, data) {
- if (!browser) {
- browser = win.gBrowser.selectedBrowser;
- }
- if (prefWin != browser.contentWindow) {
- return;
- }
- Services.obs.removeObserver(advancedPaneLoadedObs, "advanced-pane-loaded");
- switchToAdvancedSubPane(browser.contentDocument);
- }, "advanced-pane-loaded", false);
- } else {
- if (paneID) {
- browser.contentWindow.gotoPref(paneID);
+ win = Services.ww.openWindow(null, Services.prefs.getCharPref("browser.chromeURL"),
+ "_blank", "chrome,dialog=no,all", windowArguments);
+ } else {
+ newLoad = !win.switchToTabHavingURI(preferencesURL, true, {ignoreFragment: true});
+ browser = win.gBrowser.selectedBrowser;
+ }
+
+ if (newLoad) {
+ Services.obs.addObserver(function advancedPaneLoadedObs(prefWin, topic, data) {
+ if (!browser) {
+ browser = win.gBrowser.selectedBrowser;
}
+ if (prefWin != browser.contentWindow) {
+ return;
+ }
+ Services.obs.removeObserver(advancedPaneLoadedObs, "advanced-pane-loaded");
switchToAdvancedSubPane(browser.contentDocument);
+ }, "advanced-pane-loaded", false);
+ } else {
+ if (paneID) {
+ browser.contentWindow.gotoPref(paneID);
}
- } else {
- var instantApply = getBoolPref("browser.preferences.instantApply", false);
- var features = "chrome,titlebar,toolbar,centerscreen" + (instantApply ? ",dialog=no" : ",modal");
-
- var win = Services.wm.getMostRecentWindow("Browser:Preferences");
- if (win) {
- win.focus();
- if (paneID) {
- var pane = win.document.getElementById(paneID);
- win.document.documentElement.showPane(pane);
- }
-
- switchToAdvancedSubPane(win.document);
- } else {
- openDialog("chrome://browser/content/preferences/preferences.xul",
- "Preferences", features, paneID, extraArgs);
- }
+ switchToAdvancedSubPane(browser.contentDocument);
}
}
function openAdvancedPreferences(tabID)
{
openPreferences("paneAdvanced", { "advancedTab" : tabID });
}
--- a/browser/components/customizableui/test/browser_1087303_button_preferences.js
+++ b/browser/components/customizableui/test/browser_1087303_button_preferences.js
@@ -1,23 +1,19 @@
/* 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";
-const PREF_INCONTENT = "browser.preferences.inContent";
-
let newTab = null;
add_task(function() {
info("Check preferences button existence and functionality");
- Services.prefs.setBoolPref(PREF_INCONTENT, true);
-
yield PanelUI.show();
info("Menu panel was opened");
let preferencesButton = document.getElementById("preferences-button");
ok(preferencesButton, "Preferences button exists in Panel Menu");
preferencesButton.click();
newTab = gBrowser.selectedTab;
@@ -28,19 +24,16 @@ add_task(function() {
});
add_task(function asyncCleanup() {
if (gBrowser.tabs.length == 1)
gBrowser.addTab("about:blank");
gBrowser.removeTab(gBrowser.selectedTab);
info("Tabs were restored");
-
- // restore the browser.preferences.inContent preference
- Services.prefs.clearUserPref(PREF_INCONTENT);
});
function waitForPageLoad(aTab) {
let deferred = Promise.defer();
let timeoutId = setTimeout(() => {
aTab.linkedBrowser.removeEventListener("load", onTabLoad, true);
deferred.reject("Page didn't load within " + 20000 + "ms");
--- a/browser/components/nsBrowserContentHandler.js
+++ b/browser/components/nsBrowserContentHandler.js
@@ -226,44 +226,32 @@ function openWindow(parent, url, target,
argArray.AppendElement(null); // referer
argArray.AppendElement(null); // postData
argArray.AppendElement(null); // allowThirdPartyFixup
return wwatch.openWindow(parent, url, target, features, argArray);
}
function openPreferences() {
- if (Services.prefs.getBoolPref("browser.preferences.inContent")) {
- var sa = Components.classes["@mozilla.org/supports-array;1"]
- .createInstance(Components.interfaces.nsISupportsArray);
+ var sa = Components.classes["@mozilla.org/supports-array;1"]
+ .createInstance(Components.interfaces.nsISupportsArray);
- var wuri = Components.classes["@mozilla.org/supports-string;1"]
- .createInstance(Components.interfaces.nsISupportsString);
- wuri.data = "about:preferences";
-
- sa.AppendElement(wuri);
-
- var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
- .getService(nsIWindowWatcher);
+ var wuri = Components.classes["@mozilla.org/supports-string;1"]
+ .createInstance(Components.interfaces.nsISupportsString);
+ wuri.data = "about:preferences";
- wwatch.openWindow(null, gBrowserContentHandler.chromeURL,
- "_blank",
- "chrome,dialog=no,all",
- sa);
- } else {
- var features = "chrome,titlebar,toolbar,centerscreen,dialog=no";
- var url = "chrome://browser/content/preferences/preferences.xul";
-
- var win = getMostRecentWindow("Browser:Preferences");
- if (win) {
- win.focus();
- } else {
- openWindow(null, url, "_blank", features);
- }
- }
+ sa.AppendElement(wuri);
+
+ var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
+ .getService(nsIWindowWatcher);
+
+ wwatch.openWindow(null, gBrowserContentHandler.chromeURL,
+ "_blank",
+ "chrome,dialog=no,all",
+ sa);
}
function getMostRecentWindow(aType) {
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(nsIWindowMediator);
return wm.getMostRecentWindow(aType);
}
@@ -391,18 +379,17 @@ nsBrowserContentHandler.prototype = {
Components.utils.reportError(e);
}
var chromeParam = cmdLine.handleFlagWithParam("chrome", false);
if (chromeParam) {
// Handle old preference dialog URLs.
if (chromeParam == "chrome://browser/content/pref/pref.xul" ||
- (Services.prefs.getBoolPref("browser.preferences.inContent") &&
- chromeParam == "chrome://browser/content/preferences/preferences.xul")) {
+ chromeParam == "chrome://browser/content/preferences/preferences.xul") {
openPreferences();
cmdLine.preventDefault = true;
} else try {
var uri = resolveURIInternal(cmdLine, chromeParam);
let isLocal = (uri) => {
let localSchemes = new Set(["chrome", "file", "resource"]);
if (uri instanceof Components.interfaces.nsINestedURI) {
uri = uri.QueryInterface(Components.interfaces.nsINestedURI).innerMostURI;
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -525,18 +525,18 @@ BrowserGlue.prototype = {
let actionType;
if (action) {
actionType =
action.type == "searchengine" && action.params.searchSuggestion ?
"searchsuggestion" :
action.type;
}
if (!actionType) {
- let styles = controller.getStyleAt(idx).split(/\s+/);
- let style = ["autofill", "tag", "bookmark"].find(s => styles.includes(s));
+ let styles = new Set(controller.getStyleAt(idx).split(/\s+/));
+ let style = ["autofill", "tag", "bookmark"].find(s => styles.has(s));
actionType = style || "history";
}
Services.telemetry
.getHistogramById("FX_URLBAR_SELECTED_RESULT_INDEX")
.add(idx);
// Ideally this would be a keyed histogram and we'd just add(actionType),
deleted file mode 100644
--- a/browser/components/preferences/advanced.js
+++ /dev/null
@@ -1,823 +0,0 @@
-# -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
-# 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/.
-
-// Load DownloadUtils module for convertByteUnits
-Components.utils.import("resource://gre/modules/DownloadUtils.jsm");
-Components.utils.import("resource://gre/modules/ctypes.jsm");
-Components.utils.import("resource://gre/modules/Services.jsm");
-Components.utils.import("resource://gre/modules/LoadContextInfo.jsm");
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-Components.utils.import("resource://gre/modules/BrowserUtils.jsm");
-
-var gAdvancedPane = {
- _inited: false,
-
- /**
- * Brings the appropriate tab to the front and initializes various bits of UI.
- */
- init: function ()
- {
- this._inited = true;
- var advancedPrefs = document.getElementById("advancedPrefs");
-
- var extraArgs = window.arguments[1];
- if (extraArgs && extraArgs["advancedTab"]){
- advancedPrefs.selectedTab = document.getElementById(extraArgs["advancedTab"]);
- } else {
- var preference = document.getElementById("browser.preferences.advanced.selectedTabIndex");
- if (preference.value !== null)
- advancedPrefs.selectedIndex = preference.value;
- }
-
-#ifdef MOZ_UPDATER
- let onUnload = function () {
- window.removeEventListener("unload", onUnload, false);
- Services.prefs.removeObserver("app.update.", this);
- }.bind(this);
- window.addEventListener("unload", onUnload, false);
- Services.prefs.addObserver("app.update.", this, false);
- this.updateReadPrefs();
-#endif
- this.updateOfflineApps();
-#ifdef MOZ_CRASHREPORTER
- this.initSubmitCrashes();
-#endif
- this.initTelemetry();
-#ifdef MOZ_SERVICES_HEALTHREPORT
- this.initSubmitHealthReport();
-#endif
-
- this.updateCacheSizeInputField();
- this.updateActualCacheSize();
- this.updateActualAppCacheSize();
-
- let bundlePrefs = document.getElementById("bundlePreferences");
- document.getElementById("offlineAppsList")
- .style.height = bundlePrefs.getString("offlineAppsList.height");
-
- // Notify observers that the UI is now ready
- Services.obs.notifyObservers(window, "advanced-pane-loaded", null);
- },
-
- /**
- * Stores the identity of the current tab in preferences so that the selected
- * tab can be persisted between openings of the preferences window.
- */
- tabSelectionChanged: function ()
- {
- if (!this._inited)
- return;
- var advancedPrefs = document.getElementById("advancedPrefs");
- var preference = document.getElementById("browser.preferences.advanced.selectedTabIndex");
- preference.valueFromPreferences = advancedPrefs.selectedIndex;
- },
-
- // GENERAL TAB
-
- /*
- * Preferences:
- *
- * accessibility.browsewithcaret
- * - true enables keyboard navigation and selection within web pages using a
- * visible caret, false uses normal keyboard navigation with no caret
- * accessibility.typeaheadfind
- * - when set to true, typing outside text areas and input boxes will
- * automatically start searching for what's typed within the current
- * document; when set to false, no search action happens
- * general.autoScroll
- * - when set to true, clicking the scroll wheel on the mouse activates a
- * mouse mode where moving the mouse down scrolls the document downward with
- * speed correlated with the distance of the cursor from the original
- * position at which the click occurred (and likewise with movement upward);
- * if false, this behavior is disabled
- * general.smoothScroll
- * - set to true to enable finer page scrolling than line-by-line on page-up,
- * page-down, and other such page movements
- * layout.spellcheckDefault
- * - an integer:
- * 0 disables spellchecking
- * 1 enables spellchecking, but only for multiline text fields
- * 2 enables spellchecking for all text fields
- */
-
- /**
- * Stores the original value of the spellchecking preference to enable proper
- * restoration if unchanged (since we're mapping a tristate onto a checkbox).
- */
- _storedSpellCheck: 0,
-
- /**
- * Returns true if any spellchecking is enabled and false otherwise, caching
- * the current value to enable proper pref restoration if the checkbox is
- * never changed.
- */
- readCheckSpelling: function ()
- {
- var pref = document.getElementById("layout.spellcheckDefault");
- this._storedSpellCheck = pref.value;
-
- return (pref.value != 0);
- },
-
- /**
- * Returns the value of the spellchecking preference represented by UI,
- * preserving the preference's "hidden" value if the preference is
- * unchanged and represents a value not strictly allowed in UI.
- */
- writeCheckSpelling: function ()
- {
- var checkbox = document.getElementById("checkSpelling");
- return checkbox.checked ? (this._storedSpellCheck == 2 ? 2 : 1) : 0;
- },
-
- /**
- * security.OCSP.enabled is an integer value for legacy reasons.
- * A value of 1 means OCSP is enabled. Any other value means it is disabled.
- */
- readEnableOCSP: function ()
- {
- var preference = document.getElementById("security.OCSP.enabled");
- // This is the case if the preference is the default value.
- if (preference.value === undefined) {
- return true;
- }
- return preference.value == 1;
- },
-
- /**
- * See documentation for readEnableOCSP.
- */
- writeEnableOCSP: function ()
- {
- var checkbox = document.getElementById("enableOCSP");
- return checkbox.checked ? 1 : 0;
- },
-
- /**
- * When the user toggles the layers.acceleration.disabled pref,
- * sync its new value to the gfx.direct2d.disabled pref too.
- */
- updateHardwareAcceleration: function()
- {
-#ifdef XP_WIN
- var fromPref = document.getElementById("layers.acceleration.disabled");
- var toPref = document.getElementById("gfx.direct2d.disabled");
- toPref.value = fromPref.value;
-#endif
- },
-
- // DATA CHOICES TAB
-
- /**
- * opening links behind a modal dialog is poor form. Work around flawed text-link handling here.
- */
- openTextLink: function (evt) {
- let where = Services.prefs.getBoolPref("browser.preferences.instantApply") ? "tab" : "window";
- openUILinkIn(evt.target.getAttribute("href"), where);
- evt.preventDefault();
- },
-
- /**
- * Set up or hide the Learn More links for various data collection options
- */
- _setupLearnMoreLink: function (pref, element) {
- // set up the Learn More link with the correct URL
- let url = Services.prefs.getCharPref(pref);
- let el = document.getElementById(element);
-
- if (url) {
- el.setAttribute("href", url);
- } else {
- el.setAttribute("hidden", "true");
- }
- },
-
- /**
- *
- */
- initSubmitCrashes: function ()
- {
- var checkbox = document.getElementById("submitCrashesBox");
- try {
- var cr = Components.classes["@mozilla.org/toolkit/crash-reporter;1"].
- getService(Components.interfaces.nsICrashReporter);
- checkbox.checked = cr.submitReports;
- } catch (e) {
- checkbox.style.display = "none";
- }
- this._setupLearnMoreLink("toolkit.crashreporter.infoURL", "crashReporterLearnMore");
- },
-
- /**
- *
- */
- updateSubmitCrashes: function ()
- {
- var checkbox = document.getElementById("submitCrashesBox");
- try {
- var cr = Components.classes["@mozilla.org/toolkit/crash-reporter;1"].
- getService(Components.interfaces.nsICrashReporter);
- cr.submitReports = checkbox.checked;
- } catch (e) { }
- },
-
-
- /**
- * The preference/checkbox is configured in XUL.
- *
- * In all cases, set up the Learn More link sanely
- */
- initTelemetry: function ()
- {
-#ifdef MOZ_TELEMETRY_REPORTING
- this._setupLearnMoreLink("toolkit.telemetry.infoURL", "telemetryLearnMore");
-#endif
- },
-
- /**
- * Set the status of the telemetry controls based on the input argument.
- * @param {Boolean} aEnabled False disables the controls, true enables them.
- */
- setTelemetrySectionEnabled: function (aEnabled)
- {
-#ifdef MOZ_TELEMETRY_REPORTING
- // If FHR is disabled, additional data sharing should be disabled as well.
- let disabled = !aEnabled;
- document.getElementById("submitTelemetryBox").disabled = disabled;
- if (disabled) {
- // If we disable FHR, untick the telemetry checkbox.
- Services.prefs.setBoolPref("toolkit.telemetry.enabled", false);
- }
- document.getElementById("telemetryDataDesc").disabled = disabled;
-#endif
- },
-
-#ifdef MOZ_SERVICES_HEALTHREPORT
- /**
- * Initialize the health report service reference and checkbox.
- */
- initSubmitHealthReport: function () {
- this._setupLearnMoreLink("datareporting.healthreport.infoURL", "FHRLearnMore");
-
- let policy = Components.classes["@mozilla.org/datareporting/service;1"]
- .getService(Components.interfaces.nsISupports)
- .wrappedJSObject
- .policy;
-
- let checkbox = document.getElementById("submitHealthReportBox");
-
- if (!policy || policy.healthReportUploadLocked) {
- checkbox.setAttribute("disabled", "true");
- return;
- }
-
- checkbox.checked = policy.healthReportUploadEnabled;
- this.setTelemetrySectionEnabled(checkbox.checked);
- },
-
- /**
- * Update the health report policy acceptance with state from checkbox.
- */
- updateSubmitHealthReport: function () {
- let policy = Components.classes["@mozilla.org/datareporting/service;1"]
- .getService(Components.interfaces.nsISupports)
- .wrappedJSObject
- .policy;
-
- if (!policy) {
- return;
- }
-
- let checkbox = document.getElementById("submitHealthReportBox");
- policy.recordHealthReportUploadEnabled(checkbox.checked,
- "Checkbox from preferences pane");
- this.setTelemetrySectionEnabled(checkbox.checked);
- },
-#endif
-
- // NETWORK TAB
-
- /*
- * Preferences:
- *
- * browser.cache.disk.capacity
- * - the size of the browser cache in KB
- * - Only used if browser.cache.disk.smart_size.enabled is disabled
- */
-
- /**
- * Displays a dialog in which proxy settings may be changed.
- */
- showConnections: function ()
- {
- document.documentElement.openSubDialog("chrome://browser/content/preferences/connection.xul",
- "", null);
- },
-
- // Retrieves the amount of space currently used by disk cache
- updateActualCacheSize: function ()
- {
- var actualSizeLabel = document.getElementById("actualDiskCacheSize");
- var prefStrBundle = document.getElementById("bundlePreferences");
-
- // Needs to root the observer since cache service keeps only a weak reference.
- this.observer = {
- onNetworkCacheDiskConsumption: function(consumption) {
- var size = DownloadUtils.convertByteUnits(consumption);
- actualSizeLabel.value = prefStrBundle.getFormattedString("actualDiskCacheSize", size);
- },
-
- QueryInterface: XPCOMUtils.generateQI([
- Components.interfaces.nsICacheStorageConsumptionObserver,
- Components.interfaces.nsISupportsWeakReference
- ])
- };
-
- actualSizeLabel.value = prefStrBundle.getString("actualDiskCacheSizeCalculated");
-
- var cacheService =
- Components.classes["@mozilla.org/netwerk/cache-storage-service;1"]
- .getService(Components.interfaces.nsICacheStorageService);
- cacheService.asyncGetDiskConsumption(this.observer);
- },
-
- // Retrieves the amount of space currently used by offline cache
- updateActualAppCacheSize: function ()
- {
- var visitor = {
- onCacheStorageInfo: function (aEntryCount, aConsumption, aCapacity, aDiskDirectory)
- {
- var actualSizeLabel = document.getElementById("actualAppCacheSize");
- var sizeStrings = DownloadUtils.convertByteUnits(aConsumption);
- var prefStrBundle = document.getElementById("bundlePreferences");
- var sizeStr = prefStrBundle.getFormattedString("actualAppCacheSize", sizeStrings);
- actualSizeLabel.value = sizeStr;
- }
- };
-
- var cacheService =
- Components.classes["@mozilla.org/netwerk/cache-storage-service;1"]
- .getService(Components.interfaces.nsICacheStorageService);
- var storage = cacheService.appCacheStorage(LoadContextInfo.default, null);
- storage.asyncVisitStorage(visitor, false);
- },
-
- updateCacheSizeUI: function (smartSizeEnabled)
- {
- document.getElementById("useCacheBefore").disabled = smartSizeEnabled;
- document.getElementById("cacheSize").disabled = smartSizeEnabled;
- document.getElementById("useCacheAfter").disabled = smartSizeEnabled;
- },
-
- readSmartSizeEnabled: function ()
- {
- // The smart_size.enabled preference element is inverted="true", so its
- // value is the opposite of the actual pref value
- var disabled = document.getElementById("browser.cache.disk.smart_size.enabled").value;
- this.updateCacheSizeUI(!disabled);
- },
-
- /**
- * Converts the cache size from units of KB to units of MB and stores it in
- * the textbox element.
- */
- updateCacheSizeInputField()
- {
- let cacheSizeElem = document.getElementById("cacheSize");
- let cachePref = document.getElementById("browser.cache.disk.capacity");
- cacheSizeElem.value = cachePref.value / 1024;
- if (cachePref.locked)
- cacheSizeElem.disabled = true;
- },
-
- /**
- * Updates the cache size preference once user enters a new value.
- * We intentionally do not set preference="browser.cache.disk.capacity"
- * onto the textbox directly, as that would update the pref at each keypress
- * not only after the final value is entered.
- */
- updateCacheSizePref()
- {
- let cacheSizeElem = document.getElementById("cacheSize");
- let cachePref = document.getElementById("browser.cache.disk.capacity");
- // Converts the cache size as specified in UI (in MB) to KB.
- let intValue = parseInt(cacheSizeElem.value, 10);
- cachePref.value = isNaN(intValue) ? 0 : intValue * 1024;
- },
-
- /**
- * Clears the cache.
- */
- clearCache: function ()
- {
- var cache = Components.classes["@mozilla.org/netwerk/cache-storage-service;1"]
- .getService(Components.interfaces.nsICacheStorageService);
- try {
- cache.clear();
- } catch(ex) {}
- this.updateActualCacheSize();
- Services.obs.notifyObservers(null, "clear-private-data", null);
- },
-
- /**
- * Clears the application cache.
- */
- clearOfflineAppCache: function ()
- {
- Components.utils.import("resource:///modules/offlineAppCache.jsm");
- OfflineAppCacheHelper.clear();
-
- this.updateActualAppCacheSize();
- this.updateOfflineApps();
- Services.obs.notifyObservers(null, "clear-private-data", null);
- },
-
- readOfflineNotify: function()
- {
- var pref = document.getElementById("browser.offline-apps.notify");
- var button = document.getElementById("offlineNotifyExceptions");
- button.disabled = !pref.value;
- return pref.value;
- },
-
- showOfflineExceptions: function()
- {
- var bundlePreferences = document.getElementById("bundlePreferences");
- var params = { blockVisible : false,
- sessionVisible : false,
- allowVisible : false,
- prefilledHost : "",
- permissionType : "offline-app",
- manageCapability : Components.interfaces.nsIPermissionManager.DENY_ACTION,
- windowTitle : bundlePreferences.getString("offlinepermissionstitle"),
- introText : bundlePreferences.getString("offlinepermissionstext") };
- document.documentElement.openWindow("Browser:Permissions",
- "chrome://browser/content/preferences/permissions.xul",
- "resizable", params);
- },
-
- // XXX: duplicated in browser.js
- _getOfflineAppUsage: function (perm, groups)
- {
- var cacheService = Components.classes["@mozilla.org/network/application-cache-service;1"].
- getService(Components.interfaces.nsIApplicationCacheService);
- if (!groups)
- groups = cacheService.getGroups();
-
- var ios = Components.classes["@mozilla.org/network/io-service;1"].
- getService(Components.interfaces.nsIIOService);
-
- var usage = 0;
- for (var i = 0; i < groups.length; i++) {
- var uri = ios.newURI(groups[i], null, null);
- if (perm.matchesURI(uri, true)) {
- var cache = cacheService.getActiveCache(groups[i]);
- usage += cache.usage;
- }
- }
-
- return usage;
- },
-
- /**
- * Updates the list of offline applications
- */
- updateOfflineApps: function ()
- {
- var pm = Components.classes["@mozilla.org/permissionmanager;1"]
- .getService(Components.interfaces.nsIPermissionManager);
-
- var list = document.getElementById("offlineAppsList");
- while (list.firstChild) {
- list.removeChild(list.firstChild);
- }
-
- var cacheService = Components.classes["@mozilla.org/network/application-cache-service;1"].
- getService(Components.interfaces.nsIApplicationCacheService);
- var groups = cacheService.getGroups();
-
- var bundle = document.getElementById("bundlePreferences");
-
- var enumerator = pm.enumerator;
- while (enumerator.hasMoreElements()) {
- var perm = enumerator.getNext().QueryInterface(Components.interfaces.nsIPermission);
- if (perm.type == "offline-app" &&
- perm.capability != Components.interfaces.nsIPermissionManager.DEFAULT_ACTION &&
- perm.capability != Components.interfaces.nsIPermissionManager.DENY_ACTION) {
- var row = document.createElement("listitem");
- row.id = "";
- row.className = "offlineapp";
- row.setAttribute("origin", perm.principal.origin);
- var converted = DownloadUtils.
- convertByteUnits(this._getOfflineAppUsage(perm, groups));
- row.setAttribute("usage",
- bundle.getFormattedString("offlineAppUsage",
- converted));
- list.appendChild(row);
- }
- }
- },
-
- offlineAppSelected: function()
- {
- var removeButton = document.getElementById("offlineAppsListRemove");
- var list = document.getElementById("offlineAppsList");
- if (list.selectedItem) {
- removeButton.setAttribute("disabled", "false");
- } else {
- removeButton.setAttribute("disabled", "true");
- }
- },
-
- removeOfflineApp: function()
- {
- var list = document.getElementById("offlineAppsList");
- var item = list.selectedItem;
- var origin = item.getAttribute("origin");
- var principal = BrowserUtils.principalFromOrigin(origin);
-
- var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
- .getService(Components.interfaces.nsIPromptService);
- var flags = prompts.BUTTON_TITLE_IS_STRING * prompts.BUTTON_POS_0 +
- prompts.BUTTON_TITLE_CANCEL * prompts.BUTTON_POS_1;
-
- var bundle = document.getElementById("bundlePreferences");
- var title = bundle.getString("offlineAppRemoveTitle");
- var prompt = bundle.getFormattedString("offlineAppRemovePrompt", [principal.URI.prePath]);
- var confirm = bundle.getString("offlineAppRemoveConfirm");
- var result = prompts.confirmEx(window, title, prompt, flags, confirm,
- null, null, null, {});
- if (result != 0)
- return;
-
- // get the permission
- var pm = Components.classes["@mozilla.org/permissionmanager;1"]
- .getService(Components.interfaces.nsIPermissionManager);
- var perm = pm.getPermissionObject(principal, "offline-app");
-
- // clear offline cache entries
- var cacheService = Components.classes["@mozilla.org/network/application-cache-service;1"].
- getService(Components.interfaces.nsIApplicationCacheService);
- var ios = Components.classes["@mozilla.org/network/io-service;1"].
- getService(Components.interfaces.nsIIOService);
- var groups = cacheService.getGroups();
- for (var i = 0; i < groups.length; i++) {
- var uri = ios.newURI(groups[i], null, null);
- if (perm.matchesURI(uri, true)) {
- var cache = cacheService.getActiveCache(groups[i]);
- cache.discard();
- }
- }
-
- pm.removePermission(perm);
-
- list.removeChild(item);
- gAdvancedPane.offlineAppSelected();
- this.updateActualAppCacheSize();
- },
-
- // UPDATE TAB
-
- /*
- * Preferences:
- *
- * app.update.enabled
- * - true if updates to the application are enabled, false otherwise
- * extensions.update.enabled
- * - true if updates to extensions and themes are enabled, false otherwise
- * browser.search.update
- * - true if updates to search engines are enabled, false otherwise
- * app.update.auto
- * - true if updates should be automatically downloaded and installed,
- * possibly with a warning if incompatible extensions are installed (see
- * app.update.mode); false if the user should be asked what he wants to do
- * when an update is available
- * app.update.mode
- * - an integer:
- * 0 do not warn if an update will disable extensions or themes
- * 1 warn if an update will disable extensions or themes
- * 2 warn if an update will disable extensions or themes *or* if the
- * update is a major update
- */
-
-#ifdef MOZ_UPDATER
- /**
- * Selects the item of the radiogroup, and sets the warnIncompatible checkbox
- * based on the pref values and locked states.
- *
- * UI state matrix for update preference conditions
- *
- * UI Components: Preferences
- * Radiogroup i = app.update.enabled
- * Warn before disabling extensions checkbox ii = app.update.auto
- * iii = app.update.mode
- *
- * Disabled states:
- * Element pref value locked disabled
- * radiogroup i t/f f false
- * i t/f *t* *true*
- * ii t/f f false
- * ii t/f *t* *true*
- * iii 0/1/2 t/f false
- * warnIncompatible i t f false
- * i t *t* *true*
- * i *f* t/f *true*
- * ii t f false
- * ii t *t* *true*
- * ii *f* t/f *true*
- * iii 0/1/2 f false
- * iii 0/1/2 *t* *true*
- */
- updateReadPrefs: function ()
- {
- var enabledPref = document.getElementById("app.update.enabled");
- var autoPref = document.getElementById("app.update.auto");
- var radiogroup = document.getElementById("updateRadioGroup");
-
- if (!enabledPref.value) // Don't care for autoPref.value in this case.
- radiogroup.value="manual"; // 3. Never check for updates.
- else if (autoPref.value) // enabledPref.value && autoPref.value
- radiogroup.value="auto"; // 1. Automatically install updates for Desktop only
- else // enabledPref.value && !autoPref.value
- radiogroup.value="checkOnly"; // 2. Check, but let me choose
-
- var canCheck = Components.classes["@mozilla.org/updates/update-service;1"].
- getService(Components.interfaces.nsIApplicationUpdateService).
- canCheckForUpdates;
- // canCheck is false if the enabledPref is false and locked,
- // or the binary platform or OS version is not known.
- // A locked pref is sufficient to disable the radiogroup.
- radiogroup.disabled = !canCheck || enabledPref.locked || autoPref.locked;
-
- var modePref = document.getElementById("app.update.mode");
- var warnIncompatible = document.getElementById("warnIncompatible");
- // the warnIncompatible checkbox value is set by readAddonWarn
- warnIncompatible.disabled = radiogroup.disabled || modePref.locked ||
- !enabledPref.value || !autoPref.value;
-
-#ifdef MOZ_MAINTENANCE_SERVICE
- // Check to see if the maintenance service is installed.
- // If it is don't show the preference at all.
- var installed;
- try {
- var wrk = Components.classes["@mozilla.org/windows-registry-key;1"]
- .createInstance(Components.interfaces.nsIWindowsRegKey);
- wrk.open(wrk.ROOT_KEY_LOCAL_MACHINE,
- "SOFTWARE\\Mozilla\\MaintenanceService",
- wrk.ACCESS_READ | wrk.WOW64_64);
- installed = wrk.readIntValue("Installed");
- wrk.close();
- } catch(e) {
- }
- if (installed != 1) {
- document.getElementById("useService").hidden = true;
- }
- try {
- const DRIVE_FIXED = 3;
- const LPCWSTR = ctypes.char16_t.ptr;
- const UINT = ctypes.uint32_t;
- let kernel32 = ctypes.open("kernel32");
- let GetDriveType = kernel32.declare("GetDriveTypeW", ctypes.default_abi, UINT, LPCWSTR);
- var UpdatesDir = Components.classes["@mozilla.org/updates/update-service;1"].
- getService(Components.interfaces.nsIApplicationUpdateService);
- let rootPath = UpdatesDir.getUpdatesDirectory();
- while (rootPath.parent != null) {
- rootPath = rootPath.parent;
- }
- if (GetDriveType(rootPath.path) != DRIVE_FIXED) {
- document.getElementById("useService").hidden = true;
- }
- kernel32.close();
- } catch(e) {
- }
-#endif
- },
-
- /**
- * Sets the pref values based on the selected item of the radiogroup,
- * and sets the disabled state of the warnIncompatible checkbox accordingly.
- */
- updateWritePrefs: function ()
- {
- var enabledPref = document.getElementById("app.update.enabled");
- var autoPref = document.getElementById("app.update.auto");
- var modePref = document.getElementById("app.update.mode");
- var radiogroup = document.getElementById("updateRadioGroup");
- switch (radiogroup.value) {
- case "auto": // 1. Automatically install updates for Desktop only
- enabledPref.value = true;
- autoPref.value = true;
- break;
- case "checkOnly": // 2. Check, but let me choose
- enabledPref.value = true;
- autoPref.value = false;
- break;
- case "manual": // 3. Never check for updates.
- enabledPref.value = false;
- autoPref.value = false;
- }
-
- var warnIncompatible = document.getElementById("warnIncompatible");
- warnIncompatible.disabled = enabledPref.locked || !enabledPref.value ||
- autoPref.locked || !autoPref.value ||
- modePref.locked;
- },
-
- /**
- * Stores the value of the app.update.mode preference, which is a tristate
- * integer preference. We store the value here so that we can properly
- * restore the preference value if the UI reflecting the preference value
- * is in a state which can represent either of two integer values (as
- * opposed to only one possible value in the other UI state).
- */
- _modePreference: -1,
-
- /**
- * Reads the app.update.mode preference and converts its value into a
- * true/false value for use in determining whether the "Warn me if this will
- * disable extensions or themes" checkbox is checked. We also save the value
- * of the preference so that the preference value can be properly restored if
- * the user's preferences cannot adequately be expressed by a single checkbox.
- *
- * app.update.mode Checkbox State Meaning
- * 0 Unchecked Do not warn
- * 1 Checked Warn if there are incompatibilities
- * 2 Checked Warn if there are incompatibilities,
- * or the update is major.
- */
- readAddonWarn: function ()
- {
- var preference = document.getElementById("app.update.mode");
- var warn = preference.value != 0;
- gAdvancedPane._modePreference = warn ? preference.value : 1;
- return warn;
- },
-
- /**
- * Converts the state of the "Warn me if this will disable extensions or
- * themes" checkbox into the integer preference which represents it,
- * returning that value.
- */
- writeAddonWarn: function ()
- {
- var warnIncompatible = document.getElementById("warnIncompatible");
- return !warnIncompatible.checked ? 0 : gAdvancedPane._modePreference;
- },
-
- /**
- * Displays the history of installed updates.
- */
- showUpdates: function ()
- {
- var prompter = Components.classes["@mozilla.org/updates/update-prompt;1"]
- .createInstance(Components.interfaces.nsIUpdatePrompt);
- prompter.showUpdateHistory(window);
- },
-#endif
-
- // ENCRYPTION TAB
-
- /*
- * Preferences:
- *
- * security.default_personal_cert
- * - a string:
- * "Select Automatically" select a certificate automatically when a site
- * requests one
- * "Ask Every Time" present a dialog to the user so he can select
- * the certificate to use on a site which
- * requests one
- */
-
- /**
- * Displays the user's certificates and associated options.
- */
- showCertificates: function ()
- {
- document.documentElement.openWindow("mozilla:certmanager",
- "chrome://pippki/content/certManager.xul",
- "", null);
- },
-
- /**
- * Displays a dialog from which the user can manage his security devices.
- */
- showSecurityDevices: function ()
- {
- document.documentElement.openWindow("mozilla:devicemanager",
- "chrome://pippki/content/device_manager.xul",
- "", null);
- },
-
-#ifdef MOZ_UPDATER
- observe: function (aSubject, aTopic, aData) {
- switch(aTopic) {
- case "nsPref:changed":
- this.updateReadPrefs();
- break;
- }
- },
-#endif
-};
deleted file mode 100644
--- a/browser/components/preferences/advanced.xul
+++ /dev/null
@@ -1,397 +0,0 @@
-<?xml version="1.0"?>
-
-# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
-# 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/.
-
-<!DOCTYPE overlay [
-<!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
-%brandDTD;
-<!ENTITY % advancedDTD SYSTEM "chrome://browser/locale/preferences/advanced.dtd">
-%advancedDTD;
-<!ENTITY % privacyDTD SYSTEM "chrome://browser/locale/preferences/privacy.dtd">
-%privacyDTD;
-]>
-
-<overlay id="AdvancedPaneOverlay"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
- <prefpane id="paneAdvanced" onpaneload="gAdvancedPane.init();">
-
- <preferences id="advancedPreferences">
- <preference id="browser.preferences.advanced.selectedTabIndex"
- name="browser.preferences.advanced.selectedTabIndex"
- type="int"/>
-
- <!--XXX button prefs -->
-
- <!-- General tab -->
- <preference id="accessibility.browsewithcaret" name="accessibility.browsewithcaret" type="bool"/>
- <preference id="accessibility.typeaheadfind" name="accessibility.typeaheadfind" type="bool"/>
- <preference id="accessibility.blockautorefresh" name="accessibility.blockautorefresh" type="bool"/>
-
- <preference id="general.autoScroll" name="general.autoScroll" type="bool"/>
- <preference id="general.smoothScroll" name="general.smoothScroll" type="bool"/>
- <preference id="layers.acceleration.disabled" name="layers.acceleration.disabled" type="bool" inverted="true"
- onchange="gAdvancedPane.updateHardwareAcceleration()"/>
-#ifdef XP_WIN
- <preference id="gfx.direct2d.disabled" name="gfx.direct2d.disabled" type="bool" inverted="true"/>
-#endif
- <preference id="layout.spellcheckDefault" name="layout.spellcheckDefault" type="int"/>
-
- <!-- Data Choices tab -->
-
-#ifdef MOZ_TELEMETRY_REPORTING
- <preference id="toolkit.telemetry.enabled"
- name="toolkit.telemetry.enabled"
- type="bool"/>
-#endif
-
- <!-- Network tab -->
- <preference id="browser.cache.disk.capacity" name="browser.cache.disk.capacity" type="int"/>
- <preference id="browser.offline-apps.notify" name="browser.offline-apps.notify" type="bool"/>
-
- <preference id="browser.cache.disk.smart_size.enabled"
- name="browser.cache.disk.smart_size.enabled"
- inverted="true"
- type="bool"/>
-
- <!-- Update tab -->
-#ifdef MOZ_UPDATER
- <preference id="app.update.enabled" name="app.update.enabled" type="bool"/>
- <preference id="app.update.auto" name="app.update.auto" type="bool"/>
- <preference id="app.update.mode" name="app.update.mode" type="int"/>
-
- <preference id="app.update.disable_button.showUpdateHistory"
- name="app.update.disable_button.showUpdateHistory"
- type="bool"/>
-
-#ifdef MOZ_MAINTENANCE_SERVICE
- <preference id="app.update.service.enabled"
- name="app.update.service.enabled"
- type="bool"/>
-#endif
-#endif
-
- <preference id="browser.search.update" name="browser.search.update" type="bool"/>
-
- <!-- Certificates tab -->
- <preference id="security.default_personal_cert" name="security.default_personal_cert" type="string"/>
-
- <preference id="security.disable_button.openCertManager"
- name="security.disable_button.openCertManager"
- type="bool"/>
- <preference id="security.disable_button.openDeviceManager"
- name="security.disable_button.openDeviceManager"
- type="bool"/>
- <preference id="security.OCSP.enabled"
- name="security.OCSP.enabled"
- type="int"/>
- </preferences>
-
-#ifdef HAVE_SHELL_SERVICE
- <stringbundle id="bundleShell" src="chrome://browser/locale/shellservice.properties"/>
- <stringbundle id="bundleBrand" src="chrome://branding/locale/brand.properties"/>
-#endif
- <stringbundle id="bundlePreferences" src="chrome://browser/locale/preferences/preferences.properties"/>
-
- <script type="application/javascript" src="chrome://browser/content/preferences/advanced.js"/>
-
- <tabbox id="advancedPrefs" flex="1"
- onselect="gAdvancedPane.tabSelectionChanged();">
-
- <tabs id="tabsElement">
- <tab id="generalTab" label="&generalTab.label;" helpTopic="prefs-advanced-general"/>
-#ifdef MOZ_DATA_REPORTING
- <tab id="dataChoicesTab" label="&dataChoicesTab.label;" helpTopic="prefs-advanced-data-choices"/>
-#endif
- <tab id="networkTab" label="&networkTab.label;" helpTopic="prefs-advanced-network"/>
- <tab id="updateTab" label="&updateTab.label;" helpTopic="prefs-advanced-update"/>
- <tab id="encryptionTab" label="&certificateTab.label;" helpTopic="prefs-advanced-encryption"/>
- </tabs>
-
- <tabpanels flex="1">
-
- <!-- General -->
- <tabpanel id="generalPanel" orient="vertical">
-
- <!-- Accessibility -->
- <groupbox id="accessibilityGroup" align="start">
- <caption label="&accessibility.label;"/>
-
- <checkbox id="useCursorNavigation"
- label="&useCursorNavigation.label;"
- accesskey="&useCursorNavigation.accesskey;"
- preference="accessibility.browsewithcaret"/>
- <checkbox id="searchStartTyping"
- label="&searchStartTyping.label;"
- accesskey="&searchStartTyping.accesskey;"
- preference="accessibility.typeaheadfind"/>
- <checkbox id="blockAutoRefresh"
- label="&blockAutoRefresh.label;"
- accesskey="&blockAutoRefresh.accesskey;"
- preference="accessibility.blockautorefresh"/>
- </groupbox>
-
- <!-- Browsing -->
- <groupbox id="browsingGroup" align="start">
- <caption label="&browsing.label;"/>
-
- <checkbox id="useAutoScroll"
- label="&useAutoScroll.label;"
- accesskey="&useAutoScroll.accesskey;"
- preference="general.autoScroll"/>
- <checkbox id="useSmoothScrolling"
- label="&useSmoothScrolling.label;"
- accesskey="&useSmoothScrolling.accesskey;"
- preference="general.smoothScroll"/>
- <checkbox id="allowHWAccel"
- label="&allowHWAccel.label;"
- accesskey="&allowHWAccel.accesskey;"
- preference="layers.acceleration.disabled"/>
- <checkbox id="checkSpelling"
- label="&checkSpelling.label;"
- accesskey="&checkSpelling.accesskey;"
- onsyncfrompreference="return gAdvancedPane.readCheckSpelling();"
- onsynctopreference="return gAdvancedPane.writeCheckSpelling();"
- preference="layout.spellcheckDefault"/>
- </groupbox>
- </tabpanel>
-
-#ifdef MOZ_DATA_REPORTING
- <!-- Data Choices -->
- <tabpanel id="dataChoicesPanel" orient="vertical">
-#ifdef MOZ_SERVICES_HEALTHREPORT
- <groupbox>
- <caption>
- <checkbox id="submitHealthReportBox" label="&enableHealthReport.label;"
- oncommand="gAdvancedPane.updateSubmitHealthReport();"
- accesskey="&enableHealthReport.accesskey;"/>
- </caption>
- <vbox>
- <hbox class="indent">
- <label flex="1">&healthReportDesc.label;</label>
- <spacer flex="10"/>
- <label id="FHRLearnMore" class="text-link"
- value="&healthReportLearnMore.label;"
- onclick="gAdvancedPane.openTextLink(event)"/>
- </hbox>
-#ifdef MOZ_TELEMETRY_REPORTING
- <hbox class="indent">
- <vbox flex="1">
- <checkbox id="submitTelemetryBox" label="&enableTelemetryData.label;"
- preference="toolkit.telemetry.enabled"
- accesskey="&enableTelemetryData.accesskey;"/>
- <hbox class="indent">
- <label id="telemetryDataDesc" flex="1">&telemetryDesc.label;</label>
- <spacer flex="10"/>
- <label id="telemetryLearnMore" class="text-link"
- value="&telemetryLearnMore.label;"
- onclick="gAdvancedPane.openTextLink(event)"/>
- </hbox>
- </vbox>
- </hbox>
-#endif
- </vbox>
- </groupbox>
-#endif
-#ifdef MOZ_CRASHREPORTER
- <groupbox>
- <caption>
- <checkbox id="submitCrashesBox" label="&enableCrashReporter.label;"
- oncommand="gAdvancedPane.updateSubmitCrashes();"
- accesskey="&enableCrashReporter.accesskey;"/>
- </caption>
- <hbox class="indent">
- <label flex="1">&crashReporterDesc.label;</label>
- <spacer flex="10"/>
- <label id="crashReporterLearnMore"
- class="text-link"
- value="&crashReporterLearnMore.label;"
- onclick="gAdvancedPane.openTextLink(event)"/>
- </hbox>
- </groupbox>
-#endif
- </tabpanel>
-#endif
- <!-- Network -->
- <tabpanel id="networkPanel" orient="vertical">
-
- <!-- Connection -->
- <groupbox id="connectionGroup">
- <caption label="&connection.label;"/>
-
- <hbox align="center">
- <description flex="1" control="connectionSettings">&connectionDesc.label;</description>
- <button id="connectionSettings" icon="network" label="&connectionSettings.label;"
- accesskey="&connectionSettings.accesskey;"
- oncommand="gAdvancedPane.showConnections();"/>
- </hbox>
- </groupbox>
-
- <!-- Cache -->
- <groupbox id="cacheGroup">
- <caption label="&httpCache.label;"/>
-
- <hbox align="center">
- <label id="actualDiskCacheSize" flex="1"/>
- <button id="clearCacheButton" icon="clear"
- label="&clearCacheNow.label;" accesskey="&clearCacheNow.accesskey;"
- oncommand="gAdvancedPane.clearCache();"/>
- </hbox>
- <checkbox preference="browser.cache.disk.smart_size.enabled"
- id="allowSmartSize" flex="1"
- onsyncfrompreference="return gAdvancedPane.readSmartSizeEnabled();"
- label="&overrideSmartCacheSize.label;"
- accesskey="&overrideSmartCacheSize.accesskey;"/>
- <hbox align="center" class="indent">
- <label id="useCacheBefore" control="cacheSize"
- accesskey="&limitCacheSizeBefore.accesskey;"
- value="&limitCacheSizeBefore.label;"/>
- <textbox id="cacheSize" type="number" size="4" max="1024"
- onchange="gAdvancedPane.updateCacheSizePref();"
- aria-labelledby="useCacheBefore cacheSize useCacheAfter"/>
- <label id="useCacheAfter" flex="1">&limitCacheSizeAfter.label;</label>
- </hbox>
- </groupbox>
-
- <!-- Offline apps -->
- <groupbox id="offlineGroup">
- <caption label="&offlineStorage2.label;"/>
-
- <hbox align="center">
- <label id="actualAppCacheSize" flex="1"/>
- <button id="clearOfflineAppCacheButton" icon="clear"
- label="&clearOfflineAppCacheNow.label;" accesskey="&clearOfflineAppCacheNow.accesskey;"
- oncommand="gAdvancedPane.clearOfflineAppCache();"/>
- </hbox>
- <hbox align="center">
- <checkbox id="offlineNotify" flex="1"
- label="&offlineNotify.label;" accesskey="&offlineNotify.accesskey;"
- preference="browser.offline-apps.notify"
- onsyncfrompreference="return gAdvancedPane.readOfflineNotify();"/>
- <button id="offlineNotifyExceptions"
- label="&offlineNotifyExceptions.label;"
- accesskey="&offlineNotifyExceptions.accesskey;"
- oncommand="gAdvancedPane.showOfflineExceptions();"/>
- </hbox>
- <hbox>
- <vbox flex="1">
- <label id="offlineAppsListLabel">&offlineAppsList2.label;</label>
- <listbox id="offlineAppsList"
- flex="1"
- aria-labelledby="offlineAppsListLabel"
- onselect="gAdvancedPane.offlineAppSelected(event);">
- </listbox>
- </vbox>
- <vbox pack="end">
- <button id="offlineAppsListRemove"
- disabled="true"
- label="&offlineAppsListRemove.label;"
- accesskey="&offlineAppsListRemove.accesskey;"
- oncommand="gAdvancedPane.removeOfflineApp();"/>
- </vbox>
- </hbox>
- </groupbox>
- </tabpanel>
-
- <!-- Update -->
- <tabpanel id="updatePanel" orient="vertical">
-#ifdef MOZ_UPDATER
- <groupbox id="updateApp">
- <caption label="&updateApp.label;"/>
- <radiogroup id="updateRadioGroup"
- oncommand="gAdvancedPane.updateWritePrefs();">
- <radio id="autoDesktop"
- value="auto"
- label="&updateAuto1.label;"
- accesskey="&updateAuto1.accesskey;"/>
- <hbox class="indent">
- <checkbox id="warnIncompatible"
- label="&updateAutoAddonWarn.label;"
- accesskey="&updateAutoAddonWarn.accesskey;"
- preference="app.update.mode"
- onsyncfrompreference="return gAdvancedPane.readAddonWarn();"
- onsynctopreference="return gAdvancedPane.writeAddonWarn();"/>
- </hbox>
- <radio value="checkOnly"
- label="&updateCheck.label;"
- accesskey="&updateCheck.accesskey;"/>
- <radio value="manual"
- label="&updateManual.label;"
- accesskey="&updateManual.accesskey;"/>
- </radiogroup>
-
- <hbox>
- <button id="showUpdateHistory"
- label="&updateHistory.label;"
- accesskey="&updateHistory.accesskey;"
- preference="app.update.disable_button.showUpdateHistory"
- oncommand="gAdvancedPane.showUpdates();"/>
- </hbox>
-
-#ifdef MOZ_MAINTENANCE_SERVICE
- <checkbox id="useService"
- label="&useService.label;"
- accesskey="&useService.accesskey;"
- preference="app.update.service.enabled"/>
-#endif
- </groupbox>
-#endif
- <groupbox id="updateOthers">
- <caption label="&updateOthers.label;"/>
- <checkbox id="enableSearchUpdate"
- label="&enableSearchUpdate.label;"
- accesskey="&enableSearchUpdate.accesskey;"
- preference="browser.search.update"/>
- </groupbox>
- </tabpanel>
-
- <!-- Certificates -->
- <tabpanel id="encryptionPanel" orient="vertical">
-
- <description id="CertSelectionDesc" control="certSelection">&certSelection.description;</description>
-
- <!--
- The values on these radio buttons may look like l12y issues, but
- they're not - this preference uses *those strings* as its values.
- I KID YOU NOT.
- -->
- <radiogroup id="certSelection" orient="horizontal" preftype="string"
- preference="security.default_personal_cert"
- aria-labelledby="CertSelectionDesc">
- <radio label="&certs.auto;" accesskey="&certs.auto.accesskey;"
- value="Select Automatically"/>
- <radio label="&certs.ask;" accesskey="&certs.ask.accesskey;"
- value="Ask Every Time"/>
- </radiogroup>
-
- <separator/>
-
- <checkbox id="enableOCSP"
- label="&enableOCSP.label;"
- accesskey="&enableOCSP.accesskey;"
- onsyncfrompreference="return gAdvancedPane.readEnableOCSP();"
- onsynctopreference="return gAdvancedPane.writeEnableOCSP();"
- preference="security.OCSP.enabled"/>
-
- <separator/>
-
- <hbox>
- <button id="viewCertificatesButton"
- label="&viewCerts.label;" accesskey="&viewCerts.accesskey;"
- oncommand="gAdvancedPane.showCertificates();"
- preference="security.disable_button.openCertManager"/>
- <button id="viewSecurityDevicesButton"
- label="&viewSecurityDevices.label;" accesskey="&viewSecurityDevices.accesskey;"
- oncommand="gAdvancedPane.showSecurityDevices();"
- preference="security.disable_button.openDeviceManager"/>
- </hbox>
- </tabpanel>
-
- </tabpanels>
- </tabbox>
- </prefpane>
-
-</overlay>
--- a/browser/components/preferences/applicationManager.js
+++ b/browser/components/preferences/applicationManager.js
@@ -1,16 +1,14 @@
# 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/.
-#ifdef XP_MACOSX
var Cc = Components.classes;
var Ci = Components.interfaces;
-#endif
var gAppManagerDialog = {
_removed: [],
init: function appManager_init() {
this.handlerInfo = window.arguments[0];
var bundle = document.getElementById("appManagerBundle");
--- a/browser/components/preferences/applicationManager.xul
+++ b/browser/components/preferences/applicationManager.xul
@@ -17,17 +17,17 @@
style="&appManager.style;"
persist="screenX screenY">
<script type="application/javascript"
src="chrome://browser/content/utilityOverlay.js"/>
<script type="application/javascript"
src="chrome://browser/content/preferences/applicationManager.js"/>
<script type="application/javascript"
- src="chrome://browser/content/preferences/applications.js"/>
+ src="chrome://browser/content/preferences/in-content/applications.js"/>
<commandset id="appManagerCommandSet">
<command id="cmd_remove"
oncommand="gAppManagerDialog.remove();"
disabled="true"/>
</commandset>
<keyset id="appManagerKeyset">
deleted file mode 100644
--- a/browser/components/preferences/applications.js
+++ /dev/null
@@ -1,1911 +0,0 @@
-/*
-# -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
-# 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/.
- */
-
-//****************************************************************************//
-// Constants & Enumeration Values
-
-var Cc = Components.classes;
-var Ci = Components.interfaces;
-var Cr = Components.results;
-
-Components.utils.import('resource://gre/modules/Services.jsm');
-Components.utils.import('resource://gre/modules/AppConstants.jsm');
-
-const TYPE_MAYBE_FEED = "application/vnd.mozilla.maybe.feed";
-const TYPE_MAYBE_VIDEO_FEED = "application/vnd.mozilla.maybe.video.feed";
-const TYPE_MAYBE_AUDIO_FEED = "application/vnd.mozilla.maybe.audio.feed";
-const TYPE_PDF = "application/pdf";
-
-const PREF_PDFJS_DISABLED = "pdfjs.disabled";
-const TOPIC_PDFJS_HANDLER_CHANGED = "pdfjs:handlerChanged";
-
-const PREF_DISABLED_PLUGIN_TYPES = "plugin.disable_full_page_plugin_for_types";
-
-// Preferences that affect which entries to show in the list.
-const PREF_SHOW_PLUGINS_IN_LIST = "browser.download.show_plugins_in_list";
-const PREF_HIDE_PLUGINS_WITHOUT_EXTENSIONS =
- "browser.download.hide_plugins_without_extensions";
-
-/*
- * Preferences where we store handling information about the feed type.
- *
- * browser.feeds.handler
- * - "bookmarks", "reader" (clarified further using the .default preference),
- * or "ask" -- indicates the default handler being used to process feeds;
- * "bookmarks" is obsolete; to specify that the handler is bookmarks,
- * set browser.feeds.handler.default to "bookmarks";
- *
- * browser.feeds.handler.default
- * - "bookmarks", "client" or "web" -- indicates the chosen feed reader used
- * to display feeds, either transiently (i.e., when the "use as default"
- * checkbox is unchecked, corresponds to when browser.feeds.handler=="ask")
- * or more permanently (i.e., the item displayed in the dropdown in Feeds
- * preferences)
- *
- * browser.feeds.handler.webservice
- * - the URL of the currently selected web service used to read feeds
- *
- * browser.feeds.handlers.application
- * - nsILocalFile, stores the current client-side feed reading app if one has
- * been chosen
- */
-const PREF_FEED_SELECTED_APP = "browser.feeds.handlers.application";
-const PREF_FEED_SELECTED_WEB = "browser.feeds.handlers.webservice";
-const PREF_FEED_SELECTED_ACTION = "browser.feeds.handler";
-const PREF_FEED_SELECTED_READER = "browser.feeds.handler.default";
-
-const PREF_VIDEO_FEED_SELECTED_APP = "browser.videoFeeds.handlers.application";
-const PREF_VIDEO_FEED_SELECTED_WEB = "browser.videoFeeds.handlers.webservice";
-const PREF_VIDEO_FEED_SELECTED_ACTION = "browser.videoFeeds.handler";
-const PREF_VIDEO_FEED_SELECTED_READER = "browser.videoFeeds.handler.default";
-
-const PREF_AUDIO_FEED_SELECTED_APP = "browser.audioFeeds.handlers.application";
-const PREF_AUDIO_FEED_SELECTED_WEB = "browser.audioFeeds.handlers.webservice";
-const PREF_AUDIO_FEED_SELECTED_ACTION = "browser.audioFeeds.handler";
-const PREF_AUDIO_FEED_SELECTED_READER = "browser.audioFeeds.handler.default";
-
-// The nsHandlerInfoAction enumeration values in nsIHandlerInfo identify
-// the actions the application can take with content of various types.
-// But since nsIHandlerInfo doesn't support plugins, there's no value
-// identifying the "use plugin" action, so we use this constant instead.
-const kActionUsePlugin = 5;
-
-const ICON_URL_APP = AppConstants.platform == "linux" ?
- "moz-icon://dummy.exe?size=16" :
- "chrome://browser/skin/preferences/application.png";
-
-// For CSS. Can be one of "ask", "save", "plugin" or "feed". If absent, the icon URL
-// was set by us to a custom handler icon and CSS should not try to override it.
-const APP_ICON_ATTR_NAME = "appHandlerIcon";
-
-//****************************************************************************//
-// Utilities
-
-function getFileDisplayName(file) {
-#ifdef XP_WIN
- if (file instanceof Ci.nsILocalFileWin) {
- try {
- return file.getVersionInfoField("FileDescription");
- } catch (e) {}
- }
-#endif
-#ifdef XP_MACOSX
- if (file instanceof Ci.nsILocalFileMac) {
- try {
- return file.bundleDisplayName;
- } catch (e) {}
- }
-#endif
- return file.leafName;
-}
-
-function getLocalHandlerApp(aFile) {
- var localHandlerApp = Cc["@mozilla.org/uriloader/local-handler-app;1"].
- createInstance(Ci.nsILocalHandlerApp);
- localHandlerApp.name = getFileDisplayName(aFile);
- localHandlerApp.executable = aFile;
-
- return localHandlerApp;
-}
-
-/**
- * An enumeration of items in a JS array.
- *
- * FIXME: use ArrayConverter once it lands (bug 380839).
- *
- * @constructor
- */
-function ArrayEnumerator(aItems) {
- this._index = 0;
- this._contents = aItems;
-}
-
-ArrayEnumerator.prototype = {
- _index: 0,
-
- hasMoreElements: function() {
- return this._index < this._contents.length;
- },
-
- getNext: function() {
- return this._contents[this._index++];
- }
-};
-
-function isFeedType(t) {
- return t == TYPE_MAYBE_FEED || t == TYPE_MAYBE_VIDEO_FEED || t == TYPE_MAYBE_AUDIO_FEED;
-}
-
-//****************************************************************************//
-// HandlerInfoWrapper
-
-/**
- * This object wraps nsIHandlerInfo with some additional functionality
- * the Applications prefpane needs to display and allow modification of
- * the list of handled types.
- *
- * We create an instance of this wrapper for each entry we might display
- * in the prefpane, and we compose the instances from various sources,
- * including plugins and the handler service.
- *
- * We don't implement all the original nsIHandlerInfo functionality,
- * just the stuff that the prefpane needs.
- *
- * In theory, all of the custom functionality in this wrapper should get
- * pushed down into nsIHandlerInfo eventually.
- */
-function HandlerInfoWrapper(aType, aHandlerInfo) {
- this._type = aType;
- this.wrappedHandlerInfo = aHandlerInfo;
-}
-
-HandlerInfoWrapper.prototype = {
- // The wrapped nsIHandlerInfo object. In general, this object is private,
- // but there are a couple cases where callers access it directly for things
- // we haven't (yet?) implemented, so we make it a public property.
- wrappedHandlerInfo: null,
-
-
- //**************************************************************************//
- // Convenience Utils
-
- _handlerSvc: Cc["@mozilla.org/uriloader/handler-service;1"].
- getService(Ci.nsIHandlerService),
-
- _prefSvc: Cc["@mozilla.org/preferences-service;1"].
- getService(Ci.nsIPrefBranch),
-
- _categoryMgr: Cc["@mozilla.org/categorymanager;1"].
- getService(Ci.nsICategoryManager),
-
- element: function(aID) {
- return document.getElementById(aID);
- },
-
-
- //**************************************************************************//
- // nsIHandlerInfo
-
- // The MIME type or protocol scheme.
- _type: null,
- get type() {
- return this._type;
- },
-
- get description() {
- if (this.wrappedHandlerInfo.description)
- return this.wrappedHandlerInfo.description;
-
- if (this.primaryExtension) {
- var extension = this.primaryExtension.toUpperCase();
- return this.element("bundlePreferences").getFormattedString("fileEnding",
- [extension]);
- }
-
- return this.type;
- },
-
- get preferredApplicationHandler() {
- return this.wrappedHandlerInfo.preferredApplicationHandler;
- },
-
- set preferredApplicationHandler(aNewValue) {
- this.wrappedHandlerInfo.preferredApplicationHandler = aNewValue;
-
- // Make sure the preferred handler is in the set of possible handlers.
- if (aNewValue)
- this.addPossibleApplicationHandler(aNewValue)
- },
-
- get possibleApplicationHandlers() {
- return this.wrappedHandlerInfo.possibleApplicationHandlers;
- },
-
- addPossibleApplicationHandler: function(aNewHandler) {
- var possibleApps = this.possibleApplicationHandlers.enumerate();
- while (possibleApps.hasMoreElements()) {
- if (possibleApps.getNext().equals(aNewHandler))
- return;
- }
- this.possibleApplicationHandlers.appendElement(aNewHandler, false);
- },
-
- removePossibleApplicationHandler: function(aHandler) {
- var defaultApp = this.preferredApplicationHandler;
- if (defaultApp && aHandler.equals(defaultApp)) {
- // If the app we remove was the default app, we must make sure
- // it won't be used anymore
- this.alwaysAskBeforeHandling = true;
- this.preferredApplicationHandler = null;
- }
-
- var handlers = this.possibleApplicationHandlers;
- for (var i = 0; i < handlers.length; ++i) {
- var handler = handlers.queryElementAt(i, Ci.nsIHandlerApp);
- if (handler.equals(aHandler)) {
- handlers.removeElementAt(i);
- break;
- }
- }
- },
-
- get hasDefaultHandler() {
- return this.wrappedHandlerInfo.hasDefaultHandler;
- },
-
- get defaultDescription() {
- return this.wrappedHandlerInfo.defaultDescription;
- },
-
- // What to do with content of this type.
- get preferredAction() {
- // If we have an enabled plugin, then the action is to use that plugin.
- if (this.pluginName && !this.isDisabledPluginType)
- return kActionUsePlugin;
-
- // If the action is to use a helper app, but we don't have a preferred
- // handler app, then switch to using the system default, if any; otherwise
- // fall back to saving to disk, which is the default action in nsMIMEInfo.
- // Note: "save to disk" is an invalid value for protocol info objects,
- // but the alwaysAskBeforeHandling getter will detect that situation
- // and always return true in that case to override this invalid value.
- if (this.wrappedHandlerInfo.preferredAction == Ci.nsIHandlerInfo.useHelperApp &&
- !gApplicationsPane.isValidHandlerApp(this.preferredApplicationHandler)) {
- if (this.wrappedHandlerInfo.hasDefaultHandler)
- return Ci.nsIHandlerInfo.useSystemDefault;
- else
- return Ci.nsIHandlerInfo.saveToDisk;
- }
-
- return this.wrappedHandlerInfo.preferredAction;
- },
-
- set preferredAction(aNewValue) {
- // If the action is to use the plugin,
- // we must set the preferred action to "save to disk".
- // But only if it's not currently the preferred action.
- if ((aNewValue == kActionUsePlugin) &&
- (this.preferredAction != Ci.nsIHandlerInfo.saveToDisk)) {
- aNewValue = Ci.nsIHandlerInfo.saveToDisk;
- }
-
- // We don't modify the preferred action if the new action is to use a plugin
- // because handler info objects don't understand our custom "use plugin"
- // value. Also, leaving it untouched means that we can automatically revert
- // to the old setting if the user ever removes the plugin.
-
- if (aNewValue != kActionUsePlugin)
- this.wrappedHandlerInfo.preferredAction = aNewValue;
- },
-
- get alwaysAskBeforeHandling() {
- // If this type is handled only by a plugin, we can't trust the value
- // in the handler info object, since it'll be a default based on the absence
- // of any user configuration, and the default in that case is to always ask,
- // even though we never ask for content handled by a plugin, so special case
- // plugin-handled types by returning false here.
- if (this.pluginName && this.handledOnlyByPlugin)
- return false;
-
- // If this is a protocol type and the preferred action is "save to disk",
- // which is invalid for such types, then return true here to override that
- // action. This could happen when the preferred action is to use a helper
- // app, but the preferredApplicationHandler is invalid, and there isn't
- // a default handler, so the preferredAction getter returns save to disk
- // instead.
- if (!(this.wrappedHandlerInfo instanceof Ci.nsIMIMEInfo) &&
- this.preferredAction == Ci.nsIHandlerInfo.saveToDisk)
- return true;
-
- return this.wrappedHandlerInfo.alwaysAskBeforeHandling;
- },
-
- set alwaysAskBeforeHandling(aNewValue) {
- this.wrappedHandlerInfo.alwaysAskBeforeHandling = aNewValue;
- },
-
-
- //**************************************************************************//
- // nsIMIMEInfo
-
- // The primary file extension associated with this type, if any.
- //
- // XXX Plugin objects contain an array of MimeType objects with "suffixes"
- // properties; if this object has an associated plugin, shouldn't we check
- // those properties for an extension?
- get primaryExtension() {
- try {
- if (this.wrappedHandlerInfo instanceof Ci.nsIMIMEInfo &&
- this.wrappedHandlerInfo.primaryExtension)
- return this.wrappedHandlerInfo.primaryExtension
- } catch(ex) {}
-
- return null;
- },
-
-
- //**************************************************************************//
- // Plugin Handling
-
- // A plugin that can handle this type, if any.
- //
- // Note: just because we have one doesn't mean it *will* handle the type.
- // That depends on whether or not the type is in the list of types for which
- // plugin handling is disabled.
- plugin: null,
-
- // Whether or not this type is only handled by a plugin or is also handled
- // by some user-configured action as specified in the handler info object.
- //
- // Note: we can't just check if there's a handler info object for this type,
- // because OS and user configuration is mixed up in the handler info object,
- // so we always need to retrieve it for the OS info and can't tell whether
- // it represents only OS-default information or user-configured information.
- //
- // FIXME: once handler info records are broken up into OS-provided records
- // and user-configured records, stop using this boolean flag and simply
- // check for the presence of a user-configured record to determine whether
- // or not this type is only handled by a plugin. Filed as bug 395142.
- handledOnlyByPlugin: undefined,
-
- get isDisabledPluginType() {
- return this._getDisabledPluginTypes().indexOf(this.type) != -1;
- },
-
- _getDisabledPluginTypes: function() {
- var types = "";
-
- if (this._prefSvc.prefHasUserValue(PREF_DISABLED_PLUGIN_TYPES))
- types = this._prefSvc.getCharPref(PREF_DISABLED_PLUGIN_TYPES);
-
- // Only split if the string isn't empty so we don't end up with an array
- // containing a single empty string.
- if (types != "")
- return types.split(",");
-
- return [];
- },
-
- disablePluginType: function() {
- var disabledPluginTypes = this._getDisabledPluginTypes();
-
- if (disabledPluginTypes.indexOf(this.type) == -1)
- disabledPluginTypes.push(this.type);
-
- this._prefSvc.setCharPref(PREF_DISABLED_PLUGIN_TYPES,
- disabledPluginTypes.join(","));
-
- // Update the category manager so existing browser windows update.
- this._categoryMgr.deleteCategoryEntry("Gecko-Content-Viewers",
- this.type,
- false);
- },
-
- enablePluginType: function() {
- var disabledPluginTypes = this._getDisabledPluginTypes();
-
- var type = this.type;
- disabledPluginTypes = disabledPluginTypes.filter(function(v) v != type);
-
- this._prefSvc.setCharPref(PREF_DISABLED_PLUGIN_TYPES,
- disabledPluginTypes.join(","));
-
- // Update the category manager so existing browser windows update.
- this._categoryMgr.
- addCategoryEntry("Gecko-Content-Viewers",
- this.type,
- "@mozilla.org/content/plugin/document-loader-factory;1",
- false,
- true);
- },
-
-
- //**************************************************************************//
- // Storage
-
- store: function() {
- this._handlerSvc.store(this.wrappedHandlerInfo);
- },
-
-
- //**************************************************************************//
- // Icons
-
- get smallIcon() {
- return this._getIcon(16);
- },
-
- _getIcon: function(aSize) {
- if (this.primaryExtension)
- return "moz-icon://goat." + this.primaryExtension + "?size=" + aSize;
-
- if (this.wrappedHandlerInfo instanceof Ci.nsIMIMEInfo)
- return "moz-icon://goat?size=" + aSize + "&contentType=" + this.type;
-
- // FIXME: consider returning some generic icon when we can't get a URL for
- // one (for example in the case of protocol schemes). Filed as bug 395141.
- return null;
- }
-
-};
-
-
-//****************************************************************************//
-// Feed Handler Info
-
-/**
- * This object implements nsIHandlerInfo for the feed types. It's a separate
- * object because we currently store handling information for the feed type
- * in a set of preferences rather than the nsIHandlerService-managed datastore.
- *
- * This object inherits from HandlerInfoWrapper in order to get functionality
- * that isn't special to the feed type.
- *
- * XXX Should we inherit from HandlerInfoWrapper? After all, we override
- * most of that wrapper's properties and methods, and we have to dance around
- * the fact that the wrapper expects to have a wrappedHandlerInfo, which we
- * don't provide.
- */
-
-function FeedHandlerInfo(aMIMEType) {
- HandlerInfoWrapper.call(this, aMIMEType, null);
-}
-
-FeedHandlerInfo.prototype = {
- __proto__: HandlerInfoWrapper.prototype,
-
- //**************************************************************************//
- // Convenience Utils
-
- _converterSvc:
- Cc["@mozilla.org/embeddor.implemented/web-content-handler-registrar;1"].
- getService(Ci.nsIWebContentConverterService),
-
- _shellSvc:
-#ifdef HAVE_SHELL_SERVICE
- getShellService(),
-#else
- null,
-#endif
-
-
- //**************************************************************************//
- // nsIHandlerInfo
-
- get description() {
- return this.element("bundlePreferences").getString(this._appPrefLabel);
- },
-
- get preferredApplicationHandler() {
- switch (this.element(this._prefSelectedReader).value) {
- case "client":
- var file = this.element(this._prefSelectedApp).value;
- if (file)
- return getLocalHandlerApp(file);
-
- return null;
-
- case "web":
- var uri = this.element(this._prefSelectedWeb).value;
- if (!uri)
- return null;
- return this._converterSvc.getWebContentHandlerByURI(this.type, uri);
-
- case "bookmarks":
- default:
- // When the pref is set to bookmarks, we handle feeds internally,
- // we don't forward them to a local or web handler app, so there is
- // no preferred handler.
- return null;
- }
- },
-
- set preferredApplicationHandler(aNewValue) {
- if (aNewValue instanceof Ci.nsILocalHandlerApp) {
- this.element(this._prefSelectedApp).value = aNewValue.executable;
- this.element(this._prefSelectedReader).value = "client";
- }
- else if (aNewValue instanceof Ci.nsIWebContentHandlerInfo) {
- this.element(this._prefSelectedWeb).value = aNewValue.uri;
- this.element(this._prefSelectedReader).value = "web";
- // Make the web handler be the new "auto handler" for feeds.
- // Note: we don't have to unregister the auto handler when the user picks
- // a non-web handler (local app, Live Bookmarks, etc.) because the service
- // only uses the "auto handler" when the selected reader is a web handler.
- // We also don't have to unregister it when the user turns on "always ask"
- // (i.e. preview in browser), since that also overrides the auto handler.
- this._converterSvc.setAutoHandler(this.type, aNewValue);
- }
- },
-
- _possibleApplicationHandlers: null,
-
- get possibleApplicationHandlers() {
- if (this._possibleApplicationHandlers)
- return this._possibleApplicationHandlers;
-
- // A minimal implementation of nsIMutableArray. It only supports the two
- // methods its callers invoke, namely appendElement and nsIArray::enumerate.
- this._possibleApplicationHandlers = {
- _inner: [],
- _removed: [],
-
- QueryInterface: function(aIID) {
- if (aIID.equals(Ci.nsIMutableArray) ||
- aIID.equals(Ci.nsIArray) ||
- aIID.equals(Ci.nsISupports))
- return this;
-
- throw Cr.NS_ERROR_NO_INTERFACE;
- },
-
- get length() {
- return this._inner.length;
- },
-
- enumerate: function() {
- return new ArrayEnumerator(this._inner);
- },
-
- appendElement: function(aHandlerApp, aWeak) {
- this._inner.push(aHandlerApp);
- },
-
- removeElementAt: function(aIndex) {
- this._removed.push(this._inner[aIndex]);
- this._inner.splice(aIndex, 1);
- },
-
- queryElementAt: function(aIndex, aInterface) {
- return this._inner[aIndex].QueryInterface(aInterface);
- }
- };
-
- // Add the selected local app if it's different from the OS default handler.
- // Unlike for other types, we can store only one local app at a time for the
- // feed type, since we store it in a preference that historically stores
- // only a single path. But we display all the local apps the user chooses
- // while the prefpane is open, only dropping the list when the user closes
- // the prefpane, for maximum usability and consistency with other types.
- var preferredAppFile = this.element(this._prefSelectedApp).value;
- if (preferredAppFile) {
- let preferredApp = getLocalHandlerApp(preferredAppFile);
- let defaultApp = this._defaultApplicationHandler;
- if (!defaultApp || !defaultApp.equals(preferredApp))
- this._possibleApplicationHandlers.appendElement(preferredApp, false);
- }
-
- // Add the registered web handlers. There can be any number of these.
- var webHandlers = this._converterSvc.getContentHandlers(this.type);
- for each (let webHandler in webHandlers)
- this._possibleApplicationHandlers.appendElement(webHandler, false);
-
- return this._possibleApplicationHandlers;
- },
-
- __defaultApplicationHandler: undefined,
- get _defaultApplicationHandler() {
- if (typeof this.__defaultApplicationHandler != "undefined")
- return this.__defaultApplicationHandler;
-
- var defaultFeedReader = null;
-#ifdef HAVE_SHELL_SERVICE
- try {
- defaultFeedReader = this._shellSvc.defaultFeedReader;
- }
- catch(ex) {
- // no default reader or _shellSvc is null
- }
-#endif
-
- if (defaultFeedReader) {
- let handlerApp = Cc["@mozilla.org/uriloader/local-handler-app;1"].
- createInstance(Ci.nsIHandlerApp);
- handlerApp.name = getFileDisplayName(defaultFeedReader);
- handlerApp.QueryInterface(Ci.nsILocalHandlerApp);
- handlerApp.executable = defaultFeedReader;
-
- this.__defaultApplicationHandler = handlerApp;
- }
- else {
- this.__defaultApplicationHandler = null;
- }
-
- return this.__defaultApplicationHandler;
- },
-
- get hasDefaultHandler() {
-#ifdef HAVE_SHELL_SERVICE
- try {
- if (this._shellSvc.defaultFeedReader)
- return true;
- }
- catch(ex) {
- // no default reader or _shellSvc is null
- }
-#endif
-
- return false;
- },
-
- get defaultDescription() {
- if (this.hasDefaultHandler)
- return this._defaultApplicationHandler.name;
-
- // Should we instead return null?
- return "";
- },
-
- // What to do with content of this type.
- get preferredAction() {
- switch (this.element(this._prefSelectedAction).value) {
-
- case "bookmarks":
- return Ci.nsIHandlerInfo.handleInternally;
-
- case "reader": {
- let preferredApp = this.preferredApplicationHandler;
- let defaultApp = this._defaultApplicationHandler;
-
- // If we have a valid preferred app, return useSystemDefault if it's
- // the default app; otherwise return useHelperApp.
- if (gApplicationsPane.isValidHandlerApp(preferredApp)) {
- if (defaultApp && defaultApp.equals(preferredApp))
- return Ci.nsIHandlerInfo.useSystemDefault;
-
- return Ci.nsIHandlerInfo.useHelperApp;
- }
-
- // The pref is set to "reader", but we don't have a valid preferred app.
- // What do we do now? Not sure this is the best option (perhaps we
- // should direct the user to the default app, if any), but for now let's
- // direct the user to live bookmarks.
- return Ci.nsIHandlerInfo.handleInternally;
- }
-
- // If the action is "ask", then alwaysAskBeforeHandling will override
- // the action, so it doesn't matter what we say it is, it just has to be
- // something that doesn't cause the controller to hide the type.
- case "ask":
- default:
- return Ci.nsIHandlerInfo.handleInternally;
- }
- },
-
- set preferredAction(aNewValue) {
- switch (aNewValue) {
-
- case Ci.nsIHandlerInfo.handleInternally:
- this.element(this._prefSelectedReader).value = "bookmarks";
- break;
-
- case Ci.nsIHandlerInfo.useHelperApp:
- this.element(this._prefSelectedAction).value = "reader";
- // The controller has already set preferredApplicationHandler
- // to the new helper app.
- break;
-
- case Ci.nsIHandlerInfo.useSystemDefault:
- this.element(this._prefSelectedAction).value = "reader";
- this.preferredApplicationHandler = this._defaultApplicationHandler;
- break;
- }
- },
-
- get alwaysAskBeforeHandling() {
- return this.element(this._prefSelectedAction).value == "ask";
- },
-
- set alwaysAskBeforeHandling(aNewValue) {
- if (aNewValue == true)
- this.element(this._prefSelectedAction).value = "ask";
- else
- this.element(this._prefSelectedAction).value = "reader";
- },
-
- // Whether or not we are currently storing the action selected by the user.
- // We use this to suppress notification-triggered updates to the list when
- // we make changes that may spawn such updates, specifically when we change
- // the action for the feed type, which results in feed preference updates,
- // which spawn "pref changed" notifications that would otherwise cause us
- // to rebuild the view unnecessarily.
- _storingAction: false,
-
-
- //**************************************************************************//
- // nsIMIMEInfo
-
- get primaryExtension() {
- return "xml";
- },
-
-
- //**************************************************************************//
- // Storage
-
- // Changes to the preferred action and handler take effect immediately
- // (we write them out to the preferences right as they happen),
- // so we when the controller calls store() after modifying the handlers,
- // the only thing we need to store is the removal of possible handlers
- // XXX Should we hold off on making the changes until this method gets called?
- store: function() {
- for each (let app in this._possibleApplicationHandlers._removed) {
- if (app instanceof Ci.nsILocalHandlerApp) {
- let pref = this.element(PREF_FEED_SELECTED_APP);
- var preferredAppFile = pref.value;
- if (preferredAppFile) {
- let preferredApp = getLocalHandlerApp(preferredAppFile);
- if (app.equals(preferredApp))
- pref.reset();
- }
- }
- else {
- app.QueryInterface(Ci.nsIWebContentHandlerInfo);
- this._converterSvc.removeContentHandler(app.contentType, app.uri);
- }
- }
- this._possibleApplicationHandlers._removed = [];
- },
-
-
- //**************************************************************************//
- // Icons
-
- get smallIcon() {
- return this._smallIcon;
- }
-
-};
-
-var feedHandlerInfo = {
- __proto__: new FeedHandlerInfo(TYPE_MAYBE_FEED),
- _prefSelectedApp: PREF_FEED_SELECTED_APP,
- _prefSelectedWeb: PREF_FEED_SELECTED_WEB,
- _prefSelectedAction: PREF_FEED_SELECTED_ACTION,
- _prefSelectedReader: PREF_FEED_SELECTED_READER,
- _smallIcon: "chrome://browser/skin/feeds/feedIcon16.png",
- _appPrefLabel: "webFeed"
-}
-
-var videoFeedHandlerInfo = {
- __proto__: new FeedHandlerInfo(TYPE_MAYBE_VIDEO_FEED),
- _prefSelectedApp: PREF_VIDEO_FEED_SELECTED_APP,
- _prefSelectedWeb: PREF_VIDEO_FEED_SELECTED_WEB,
- _prefSelectedAction: PREF_VIDEO_FEED_SELECTED_ACTION,
- _prefSelectedReader: PREF_VIDEO_FEED_SELECTED_READER,
- _smallIcon: "chrome://browser/skin/feeds/videoFeedIcon16.png",
- _appPrefLabel: "videoPodcastFeed"
-}
-
-var audioFeedHandlerInfo = {
- __proto__: new FeedHandlerInfo(TYPE_MAYBE_AUDIO_FEED),
- _prefSelectedApp: PREF_AUDIO_FEED_SELECTED_APP,
- _prefSelectedWeb: PREF_AUDIO_FEED_SELECTED_WEB,
- _prefSelectedAction: PREF_AUDIO_FEED_SELECTED_ACTION,
- _prefSelectedReader: PREF_AUDIO_FEED_SELECTED_READER,
- _smallIcon: "chrome://browser/skin/feeds/audioFeedIcon16.png",
- _appPrefLabel: "audioPodcastFeed"
-}
-
-/**
- * InternalHandlerInfoWrapper provides a basic mechanism to create an internal
- * mime type handler that can be enabled/disabled in the applications preference
- * menu.
- */
-function InternalHandlerInfoWrapper(aMIMEType) {
- var mimeSvc = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService);
- var handlerInfo = mimeSvc.getFromTypeAndExtension(aMIMEType, null);
-
- HandlerInfoWrapper.call(this, aMIMEType, handlerInfo);
-}
-
-InternalHandlerInfoWrapper.prototype = {
- __proto__: HandlerInfoWrapper.prototype,
-
- // Override store so we so we can notify any code listening for registration
- // or unregistration of this handler.
- store: function() {
- HandlerInfoWrapper.prototype.store.call(this);
- Services.obs.notifyObservers(null, this._handlerChanged, null);
- },
-
- get enabled() {
- throw Cr.NS_ERROR_NOT_IMPLEMENTED;
- },
-
- get description() {
- return this.element("bundlePreferences").getString(this._appPrefLabel);
- }
-};
-
-var pdfHandlerInfo = {
- __proto__: new InternalHandlerInfoWrapper(TYPE_PDF),
- _handlerChanged: TOPIC_PDFJS_HANDLER_CHANGED,
- _appPrefLabel: "portableDocumentFormat",
- get enabled() {
- return !Services.prefs.getBoolPref(PREF_PDFJS_DISABLED);
- },
-};
-
-
-//****************************************************************************//
-// Prefpane Controller
-
-var gApplicationsPane = {
- // The set of types the app knows how to handle. A hash of HandlerInfoWrapper
- // objects, indexed by type.
- _handledTypes: {},
-
- // The list of types we can show, sorted by the sort column/direction.
- // An array of HandlerInfoWrapper objects. We build this list when we first
- // load the data and then rebuild it when users change a pref that affects
- // what types we can show or change the sort column/direction.
- // Note: this isn't necessarily the list of types we *will* show; if the user
- // provides a filter string, we'll only show the subset of types in this list
- // that match that string.
- _visibleTypes: [],
-
- // A count of the number of times each visible type description appears.
- // We use these counts to determine whether or not to annotate descriptions
- // with their types to distinguish duplicate descriptions from each other.
- // A hash of integer counts, indexed by string description.
- _visibleTypeDescriptionCount: {},
-
-
- //**************************************************************************//
- // Convenience & Performance Shortcuts
-
- // These get defined by init().
- _brandShortName : null,
- _prefsBundle : null,
- _list : null,
- _filter : null,
-
- _prefSvc : Cc["@mozilla.org/preferences-service;1"].
- getService(Ci.nsIPrefBranch),
-
- _mimeSvc : Cc["@mozilla.org/mime;1"].
- getService(Ci.nsIMIMEService),
-
- _helperAppSvc : Cc["@mozilla.org/uriloader/external-helper-app-service;1"].
- getService(Ci.nsIExternalHelperAppService),
-
- _handlerSvc : Cc["@mozilla.org/uriloader/handler-service;1"].
- getService(Ci.nsIHandlerService),
-
- _ioSvc : Cc["@mozilla.org/network/io-service;1"].
- getService(Ci.nsIIOService),
-
-
- //**************************************************************************//
- // Initialization & Destruction
-
- init: function() {
- // Initialize shortcuts to some commonly accessed elements & values.
- this._brandShortName =
- document.getElementById("bundleBrand").getString("brandShortName");
- this._prefsBundle = document.getElementById("bundlePreferences");
- this._list = document.getElementById("handlersView");
- this._filter = document.getElementById("filter");
-
- // Observe preferences that influence what we display so we can rebuild
- // the view when they change.
- this._prefSvc.addObserver(PREF_SHOW_PLUGINS_IN_LIST, this, false);
- this._prefSvc.addObserver(PREF_HIDE_PLUGINS_WITHOUT_EXTENSIONS, this, false);
- this._prefSvc.addObserver(PREF_FEED_SELECTED_APP, this, false);
- this._prefSvc.addObserver(PREF_FEED_SELECTED_WEB, this, false);
- this._prefSvc.addObserver(PREF_FEED_SELECTED_ACTION, this, false);
- this._prefSvc.addObserver(PREF_FEED_SELECTED_READER, this, false);
-
- this._prefSvc.addObserver(PREF_VIDEO_FEED_SELECTED_APP, this, false);
- this._prefSvc.addObserver(PREF_VIDEO_FEED_SELECTED_WEB, this, false);
- this._prefSvc.addObserver(PREF_VIDEO_FEED_SELECTED_ACTION, this, false);
- this._prefSvc.addObserver(PREF_VIDEO_FEED_SELECTED_READER, this, false);
-
- this._prefSvc.addObserver(PREF_AUDIO_FEED_SELECTED_APP, this, false);
- this._prefSvc.addObserver(PREF_AUDIO_FEED_SELECTED_WEB, this, false);
- this._prefSvc.addObserver(PREF_AUDIO_FEED_SELECTED_ACTION, this, false);
- this._prefSvc.addObserver(PREF_AUDIO_FEED_SELECTED_READER, this, false);
-
-
- // Listen for window unload so we can remove our preference observers.
- window.addEventListener("unload", this, false);
-
- // Figure out how we should be sorting the list. We persist sort settings
- // across sessions, so we can't assume the default sort column/direction.
- // XXX should we be using the XUL sort service instead?
- if (document.getElementById("actionColumn").hasAttribute("sortDirection")) {
- this._sortColumn = document.getElementById("actionColumn");
- // The typeColumn element always has a sortDirection attribute,
- // either because it was persisted or because the default value
- // from the xul file was used. If we are sorting on the other
- // column, we should remove it.
- document.getElementById("typeColumn").removeAttribute("sortDirection");
- }
- else
- this._sortColumn = document.getElementById("typeColumn");
-
- // Load the data and build the list of handlers.
- // By doing this in a timeout, we let the preferences dialog resize itself
- // to an appropriate size before we add a bunch of items to the list.
- // Otherwise, if there are many items, and the Applications prefpane
- // is the one that gets displayed when the user first opens the dialog,
- // the dialog might stretch too much in an attempt to fit them all in.
- // XXX Shouldn't we perhaps just set a max-height on the richlistbox?
- var _delayedPaneLoad = function(self) {
- self._loadData();
- self._rebuildVisibleTypes();
- self._sortVisibleTypes();
- self._rebuildView();
-
- // Notify observers that the UI is now ready
- Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService).
- notifyObservers(window, "app-handler-pane-loaded", null);
- }
- setTimeout(_delayedPaneLoad, 0, this);
- },
-
- destroy: function() {
- window.removeEventListener("unload", this, false);
- this._prefSvc.removeObserver(PREF_SHOW_PLUGINS_IN_LIST, this);
- this._prefSvc.removeObserver(PREF_HIDE_PLUGINS_WITHOUT_EXTENSIONS, this);
- this._prefSvc.removeObserver(PREF_FEED_SELECTED_APP, this);
- this._prefSvc.removeObserver(PREF_FEED_SELECTED_WEB, this);
- this._prefSvc.removeObserver(PREF_FEED_SELECTED_ACTION, this);
- this._prefSvc.removeObserver(PREF_FEED_SELECTED_READER, this);
-
- this._prefSvc.removeObserver(PREF_VIDEO_FEED_SELECTED_APP, this);
- this._prefSvc.removeObserver(PREF_VIDEO_FEED_SELECTED_WEB, this);
- this._prefSvc.removeObserver(PREF_VIDEO_FEED_SELECTED_ACTION, this);
- this._prefSvc.removeObserver(PREF_VIDEO_FEED_SELECTED_READER, this);
-
- this._prefSvc.removeObserver(PREF_AUDIO_FEED_SELECTED_APP, this);
- this._prefSvc.removeObserver(PREF_AUDIO_FEED_SELECTED_WEB, this);
- this._prefSvc.removeObserver(PREF_AUDIO_FEED_SELECTED_ACTION, this);
- this._prefSvc.removeObserver(PREF_AUDIO_FEED_SELECTED_READER, this);
- },
-
-
- //**************************************************************************//
- // nsISupports
-
- QueryInterface: function(aIID) {
- if (aIID.equals(Ci.nsIObserver) ||
- aIID.equals(Ci.nsIDOMEventListener ||
- aIID.equals(Ci.nsISupports)))
- return this;
-
- throw Cr.NS_ERROR_NO_INTERFACE;
- },
-
-
- //**************************************************************************//
- // nsIObserver
-
- observe: function (aSubject, aTopic, aData) {
- // Rebuild the list when there are changes to preferences that influence
- // whether or not to show certain entries in the list.
- if (aTopic == "nsPref:changed" && !this._storingAction) {
- // These two prefs alter the list of visible types, so we have to rebuild
- // that list when they change.
- if (aData == PREF_SHOW_PLUGINS_IN_LIST ||
- aData == PREF_HIDE_PLUGINS_WITHOUT_EXTENSIONS) {
- this._rebuildVisibleTypes();
- this._sortVisibleTypes();
- }
-
- // All the prefs we observe can affect what we display, so we rebuild
- // the view when any of them changes.
- this._rebuildView();
- }
- },
-
-
- //**************************************************************************//
- // nsIDOMEventListener
-
- handleEvent: function(aEvent) {
- if (aEvent.type == "unload") {
- this.destroy();
- }
- },
-
-
- //**************************************************************************//
- // Composed Model Construction
-
- _loadData: function() {
- this._loadFeedHandler();
- this._loadInternalHandlers();
- this._loadPluginHandlers();
- this._loadApplicationHandlers();
- },
-
- _loadFeedHandler: function() {
- this._handledTypes[TYPE_MAYBE_FEED] = feedHandlerInfo;
- feedHandlerInfo.handledOnlyByPlugin = false;
-
- this._handledTypes[TYPE_MAYBE_VIDEO_FEED] = videoFeedHandlerInfo;
- videoFeedHandlerInfo.handledOnlyByPlugin = false;
-
- this._handledTypes[TYPE_MAYBE_AUDIO_FEED] = audioFeedHandlerInfo;
- audioFeedHandlerInfo.handledOnlyByPlugin = false;
- },
-
- /**
- * Load higher level internal handlers so they can be turned on/off in the
- * applications menu.
- */
- _loadInternalHandlers: function() {
- var internalHandlers = [pdfHandlerInfo];
- for (let internalHandler of internalHandlers) {
- if (internalHandler.enabled) {
- this._handledTypes[internalHandler.type] = internalHandler;
- }
- }
- },
-
- /**
- * Load the set of handlers defined by plugins.
- *
- * Note: if there's more than one plugin for a given MIME type, we assume
- * the last one is the one that the application will use. That may not be
- * correct, but it's how we've been doing it for years.
- *
- * Perhaps we should instead query navigator.mimeTypes for the set of types
- * supported by the application and then get the plugin from each MIME type's
- * enabledPlugin property. But if there's a plugin for a type, we need
- * to know about it even if it isn't enabled, since we're going to give
- * the user an option to enable it.
- *
- * Also note that enabledPlugin does not get updated when
- * plugin.disable_full_page_plugin_for_types changes, so even if we could use
- * enabledPlugin to get the plugin that would be used, we'd still need to
- * check the pref ourselves to find out if it's enabled.
- */
- _loadPluginHandlers: function() {
- "use strict";
-
- let mimeTypes = navigator.mimeTypes;
-
- for (let mimeType of mimeTypes) {
- let handlerInfoWrapper;
- if (mimeType.type in this._handledTypes) {
- handlerInfoWrapper = this._handledTypes[mimeType.type];
- } else {
- let wrappedHandlerInfo =
- this._mimeSvc.getFromTypeAndExtension(mimeType.type, null);
- handlerInfoWrapper = new HandlerInfoWrapper(mimeType.type, wrappedHandlerInfo);
- handlerInfoWrapper.handledOnlyByPlugin = true;
- this._handledTypes[mimeType.type] = handlerInfoWrapper;
- }
- handlerInfoWrapper.pluginName = mimeType.enabledPlugin.name;
- }
- },
-
- /**
- * Load the set of handlers defined by the application datastore.
- */
- _loadApplicationHandlers: function() {
- var wrappedHandlerInfos = this._handlerSvc.enumerate();
- while (wrappedHandlerInfos.hasMoreElements()) {
- let wrappedHandlerInfo =
- wrappedHandlerInfos.getNext().QueryInterface(Ci.nsIHandlerInfo);
- let type = wrappedHandlerInfo.type;
-
- let handlerInfoWrapper;
- if (type in this._handledTypes)
- handlerInfoWrapper = this._handledTypes[type];
- else {
- handlerInfoWrapper = new HandlerInfoWrapper(type, wrappedHandlerInfo);
- this._handledTypes[type] = handlerInfoWrapper;
- }
-
- handlerInfoWrapper.handledOnlyByPlugin = false;
- }
- },
-
-
- //**************************************************************************//
- // View Construction
-
- _rebuildVisibleTypes: function() {
- // Reset the list of visible types and the visible type description counts.
- this._visibleTypes = [];
- this._visibleTypeDescriptionCount = {};
-
- // Get the preferences that help determine what types to show.
- var showPlugins = this._prefSvc.getBoolPref(PREF_SHOW_PLUGINS_IN_LIST);
- var hidePluginsWithoutExtensions =
- this._prefSvc.getBoolPref(PREF_HIDE_PLUGINS_WITHOUT_EXTENSIONS);
-
- for (let type in this._handledTypes) {
- let handlerInfo = this._handledTypes[type];
-
- // Hide plugins without associated extensions if so prefed so we don't
- // show a whole bunch of obscure types handled by plugins on Mac.
- // Note: though protocol types don't have extensions, we still show them;
- // the pref is only meant to be applied to MIME types, since plugins are
- // only associated with MIME types.
- // FIXME: should we also check the "suffixes" property of the plugin?
- // Filed as bug 395135.
- if (hidePluginsWithoutExtensions && handlerInfo.handledOnlyByPlugin &&
- handlerInfo.wrappedHandlerInfo instanceof Ci.nsIMIMEInfo &&
- !handlerInfo.primaryExtension)
- continue;
-
- // Hide types handled only by plugins if so prefed.
- if (handlerInfo.handledOnlyByPlugin && !showPlugins)
- continue;
-
- // We couldn't find any reason to exclude the type, so include it.
- this._visibleTypes.push(handlerInfo);
-
- if (handlerInfo.description in this._visibleTypeDescriptionCount)
- this._visibleTypeDescriptionCount[handlerInfo.description]++;
- else
- this._visibleTypeDescriptionCount[handlerInfo.description] = 1;
- }
- },
-
- _rebuildView: function() {
- // Clear the list of entries.
- while (this._list.childNodes.length > 1)
- this._list.removeChild(this._list.lastChild);
-
- var visibleTypes = this._visibleTypes;
-
- // If the user is filtering the list, then only show matching types.
- if (this._filter.value)
- visibleTypes = visibleTypes.filter(this._matchesFilter, this);
-
- for each (let visibleType in visibleTypes) {
- let item = document.createElement("richlistitem");
- item.setAttribute("type", visibleType.type);
- item.setAttribute("typeDescription", this._describeType(visibleType));
- if (visibleType.smallIcon)
- item.setAttribute("typeIcon", visibleType.smallIcon);
- item.setAttribute("actionDescription",
- this._describePreferredAction(visibleType));
-
- if (!this._setIconClassForPreferredAction(visibleType, item)) {
- item.setAttribute("actionIcon",
- this._getIconURLForPreferredAction(visibleType));
- }
-
- this._list.appendChild(item);
- }
-
- this._selectLastSelectedType();
- },
-
- _matchesFilter: function(aType) {
- var filterValue = this._filter.value.toLowerCase();
- return this._describeType(aType).toLowerCase().indexOf(filterValue) != -1 ||
- this._describePreferredAction(aType).toLowerCase().indexOf(filterValue) != -1;
- },
-
- /**
- * Describe, in a human-readable fashion, the type represented by the given
- * handler info object. Normally this is just the description provided by
- * the info object, but if more than one object presents the same description,
- * then we annotate the duplicate descriptions with the type itself to help
- * users distinguish between those types.
- *
- * @param aHandlerInfo {nsIHandlerInfo} the type being described
- * @returns {string} a description of the type
- */
- _describeType: function(aHandlerInfo) {
- if (this._visibleTypeDescriptionCount[aHandlerInfo.description] > 1)
- return this._prefsBundle.getFormattedString("typeDescriptionWithType",
- [aHandlerInfo.description,
- aHandlerInfo.type]);
-
- return aHandlerInfo.description;
- },
-
- /**
- * Describe, in a human-readable fashion, the preferred action to take on
- * the type represented by the given handler info object.
- *
- * XXX Should this be part of the HandlerInfoWrapper interface? It would
- * violate the separation of model and view, but it might make more sense
- * nonetheless (f.e. it would make sortTypes easier).
- *
- * @param aHandlerInfo {nsIHandlerInfo} the type whose preferred action
- * is being described
- * @returns {string} a description of the action
- */
- _describePreferredAction: function(aHandlerInfo) {
- // alwaysAskBeforeHandling overrides the preferred action, so if that flag
- // is set, then describe that behavior instead. For most types, this is
- // the "alwaysAsk" string, but for the feed type we show something special.
- if (aHandlerInfo.alwaysAskBeforeHandling) {
- if (isFeedType(aHandlerInfo.type))
- return this._prefsBundle.getFormattedString("previewInApp",
- [this._brandShortName]);
- else
- return this._prefsBundle.getString("alwaysAsk");
- }
-
- switch (aHandlerInfo.preferredAction) {
- case Ci.nsIHandlerInfo.saveToDisk:
- return this._prefsBundle.getString("saveFile");
-
- case Ci.nsIHandlerInfo.useHelperApp:
- var preferredApp = aHandlerInfo.preferredApplicationHandler;
- var name;
- if (preferredApp instanceof Ci.nsILocalHandlerApp)
- name = getFileDisplayName(preferredApp.executable);
- else
- name = preferredApp.name;
- return this._prefsBundle.getFormattedString("useApp", [name]);
-
- case Ci.nsIHandlerInfo.handleInternally:
- // For the feed type, handleInternally means live bookmarks.
- if (isFeedType(aHandlerInfo.type)) {
- return this._prefsBundle.getFormattedString("addLiveBookmarksInApp",
- [this._brandShortName]);
- }
-
- if (aHandlerInfo instanceof InternalHandlerInfoWrapper) {
- return this._prefsBundle.getFormattedString("previewInApp",
- [this._brandShortName]);
- }
-
- // For other types, handleInternally looks like either useHelperApp
- // or useSystemDefault depending on whether or not there's a preferred
- // handler app.
- if (this.isValidHandlerApp(aHandlerInfo.preferredApplicationHandler))
- return aHandlerInfo.preferredApplicationHandler.name;
-
- return aHandlerInfo.defaultDescription;
-
- // XXX Why don't we say the app will handle the type internally?
- // Is it because the app can't actually do that? But if that's true,
- // then why would a preferredAction ever get set to this value
- // in the first place?
-
- case Ci.nsIHandlerInfo.useSystemDefault:
- return this._prefsBundle.getFormattedString("useDefault",
- [aHandlerInfo.defaultDescription]);
-
- case kActionUsePlugin:
- return this._prefsBundle.getFormattedString("usePluginIn",
- [aHandlerInfo.pluginName,
- this._brandShortName]);
- }
- },
-
- _selectLastSelectedType: function() {
- // If the list is disabled by the pref.downloads.disable_button.edit_actions
- // preference being locked, then don't select the type, as that would cause
- // it to appear selected, with a different background and an actions menu
- // that makes it seem like you can choose an action for the type.
- if (this._list.disabled)
- return;
-
- var lastSelectedType = this._list.getAttribute("lastSelectedType");
- if (!lastSelectedType)
- return;
-
- var item = this._list.getElementsByAttribute("type", lastSelectedType)[0];
- if (!item)
- return;
-
- this._list.selectedItem = item;
- },
-
- /**
- * Whether or not the given handler app is valid.
- *
- * @param aHandlerApp {nsIHandlerApp} the handler app in question
- *
- * @returns {boolean} whether or not it's valid
- */
- isValidHandlerApp: function(aHandlerApp) {
- if (!aHandlerApp)
- return false;
-
- if (aHandlerApp instanceof Ci.nsILocalHandlerApp)
- return this._isValidHandlerExecutable(aHandlerApp.executable);
-
- if (aHandlerApp instanceof Ci.nsIWebHandlerApp)
- return aHandlerApp.uriTemplate;
-
- if (aHandlerApp instanceof Ci.nsIWebContentHandlerInfo)
- return aHandlerApp.uri;
-
- return false;
- },
-
- _isValidHandlerExecutable: function(aExecutable) {
- return aExecutable &&
- aExecutable.exists() &&
- aExecutable.isExecutable() &&
-// XXXben - we need to compare this with the running instance executable
-// just don't know how to do that via script...
-// XXXmano TBD: can probably add this to nsIShellService
-#ifdef XP_WIN
-#expand aExecutable.leafName != "__MOZ_APP_NAME__.exe";
-#else
-#ifdef XP_MACOSX
-#expand aExecutable.leafName != "__MOZ_MACBUNDLE_NAME__";
-#else
-#expand aExecutable.leafName != "__MOZ_APP_NAME__-bin";
-#endif
-#endif
- },
-
- /**
- * Rebuild the actions menu for the selected entry. Gets called by
- * the richlistitem constructor when an entry in the list gets selected.
- */
- rebuildActionsMenu: function() {
- var typeItem = this._list.selectedItem;
- var handlerInfo = this._handledTypes[typeItem.type];
- var menu =
- document.getAnonymousElementByAttribute(typeItem, "class", "actionsMenu");
- var menuPopup = menu.menupopup;
-
- // Clear out existing items.
- while (menuPopup.hasChildNodes())
- menuPopup.removeChild(menuPopup.lastChild);
-
- // Add the "Preview in Firefox" option for optional internal handlers.
- if (handlerInfo instanceof InternalHandlerInfoWrapper) {
- var internalMenuItem = document.createElement("menuitem");
- internalMenuItem.setAttribute("action", Ci.nsIHandlerInfo.handleInternally);
- let label = this._prefsBundle.getFormattedString("previewInApp",
- [this._brandShortName]);
- internalMenuItem.setAttribute("label", label);
- internalMenuItem.setAttribute("tooltiptext", label);
- internalMenuItem.setAttribute(APP_ICON_ATTR_NAME, "ask");
- menuPopup.appendChild(internalMenuItem);
- }
-
- {
- var askMenuItem = document.createElement("menuitem");
- askMenuItem.setAttribute("action", Ci.nsIHandlerInfo.alwaysAsk);
- let label;
- if (isFeedType(handlerInfo.type))
- label = this._prefsBundle.getFormattedString("previewInApp",
- [this._brandShortName]);
- else
- label = this._prefsBundle.getString("alwaysAsk");
- askMenuItem.setAttribute("label", label);
- askMenuItem.setAttribute("tooltiptext", label);
- askMenuItem.setAttribute(APP_ICON_ATTR_NAME, "ask");
- menuPopup.appendChild(askMenuItem);
- }
-
- // Create a menu item for saving to disk.
- // Note: this option isn't available to protocol types, since we don't know
- // what it means to save a URL having a certain scheme to disk, nor is it
- // available to feeds, since the feed code doesn't implement the capability.
- if ((handlerInfo.wrappedHandlerInfo instanceof Ci.nsIMIMEInfo) &&
- !isFeedType(handlerInfo.type)) {
- var saveMenuItem = document.createElement("menuitem");
- saveMenuItem.setAttribute("action", Ci.nsIHandlerInfo.saveToDisk);
- let label = this._prefsBundle.getString("saveFile");
- saveMenuItem.setAttribute("label", label);
- saveMenuItem.setAttribute("tooltiptext", label);
- saveMenuItem.setAttribute(APP_ICON_ATTR_NAME, "save");
- menuPopup.appendChild(saveMenuItem);
- }
-
- // If this is the feed type, add a Live Bookmarks item.
- if (isFeedType(handlerInfo.type)) {
- var internalMenuItem = document.createElement("menuitem");
- internalMenuItem.setAttribute("action", Ci.nsIHandlerInfo.handleInternally);
- let label = this._prefsBundle.getFormattedString("addLiveBookmarksInApp",
- [this._brandShortName]);
- internalMenuItem.setAttribute("label", label);
- internalMenuItem.setAttribute("tooltiptext", label);
- internalMenuItem.setAttribute(APP_ICON_ATTR_NAME, "feed");
- menuPopup.appendChild(internalMenuItem);
- }
-
- // Add a separator to distinguish these items from the helper app items
- // that follow them.
- let menuItem = document.createElement("menuseparator");
- menuPopup.appendChild(menuItem);
-
- // Create a menu item for the OS default application, if any.
- if (handlerInfo.hasDefaultHandler) {
- var defaultMenuItem = document.createElement("menuitem");
- defaultMenuItem.setAttribute("action", Ci.nsIHandlerInfo.useSystemDefault);
- let label = this._prefsBundle.getFormattedString("useDefault",
- [handlerInfo.defaultDescription]);
- defaultMenuItem.setAttribute("label", label);
- defaultMenuItem.setAttribute("tooltiptext", handlerInfo.defaultDescription);
- defaultMenuItem.setAttribute("image", this._getIconURLForSystemDefault(handlerInfo));
-
- menuPopup.appendChild(defaultMenuItem);
- }
-
- // Create menu items for possible handlers.
- let preferredApp = handlerInfo.preferredApplicationHandler;
- let possibleApps = handlerInfo.possibleApplicationHandlers.enumerate();
- var possibleAppMenuItems = [];
- while (possibleApps.hasMoreElements()) {
- let possibleApp = possibleApps.getNext();
- if (!this.isValidHandlerApp(possibleApp))
- continue;
-
- let menuItem = document.createElement("menuitem");
- menuItem.setAttribute("action", Ci.nsIHandlerInfo.useHelperApp);
- let label;
- if (possibleApp instanceof Ci.nsILocalHandlerApp)
- label = getFileDisplayName(possibleApp.executable);
- else
- label = possibleApp.name;
- label = this._prefsBundle.getFormattedString("useApp", [label]);
- menuItem.setAttribute("label", label);
- menuItem.setAttribute("tooltiptext", label);
- menuItem.setAttribute("image", this._getIconURLForHandlerApp(possibleApp));
-
- // Attach the handler app object to the menu item so we can use it
- // to make changes to the datastore when the user selects the item.
- menuItem.handlerApp = possibleApp;
-
- menuPopup.appendChild(menuItem);
- possibleAppMenuItems.push(menuItem);
- }
-
- // Create a menu item for the plugin.
- if (handlerInfo.pluginName) {
- var pluginMenuItem = document.createElement("menuitem");
- pluginMenuItem.setAttribute("action", kActionUsePlugin);
- let label = this._prefsBundle.getFormattedString("usePluginIn",
- [handlerInfo.pluginName,
- this._brandShortName]);
- pluginMenuItem.setAttribute("label", label);
- pluginMenuItem.setAttribute("tooltiptext", label);
- pluginMenuItem.setAttribute(APP_ICON_ATTR_NAME, "plugin");
- menuPopup.appendChild(pluginMenuItem);
- }
-
- // Create a menu item for selecting a local application.
-#ifdef XP_WIN
- // On Windows, selecting an application to open another application
- // would be meaningless so we special case executables.
- var executableType = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService)
- .getTypeFromExtension("exe");
- if (handlerInfo.type != executableType)
-#endif
- {
- let menuItem = document.createElement("menuitem");
- menuItem.setAttribute("oncommand", "gApplicationsPane.chooseApp(event)");
- let label = this._prefsBundle.getString("useOtherApp");
- menuItem.setAttribute("label", label);
- menuItem.setAttribute("tooltiptext", label);
- menuPopup.appendChild(menuItem);
- }
-
- // Create a menu item for managing applications.
- if (possibleAppMenuItems.length) {
- let menuItem = document.createElement("menuseparator");
- menuPopup.appendChild(menuItem);
- menuItem = document.createElement("menuitem");
- menuItem.setAttribute("oncommand", "gApplicationsPane.manageApp(event)");
- menuItem.setAttribute("label", this._prefsBundle.getString("manageApp"));
- menuPopup.appendChild(menuItem);
- }
-
- // Select the item corresponding to the preferred action. If the always
- // ask flag is set, it overrides the preferred action. Otherwise we pick
- // the item identified by the preferred action (when the preferred action
- // is to use a helper app, we have to pick the specific helper app item).
- if (handlerInfo.alwaysAskBeforeHandling)
- menu.selectedItem = askMenuItem;
- else switch (handlerInfo.preferredAction) {
- case Ci.nsIHandlerInfo.handleInternally:
- menu.selectedItem = internalMenuItem;
- break;
- case Ci.nsIHandlerInfo.useSystemDefault:
- menu.selectedItem = defaultMenuItem;
- break;
- case Ci.nsIHandlerInfo.useHelperApp:
- if (preferredApp)
- menu.selectedItem =
- possibleAppMenuItems.filter(function(v) v.handlerApp.equals(preferredApp))[0];
- break;
- case kActionUsePlugin:
- menu.selectedItem = pluginMenuItem;
- break;
- case Ci.nsIHandlerInfo.saveToDisk:
- menu.selectedItem = saveMenuItem;
- break;
- }
- },
-
-
- //**************************************************************************//
- // Sorting & Filtering
-
- _sortColumn: null,
-
- /**
- * Sort the list when the user clicks on a column header.
- */
- sort: function (event) {
- var column = event.target;
-
- // If the user clicked on a new sort column, remove the direction indicator
- // from the old column.
- if (this._sortColumn && this._sortColumn != column)
- this._sortColumn.removeAttribute("sortDirection");
-
- this._sortColumn = column;
-
- // Set (or switch) the sort direction indicator.
- if (column.getAttribute("sortDirection") == "ascending")
- column.setAttribute("sortDirection", "descending");
- else
- column.setAttribute("sortDirection", "ascending");
-
- this._sortVisibleTypes();
- this._rebuildView();
- },
-
- /**
- * Sort the list of visible types by the current sort column/direction.
- */
- _sortVisibleTypes: function() {
- if (!this._sortColumn)
- return;
-
- var t = this;
-
- function sortByType(a, b) {
- return t._describeType(a).toLowerCase().
- localeCompare(t._describeType(b).toLowerCase());
- }
-
- function sortByAction(a, b) {
- return t._describePreferredAction(a).toLowerCase().
- localeCompare(t._describePreferredAction(b).toLowerCase());
- }
-
- switch (this._sortColumn.getAttribute("value")) {
- case "type":
- this._visibleTypes.sort(sortByType);
- break;
- case "action":
- this._visibleTypes.sort(sortByAction);
- break;
- }
-
- if (this._sortColumn.getAttribute("sortDirection") == "descending")
- this._visibleTypes.reverse();
- },
-
- /**
- * Filter the list when the user enters a filter term into the filter field.
- */
- filter: function() {
- this._rebuildView();
- },
-
- focusFilterBox: function() {
- this._filter.focus();
- this._filter.select();
- },
-
-
- //**************************************************************************//
- // Changes
-
- onSelectAction: function(aActionItem) {
- this._storingAction = true;
-
- try {
- this._storeAction(aActionItem);
- }
- finally {
- this._storingAction = false;
- }
- },
-
- _storeAction: function(aActionItem) {
- var typeItem = this._list.selectedItem;
- var handlerInfo = this._handledTypes[typeItem.type];
-
- let action = parseInt(aActionItem.getAttribute("action"), 10);
-
- // Set the plugin state if we're enabling or disabling a plugin.
- if (action == kActionUsePlugin)
- handlerInfo.enablePluginType();
- else if (handlerInfo.pluginName && !handlerInfo.isDisabledPluginType)
- handlerInfo.disablePluginType();
-
- // Set the preferred application handler.
- // We leave the existing preferred app in the list when we set
- // the preferred action to something other than useHelperApp so that
- // legacy datastores that don't have the preferred app in the list
- // of possible apps still include the preferred app in the list of apps
- // the user can choose to handle the type.
- if (action == Ci.nsIHandlerInfo.useHelperApp)
- handlerInfo.preferredApplicationHandler = aActionItem.handlerApp;
-
- // Set the "always ask" flag.
- if (action == Ci.nsIHandlerInfo.alwaysAsk)
- handlerInfo.alwaysAskBeforeHandling = true;
- else
- handlerInfo.alwaysAskBeforeHandling = false;
-
- // Set the preferred action.
- handlerInfo.preferredAction = action;
-
- handlerInfo.store();
-
- // Make sure the handler info object is flagged to indicate that there is
- // now some user configuration for the type.
- handlerInfo.handledOnlyByPlugin = false;
-
- // Update the action label and image to reflect the new preferred action.
- typeItem.setAttribute("actionDescription",
- this._describePreferredAction(handlerInfo));
- if (!this._setIconClassForPreferredAction(handlerInfo, typeItem)) {
- typeItem.setAttribute("actionIcon",
- this._getIconURLForPreferredAction(handlerInfo));
- }
- },
-
- manageApp: function(aEvent) {
- // Don't let the normal "on select action" handler get this event,
- // as we handle it specially ourselves.
- aEvent.stopPropagation();
-
- var typeItem = this._list.selectedItem;
- var handlerInfo = this._handledTypes[typeItem.type];
-
- document.documentElement.openSubDialog("chrome://browser/content/preferences/applicationManager.xul",
- "", handlerInfo);
-
- // Rebuild the actions menu so that we revert to the previous selection,
- // or "Always ask" if the previous default application has been removed
- this.rebuildActionsMenu();
-
- // update the richlistitem too. Will be visible when selecting another row
- typeItem.setAttribute("actionDescription",
- this._describePreferredAction(handlerInfo));
- if (!this._setIconClassForPreferredAction(handlerInfo, typeItem)) {
- typeItem.setAttribute("actionIcon",
- this._getIconURLForPreferredAction(handlerInfo));
- }
- },
-
- chooseApp: function(aEvent) {
- // Don't let the normal "on select action" handler get this event,
- // as we handle it specially ourselves.
- aEvent.stopPropagation();
-
- var handlerApp;
- let chooseAppCallback = function(aHandlerApp) {
- // Rebuild the actions menu whether the user picked an app or canceled.
- // If they picked an app, we want to add the app to the menu and select it.
- // If they canceled, we want to go back to their previous selection.
- this.rebuildActionsMenu();
-
- // If the user picked a new app from the menu, select it.
- if (aHandlerApp) {
- let typeItem = this._list.selectedItem;
- let actionsMenu =
- document.getAnonymousElementByAttribute(typeItem, "class", "actionsMenu");
- let menuItems = actionsMenu.menupopup.childNodes;
- for (let i = 0; i < menuItems.length; i++) {
- let menuItem = menuItems[i];
- if (menuItem.handlerApp && menuItem.handlerApp.equals(aHandlerApp)) {
- actionsMenu.selectedIndex = i;
- this.onSelectAction(menuItem);
- break;
- }
- }
- }
- }.bind(this);
-
-#ifdef XP_WIN
- var params = {};
- var handlerInfo = this._handledTypes[this._list.selectedItem.type];
-
- if (isFeedType(handlerInfo.type)) {
- // MIME info will be null, create a temp object.
- params.mimeInfo = this._mimeSvc.getFromTypeAndExtension(handlerInfo.type,
- handlerInfo.primaryExtension);
- } else {
- params.mimeInfo = handlerInfo.wrappedHandlerInfo;
- }
-
- params.title = this._prefsBundle.getString("fpTitleChooseApp");
- params.description = handlerInfo.description;
- params.filename = null;
- params.handlerApp = null;
-
- window.openDialog("chrome://global/content/appPicker.xul", null,
- "chrome,modal,centerscreen,titlebar,dialog=yes",
- params);
-
- if (this.isValidHandlerApp(params.handlerApp)) {
- handlerApp = params.handlerApp;
-
- // Add the app to the type's list of possible handlers.
- handlerInfo.addPossibleApplicationHandler(handlerApp);
- }
-
- chooseAppCallback(handlerApp);
-#else
- let winTitle = this._prefsBundle.getString("fpTitleChooseApp");
- let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
- let fpCallback = function fpCallback_done(aResult) {
- if (aResult == Ci.nsIFilePicker.returnOK && fp.file &&
- this._isValidHandlerExecutable(fp.file)) {
- handlerApp = Cc["@mozilla.org/uriloader/local-handler-app;1"].
- createInstance(Ci.nsILocalHandlerApp);
- handlerApp.name = getFileDisplayName(fp.file);
- handlerApp.executable = fp.file;
-
- // Add the app to the type's list of possible handlers.
- let handlerInfo = this._handledTypes[this._list.selectedItem.type];
- handlerInfo.addPossibleApplicationHandler(handlerApp);
-
- chooseAppCallback(handlerApp);
- }
- }.bind(this);
-
- // Prompt the user to pick an app. If they pick one, and it's a valid
- // selection, then add it to the list of possible handlers.
- fp.init(window, winTitle, Ci.nsIFilePicker.modeOpen);
- fp.appendFilters(Ci.nsIFilePicker.filterApps);
- fp.open(fpCallback);
-#endif
- },
-
- // Mark which item in the list was last selected so we can reselect it
- // when we rebuild the list or when the user returns to the prefpane.
- onSelectionChanged: function() {
- if (this._list.selectedItem)
- this._list.setAttribute("lastSelectedType",
- this._list.selectedItem.getAttribute("type"));
- },
-
- _setIconClassForPreferredAction: function(aHandlerInfo, aElement) {
- // If this returns true, the attribute that CSS sniffs for was set to something
- // so you shouldn't manually set an icon URI.
- // This removes the existing actionIcon attribute if any, even if returning false.
- aElement.removeAttribute("actionIcon");
-
- if (aHandlerInfo.alwaysAskBeforeHandling) {
- aElement.setAttribute(APP_ICON_ATTR_NAME, "ask");
- return true;
- }
-
- switch (aHandlerInfo.preferredAction) {
- case Ci.nsIHandlerInfo.saveToDisk:
- aElement.setAttribute(APP_ICON_ATTR_NAME, "save");
- return true;
-
- case Ci.nsIHandlerInfo.handleInternally:
- if (isFeedType(aHandlerInfo.type)) {
- aElement.setAttribute(APP_ICON_ATTR_NAME, "feed");
- return true;
- } else if (aHandlerInfo instanceof InternalHandlerInfoWrapper) {
- aElement.setAttribute(APP_ICON_ATTR_NAME, "ask");
- return true;
- }
- break;
-
- case kActionUsePlugin:
- aElement.setAttribute(APP_ICON_ATTR_NAME, "plugin");
- return true;
- }
- aElement.removeAttribute(APP_ICON_ATTR_NAME);
- return false;
- },
-
- _getIconURLForPreferredAction: function(aHandlerInfo) {
- switch (aHandlerInfo.preferredAction) {
- case Ci.nsIHandlerInfo.useSystemDefault:
- return this._getIconURLForSystemDefault(aHandlerInfo);
-
- case Ci.nsIHandlerInfo.useHelperApp:
- let preferredApp = aHandlerInfo.preferredApplicationHandler;
- if (this.isValidHandlerApp(preferredApp))
- return this._getIconURLForHandlerApp(preferredApp);
- break;
-
- // This should never happen, but if preferredAction is set to some weird
- // value, then fall back to the generic application icon.
- default:
- return ICON_URL_APP;
- }
- },
-
- _getIconURLForHandlerApp: function(aHandlerApp) {
- if (aHandlerApp instanceof Ci.nsILocalHandlerApp)
- return this._getIconURLForFile(aHandlerApp.executable);
-
- if (aHandlerApp instanceof Ci.nsIWebHandlerApp)
- return this._getIconURLForWebApp(aHandlerApp.uriTemplate);
-
- if (aHandlerApp instanceof Ci.nsIWebContentHandlerInfo)
- return this._getIconURLForWebApp(aHandlerApp.uri)
-
- // We know nothing about other kinds of handler apps.
- return "";
- },
-
- _getIconURLForFile: function(aFile) {
- var fph = this._ioSvc.getProtocolHandler("file").
- QueryInterface(Ci.nsIFileProtocolHandler);
- var urlSpec = fph.getURLSpecFromFile(aFile);
-
- return "moz-icon://" + urlSpec + "?size=16";
- },
-
- _getIconURLForWebApp: function(aWebAppURITemplate) {
- var uri = this._ioSvc.newURI(aWebAppURITemplate, null, null);
-
- // Unfortunately we can't use the favicon service to get the favicon,
- // because the service looks for a record with the exact URL we give it, and
- // users won't have such records for URLs they don't visit, and users won't
- // visit the handler's URL template, they'll only visit URLs derived from
- // that template (i.e. with %s in the template replaced by the URL of the
- // content being handled).
-
- if (/^https?$/.test(uri.scheme) && this._prefSvc.getBoolPref("browser.chrome.favicons"))
- return uri.prePath + "/favicon.ico";
-
- return "";
- },
-
- _getIconURLForSystemDefault: function(aHandlerInfo) {
- // Handler info objects for MIME types on some OSes implement a property bag
- // interface from which we can get an icon for the default app, so if we're
- // dealing with a MIME type on one of those OSes, then try to get the icon.
- if ("wrappedHandlerInfo" in aHandlerInfo) {
- let wrappedHandlerInfo = aHandlerInfo.wrappedHandlerInfo;
-
- if (wrappedHandlerInfo instanceof Ci.nsIMIMEInfo &&
- wrappedHandlerInfo instanceof Ci.nsIPropertyBag) {
- try {
- let url = wrappedHandlerInfo.getProperty("defaultApplicationIconURL");
- if (url)
- return url + "?size=16";
- }
- catch(ex) {}
- }
- }
-
- // If this isn't a MIME type object on an OS that supports retrieving
- // the icon, or if we couldn't retrieve the icon for some other reason,
- // then use a generic icon.
- return ICON_URL_APP;
- }
-
-};
deleted file mode 100644
--- a/browser/components/preferences/applications.xul
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- -->
-<!-- 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/. -->
-
-<!DOCTYPE overlay [
- <!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
- <!ENTITY % applicationsDTD SYSTEM "chrome://browser/locale/preferences/applications.dtd">
- %brandDTD;
- %applicationsDTD;
-]>
-
-<overlay id="ApplicationsPaneOverlay"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
- <prefpane id="paneApplications"
- onpaneload="gApplicationsPane.init();"
- flex="1"
- helpTopic="prefs-applications">
-
- <preferences id="feedsPreferences">
- <preference id="browser.feeds.handler"
- name="browser.feeds.handler"
- type="string"/>
- <preference id="browser.feeds.handler.default"
- name="browser.feeds.handler.default"
- type="string"/>
- <preference id="browser.feeds.handlers.application"
- name="browser.feeds.handlers.application"
- type="file"/>
- <preference id="browser.feeds.handlers.webservice"
- name="browser.feeds.handlers.webservice"
- type="string"/>
-
- <preference id="browser.videoFeeds.handler"
- name="browser.videoFeeds.handler"
- type="string"/>
- <preference id="browser.videoFeeds.handler.default"
- name="browser.videoFeeds.handler.default"
- type="string"/>
- <preference id="browser.videoFeeds.handlers.application"
- name="browser.videoFeeds.handlers.application"
- type="file"/>
- <preference id="browser.videoFeeds.handlers.webservice"
- name="browser.videoFeeds.handlers.webservice"
- type="string"/>
-
- <preference id="browser.audioFeeds.handler"
- name="browser.audioFeeds.handler"
- type="string"/>
- <preference id="browser.audioFeeds.handler.default"
- name="browser.audioFeeds.handler.default"
- type="string"/>
- <preference id="browser.audioFeeds.handlers.application"
- name="browser.audioFeeds.handlers.application"
- type="file"/>
- <preference id="browser.audioFeeds.handlers.webservice"
- name="browser.audioFeeds.handlers.webservice"
- type="string"/>
-
- <preference id="pref.downloads.disable_button.edit_actions"
- name="pref.downloads.disable_button.edit_actions"
- type="bool"/>
- </preferences>
-
- <script type="application/javascript" src="chrome://browser/content/preferences/applications.js"/>
-
- <keyset>
- <key key="&focusSearch1.key;" modifiers="accel" oncommand="gApplicationsPane.focusFilterBox();"/>
- <key key="&focusSearch2.key;" modifiers="accel" oncommand="gApplicationsPane.focusFilterBox();"/>
- </keyset>
-
- <hbox>
- <textbox id="filter" flex="1"
- type="search"
- placeholder="&filter.emptytext;"
- aria-controls="handlersView"
- oncommand="gApplicationsPane.filter();"/>
- </hbox>
-
- <separator class="thin"/>
-
- <richlistbox id="handlersView" orient="vertical" persist="lastSelectedType"
- preference="pref.downloads.disable_button.edit_actions"
- onselect="gApplicationsPane.onSelectionChanged();">
- <listheader equalsize="always" style="border: 0; padding: 0; -moz-appearance: none;">
- <treecol id="typeColumn" label="&typeColumn.label;" value="type"
- accesskey="&typeColumn.accesskey;" persist="sortDirection"
- flex="1" onclick="gApplicationsPane.sort(event);"
- sortDirection="ascending"/>
- <treecol id="actionColumn" label="&actionColumn2.label;" value="action"
- accesskey="&actionColumn2.accesskey;" persist="sortDirection"
- flex="1" onclick="gApplicationsPane.sort(event);"/>
- </listheader>
- </richlistbox>
- </prefpane>
-</overlay>
deleted file mode 100644
--- a/browser/components/preferences/content.js
+++ /dev/null
@@ -1,209 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
-/* 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/. */
-
-var gContentPane = {
- init: function ()
- {
- // Initializes the fonts dropdowns displayed in this pane.
- this._rebuildFonts();
- var menulist = document.getElementById("defaultFont");
- if (menulist.selectedIndex == -1) {
- menulist.value = FontBuilder.readFontSelection(menulist);
- }
-
- // Show translation preferences if we may:
- const prefName = "browser.translation.ui.show";
- if (Services.prefs.getBoolPref(prefName)) {
- let row = document.getElementById("translationBox");
- row.removeAttribute("hidden");
- // Showing attribution only for Bing Translator.
- Components.utils.import("resource:///modules/translation/Translation.jsm");
- if (Translation.translationEngine == "bing") {
- document.getElementById("bingAttribution").removeAttribute("hidden");
- }
- }
-
- let drmInfoURL =
- Services.urlFormatter.formatURLPref("app.support.baseURL") + "drm-content";
- document.getElementById("playDRMContentLink").setAttribute("href", drmInfoURL);
- let emeUIEnabled = Services.prefs.getBoolPref("browser.eme.ui.enabled");
- // Force-disable/hide on WinXP:
- if (navigator.platform.toLowerCase().startsWith("win")) {
- emeUIEnabled = emeUIEnabled && parseFloat(Services.sysinfo.get("version")) >= 6;
- }
- document.getElementById("playDRMContentRow").hidden = !emeUIEnabled;
- },
-
- // UTILITY FUNCTIONS
-
- /**
- * Utility function to enable/disable the button specified by aButtonID based
- * on the value of the Boolean preference specified by aPreferenceID.
- */
- updateButtons: function (aButtonID, aPreferenceID)
- {
- var button = document.getElementById(aButtonID);
- var preference = document.getElementById(aPreferenceID);
- button.disabled = preference.value != true;
- return undefined;
- },
-
- // BEGIN UI CODE
-
- /*
- * Preferences:
- *
- * dom.disable_open_during_load
- * - true if popups are blocked by default, false otherwise
- */
-
- // POP-UPS
-
- /**
- * Displays the popup exceptions dialog where specific site popup preferences
- * can be set.
- */
- showPopupExceptions: function ()
- {
- var bundlePreferences = document.getElementById("bundlePreferences");
- var params = { blockVisible: false, sessionVisible: false, allowVisible: true, prefilledHost: "", permissionType: "popup" };
- params.windowTitle = bundlePreferences.getString("popuppermissionstitle");
- params.introText = bundlePreferences.getString("popuppermissionstext");
- document.documentElement.openWindow("Browser:Permissions",
- "chrome://browser/content/preferences/permissions.xul",
- "resizable", params);
- },
-
-
- // FONTS
-
- /**
- * Populates the default font list in UI.
- */
- _rebuildFonts: function ()
- {
- var langGroupPref = document.getElementById("font.language.group");
- this._selectDefaultLanguageGroup(langGroupPref.value,
- this._readDefaultFontTypeForLanguage(langGroupPref.value) == "serif");
- },
-
- /**
- *
- */
- _selectDefaultLanguageGroup: function (aLanguageGroup, aIsSerif)
- {
- const kFontNameFmtSerif = "font.name.serif.%LANG%";
- const kFontNameFmtSansSerif = "font.name.sans-serif.%LANG%";
- const kFontNameListFmtSerif = "font.name-list.serif.%LANG%";
- const kFontNameListFmtSansSerif = "font.name-list.sans-serif.%LANG%";
- const kFontSizeFmtVariable = "font.size.variable.%LANG%";
-
- var prefs = [{ format : aIsSerif ? kFontNameFmtSerif : kFontNameFmtSansSerif,
- type : "fontname",
- element : "defaultFont",
- fonttype : aIsSerif ? "serif" : "sans-serif" },
- { format : aIsSerif ? kFontNameListFmtSerif : kFontNameListFmtSansSerif,
- type : "unichar",
- element : null,
- fonttype : aIsSerif ? "serif" : "sans-serif" },
- { format : kFontSizeFmtVariable,
- type : "int",
- element : "defaultFontSize",
- fonttype : null }];
- var preferences = document.getElementById("contentPreferences");
- for (var i = 0; i < prefs.length; ++i) {
- var preference = document.getElementById(prefs[i].format.replace(/%LANG%/, aLanguageGroup));
- if (!preference) {
- preference = document.createElement("preference");
- var name = prefs[i].format.replace(/%LANG%/, aLanguageGroup);
- preference.id = name;
- preference.setAttribute("name", name);
- preference.setAttribute("type", prefs[i].type);
- preferences.appendChild(preference);
- }
-
- if (!prefs[i].element)
- continue;
-
- var element = document.getElementById(prefs[i].element);
- if (element) {
- element.setAttribute("preference", preference.id);
-
- if (prefs[i].fonttype)
- FontBuilder.buildFontList(aLanguageGroup, prefs[i].fonttype, element);
-
- preference.setElementValue(element);
- }
- }
- },
-
- /**
- * Returns the type of the current default font for the language denoted by
- * aLanguageGroup.
- */
- _readDefaultFontTypeForLanguage: function (aLanguageGroup)
- {
- const kDefaultFontType = "font.default.%LANG%";
- var defaultFontTypePref = kDefaultFontType.replace(/%LANG%/, aLanguageGroup);
- var preference = document.getElementById(defaultFontTypePref);
- if (!preference) {
- preference = document.createElement("preference");
- preference.id = defaultFontTypePref;
- preference.setAttribute("name", defaultFontTypePref);
- preference.setAttribute("type", "string");
- preference.setAttribute("onchange", "gContentPane._rebuildFonts();");
- document.getElementById("contentPreferences").appendChild(preference);
- }
- return preference.value;
- },
-
- /**
- * Displays the fonts dialog, where web page font names and sizes can be
- * configured.
- */
- configureFonts: function ()
- {
- document.documentElement.openSubDialog("chrome://browser/content/preferences/fonts.xul",
- "", null);
- },
-
- /**
- * Displays the colors dialog, where default web page/link/etc. colors can be
- * configured.
- */
- configureColors: function ()
- {
- document.documentElement.openSubDialog("chrome://browser/content/preferences/colors.xul",
- "", null);
- },
-
- // LANGUAGES
-
- /**
- * Shows a dialog in which the preferred language for web content may be set.
- */
- showLanguages: function ()
- {
- document.documentElement.openSubDialog("chrome://browser/content/preferences/languages.xul",
- "", null);
- },
-
- /**
- * Displays the translation exceptions dialog where specific site and language
- * translation preferences can be set.
- */
- showTranslationExceptions: function ()
- {
- document.documentElement.openWindow("Browser:TranslationExceptions",
- "chrome://browser/content/preferences/translation.xul",
- "resizable", null);
- },
-
- openTranslationProviderAttribution: function ()
- {
- Components.utils.import("resource:///modules/translation/Translation.jsm");
- Translation.openProviderAttribution();
- }
-};
deleted file mode 100644
--- a/browser/components/preferences/content.xul
+++ /dev/null
@@ -1,185 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -->
-<!-- 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/. -->
-
-<!DOCTYPE overlay [
- <!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
- <!ENTITY % contentDTD SYSTEM "chrome://browser/locale/preferences/content.dtd">
- %brandDTD;
- %contentDTD;
-]>
-
-<overlay id="ContentPaneOverlay"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
- <prefpane id="paneContent"
- onpaneload="gContentPane.init();"
- helpTopic="prefs-content">
-
- <preferences id="contentPreferences">
- <!--XXX buttons prefs -->
-
- <!-- DRM content -->
- <preference id="media.eme.enabled" name="media.eme.enabled" type="bool"/>
-
- <!-- POPUPS -->
- <preference id="dom.disable_open_during_load" name="dom.disable_open_during_load" type="bool"/>
-
- <!-- FONTS -->
- <preference id="font.language.group"
- name="font.language.group"
- type="wstring"
- onchange="gContentPane._rebuildFonts();"/>
-
- <!-- LANGUAGES -->
- <preference id="browser.translation.detectLanguage"
- name="browser.translation.detectLanguage"
- type="bool"/>
- </preferences>
-
- <script type="application/javascript" src="chrome://mozapps/content/preferences/fontbuilder.js"/>
- <script type="application/javascript" src="chrome://browser/content/preferences/content.js"/>
-
- <stringbundle id="bundlePreferences" src="chrome://browser/locale/preferences/preferences.properties"/>
-
- <!-- various checkboxes, font-fu -->
- <groupbox id="miscGroup">
- <grid id="contentGrid">
- <columns>
- <column flex="1"/>
- <column/>
- </columns>
- <rows id="contentRows-1">
- <row id="playDRMContentRow">
- <vbox align="start">
- <checkbox id="playDRMContent" preference="media.eme.enabled"
- label="&playDRMContent.label;" accesskey="&playDRMContent.accesskey;"/>
- </vbox>
- <hbox pack="end">
- <label id="playDRMContentLink" class="text-link" value="&playDRMContent.learnMore.label;"/>
- </hbox>
- </row>
- <row id="popupPolicyRow">
- <vbox align="start">
- <checkbox id="popupPolicy" preference="dom.disable_open_during_load"
- label="&blockPopups.label;" accesskey="&blockPopups.accesskey;"
- onsyncfrompreference="return gContentPane.updateButtons('popupPolicyButton',
- 'dom.disable_open_during_load');"/>
- </vbox>
- <hbox pack="end">
- <button id="popupPolicyButton" label="&popupExceptions.label;"
- oncommand="gContentPane.showPopupExceptions();"
- accesskey="&popupExceptions.accesskey;"/>
- </hbox>
- </row>
- </rows>
- </grid>
- </groupbox>
-
- <!-- Fonts and Colors -->
- <groupbox id="fontsGroup">
- <caption label="&fontsAndColors.label;"/>
-
- <grid id="fontsGrid">
- <columns>
- <column flex="1"/>
- <column/>
- </columns>
- <rows id="fontsRows">
- <row id="fontRow">
- <hbox align="center">
- <label control="defaultFont" accesskey="&defaultFont.accesskey;">&defaultFont.label;</label>
- <menulist id="defaultFont" flex="1"/>
- <label control="defaultFontSize" accesskey="&defaultSize.accesskey;">&defaultSize.label;</label>
- <menulist id="defaultFontSize">
- <menupopup>
- <menuitem value="9" label="9"/>
- <menuitem value="10" label="10"/>
- <menuitem value="11" label="11"/>
- <menuitem value="12" label="12"/>
- <menuitem value="13" label="13"/>
- <menuitem value="14" label="14"/>
- <menuitem value="15" label="15"/>
- <menuitem value="16" label="16"/>
- <menuitem value="17" label="17"/>
- <menuitem value="18" label="18"/>
- <menuitem value="20" label="20"/>
- <menuitem value="22" label="22"/>
- <menuitem value="24" label="24"/>
- <menuitem value="26" label="26"/>
- <menuitem value="28" label="28"/>
- <menuitem value="30" label="30"/>
- <menuitem value="32" label="32"/>
- <menuitem value="34" label="34"/>
- <menuitem value="36" label="36"/>
- <menuitem value="40" label="40"/>
- <menuitem value="44" label="44"/>
- <menuitem value="48" label="48"/>
- <menuitem value="56" label="56"/>
- <menuitem value="64" label="64"/>
- <menuitem value="72" label="72"/>
- </menupopup>
- </menulist>
- </hbox>
- <button id="advancedFonts" icon="select-font"
- label="&advancedFonts.label;"
- accesskey="&advancedFonts.accesskey;"
- oncommand="gContentPane.configureFonts();"/>
- </row>
- <row id="colorsRow">
- <hbox/>
- <button id="colors" icon="select-color"
- label="&colors.label;"
- accesskey="&colors.accesskey;"
- oncommand="gContentPane.configureColors();"/>
- </row>
- </rows>
- </grid>
- </groupbox>
-
- <!-- Languages -->
- <groupbox id="languagesGroup">
- <caption label="&languages.label;"/>
-
- <grid id="languagesGrid">
- <columns>
- <column flex="1"/>
- <column/>
- </columns>
- <rows id="languagesRows">
- <row id="preferredLanguageRow">
- <label flex="1" control="chooseLanguage">&chooseLanguage.label;</label>
- <button id="chooseLanguage"
- label="&chooseButton.label;"
- accesskey="&chooseButton.accesskey;"
- oncommand="gContentPane.showLanguages();"/>
- </row>
- <row id="translationBox" hidden="true">
- <hbox align="center">
- <checkbox id="translate" preference="browser.translation.detectLanguage"
- label="&translateWebPages.label;." accesskey="&translateWebPages.accesskey;"
- onsyncfrompreference="return gContentPane.updateButtons('translateButton',
- 'browser.translation.detectLanguage');"/>
- <hbox id="bingAttribution" hidden="true">
- <label>&translation.options.attribution.beforeLogo;</label>
- <image id="translationAttributionImage" aria-label="Microsoft Translator"
- onclick="gContentPane.openTranslationProviderAttribution()"
- src="chrome://browser/content/microsoft-translator-attribution.png"/>
- <label>&translation.options.attribution.afterLogo;</label>
- </hbox>
- </hbox>
- <button id="translateButton" label="&translateExceptions.label;"
- oncommand="gContentPane.showTranslationExceptions();"
- accesskey="&translateExceptions.accesskey;"/>
- </row>
- </rows>
- </grid>
-
- </groupbox>
-
- </prefpane>
-
-</overlay>
--- a/browser/components/preferences/in-content/tests/browser_basic_rebuild_fonts_test.js
+++ b/browser/components/preferences/in-content/tests/browser_basic_rebuild_fonts_test.js
@@ -1,13 +1,11 @@
-Services.prefs.setBoolPref("browser.preferences.inContent", true);
Services.prefs.setBoolPref("browser.preferences.instantApply", true);
registerCleanupFunction(function() {
- Services.prefs.clearUserPref("browser.preferences.inContent");
Services.prefs.clearUserPref("browser.preferences.instantApply");
});
add_task(function() {
yield openPreferencesViaOpenPreferencesAPI("paneContent", null, {leaveOpen: true});
let doc = gBrowser.contentDocument;
var langGroup = Services.prefs.getComplexValue("font.language.group", Ci.nsIPrefLocalizedString).data
is(doc.getElementById("font.language.group").value, langGroup,
--- a/browser/components/preferences/in-content/tests/browser_bug1018066_resetScrollPosition.js
+++ b/browser/components/preferences/in-content/tests/browser_bug1018066_resetScrollPosition.js
@@ -1,16 +1,13 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
-Services.prefs.setBoolPref("browser.preferences.inContent", true);
-
let originalWindowHeight;
registerCleanupFunction(function() {
- Services.prefs.clearUserPref("browser.preferences.inContent");
window.resizeTo(window.outerWidth, originalWindowHeight);
while (gBrowser.tabs[1])
gBrowser.removeTab(gBrowser.tabs[1]);
});
add_task(function() {
originalWindowHeight = window.outerHeight;
window.resizeTo(window.outerWidth, 300);
--- a/browser/components/preferences/in-content/tests/browser_bug1020245_openPreferences_to_paneContent.js
+++ b/browser/components/preferences/in-content/tests/browser_bug1020245_openPreferences_to_paneContent.js
@@ -1,16 +1,14 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
-Services.prefs.setBoolPref("browser.preferences.inContent", true);
Services.prefs.setBoolPref("browser.preferences.instantApply", true);
registerCleanupFunction(function() {
- Services.prefs.clearUserPref("browser.preferences.inContent");
Services.prefs.clearUserPref("browser.preferences.instantApply");
});
add_task(function() {
let prefs = yield openPreferencesViaOpenPreferencesAPI("paneContent");
is(prefs.selectedPane, "paneContent", "Content pane was selected");
prefs = yield openPreferencesViaOpenPreferencesAPI("advanced", "updateTab");
is(prefs.selectedPane, "paneAdvanced", "Advanced pane was selected");
--- a/browser/components/preferences/in-content/tests/browser_bug410900.js
+++ b/browser/components/preferences/in-content/tests/browser_bug410900.js
@@ -1,18 +1,16 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
Components.utils.import("resource://gre/modules/PlacesUtils.jsm");
Components.utils.import("resource://gre/modules/NetUtil.jsm");
function test() {
waitForExplicitFinish();
- Services.prefs.setBoolPref("browser.preferences.inContent", true);
- registerCleanupFunction(() => Services.prefs.clearUserPref("browser.preferences.inContent"));
// Setup a phony handler to ensure the app pane will be populated.
var handler = Cc["@mozilla.org/uriloader/web-handler-app;1"].
createInstance(Ci.nsIWebHandlerApp);
handler.name = "App pane alive test";
handler.uriTemplate = "http://test.mozilla.org/%s";
var extps = Cc["@mozilla.org/uriloader/external-protocol-service;1"].
--- a/browser/components/preferences/in-content/tests/browser_change_app_handler.js
+++ b/browser/components/preferences/in-content/tests/browser_change_app_handler.js
@@ -1,13 +1,11 @@
let gMimeSvc = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService);
let gHandlerSvc = Cc["@mozilla.org/uriloader/handler-service;1"].getService(Ci.nsIHandlerService);
-Services.prefs.setBoolPref("browser.preferences.inContent", true);
-
SimpleTest.requestCompleteLog();
function setupFakeHandler() {
let info = gMimeSvc.getFromTypeAndExtension("text/plain", "foo.txt");
ok(info.possibleLocalHandlers.length, "Should have at least one known handler");
let handler = info.possibleLocalHandlers.queryElementAt(0, Ci.nsILocalHandlerApp);
let infoToModify = gMimeSvc.getFromTypeAndExtension("text/x-test-handler", null);
@@ -91,11 +89,10 @@ add_task(function*() {
"No app should be visible as preferred item.");
gBrowser.removeCurrentTab();
});
registerCleanupFunction(function() {
let infoToModify = gMimeSvc.getFromTypeAndExtension("text/x-test-handler", null);
gHandlerSvc.remove(infoToModify);
- Services.prefs.clearUserPref("browser.preferences.inContent");
});
--- a/browser/components/preferences/in-content/tests/browser_sanitizeOnShutdown_prefLocked.js
+++ b/browser/components/preferences/in-content/tests/browser_sanitizeOnShutdown_prefLocked.js
@@ -17,19 +17,17 @@ function testPrefStateMatchesLockedState
is(checkbox.disabled, preference.locked, "Always Clear checkbox should be enabled when preference is not locked.");
gBrowser.removeCurrentTab();
}
add_task(function setup() {
registerCleanupFunction(function resetPreferences() {
Services.prefs.unlockPref("privacy.sanitize.sanitizeOnShutdown");
- Services.prefs.clearUserPref("browser.preferences.inContent");
});
- Services.prefs.setBoolPref("browser.preferences.inContent", true);
});
add_task(function test_preference_enabled_when_unlocked() {
yield openPreferencesViaOpenPreferencesAPI("panePrivacy", undefined, {leaveOpen: true});
testPrefStateMatchesLockedState();
});
add_task(function test_preference_disabled_when_locked() {
--- a/browser/components/preferences/jar.mn
+++ b/browser/components/preferences/jar.mn
@@ -2,51 +2,29 @@
# 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/.
browser.jar:
content/browser/preferences/aboutPermissions.xul
content/browser/preferences/aboutPermissions.js
content/browser/preferences/aboutPermissions.css
content/browser/preferences/aboutPermissions.xml
-* content/browser/preferences/advanced.xul
-* content/browser/preferences/advanced.js
- content/browser/preferences/applications.xul
-* content/browser/preferences/applications.js
content/browser/preferences/applicationManager.xul
* content/browser/preferences/applicationManager.js
* content/browser/preferences/colors.xul
* content/browser/preferences/cookies.xul
* content/browser/preferences/cookies.js
- content/browser/preferences/content.xul
- content/browser/preferences/content.js
* content/browser/preferences/connection.xul
content/browser/preferences/connection.js
* content/browser/preferences/fonts.xul
content/browser/preferences/fonts.js
content/browser/preferences/handlers.xml
content/browser/preferences/handlers.css
* content/browser/preferences/languages.xul
content/browser/preferences/languages.js
-* content/browser/preferences/main.xul
-* content/browser/preferences/main.js
content/browser/preferences/permissions.xul
* content/browser/preferences/permissions.js
-* content/browser/preferences/preferences.xul
- content/browser/preferences/preferences.js
- content/browser/preferences/privacy.xul
-* content/browser/preferences/privacy.js
content/browser/preferences/sanitize.xul
content/browser/preferences/sanitize.js
- content/browser/preferences/security.xul
- content/browser/preferences/security.js
content/browser/preferences/selectBookmark.xul
content/browser/preferences/selectBookmark.js
-#ifdef MOZ_SERVICES_SYNC
- content/browser/preferences/sync.xul
- content/browser/preferences/sync.js
-#endif
- content/browser/preferences/search.xul
- content/browser/preferences/search.js
-* content/browser/preferences/tabs.xul
-* content/browser/preferences/tabs.js
content/browser/preferences/translation.xul
content/browser/preferences/translation.js
deleted file mode 100644
--- a/browser/components/preferences/main.js
+++ /dev/null
@@ -1,544 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* 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/. */
-
-Components.utils.import("resource://gre/modules/Downloads.jsm");
-Components.utils.import("resource://gre/modules/FileUtils.jsm");
-Components.utils.import("resource://gre/modules/Task.jsm");
-
-var gMainPane = {
- _pane: null,
-
- /**
- * Initialization of this.
- */
- init: function ()
- {
- this._pane = document.getElementById("paneMain");
-
-#ifdef HAVE_SHELL_SERVICE
- this.updateSetDefaultBrowser();
-#ifdef XP_WIN
- // In Windows 8 we launch the control panel since it's the only
- // way to get all file type association prefs. So we don't know
- // when the user will select the default. We refresh here periodically
- // in case the default changes. On other Windows OS's defaults can also
- // be set while the prefs are open.
- window.setInterval(this.updateSetDefaultBrowser, 1000);
-#endif
-#endif
-
- // set up the "use current page" label-changing listener
- this._updateUseCurrentButton();
- window.addEventListener("focus", this._updateUseCurrentButton.bind(this), false);
-
- this.updateBrowserStartupLastSession();
-
-#ifdef MOZ_DEV_EDITION
- let separateProfileModeCheckbox = document.getElementById("separateProfileMode");
- let listener = gMainPane.separateProfileModeChange.bind(gMainPane);
- separateProfileModeCheckbox.addEventListener("command", listener);
-
- let getStartedLink = document.getElementById("getStarted");
- let syncListener = gMainPane.onGetStarted.bind(gMainPane);
- getStartedLink.addEventListener("click", syncListener);
-
- Components.utils.import("resource://gre/modules/osfile.jsm");
- let uAppData = OS.Constants.Path.userApplicationDataDir;
- let ignoreSeparateProfile = OS.Path.join(uAppData, "ignore-dev-edition-profile");
-
- OS.File.stat(ignoreSeparateProfile).then(() => separateProfileModeCheckbox.checked = false,
- () => separateProfileModeCheckbox.checked = true);
-#endif
-
- // Notify observers that the UI is now ready
- Components.classes["@mozilla.org/observer-service;1"]
- .getService(Components.interfaces.nsIObserverService)
- .notifyObservers(window, "main-pane-loaded", null);
- },
-
-#ifdef MOZ_DEV_EDITION
- separateProfileModeChange: function ()
- {
- function quitApp() {
- Services.startup.quit(Components.interfaces.nsIAppStartup.eAttemptQuit |
- Components.interfaces.nsIAppStartup.eRestartNotSameProfile);
- }
- function revertCheckbox(error) {
- separateProfileModeCheckbox.checked = !separateProfileModeCheckbox.checked;
- if (error) {
- Components.utils.reportError("Failed to toggle separate profile mode: " + error);
- }
- }
-
- let separateProfileModeCheckbox = document.getElementById("separateProfileMode");
- let brandName = document.getElementById("bundleBrand").getString("brandShortName");
- let bundle = document.getElementById("bundlePreferences");
- let msg = bundle.getFormattedString(separateProfileModeCheckbox.checked ?
- "featureEnableRequiresRestart" : "featureDisableRequiresRestart",
- [brandName]);
- let title = bundle.getFormattedString("shouldRestartTitle", [brandName]);
- let shouldProceed = Services.prompt.confirm(window, title, msg)
- if (shouldProceed) {
- let cancelQuit = Cc["@mozilla.org/supports-PRBool;1"]
- .createInstance(Components.interfaces.nsISupportsPRBool);
- Services.obs.notifyObservers(cancelQuit, "quit-application-requested",
- "restart");
- shouldProceed = !cancelQuit.data;
-
- if (shouldProceed) {
- Components.utils.import("resource://gre/modules/osfile.jsm");
- let uAppData = OS.Constants.Path.userApplicationDataDir;
- let ignoreSeparateProfile = OS.Path.join(uAppData, "ignore-dev-edition-profile");
-
- if (separateProfileModeCheckbox.checked) {
- OS.File.remove(ignoreSeparateProfile).then(quitApp, revertCheckbox);
- } else {
- OS.File.writeAtomic(ignoreSeparateProfile, new Uint8Array()).then(quitApp, revertCheckbox);
- }
- }
- }
-
- // Revert the checkbox in case we didn't quit
- revertCheckbox();
- },
-
- onGetStarted: function (aEvent) {
- const Cc = Components.classes, Ci = Components.interfaces;
- let wm = Cc["@mozilla.org/appshell/window-mediator;1"]
- .getService(Components.interfaces.nsIWindowMediator);
- let win = wm.getMostRecentWindow("navigator:browser");
-
- if (win) {
- let accountsTab = win.gBrowser.addTab("about:accounts");
- win.gBrowser.selectedTab = accountsTab;
- }
- },
-#endif
-
- // HOME PAGE
-
- /*
- * Preferences:
- *
- * browser.startup.homepage
- * - the user's home page, as a string; if the home page is a set of tabs,
- * this will be those URLs separated by the pipe character "|"
- * browser.startup.page
- * - what page(s) to show when the user starts the application, as an integer:
- *
- * 0: a blank page
- * 1: the home page (as set by the browser.startup.homepage pref)
- * 2: the last page the user visited (DEPRECATED)
- * 3: windows and tabs from the last session (a.k.a. session restore)
- *
- * The deprecated option is not exposed in UI; however, if the user has it
- * selected and doesn't change the UI for this preference, the deprecated
- * option is preserved.
- */
-
- syncFromHomePref: function ()
- {
- let homePref = document.getElementById("browser.startup.homepage");
-
- // If the pref is set to about:home, set the value to "" to show the
- // placeholder text (about:home title).
- if (homePref.value.toLowerCase() == "about:home")
- return "";
-
- // If the pref is actually "", show about:blank. The actual home page
- // loading code treats them the same, and we don't want the placeholder text
- // to be shown.
- if (homePref.value == "")
- return "about:blank";
-
- // Otherwise, show the actual pref value.
- return undefined;
- },
-
- syncToHomePref: function (value)
- {
- // If the value is "", use about:home.
- if (value == "")
- return "about:home";
-
- // Otherwise, use the actual textbox value.
- return undefined;
- },
-
- /**
- * Sets the home page to the current displayed page (or frontmost tab, if the
- * most recent browser window contains multiple tabs), updating preference
- * window UI to reflect this.
- */
- setHomePageToCurrent: function ()
- {
- let homePage = document.getElementById("browser.startup.homepage");
- let tabs = this._getTabsForHomePage();
- function getTabURI(t) t.linkedBrowser.currentURI.spec;
-
- // FIXME Bug 244192: using dangerous "|" joiner!
- if (tabs.length)
- homePage.value = tabs.map(getTabURI).join("|");
- },
-
- /**
- * Displays a dialog in which the user can select a bookmark to use as home
- * page. If the user selects a bookmark, that bookmark's name is displayed in
- * UI and the bookmark's address is stored to the home page preference.
- */
- setHomePageToBookmark: function ()
- {
- var rv = { urls: null, names: null };
- document.documentElement.openSubDialog("chrome://browser/content/preferences/selectBookmark.xul",
- "resizable", rv);
- if (rv.urls && rv.names) {
- var homePage = document.getElementById("browser.startup.homepage");
-
- // XXX still using dangerous "|" joiner!
- homePage.value = rv.urls.join("|");
- }
- },
-
- /**
- * Switches the "Use Current Page" button between its singular and plural
- * forms.
- */
- _updateUseCurrentButton: function () {
- let useCurrent = document.getElementById("useCurrent");
-
- let tabs = this._getTabsForHomePage();
- if (tabs.length > 1)
- useCurrent.label = useCurrent.getAttribute("label2");
- else
- useCurrent.label = useCurrent.getAttribute("label1");
-
- // In this case, the button's disabled state is set by preferences.xml.
- if (document.getElementById
- ("pref.browser.homepage.disable_button.current_page").locked)
- return;
-
- useCurrent.disabled = !tabs.length
- },
-
- _getTabsForHomePage: function ()
- {
- var win;
- var tabs = [];
- if (document.documentElement.instantApply) {
- const Cc = Components.classes, Ci = Components.interfaces;
- // If we're in instant-apply mode, use the most recent browser window
- var wm = Cc["@mozilla.org/appshell/window-mediator;1"]
- .getService(Components.interfaces.nsIWindowMediator);
- win = wm.getMostRecentWindow("navigator:browser");
- }
- else {
- win = window.opener;
- }
-
- if (win && win.document.documentElement
- .getAttribute("windowtype") == "navigator:browser") {
- // We should only include visible & non-pinned tabs
- tabs = win.gBrowser.visibleTabs.slice(win.gBrowser._numPinnedTabs);
- }
-
- return tabs;
- },
-
- /**
- * Restores the default home page as the user's home page.
- */
- restoreDefaultHomePage: function ()
- {
- var homePage = document.getElementById("browser.startup.homepage");
- homePage.value = homePage.defaultValue;
- },
-
- // DOWNLOADS
-
- /*
- * Preferences:
- *
- * browser.download.useDownloadDir - bool
- * True - Save files directly to the folder configured via the
- * browser.download.folderList preference.
- * False - Always ask the user where to save a file and default to
- * browser.download.lastDir when displaying a folder picker dialog.
- * browser.download.dir - local file handle
- * A local folder the user may have selected for downloaded files to be
- * saved. Migration of other browser settings may also set this path.
- * This folder is enabled when folderList equals 2.
- * browser.download.lastDir - local file handle
- * May contain the last folder path accessed when the user browsed
- * via the file save-as dialog. (see contentAreaUtils.js)
- * browser.download.folderList - int
- * Indicates the location users wish to save downloaded files too.
- * It is also used to display special file labels when the default
- * download location is either the Desktop or the Downloads folder.
- * Values:
- * 0 - The desktop is the default download location.
- * 1 - The system's downloads folder is the default download location.
- * 2 - The default download location is elsewhere as specified in
- * browser.download.dir.
- * browser.download.downloadDir
- * deprecated.
- * browser.download.defaultFolder
- * deprecated.
- */
-
- /**
- * Enables/disables the folder field and Browse button based on whether a
- * default download directory is being used.
- */
- readUseDownloadDir: function ()
- {
- var downloadFolder = document.getElementById("downloadFolder");
- var chooseFolder = document.getElementById("chooseFolder");
- var preference = document.getElementById("browser.download.useDownloadDir");
- downloadFolder.disabled = !preference.value;
- chooseFolder.disabled = !preference.value;
-
- // don't override the preference's value in UI
- return undefined;
- },
-
- /**
- * Displays a file picker in which the user can choose the location where
- * downloads are automatically saved, updating preferences and UI in
- * response to the choice, if one is made.
- */
- chooseFolder()
- {
- return this.chooseFolderTask().catch(Components.utils.reportError);
- },
- chooseFolderTask: Task.async(function* ()
- {
- let bundlePreferences = document.getElementById("bundlePreferences");
- let title = bundlePreferences.getString("chooseDownloadFolderTitle");
- let folderListPref = document.getElementById("browser.download.folderList");
- let currentDirPref = yield this._indexToFolder(folderListPref.value);
- let defDownloads = yield this._indexToFolder(1);
- let fp = Components.classes["@mozilla.org/filepicker;1"].
- createInstance(Components.interfaces.nsIFilePicker);
-
- fp.init(window, title, Components.interfaces.nsIFilePicker.modeGetFolder);
- fp.appendFilters(Components.interfaces.nsIFilePicker.filterAll);
- // First try to open what's currently configured
- if (currentDirPref && currentDirPref.exists()) {
- fp.displayDirectory = currentDirPref;
- } // Try the system's download dir
- else if (defDownloads && defDownloads.exists()) {
- fp.displayDirectory = defDownloads;
- } // Fall back to Desktop
- else {
- fp.displayDirectory = yield this._indexToFolder(0);
- }
-
- let result = yield new Promise(resolve => fp.open(resolve));
- if (result != Components.interfaces.nsIFilePicker.returnOK) {
- return;
- }
-
- let downloadDirPref = document.getElementById("browser.download.dir");
- downloadDirPref.value = fp.file;
- folderListPref.value = yield this._folderToIndex(fp.file);
- // Note, the real prefs will not be updated yet, so dnld manager's
- // userDownloadsDirectory may not return the right folder after
- // this code executes. displayDownloadDirPref will be called on
- // the assignment above to update the UI.
- }),
-
- /**
- * Initializes the download folder display settings based on the user's
- * preferences.
- */
- displayDownloadDirPref()
- {
- this.displayDownloadDirPrefTask().catch(Components.utils.reportError);
-
- // don't override the preference's value in UI
- return undefined;
- },
-
- displayDownloadDirPrefTask: Task.async(function* ()
- {
- var folderListPref = document.getElementById("browser.download.folderList");
- var bundlePreferences = document.getElementById("bundlePreferences");
- var downloadFolder = document.getElementById("downloadFolder");
- var currentDirPref = document.getElementById("browser.download.dir");
-
- // Used in defining the correct path to the folder icon.
- var ios = Components.classes["@mozilla.org/network/io-service;1"]
- .getService(Components.interfaces.nsIIOService);
- var fph = ios.getProtocolHandler("file")
- .QueryInterface(Components.interfaces.nsIFileProtocolHandler);
- var iconUrlSpec;
-
- // Display a 'pretty' label or the path in the UI.
- if (folderListPref.value == 2) {
- // Custom path selected and is configured
- downloadFolder.label = this._getDisplayNameOfFile(currentDirPref.value);
- iconUrlSpec = fph.getURLSpecFromFile(currentDirPref.value);
- } else if (folderListPref.value == 1) {
- // 'Downloads'
- // In 1.5, this pointed to a folder we created called 'My Downloads'
- // and was available as an option in the 1.5 drop down. On XP this
- // was in My Documents, on OSX it was in User Docs. In 2.0, we did
- // away with the drop down option, although the special label was
- // still supported for the folder if it existed. Because it was
- // not exposed it was rarely used.
- // With 3.0, a new desktop folder - 'Downloads' was introduced for
- // platforms and versions that don't support a default system downloads
- // folder. See nsDownloadManager for details.
- downloadFolder.label = bundlePreferences.getString("downloadsFolderName");
- iconUrlSpec = fph.getURLSpecFromFile(yield this._indexToFolder(1));
- } else {
- // 'Desktop'
- downloadFolder.label = bundlePreferences.getString("desktopFolderName");
- iconUrlSpec = fph.getURLSpecFromFile(yield this._getDownloadsFolder("Desktop"));
- }
- downloadFolder.image = "moz-icon://" + iconUrlSpec + "?size=16";
- }),
-
- /**
- * Returns the textual path of a folder in readable form.
- */
- _getDisplayNameOfFile: function (aFolder)
- {
- // TODO: would like to add support for 'Downloads on Macintosh HD'
- // for OS X users.
- return aFolder ? aFolder.path : "";
- },
-
- /**
- * Returns the Downloads folder. If aFolder is "Desktop", then the Downloads
- * folder returned is the desktop folder; otherwise, it is a folder whose name
- * indicates that it is a download folder and whose path is as determined by
- * the XPCOM directory service via the download manager's attribute
- * defaultDownloadsDirectory.
- *
- * @throws if aFolder is not "Desktop" or "Downloads"
- */
- _getDownloadsFolder: Task.async(function* (aFolder)
- {
- switch (aFolder) {
- case "Desktop":
- var fileLoc = Components.classes["@mozilla.org/file/directory_service;1"]
- .getService(Components.interfaces.nsIProperties);
- return fileLoc.get("Desk", Components.interfaces.nsILocalFile);
- case "Downloads":
- let downloadsDir = yield Downloads.getSystemDownloadsDirectory();
- return new FileUtils.File(downloadsDir);
- }
- throw "ASSERTION FAILED: folder type should be 'Desktop' or 'Downloads'";
- }),
-
- /**
- * Determines the type of the given folder.
- *
- * @param aFolder
- * the folder whose type is to be determined
- * @returns integer
- * 0 if aFolder is the Desktop or is unspecified,
- * 1 if aFolder is the Downloads folder,
- * 2 otherwise
- */
- _folderToIndex: Task.async(function* (aFolder)
- {
- if (!aFolder || aFolder.equals(yield this._getDownloadsFolder("Desktop")))
- return 0;
- else if (aFolder.equals(yield this._getDownloadsFolder("Downloads")))
- return 1;
- return 2;
- }),
-
- /**
- * Converts an integer into the corresponding folder.
- *
- * @param aIndex
- * an integer
- * @returns the Desktop folder if aIndex == 0,
- * the Downloads folder if aIndex == 1,
- * the folder stored in browser.download.dir
- */
- _indexToFolder: Task.async(function* (aIndex)
- {
- switch (aIndex) {
- case 0:
- return yield this._getDownloadsFolder("Desktop");
- case 1:
- return yield this._getDownloadsFolder("Downloads");
- }
- var currentDirPref = document.getElementById("browser.download.dir");
- return currentDirPref.value;
- }),
-
- /**
- * Hide/show the "Show my windows and tabs from last time" option based
- * on the value of the browser.privatebrowsing.autostart pref.
- */
- updateBrowserStartupLastSession: function()
- {
- let pbAutoStartPref = document.getElementById("browser.privatebrowsing.autostart");
- let startupPref = document.getElementById("browser.startup.page");
- let menu = document.getElementById("browserStartupPage");
- let option = document.getElementById("browserStartupLastSession");
- if (pbAutoStartPref.value) {
- option.setAttribute("disabled", "true");
- if (option.selected) {
- menu.selectedItem = document.getElementById("browserStartupHomePage");
- }
- } else {
- option.removeAttribute("disabled");
- startupPref.updateElements(); // select the correct index in the startup menulist
- }
- }
-
-#ifdef HAVE_SHELL_SERVICE
- ,
- /*
- * Preferences:
- *
- * browser.shell.checkDefault
- * - true if a default-browser check (and prompt to make it so if necessary)
- * occurs at startup, false otherwise
- */
-
- /**
- * Show button for setting browser as default browser or information that
- * browser is already the default browser.
- */
- updateSetDefaultBrowser: function()
- {
- let shellSvc = getShellService();
- let defaultBrowserBox = document.getElementById("defaultBrowserBox");
- if (!shellSvc) {
- defaultBrowserBox.hidden = true;
- return;
- }
- let setDefaultPane = document.getElementById("setDefaultPane");
- let selectedIndex = shellSvc.isDefaultBrowser(false, true) ? 1 : 0;
- setDefaultPane.selectedIndex = selectedIndex;
- },
-
- /**
- * Set browser as the operating system default browser.
- */
- setDefaultBrowser: function()
- {
- let shellSvc = getShellService();
- if (!shellSvc)
- return;
- try {
- shellSvc.setDefaultBrowser(true, false);
- } catch (ex) {
- Components.utils.reportError(ex);
- return;
- }
- let selectedIndex =
- shellSvc.isDefaultBrowser(false, true) ? 1 : 0;
- document.getElementById("setDefaultPane").selectedIndex = selectedIndex;
- }
-#endif
-};
deleted file mode 100644
--- a/browser/components/preferences/main.xul
+++ /dev/null
@@ -1,186 +0,0 @@
-<?xml version="1.0"?>
-
-# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
-# 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/.
-
-<!DOCTYPE overlay [
- <!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
- <!ENTITY % mainDTD SYSTEM "chrome://browser/locale/preferences/main.dtd">
- <!ENTITY % aboutHomeDTD SYSTEM "chrome://browser/locale/aboutHome.dtd">
- %brandDTD;
- %mainDTD;
- %aboutHomeDTD;
-]>
-
-<overlay id="MainPaneOverlay"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
- <prefpane id="paneMain"
- onpaneload="gMainPane.init();"
- helpTopic="prefs-main">
-
- <script type="application/javascript" src="chrome://browser/content/preferences/main.js"/>
-
- <preferences id="mainPreferences">
- <!-- XXX Button preferences -->
-
- <!-- Startup -->
- <preference id="browser.startup.page"
- name="browser.startup.page"
- type="int"/>
- <preference id="browser.startup.homepage"
- name="browser.startup.homepage"
- type="wstring"/>
-
-#ifdef HAVE_SHELL_SERVICE
- <preference id="browser.shell.checkDefaultBrowser"
- name="browser.shell.checkDefaultBrowser"
- type="bool"/>
-
- <preference id="pref.general.disable_button.default_browser"
- name="pref.general.disable_button.default_browser"
- type="bool"/>
-#endif
-
- <preference id="pref.browser.homepage.disable_button.current_page"
- name="pref.browser.homepage.disable_button.current_page"
- type="bool"/>
- <preference id="pref.browser.homepage.disable_button.bookmark_page"
- name="pref.browser.homepage.disable_button.bookmark_page"
- type="bool"/>
- <preference id="pref.browser.homepage.disable_button.restore_default"
- name="pref.browser.homepage.disable_button.restore_default"
- type="bool"/>
-
- <preference id="browser.privatebrowsing.autostart"
- name="browser.privatebrowsing.autostart"
- type="bool"
- onchange="gMainPane.updateBrowserStartupLastSession();"/>
-
- <!-- Downloads -->
- <preference id="browser.download.useDownloadDir"
- name="browser.download.useDownloadDir"
- type="bool"/>
- <preference id="browser.download.dir"
- name="browser.download.dir"
- type="file"
- onchange="gMainPane.displayDownloadDirPref();"/>
- <preference id="browser.download.folderList" name="browser.download.folderList" type="int"/>
-
- </preferences>
-
- <stringbundle id="bundlePreferences" src="chrome://browser/locale/preferences/preferences.properties"/>
-
- <!-- Startup -->
- <groupbox id="startupGroup">
- <caption label="&startup.label;"/>
-
-#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">
- <checkbox id="alwaysCheckDefault" preference="browser.shell.checkDefaultBrowser"
- label="&alwaysCheckDefault2.label;" accesskey="&alwaysCheckDefault2.accesskey;"/>
- </hbox>
- <deck id="setDefaultPane">
- <hbox align="center" class="indent">
- <label id="isNotDefaultLabel" flex="1">&isNotDefault.label;</label>
- <button id="setDefaultButton"
- label="&setAsMyDefaultBrowser2.label;" accesskey="&setAsMyDefaultBrowser2.accesskey;"
- oncommand="gMainPane.setDefaultBrowser();"
- preference="pref.general.disable_button.default_browser"/>
- </hbox>
- <hbox align="center" class="indent">
- <label id="isDefaultLabel" flex="1">&isDefault.label;</label>
- </hbox>
- </deck>
- <separator class="thin"/>
- </vbox>
-#endif
- <hbox align="center">
- <label value="&startupPage.label;" accesskey="&startupPage.accesskey;"
- control="browserStartupPage"/>
- <menulist id="browserStartupPage" preference="browser.startup.page">
- <menupopup>
- <menuitem label="&startupHomePage.label;" value="1" id="browserStartupHomePage"/>
- <menuitem label="&startupBlankPage.label;" value="0" id="browserStartupBlank"/>
- <menuitem label="&startupLastSession.label;" value="3" id="browserStartupLastSession"/>
- </menupopup>
- </menulist>
- </hbox>
- <separator class="thin"/>
- <hbox align="center">
- <label value="&homepage.label;" accesskey="&homepage.accesskey;" control="browserHomePage"/>
- <textbox id="browserHomePage" class="padded uri-element" flex="1"
- type="autocomplete" autocompletesearch="history"
- onsyncfrompreference="return gMainPane.syncFromHomePref();"
- onsynctopreference="return gMainPane.syncToHomePref(this.value);"
- placeholder="&abouthome.pageTitle;"
- preference="browser.startup.homepage"/>
- </hbox>
- <hbox align="center" pack="end">
- <button label="" accesskey="&useCurrentPage.accesskey;"
- label1="&useCurrentPage.label;"
- label2="&useMultiple.label;"
- oncommand="gMainPane.setHomePageToCurrent();"
- id="useCurrent"
- preference="pref.browser.homepage.disable_button.current_page"/>
- <button label="&chooseBookmark.label;" accesskey="&chooseBookmark.accesskey;"
- oncommand="gMainPane.setHomePageToBookmark();"
- id="useBookmark"
- preference="pref.browser.homepage.disable_button.bookmark_page"/>
- <button label="&restoreDefault.label;" accesskey="&restoreDefault.accesskey;"
- oncommand="gMainPane.restoreDefaultHomePage();"
- id="restoreDefaultHomePage"
- preference="pref.browser.homepage.disable_button.restore_default"/>
- </hbox>
- </groupbox>
-
- <!-- Downloads -->
- <groupbox id="downloadsGroup">
- <caption label="&downloads.label;"/>
-
- <radiogroup id="saveWhere"
- preference="browser.download.useDownloadDir"
- onsyncfrompreference="return gMainPane.readUseDownloadDir();">
- <hbox id="saveToRow">
- <radio id="saveTo" value="true"
- label="&saveTo.label;"
- accesskey="&saveTo.accesskey;"
- aria-labelledby="saveTo downloadFolder"/>
- <filefield id="downloadFolder" flex="1"
- preference="browser.download.folderList"
- preference-editable="true"
- aria-labelledby="saveTo"
- onsyncfrompreference="return gMainPane.displayDownloadDirPref();"/>
- <button id="chooseFolder" oncommand="gMainPane.chooseFolder();"
-#ifdef XP_MACOSX
- accesskey="&chooseFolderMac.accesskey;"
- label="&chooseFolderMac.label;"
-#else
- accesskey="&chooseFolderWin.accesskey;"
- label="&chooseFolderWin.label;"
-#endif
- />
- </hbox>
- <radio id="alwaysAsk" value="false"
- label="&alwaysAsk.label;"
- accesskey="&alwaysAsk.accesskey;"/>
- </radiogroup>
- </groupbox>
-
- </prefpane>
-
-</overlay>
--- a/browser/components/preferences/moz.build
+++ b/browser/components/preferences/moz.build
@@ -3,17 +3,16 @@
# 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/.
DIRS += ['in-content']
BROWSER_CHROME_MANIFESTS += [
'in-content/tests/browser.ini',
- 'tests/browser.ini',
]
for var in ('MOZ_APP_NAME', 'MOZ_MACBUNDLE_NAME'):
DEFINES[var] = CONFIG[var]
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('windows', 'gtk2', 'gtk3', 'cocoa'):
DEFINES['HAVE_SHELL_SERVICE'] = 1
deleted file mode 100644
--- a/browser/components/preferences/preferences.js
+++ /dev/null
@@ -1,19 +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";
-
-Components.utils.import("resource://gre/modules/Services.jsm");
-
-if (!Services.prefs.getBoolPref("browser.search.showOneOffButtons")) {
- addEventListener("load", function onLoad() {
- removeEventListener("load", onLoad);
- let pane =
- document.getAnonymousElementByAttribute(document.documentElement,
- "pane", "paneSearch");
- pane.hidden = true;
- if (pane.selected)
- document.documentElement.showPane(document.getElementById("paneMain"));
- });
-}
deleted file mode 100644
--- a/browser/components/preferences/preferences.xul
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0"?>
-
-# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
-# 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/.
-
-<?xml-stylesheet href="chrome://global/skin/global.css"?>
-<?xml-stylesheet href="chrome://mozapps/content/preferences/preferences.css"?>
-<?xml-stylesheet href="chrome://browser/skin/preferences/preferences.css"?>
-
-<!-- XXX This should be in applications.xul, but bug 393953 means putting it
- - there causes the Applications pane not to work the first time you open
- - the Preferences dialog in a browsing session, so we work around the problem
- - by putting it here instead.
- -->
-<?xml-stylesheet href="chrome://browser/content/preferences/handlers.css"?>
-<?xml-stylesheet href="chrome://browser/skin/preferences/applications.css"?>
-<?xml-stylesheet href="chrome://browser/skin/preferences/search.css"?>
-
-<!DOCTYPE prefwindow [
-<!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
-<!ENTITY % preferencesDTD SYSTEM "chrome://browser/locale/preferences/preferences.dtd">
-%brandDTD;
-%preferencesDTD;
-]>
-
-#ifdef XP_WIN
-#define USE_WIN_TITLE_STYLE
-#endif
-
-#ifdef XP_MACOSX
-<?xul-overlay href="chrome://browser/content/macBrowserOverlay.xul"?>
-#endif
-
-<prefwindow type="prefwindow"
- id="BrowserPreferences"
- windowtype="Browser:Preferences"
- ondialoghelp="openPrefsHelp()"
-#ifdef USE_WIN_TITLE_STYLE
- title="&prefWindow.titleWin;"
-#else
-#ifdef XP_UNIX
-#ifndef XP_MACOSX
- title="&prefWindow.titleGNOME;"
-#endif
-#endif
-#endif
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-#ifdef USE_WIN_TITLE_STYLE
- style="&prefWinMinSize.styleWin2;">
-#else
-#ifdef XP_MACOSX
- style="&prefWinMinSize.styleMac;">
-#else
- style="&prefWinMinSize.styleGNOME;">
-#endif
-#endif
-
- <script type="application/javascript" src="chrome://browser/content/utilityOverlay.js"/>
-
- <stringbundle id="bundleBrand" src="chrome://branding/locale/brand.properties"/>
- <stringbundle id="bundlePreferences"
- src="chrome://browser/locale/preferences/preferences.properties"/>
-
- <prefpane id="paneMain" label="&paneGeneral.title;"
- src="chrome://browser/content/preferences/main.xul"/>
- <prefpane id="paneTabs" label="&paneTabs.title;"
- src="chrome://browser/content/preferences/tabs.xul"/>
- <prefpane id="paneSearch" label="&paneSearch.title;"
- src="chrome://browser/content/preferences/search.xul"/>
- <prefpane id="paneContent" label="&paneContent.title;"
- src="chrome://browser/content/preferences/content.xul"/>
- <prefpane id="paneApplications" label="&paneApplications.title;"
- src="chrome://browser/content/preferences/applications.xul"/>
- <prefpane id="panePrivacy" label="&panePrivacy.title;"
- src="chrome://browser/content/preferences/privacy.xul"/>
- <prefpane id="paneSecurity" label="&paneSecurity.title;"
- src="chrome://browser/content/preferences/security.xul"/>
-#ifdef MOZ_SERVICES_SYNC
- <prefpane id="paneSync" label="&paneSync.title;"
- src="chrome://browser/content/preferences/sync.xul"/>
-#endif
- <prefpane id="paneAdvanced" label="&paneAdvanced.title;"
- src="chrome://browser/content/preferences/advanced.xul"/>
-
- <script type="application/javascript"
- src="chrome://browser/content/preferences/preferences.js"/>
-#ifdef XP_MACOSX
-#include ../../base/content/browserMountPoints.inc
-#endif
-
-</prefwindow>
-
deleted file mode 100644
--- a/browser/components/preferences/privacy.js
+++ /dev/null
@@ -1,512 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
-/* 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/. */
-
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-Components.utils.import("resource://gre/modules/AppConstants.jsm");
-
-var gPrivacyPane = {
-
- /**
- * Whether the use has selected the auto-start private browsing mode in the UI.
- */
- _autoStartPrivateBrowsing: false,
-
- /**
- * Whether the prompt to restart Firefox should appear when changing the autostart pref.
- */
- _shouldPromptForRestart: true,
-
-#ifdef NIGHTLY_BUILD
- /**
- * Show the Tracking Protection UI depending on the
- * privacy.trackingprotection.ui.enabled pref, and linkify its Learn More link
- */
- _initTrackingProtection: function () {
- if (!Services.prefs.getBoolPref("privacy.trackingprotection.ui.enabled")) {
- return;
- }
-
- let link = document.getElementById("trackingProtectionLearnMore");
- let url = Services.urlFormatter.formatURLPref("app.support.baseURL") + "tracking-protection";
- link.setAttribute("href", url);
-
- document.getElementById("trackingprotectionbox").hidden = false;
- },
-#endif
-
- /**
- * Initialize autocomplete to ensure prefs are in sync.
- */
- _initAutocomplete: function () {
- let unifiedCompletePref = false;
- try {
- unifiedCompletePref =
- Services.prefs.getBoolPref("browser.urlbar.unifiedcomplete");
- } catch (ex) {}
-
- if (unifiedCompletePref) {
- Components.classes["@mozilla.org/autocomplete/search;1?name=unifiedcomplete"]
- .getService(Components.interfaces.mozIPlacesAutoComplete);
- } else {
- Components.classes["@mozilla.org/autocomplete/search;1?name=history"]
- .getService(Components.interfaces.mozIPlacesAutoComplete);
- }
- },
-
- /**
- * Sets up the UI for the number of days of history to keep, and updates the
- * label of the "Clear Now..." button.
- */
- init: function ()
- {
- this._updateSanitizeSettingsButton();
- this.initializeHistoryMode();
- this.updateHistoryModePane();
- this.updatePrivacyMicroControls();
- this.initAutoStartPrivateBrowsingReverter();
-#ifdef NIGHTLY_BUILD
- this._initTrackingProtection();
-#endif
- this._initAutocomplete();
-
- document.getElementById("searchesSuggestion").hidden =
- !Services.prefs.getBoolPref("browser.urlbar.unifiedcomplete");
- },
-
- // HISTORY MODE
-
- /**
- * The list of preferences which affect the initial history mode settings.
- * If the auto start private browsing mode pref is active, the initial
- * history mode would be set to "Don't remember anything".
- * If all of these preferences have their default values, and the auto-start
- * private browsing mode is not active, the initial history mode would be
- * set to "Remember everything".
- * Otherwise, the initial history mode would be set to "Custom".
- *
- * Extensions adding their own preferences can append their IDs to this array if needed.
- */
- prefsForDefault: [
- "places.history.enabled",
- "browser.formfill.enable",
- "network.cookie.cookieBehavior",
- "network.cookie.lifetimePolicy",
- "privacy.sanitize.sanitizeOnShutdown"
- ],
-
- /**
- * The list of control IDs which are dependent on the auto-start private
- * browsing setting, such that in "Custom" mode they would be disabled if
- * the auto-start private browsing checkbox is checked, and enabled otherwise.
- *
- * Extensions adding their own controls can append their IDs to this array if needed.
- */
- dependentControls: [
- "rememberHistory",
- "rememberForms",
- "keepUntil",
- "keepCookiesUntil",
- "alwaysClear",
- "clearDataSettings"
- ],
-
- /**
- * Check whether all the preferences values are set to their default values
- *
- * @param aPrefs an array of pref names to check for
- * @returns boolean true if all of the prefs are set to their default values,
- * false otherwise
- */
- _checkDefaultValues: function(aPrefs) {
- for (let i = 0; i < aPrefs.length; ++i) {
- let pref = document.getElementById(aPrefs[i]);
- if (pref.value != pref.defaultValue)
- return false;
- }
- return true;
- },
-
- /**
- * Initialize the history mode menulist based on the privacy preferences
- */
- initializeHistoryMode: function PPP_initializeHistoryMode()
- {
- let mode;
- let getVal = function (aPref)
- document.getElementById(aPref).value;
-
- if (this._checkDefaultValues(this.prefsForDefault)) {
- if (getVal("browser.privatebrowsing.autostart"))
- mode = "dontremember";
- else
- mode = "remember";
- }
- else
- mode = "custom";
-
- document.getElementById("historyMode").value = mode;
- },
-
- /**
- * Update the selected pane based on the history mode menulist
- */
- updateHistoryModePane: function PPP_updateHistoryModePane()
- {
- let selectedIndex = -1;
- switch (document.getElementById("historyMode").value) {
- case "remember":
- selectedIndex = 0;
- break;
- case "dontremember":
- selectedIndex = 1;
- break;
- case "custom":
- selectedIndex = 2;
- break;
- }
- document.getElementById("historyPane").selectedIndex = selectedIndex;
- },
-
- /**
- * Update the private browsing auto-start pref and the history mode
- * micro-management prefs based on the history mode menulist
- */
- updateHistoryModePrefs: function PPP_updateHistoryModePrefs()
- {
- let pref = document.getElementById("browser.privatebrowsing.autostart");
- switch (document.getElementById("historyMode").value) {
- case "remember":
- if (pref.value)
- pref.value = false;
-
- // select the remember history option if needed
- let rememberHistoryCheckbox = document.getElementById("rememberHistory");
- if (!rememberHistoryCheckbox.checked)
- rememberHistoryCheckbox.checked = true;
-
- // select the remember forms history option
- document.getElementById("browser.formfill.enable").value = true;
-
- // select the accept cookies option
- document.getElementById("network.cookie.cookieBehavior").value = 0;
- // select the cookie lifetime policy option
- document.getElementById("network.cookie.lifetimePolicy").value = 0;
-
- // select the clear on close option
- document.getElementById("privacy.sanitize.sanitizeOnShutdown").value = false;
- break;
- case "dontremember":
- if (!pref.value)
- pref.value = true;
- break;
- }
- },
-
- /**
- * Update the privacy micro-management controls based on the
- * value of the private browsing auto-start checkbox.
- */
- updatePrivacyMicroControls: function PPP_updatePrivacyMicroControls()
- {
- if (document.getElementById("historyMode").value == "custom") {
- let disabled = this._autoStartPrivateBrowsing =
- document.getElementById("privateBrowsingAutoStart").checked;
- this.dependentControls.forEach(function (aElement) {
- let control = document.getElementById(aElement);
- let preferenceId = control.getAttribute("preference");
- if (!preferenceId) {
- let dependentControlId = control.getAttribute("control");
- if (dependentControlId) {
- let dependentControl = document.getElementById(dependentControlId);
- preferenceId = dependentControl.getAttribute("preference");
- }
- }
-
- let preference = preferenceId ? document.getElementById(preferenceId) : {};
- control.disabled = disabled || preference.locked;
- });
-
- // adjust the cookie controls status
- this.readAcceptCookies();
- document.getElementById("keepCookiesUntil").value = disabled ? 2 :
- document.getElementById("network.cookie.lifetimePolicy").value;
-
- // adjust the checked state of the sanitizeOnShutdown checkbox
- document.getElementById("alwaysClear").checked = disabled ? false :
- document.getElementById("privacy.sanitize.sanitizeOnShutdown").value;
-
- // adjust the checked state of the remember history checkboxes
- document.getElementById("rememberHistory").checked = disabled ? false :
- document.getElementById("places.history.enabled").value;
- document.getElementById("rememberForms").checked = disabled ? false :
- document.getElementById("browser.formfill.enable").value;
-
- if (!disabled) {
- // adjust the Settings button for sanitizeOnShutdown
- this._updateSanitizeSettingsButton();
- }
- }
- },
-
- // PRIVATE BROWSING
-
- /**
- * Initialize the starting state for the auto-start private browsing mode pref reverter.
- */
- initAutoStartPrivateBrowsingReverter: function PPP_initAutoStartPrivateBrowsingReverter()
- {
- let mode = document.getElementById("historyMode");
- let autoStart = document.getElementById("privateBrowsingAutoStart");
- this._lastMode = mode.selectedIndex;
- this._lastCheckState = autoStart.hasAttribute('checked');
- },
-
- _lastMode: null,
- _lastCheckState: null,
- updateAutostart: function PPP_updateAutostart() {
- let mode = document.getElementById("historyMode");
- let autoStart = document.getElementById("privateBrowsingAutoStart");
- let pref = document.getElementById("browser.privatebrowsing.autostart");
- if ((mode.value == "custom" && this._lastCheckState == autoStart.checked) ||
- (mode.value == "remember" && !this._lastCheckState) ||
- (mode.value == "dontremember" && this._lastCheckState)) {
- // These are all no-op changes, so we don't need to prompt.
- this._lastMode = mode.selectedIndex;
- this._lastCheckState = autoStart.hasAttribute('checked');
- return;
- }
-
- if (!this._shouldPromptForRestart) {
- // We're performing a revert. Just let it happen.
- return;
- }
-
- const Cc = Components.classes, Ci = Components.interfaces;
- let brandName = document.getElementById("bundleBrand").getString("brandShortName");
- let bundle = document.getElementById("bundlePreferences");
- let msg = bundle.getFormattedString(autoStart.checked ?
- "featureEnableRequiresRestart" : "featureDisableRequiresRestart",
- [brandName]);
- let title = bundle.getFormattedString("shouldRestartTitle", [brandName]);
- let prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService);
- let shouldProceed = prompts.confirm(window, title, msg)
- if (shouldProceed) {
- let cancelQuit = Cc["@mozilla.org/supports-PRBool;1"]
- .createInstance(Ci.nsISupportsPRBool);
- Services.obs.notifyObservers(cancelQuit, "quit-application-requested",
- "restart");
- shouldProceed = !cancelQuit.data;
-
- if (shouldProceed) {
- pref.value = autoStart.hasAttribute('checked');
- document.documentElement.acceptDialog();
- let appStartup = Cc["@mozilla.org/toolkit/app-startup;1"]
- .getService(Ci.nsIAppStartup);
- appStartup.quit(Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestart);
- return;
- }
- }
-
- this._shouldPromptForRestart = false;
-
- if (this._lastCheckState) {
- autoStart.checked = "checked";
- } else {
- autoStart.removeAttribute('checked');
- }
- pref.value = autoStart.hasAttribute('checked');
- mode.selectedIndex = this._lastMode;
- mode.doCommand();
-
- this._shouldPromptForRestart = true;
- },
-
- // HISTORY
-
- /*
- * Preferences:
- *
- * places.history.enabled
- * - whether history is enabled or not
- * browser.formfill.enable
- * - true if entries in forms and the search bar should be saved, false
- * otherwise
- */
-
- // COOKIES
-
- /*
- * Preferences:
- *
- * network.cookie.cookieBehavior
- * - determines how the browser should handle cookies:
- * 0 means enable all cookies
- * 1 means reject all third party cookies
- * 2 means disable all cookies
- * 3 means reject third party cookies unless at least one is already set for the eTLD
- * see netwerk/cookie/src/nsCookieService.cpp for details
- * network.cookie.lifetimePolicy
- * - determines how long cookies are stored:
- * 0 means keep cookies until they expire
- * 1 means ask how long to keep each cookie
- * 2 means keep cookies until the browser is closed
- */
-
- /**
- * Reads the network.cookie.cookieBehavior preference value and
- * enables/disables the rest of the cookie UI accordingly, returning true
- * if cookies are enabled.
- */
- readAcceptCookies: function ()
- {
- var pref = document.getElementById("network.cookie.cookieBehavior");
- var acceptThirdPartyLabel = document.getElementById("acceptThirdPartyLabel");
- var acceptThirdPartyMenu = document.getElementById("acceptThirdPartyMenu");
- var keepUntil = document.getElementById("keepUntil");
- var menu = document.getElementById("keepCookiesUntil");
-
- // enable the rest of the UI for anything other than "disable all cookies"
- var acceptCookies = (pref.value != 2);
-
- acceptThirdPartyLabel.disabled = acceptThirdPartyMenu.disabled = !acceptCookies;
- keepUntil.disabled = menu.disabled = this._autoStartPrivateBrowsing || !acceptCookies;
-
- return acceptCookies;
- },
-
- /**
- * Enables/disables the "keep until" label and menulist in response to the
- * "accept cookies" checkbox being checked or unchecked.
- */
- writeAcceptCookies: function ()
- {
- var accept = document.getElementById("acceptCookies");
- var acceptThirdPartyMenu = document.getElementById("acceptThirdPartyMenu");
-
- // if we're enabling cookies, automatically select 'accept third party always'
- if (accept.checked)
- acceptThirdPartyMenu.selectedIndex = 0;
-
- return accept.checked ? 0 : 2;
- },
-
- /**
- * Converts between network.cookie.cookieBehavior and the third-party cookie UI
- */
- readAcceptThirdPartyCookies: function ()
- {
- var pref = document.getElementById("network.cookie.cookieBehavior");
- switch (pref.value)
- {
- case 0:
- return "always";
- case 1:
- return "never";
- case 2:
- return "never";
- case 3:
- return "visited";
- default:
- return undefined;
- }
- },
-
- writeAcceptThirdPartyCookies: function ()
- {
- var accept = document.getElementById("acceptThirdPartyMenu").selectedItem;
- switch (accept.value)
- {
- case "always":
- return 0;
- case "visited":
- return 3;
- case "never":
- return 1;
- default:
- return undefined;
- }
- },
-
- /**
- * Displays fine-grained, per-site preferences for cookies.
- */
- showCookieExceptions: function ()
- {
- var bundlePreferences = document.getElementById("bundlePreferences");
- var params = { blockVisible : true,
- sessionVisible : true,
- allowVisible : true,
- prefilledHost : "",
- permissionType : "cookie",
- windowTitle : bundlePreferences.getString("cookiepermissionstitle"),
- introText : bundlePreferences.getString("cookiepermissionstext") };
- document.documentElement.openWindow("Browser:Permissions",
- "chrome://browser/content/preferences/permissions.xul",
- "resizable", params);
- },
-
- /**
- * Displays all the user's cookies in a dialog.
- */
- showCookies: function (aCategory)
- {
- document.documentElement.openWindow("Browser:Cookies",
- "chrome://browser/content/preferences/cookies.xul",
- "resizable", null);
- },
-
- // CLEAR PRIVATE DATA
-
- /*
- * Preferences:
- *
- * privacy.sanitize.sanitizeOnShutdown
- * - true if the user's private data is cleared on startup according to the
- * Clear Private Data settings, false otherwise
- */
-
- /**
- * Displays the Clear Private Data settings dialog.
- */
- showClearPrivateDataSettings: function ()
- {
- document.documentElement.openSubDialog("chrome://browser/content/preferences/sanitize.xul",
- "", null);
- },
-
-
- /**
- * Displays a dialog from which individual parts of private data may be
- * cleared.
- */
- clearPrivateDataNow: function (aClearEverything)
- {
- var ts = document.getElementById("privacy.sanitize.timeSpan");
- var timeSpanOrig = ts.value;
- if (aClearEverything)
- ts.value = 0;
-
- const Cc = Components.classes, Ci = Components.interfaces;
- var glue = Cc["@mozilla.org/browser/browserglue;1"]
- .getService(Ci.nsIBrowserGlue);
- glue.sanitize(window);
-
- // reset the timeSpan pref
- if (aClearEverything)
- ts.value = timeSpanOrig;
- },
-
- /**
- * Enables or disables the "Settings..." button depending
- * on the privacy.sanitize.sanitizeOnShutdown preference value
- */
- _updateSanitizeSettingsButton: function () {
- var settingsButton = document.getElementById("clearDataSettings");
- var sanitizeOnShutdownPref = document.getElementById("privacy.sanitize.sanitizeOnShutdown");
-
- settingsButton.disabled = !sanitizeOnShutdownPref.value;
- }
-
-};
deleted file mode 100644
--- a/browser/components/preferences/privacy.xul
+++ /dev/null
@@ -1,292 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -->
-<!-- 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/. -->
-
-<!DOCTYPE overlay [
-<!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
-<!ENTITY % privacyDTD SYSTEM "chrome://browser/locale/preferences/privacy.dtd">
-%brandDTD;
-%privacyDTD;
-]>
-
-<overlay id="PrivacyPaneOverlay"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
- xmlns:html="http://www.w3.org/1999/xhtml">
-
- <prefpane id="panePrivacy"
- onpaneload="gPrivacyPane.init();"
- helpTopic="prefs-privacy">
-
- <preferences id="privacyPreferences">
-
- <!-- Tracking -->
- <preference id="privacy.donottrackheader.enabled"
- name="privacy.donottrackheader.enabled"
- type="bool"/>
- <preference id="privacy.trackingprotection.enabled"
- name="privacy.trackingprotection.enabled"
- type="bool"/>
-
- <!-- XXX button prefs -->
- <preference id="pref.privacy.disable_button.cookie_exceptions"
- name="pref.privacy.disable_button.cookie_exceptions"
- type="bool"/>
- <preference id="pref.privacy.disable_button.view_cookies"
- name="pref.privacy.disable_button.view_cookies"
- type="bool"/>
-
- <!-- Location Bar -->
- <preference id="browser.urlbar.autocomplete.enabled"
- name="browser.urlbar.autocomplete.enabled"
- type="bool"/>
- <preference id="browser.urlbar.suggest.bookmark"
- name="browser.urlbar.suggest.bookmark"
- type="bool"/>
- <preference id="browser.urlbar.suggest.history"
- name="browser.urlbar.suggest.history"
- type="bool"/>
- <preference id="browser.urlbar.suggest.openpage"
- name="browser.urlbar.suggest.openpage"
- type="bool"/>
- <preference id="browser.urlbar.suggest.searches"
- name="browser.urlbar.suggest.searches"
- type="bool"/>
-
- <!-- History -->
- <preference id="places.history.enabled"
- name="places.history.enabled"
- type="bool"/>
- <preference id="browser.formfill.enable"
- name="browser.formfill.enable"
- type="bool"/>
-
- <!-- Cookies -->
- <preference id="network.cookie.cookieBehavior" name="network.cookie.cookieBehavior" type="int"/>
- <preference id="network.cookie.lifetimePolicy" name="network.cookie.lifetimePolicy" type="int"/>
- <preference id="network.cookie.blockFutureCookies" name="network.cookie.blockFutureCookies" type="bool"/>
-
- <!-- Clear Private Data -->
- <preference id="privacy.sanitize.sanitizeOnShutdown"
- name="privacy.sanitize.sanitizeOnShutdown"
- onchange="gPrivacyPane._updateSanitizeSettingsButton();"
- type="bool"/>
- <preference id="privacy.sanitize.timeSpan"
- name="privacy.sanitize.timeSpan"
- type="int"/>
-
- <!-- Private Browsing -->
- <preference id="browser.privatebrowsing.autostart"
- name="browser.privatebrowsing.autostart"
- onchange="gPrivacyPane.updatePrivacyMicroControls();"
- type="bool"/>
-
- </preferences>
-
- <stringbundle id="bundlePreferences" src="chrome://browser/locale/preferences/preferences.properties"/>
-
- <script type="application/javascript" src="chrome://browser/content/preferences/privacy.js"/>
-
- <!-- Tracking -->
- <groupbox id="trackingGroup" align="start">
- <caption label="&tracking.label;"/>
- <vbox id="trackingprotectionbox" hidden="true">
- <hbox align="center">
- <checkbox id="trackingProtection"
- preference="privacy.trackingprotection.enabled"
- accesskey="&trackingProtection5.accesskey;"
- label="&trackingProtection5.label;" />
- <image id="trackingProtectionImage"
- src="chrome://browser/skin/tracking-protection-16.svg"/>
- </hbox>
- <hbox align="center"
- class="indent">
- <label id="trackingProtectionLearnMore"
- class="text-link"
- value="&trackingProtectionLearnMore.label;"/>
- </hbox>
- </vbox>
- <vbox>
- <hbox align="center">
- <checkbox id="privacyDoNotTrackCheckbox"
- label="&dntTrackingNotOkay4.label;"
- accesskey="&dntTrackingNotOkay4.accesskey;"
- preference="privacy.donottrackheader.enabled"/>
- </hbox>
- <hbox align="center"
- class="indent">
- <label id="doNotTrackInfo"
- class="text-link"
- href="https://www.mozilla.org/dnt">
- &doNotTrackInfo.label;
- </label>
- </hbox>
- </vbox>
-
- </groupbox>
-
- <!-- History -->
- <groupbox id="historyGroup">
- <caption label="&history.label;"/>
-
- <hbox align="center">
- <label id="historyModeLabel"
- control="historyMode"
- accesskey="&historyHeader.pre.accesskey;">&historyHeader.pre.label;</label>
- <menulist id="historyMode"
- oncommand="gPrivacyPane.updateHistoryModePane();
- gPrivacyPane.updateHistoryModePrefs();
- gPrivacyPane.updatePrivacyMicroControls();
- gPrivacyPane.updateAutostart();">
- <menupopup>
- <menuitem label="&historyHeader.remember.label;" value="remember"/>
- <menuitem label="&historyHeader.dontremember.label;" value="dontremember"/>
- <menuitem label="&historyHeader.custom.label;" value="custom"/>
- </menupopup>
- </menulist>
- <label>&historyHeader.post.label;</label>
- </hbox>
-
- <deck id="historyPane">
- <vbox align="center" id="historyRememberPane">
- <hbox align="center" flex="1">
- <spacer flex="1" class="indent"/>
- <vbox flex="2">
- <description>&rememberDescription.label;</description>
- <separator/>
- <description>&rememberActions.pre.label;<html:a
- class="inline-link" href="#"
- onclick="gPrivacyPane.clearPrivateDataNow(false); return false;"
- >&rememberActions.clearHistory.label;</html:a>&rememberActions.middle.label;<html:a
- class="inline-link" href="#"
- onclick="gPrivacyPane.showCookies(); return false;"
- >&rememberActions.removeCookies.label;</html:a>&rememberActions.post.label;</description>
- </vbox>
- <spacer flex="1" class="indent"/>
- </hbox>
- </vbox>
- <vbox align="center" id="historyDontRememberPane">
- <hbox align="center" flex="1">
- <spacer flex="1" class="indent"/>
- <vbox flex="2">
- <description>&dontrememberDescription.label;</description>
- <separator/>
- <description>&dontrememberActions.pre.label;<html:a
- class="inline-link" href="#"
- onclick="gPrivacyPane.clearPrivateDataNow(true); return false;"
- >&dontrememberActions.clearHistory.label;</html:a>&dontrememberActions.post.label;</description>
- </vbox>
- <spacer flex="1" class="indent"/>
- </hbox>
- </vbox>
- <vbox id="historyCustomPane">
- <separator class="thin"/>
- <checkbox id="privateBrowsingAutoStart" class="indent"
- label="&privateBrowsingPermanent2.label;"
- accesskey="&privateBrowsingPermanent2.accesskey;"
- preference="browser.privatebrowsing.autostart"
- oncommand="gPrivacyPane.updateAutostart()"/>
-
- <vbox class="indent">
- <vbox class="indent">
- <checkbox id="rememberHistory"
- label="&rememberHistory2.label;"
- accesskey="&rememberHistory2.accesskey;"
- preference="places.history.enabled"/>
- <checkbox id="rememberForms"
- label="&rememberSearchForm.label;"
- accesskey="&rememberSearchForm.accesskey;"
- preference="browser.formfill.enable"/>
-
- <hbox id="cookiesBox">
- <checkbox id="acceptCookies" label="&acceptCookies.label;" flex="1"
- preference="network.cookie.cookieBehavior"
- accesskey="&acceptCookies.accesskey;"
- onsyncfrompreference="return gPrivacyPane.readAcceptCookies();"
- onsynctopreference="return gPrivacyPane.writeAcceptCookies();"/>
- <button id="cookieExceptions" oncommand="gPrivacyPane.showCookieExceptions();"
- label="&cookieExceptions.label;" accesskey="&cookieExceptions.accesskey;"
- preference="pref.privacy.disable_button.cookie_exceptions"/>
- </hbox>
-
- <hbox id="acceptThirdPartyRow" class="indent">
- <hbox id="acceptThirdPartyBox" align="center">
- <label id="acceptThirdPartyLabel" control="acceptThirdPartyMenu"
- accesskey="&acceptThirdParty.pre.accesskey;">&acceptThirdParty.pre.label;</label>
- <menulist id="acceptThirdPartyMenu" preference="network.cookie.cookieBehavior"
- onsyncfrompreference="return gPrivacyPane.readAcceptThirdPartyCookies();"
- onsynctopreference="return gPrivacyPane.writeAcceptThirdPartyCookies();">
- <menupopup>
- <menuitem label="&acceptThirdParty.always.label;" value="always"/>
- <menuitem label="&acceptThirdParty.visited.label;" value="visited"/>
- <menuitem label="&acceptThirdParty.never.label;" value="never"/>
- </menupopup>
- </menulist>
- </hbox>
- </hbox>
-
- <hbox id="keepRow" class="indent">
- <hbox id="keepBox" align="center">
- <label id="keepUntil"
- control="keepCookiesUntil"
- accesskey="&keepUntil.accesskey;">&keepUntil.label;</label>
- <menulist id="keepCookiesUntil"
- preference="network.cookie.lifetimePolicy">
- <menupopup>
- <menuitem label="&expire.label;" value="0"/>
- <menuitem label="&close.label;" value="2"/>
- <menuitem label="&askEachTime.label;" value="1"/>
- </menupopup>
- </menulist>
- </hbox>
- <hbox flex="1"/>
- <button id="showCookiesButton"
- label="&showCookies.label;" accesskey="&showCookies.accesskey;"
- oncommand="gPrivacyPane.showCookies();"
- preference="pref.privacy.disable_button.view_cookies"/>
- </hbox>
-
- <hbox id="clearDataBox" align="center">
- <checkbox id="alwaysClear" flex="1"
- preference="privacy.sanitize.sanitizeOnShutdown"
- label="&clearOnClose.label;"
- accesskey="&clearOnClose.accesskey;"/>
- <button id="clearDataSettings" label="&clearOnCloseSettings.label;"
- accesskey="&clearOnCloseSettings.accesskey;"
- oncommand="gPrivacyPane.showClearPrivateDataSettings();"/>
- </hbox>
- </vbox>
- </vbox>
- </vbox>
- </deck>
-
- </groupbox>
-
- <!-- Location Bar -->
- <groupbox id="locationBarGroup">
- <caption label="&locationBar.label;"/>
-
- <label id="locationBarSuggestionLabel">&locbar.suggest.label;</label>
-
- <vbox id="tabPrefsBox" align="start" flex="1">
- <checkbox id="historySuggestion" label="&locbar.history.label;"
- accesskey="&locbar.history.accesskey;"
- preference="browser.urlbar.suggest.history"/>
- <checkbox id="bookmarkSuggestion" label="&locbar.bookmarks.label;"
- accesskey="&locbar.bookmarks.accesskey;"
- preference="browser.urlbar.suggest.bookmark"/>
- <checkbox id="openpageSuggestion" label="&locbar.openpage.label;"
- accesskey="&locbar.openpage.accesskey;"
- preference="browser.urlbar.suggest.openpage"/>
- <checkbox id="searchesSuggestion" label="&locbar.searches.label;"
- hidden="true"
- accesskey="&locbar.searches.accesskey;"
- preference="browser.urlbar.suggest.searches"/>
- </vbox>
- </groupbox>
-
- </prefpane>
-
-</overlay>
deleted file mode 100644
--- a/browser/components/preferences/search.js
+++ /dev/null
@@ -1,544 +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/. */
-
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
- "resource://gre/modules/PlacesUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Task",
- "resource://gre/modules/Task.jsm");
-
-const ENGINE_FLAVOR = "text/x-moz-search-engine";
-
-var gEngineView = null;
-
-var gSearchPane = {
-
- init: function ()
- {
- gEngineView = new EngineView(new EngineStore());
- document.getElementById("engineList").view = gEngineView;
- this.buildDefaultEngineDropDown();
-
- Services.obs.addObserver(this, "browser-search-engine-modified", false);
- window.addEventListener("unload", () => {
- Services.obs.removeObserver(this, "browser-search-engine-modified", false);
- });
- },
-
- buildDefaultEngineDropDown: function() {
- // This is called each time something affects the list of engines.
- let list = document.getElementById("defaultEngine");
- let currentEngine;
-
- // First, try to preserve the current selection.
- if (list.selectedItem)
- currentEngine = list.selectedItem.label;
-
- // If there's no current selection, use the current default engine.
- if (!currentEngine)
- currentEngine = Services.search.currentEngine.name;
-
- // If the current engine isn't in the list any more, select the first item.
- let engines = gEngineView._engineStore._engines;
- if (!engines.some(e => e.name == currentEngine))
- currentEngine = engines[0].name;
-
- // Now clean-up and rebuild the list.
- list.removeAllItems();
- gEngineView._engineStore._engines.forEach(e => {
- let item = list.appendItem(e.name);
- item.setAttribute("class", "menuitem-iconic searchengine-menuitem menuitem-with-favicon");
- if (e.iconURI) {
- let uri = PlacesUtils.getImageURLForResolution(window, e.iconURI.spec);
- item.setAttribute("image", uri);
- }
- item.engine = e;
- if (e.name == currentEngine)
- list.selectedItem = item;
- });
- },
-
- observe: function(aEngine, aTopic, aVerb) {
- if (aTopic == "browser-search-engine-modified") {
- aEngine.QueryInterface(Components.interfaces.nsISearchEngine);
- switch (aVerb) {
- case "engine-added":
- gEngineView._engineStore.addEngine(aEngine);
- gEngineView.rowCountChanged(gEngineView.lastIndex, 1);
- gSearchPane.buildDefaultEngineDropDown();
- break;
- case "engine-changed":
- gEngineView._engineStore.reloadIcons();
- gEngineView.invalidate();
- break;
- case "engine-removed":
- case "engine-current":
- case "engine-default":
- // Not relevant
- break;
- }
- }
- },
-
- onTreeSelect: function() {
- document.getElementById("removeEngineButton").disabled =
- gEngineView.selectedIndex == -1 || gEngineView.lastIndex == 0;
- },
-
- onTreeKeyPress: function(aEvent) {
- let index = gEngineView.selectedIndex;
- let tree = document.getElementById("engineList");
- if (tree.hasAttribute("editing"))
- return;
-
- if (aEvent.charCode == KeyEvent.DOM_VK_SPACE) {
- // Space toggles the checkbox.
- let newValue = !gEngineView._engineStore.engines[index].shown;
- gEngineView.setCellValue(index, tree.columns.getFirstColumn(),
- newValue.toString());
- }
- else {
- let isMac = Services.appinfo.OS == "Darwin";
- if ((isMac && aEvent.keyCode == KeyEvent.DOM_VK_RETURN) ||
- (!isMac && aEvent.keyCode == KeyEvent.DOM_VK_F2))
- tree.startEditing(index, tree.columns.getLastColumn());
- }
- },
-
- onRestoreDefaults: function() {
- let num = gEngineView._engineStore.restoreDefaultEngines();
- gEngineView.rowCountChanged(0, num);
- gEngineView.invalidate();
- },
-
- showRestoreDefaults: function(aEnable) {
- document.getElementById("restoreDefaultSearchEngines").disabled = !aEnable;
- },
-
- remove: function() {
- gEngineView._engineStore.removeEngine(gEngineView.selectedEngine);
- let index = gEngineView.selectedIndex;
- gEngineView.rowCountChanged(index, -1);
- gEngineView.invalidate();
- gEngineView.selection.select(Math.min(index, gEngineView.lastIndex));
- gEngineView.ensureRowIsVisible(gEngineView.currentIndex);
- document.getElementById("engineList").focus();
- },
-
- editKeyword: Task.async(function* (aEngine, aNewKeyword) {
- if (aNewKeyword) {
- let eduplicate = false;
- let dupName = "";
-
- // Check for duplicates in Places keywords.
- let bduplicate = !!(yield PlacesUtils.keywords.fetch(aNewKeyword));
-
- // Check for duplicates in changes we haven't committed yet
- let engines = gEngineView._engineStore.engines;
- for each (let engine in engines) {
- if (engine.alias == aNewKeyword &&
- engine.name != aEngine.name) {
- eduplicate = true;
- dupName = engine.name;
- break;
- }
- }
-
- // Notify the user if they have chosen an existing engine/bookmark keyword
- if (eduplicate || bduplicate) {
- let strings = document.getElementById("engineManagerBundle");
- let dtitle = strings.getString("duplicateTitle");
- let bmsg = strings.getString("duplicateBookmarkMsg");
- let emsg = strings.getFormattedString("duplicateEngineMsg", [dupName]);
-
- Services.prompt.alert(window, dtitle, eduplicate ? emsg : bmsg);
- return false;
- }
- }
-
- gEngineView._engineStore.changeEngine(aEngine, "alias", aNewKeyword);
- gEngineView.invalidate();
- return true;
- }),
-
- saveOneClickEnginesList: function () {
- let hiddenList = [];
- for (let engine of gEngineView._engineStore.engines) {
- if (!engine.shown)
- hiddenList.push(engine.name);
- }
- document.getElementById("browser.search.hiddenOneOffs").value =
- hiddenList.join(",");
- },
-
- setDefaultEngine: function () {
- if (document.documentElement.instantApply) {
- Services.search.currentEngine =
- document.getElementById("defaultEngine").selectedItem.engine;
- }
- },
-
- loadAddEngines: function () {
- window.opener.BrowserSearch.loadAddEngines();
- window.document.documentElement.acceptDialog();
- }
-};
-
-function onDragEngineStart(event) {
- var selectedIndex = gEngineView.selectedIndex;
- var tree = document.getElementById("engineList");
- var row = { }, col = { }, child = { };
- tree.treeBoxObject.getCellAt(event.clientX, event.clientY, row, col, child);
- if (selectedIndex >= 0 && !gEngineView.isCheckBox(row.value, col.value)) {
- event.dataTransfer.setData(ENGINE_FLAVOR, selectedIndex.toString());
- event.dataTransfer.effectAllowed = "move";
- }
-}
-
-// "Operation" objects
-function EngineMoveOp(aEngineClone, aNewIndex) {
- if (!aEngineClone)
- throw new Error("bad args to new EngineMoveOp!");
- this._engine = aEngineClone.originalEngine;
- this._newIndex = aNewIndex;
-}
-EngineMoveOp.prototype = {
- _engine: null,
- _newIndex: null,
- commit: function EMO_commit() {
- Services.search.moveEngine(this._engine, this._newIndex);
- }
-};
-
-function EngineRemoveOp(aEngineClone) {
- if (!aEngineClone)
- throw new Error("bad args to new EngineRemoveOp!");
- this._engine = aEngineClone.originalEngine;
-}
-EngineRemoveOp.prototype = {
- _engine: null,
- commit: function ERO_commit() {
- Services.search.removeEngine(this._engine);
- }
-};
-
-function EngineUnhideOp(aEngineClone, aNewIndex) {
- if (!aEngineClone)
- throw new Error("bad args to new EngineUnhideOp!");
- this._engine = aEngineClone.originalEngine;
- this._newIndex = aNewIndex;
-}
-EngineUnhideOp.prototype = {
- _engine: null,
- _newIndex: null,
- commit: function EUO_commit() {
- this._engine.hidden = false;
- Services.search.moveEngine(this._engine, this._newIndex);
- }
-};
-
-function EngineChangeOp(aEngineClone, aProp, aValue) {
- if (!aEngineClone)
- throw new Error("bad args to new EngineChangeOp!");
-
- this._engine = aEngineClone.originalEngine;
- this._prop = aProp;
- this._newValue = aValue;
-}
-EngineChangeOp.prototype = {
- _engine: null,
- _prop: null,
- _newValue: null,
- commit: function ECO_commit() {
- this._engine[this._prop] = this._newValue;
- }
-};
-
-function EngineStore() {
- let pref = document.getElementById("browser.search.hiddenOneOffs").value;
- this.hiddenList = pref ? pref.split(",") : [];
-
- this._engines = Services.search.getVisibleEngines().map(this._cloneEngine, this);
- this._defaultEngines = Services.search.getDefaultEngines().map(this._cloneEngine, this);
-
- if (document.documentElement.instantApply) {
- this._ops = {
- push: function(op) { op.commit(); }
- };
- }
- else {
- this._ops = [];
- document.documentElement.addEventListener("beforeaccept", () => {
- gEngineView._engineStore.commit();
- });
- }
-
- // check if we need to disable the restore defaults button
- var someHidden = this._defaultEngines.some(function (e) e.hidden);
- gSearchPane.showRestoreDefaults(someHidden);
-}
-EngineStore.prototype = {
- _engines: null,
- _defaultEngines: null,
- _ops: null,
-
- get engines() {
- return this._engines;
- },
- set engines(val) {
- this._engines = val;
- return val;
- },
-
- _getIndexForEngine: function ES_getIndexForEngine(aEngine) {
- return this._engines.indexOf(aEngine);
- },
-
- _getEngineByName: function ES_getEngineByName(aName) {
- for each (var engine in this._engines)
- if (engine.name == aName)
- return engine;
-
- return null;
- },
-
- _cloneEngine: function ES_cloneEngine(aEngine) {
- var clonedObj={};
- for (var i in aEngine)
- clonedObj[i] = aEngine[i];
- clonedObj.originalEngine = aEngine;
- clonedObj.shown = this.hiddenList.indexOf(clonedObj.name) == -1;
- return clonedObj;
- },
-
- // Callback for Array's some(). A thisObj must be passed to some()
- _isSameEngine: function ES_isSameEngine(aEngineClone) {
- return aEngineClone.originalEngine == this.originalEngine;
- },
-
- commit: function ES_commit() {
- for (op of this._ops)
- op.commit();
-
- Services.search.currentEngine =
- document.getElementById("defaultEngine").selectedItem.engine;
- },
-
- addEngine: function ES_addEngine(aEngine) {
- this._engines.push(this._cloneEngine(aEngine));
- },
-
- moveEngine: function ES_moveEngine(aEngine, aNewIndex) {
- if (aNewIndex < 0 || aNewIndex > this._engines.length - 1)
- throw new Error("ES_moveEngine: invalid aNewIndex!");
- var index = this._getIndexForEngine(aEngine);
- if (index == -1)
- throw new Error("ES_moveEngine: invalid engine?");
-
- if (index == aNewIndex)
- return; // nothing to do
-
- // Move the engine in our internal store
- var removedEngine = this._engines.splice(index, 1)[0];
- this._engines.splice(aNewIndex, 0, removedEngine);
-
- this._ops.push(new EngineMoveOp(aEngine, aNewIndex));
- },
-
- removeEngine: function ES_removeEngine(aEngine) {
- var index = this._getIndexForEngine(aEngine);
- if (index == -1)
- throw new Error("invalid engine?");
-
- this._engines.splice(index, 1);
- this._ops.push(new EngineRemoveOp(aEngine));
- if (this._defaultEngines.some(this._isSameEngine, aEngine))
- gSearchPane.showRestoreDefaults(true);
- gSearchPane.buildDefaultEngineDropDown();
- },
-
- restoreDefaultEngines: function ES_restoreDefaultEngines() {
- var added = 0;
-
- for (var i = 0; i < this._defaultEngines.length; ++i) {
- var e = this._defaultEngines[i];
-
- // If the engine is already in the list, just move it.
- if (this._engines.some(this._isSameEngine, e)) {
- this.moveEngine(this._getEngineByName(e.name), i);
- } else {
- // Otherwise, add it back to our internal store
-
- // The search service removes the alias when an engine is hidden,
- // so clear any alias we may have cached before unhiding the engine.
- e.alias = "";
-
- this._engines.splice(i, 0, e);
- this._ops.push(new EngineUnhideOp(e, i));
- added++;
- }
- }
- gSearchPane.showRestoreDefaults(false);
- gSearchPane.buildDefaultEngineDropDown();
- return added;
- },
-
- changeEngine: function ES_changeEngine(aEngine, aProp, aNewValue) {
- var index = this._getIndexForEngine(aEngine);
- if (index == -1)
- throw new Error("invalid engine?");
-
- this._engines[index][aProp] = aNewValue;
- this._ops.push(new EngineChangeOp(aEngine, aProp, aNewValue));
- },
-
- reloadIcons: function ES_reloadIcons() {
- this._engines.forEach(function (e) {
- e.uri = e.originalEngine.uri;
- });
- }
-};
-
-function EngineView(aEngineStore) {
- this._engineStore = aEngineStore;
-}
-EngineView.prototype = {
- _engineStore: null,
- tree: null,
-
- get lastIndex() {
- return this.rowCount - 1;
- },
- get selectedIndex() {
- var seln = this.selection;
- if (seln.getRangeCount() > 0) {
- var min = {};
- seln.getRangeAt(0, min, {});
- return min.value;
- }
- return -1;
- },
- get selectedEngine() {
- return this._engineStore.engines[this.selectedIndex];
- },
-
- // Helpers
- rowCountChanged: function (index, count) {
- this.tree.rowCountChanged(index, count);
- },
-
- invalidate: function () {
- this.tree.invalidate();
- },
-
- ensureRowIsVisible: function (index) {
- this.tree.ensureRowIsVisible(index);
- },
-
- getSourceIndexFromDrag: function (dataTransfer) {
- return parseInt(dataTransfer.getData(ENGINE_FLAVOR));
- },
-
- isCheckBox: function(index, column) {
- return column.id == "engineShown";
- },
-
- // nsITreeView
- get rowCount() {
- return this._engineStore.engines.length;
- },
-
- getImageSrc: function(index, column) {
- if (column.id == "engineName" && this._engineStore.engines[index].iconURI) {
- let uri = this._engineStore.engines[index].iconURI.spec;
- return PlacesUtils.getImageURLForResolution(window, uri);
- }
- return "";
- },
-
- getCellText: function(index, column) {
- if (column.id == "engineName")
- return this._engineStore.engines[index].name;
- else if (column.id == "engineKeyword")
- return this._engineStore.engines[index].alias;
- return "";
- },
-
- setTree: function(tree) {
- this.tree = tree;
- },
-
- canDrop: function(targetIndex, orientation, dataTransfer) {
- var sourceIndex = this.getSourceIndexFromDrag(dataTransfer);
- return (sourceIndex != -1 &&
- sourceIndex != targetIndex &&
- sourceIndex != targetIndex + orientation);
- },
-
- drop: function(dropIndex, orientation, dataTransfer) {
- var sourceIndex = this.getSourceIndexFromDrag(dataTransfer);
- var sourceEngine = this._engineStore.engines[sourceIndex];
-
- const nsITreeView = Components.interfaces.nsITreeView;
- if (dropIndex > sourceIndex) {
- if (orientation == nsITreeView.DROP_BEFORE)
- dropIndex--;
- } else {
- if (orientation == nsITreeView.DROP_AFTER)
- dropIndex++;
- }
-
- this._engineStore.moveEngine(sourceEngine, dropIndex);
- gSearchPane.showRestoreDefaults(true);
- gSearchPane.buildDefaultEngineDropDown();
-
- // Redraw, and adjust selection
- this.invalidate();
- this.selection.select(dropIndex);
- },
-
- selection: null,
- getRowProperties: function(index) { return ""; },
- getCellProperties: function(index, column) { return ""; },
- getColumnProperties: function(column) { return ""; },
- isContainer: function(index) { return false; },
- isContainerOpen: function(index) { return false; },
- isContainerEmpty: function(index) { return false; },
- isSeparator: function(index) { return false; },
- isSorted: function(index) { return false; },
- getParentIndex: function(index) { return -1; },
- hasNextSibling: function(parentIndex, index) { return false; },
- getLevel: function(index) { return 0; },
- getProgressMode: function(index, column) { },
- getCellValue: function(index, column) {
- if (column.id == "engineShown")
- return this._engineStore.engines[index].shown;
- return undefined;
- },
- toggleOpenState: function(index) { },
- cycleHeader: function(column) { },
- selectionChanged: function() { },
- cycleCell: function(row, column) { },
- isEditable: function(index, column) { return column.id != "engineName"; },
- isSelectable: function(index, column) { return false; },
- setCellValue: function(index, column, value) {
- if (column.id == "engineShown") {
- this._engineStore.engines[index].shown = value == "true";
- gEngineView.invalidate();
- gSearchPane.saveOneClickEnginesList();
- }
- },
- setCellText: function(index, column, value) {
- if (column.id == "engineKeyword") {
- gSearchPane.editKeyword(this._engineStore.engines[index], value)
- .then(valid => {
- if (!valid)
- document.getElementById("engineList").startEditing(index, column);
- });
- }
- },
- performAction: function(action) { },
- performActionOnRow: function(action, index) { },
- performActionOnCell: function(action, index, column) { }
-};
deleted file mode 100644
--- a/browser/components/preferences/search.xul
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.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/. -->
-
-<!DOCTYPE overlay [
- <!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
- <!ENTITY % searchDTD SYSTEM "chrome://browser/locale/preferences/search.dtd">
- %brandDTD;
- %searchDTD;
-]>
-
-<overlay id="SearchPaneOverlay"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
- xmlns:html="http://www.w3.org/1999/xhtml">
-
- <prefpane id="paneSearch" helpTopic="prefs-search"
- onpaneload="gSearchPane.init();">
-
- <preferences id="searchPreferences">
-
- <!-- Suggest -->
- <preference id="browser.search.suggest.enabled"
- name="browser.search.suggest.enabled"
- type="bool"/>
-
- <!-- One off providers -->
- <preference id="browser.search.hiddenOneOffs"
- name="browser.search.hiddenOneOffs"
- type="unichar"/>
-
- </preferences>
-
- <script type="application/javascript" src="chrome://browser/content/preferences/search.js"/>
-
- <stringbundle id="engineManagerBundle" src="chrome://browser/locale/engineManager.properties"/>
-
- <!-- Default Search Engine -->
- <groupbox id="defaultEngineGroup" align="start">
- <caption label="&defaultSearchEngine.label;"/>
- <label>&chooseYourDefaultSearchEngine.label;</label>
- <menulist id="defaultEngine" oncommand="gSearchPane.setDefaultEngine();">
- <menupopup/>
- </menulist>
- <checkbox id="suggestionsInSearchFieldsCheckbox"
- label="&provideSearchSuggestions.label;"
- accesskey="&provideSearchSuggestions.accesskey;"
- preference="browser.search.suggest.enabled"/>
- </groupbox>
-
- <groupbox id="oneClickSearchProvidersGroup">
- <caption label="&oneClickSearchEngines.label;"/>
- <label>&chooseWhichOneToDisplay.label;</label>
-
- <tree id="engineList" flex="1" rows="8" hidecolumnpicker="true" editable="true"
- seltype="single" onselect="gSearchPane.onTreeSelect();"
- onkeypress="gSearchPane.onTreeKeyPress(event);">
- <treechildren id="engineChildren" flex="1"
- ondragstart="onDragEngineStart(event);"/>
- <treecols>
- <treecol id="engineShown" type="checkbox" style="min-width: 26px;" editable="true"
- sortable="false"/>
- <treecol id="engineName" flex="4" label="&engineNameColumn.label;" sortable="false"/>
- <treecol id="engineKeyword" flex="1" label="&engineKeywordColumn.label;" editable="true"
- sortable="false"/>
- </treecols>
- </tree>
-
- <hbox>
- <button id="restoreDefaultSearchEngines"
- label="&restoreDefaultSearchEngines.label;"
- accesskey="&restoreDefaultSearchEngines.accesskey;"
- oncommand="gSearchPane.onRestoreDefaults();"/>
- <spacer flex="1"/>
- <button id="removeEngineButton"
- label="&removeEngine.label;"
- accesskey="&removeEngine.accesskey;"
- disabled="true"
- oncommand="gSearchPane.remove();"/>
- </hbox>
-
- <separator class="thin"/>
-
- <hbox pack="start">
- <label id="addEngines" class="text-link" value="&addMoreSearchEngines.label;"
- onclick="if (event.button == 0) { gSearchPane.loadAddEngines(); }"/>
- </hbox>
- </groupbox>
-
- </prefpane>
-
-</overlay>
deleted file mode 100644
--- a/browser/components/preferences/security.js
+++ /dev/null
@@ -1,227 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
-/* 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/. */
-
-Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
-
-var gSecurityPane = {
- _pane: null,
-
- /**
- * Initializes master password UI.
- */
- init: function ()
- {
- this._pane = document.getElementById("paneSecurity");
- this._initMasterPasswordUI();
- },
-
- // ADD-ONS
-
- /*
- * Preferences:
- *
- * xpinstall.whitelist.required
- * - true if a site must be added to a site whitelist before extensions
- * provided by the site may be installed from it, false if the extension
- * may be directly installed after a confirmation dialog
- */
-
- /**
- * Enables/disables the add-ons Exceptions button depending on whether
- * or not add-on installation warnings are displayed.
- */
- readWarnAddonInstall: function ()
- {
- var warn = document.getElementById("xpinstall.whitelist.required");
- var exceptions = document.getElementById("addonExceptions");
-
- exceptions.disabled = !warn.value;
-
- // don't override the preference value
- return undefined;
- },
-
- /**
- * Displays the exceptions lists for add-on installation warnings.
- */
- showAddonExceptions: function ()
- {
- var bundlePrefs = document.getElementById("bundlePreferences");
-
- var params = this._addonParams;
- if (!params.windowTitle || !params.introText) {
- params.windowTitle = bundlePrefs.getString("addons_permissions_title");
- params.introText = bundlePrefs.getString("addonspermissionstext");
- }
-
- document.documentElement.openWindow("Browser:Permissions",
- "chrome://browser/content/preferences/permissions.xul",
- "", params);
- },
-
- /**
- * Parameters for the add-on install permissions dialog.
- */
- _addonParams:
- {
- blockVisible: false,
- sessionVisible: false,
- allowVisible: true,
- prefilledHost: "",
- permissionType: "install"
- },
-
- // PASSWORDS
-
- /*
- * Preferences:
- *
- * signon.rememberSignons
- * - true if passwords are remembered, false otherwise
- */
-
- /**
- * Enables/disables the Exceptions button used to configure sites where
- * passwords are never saved. When browser is set to start in Private
- * Browsing mode, the "Remember passwords" UI is useless, so we disable it.
- */
- readSavePasswords: function ()
- {
- var pref = document.getElementById("signon.rememberSignons");
- var excepts = document.getElementById("passwordExceptions");
-
- if (PrivateBrowsingUtils.permanentPrivateBrowsing) {
- document.getElementById("savePasswords").disabled = true;
- excepts.disabled = true;
- return false;
- } else {
- excepts.disabled = !pref.value;
- // don't override pref value in UI
- return undefined;
- }
- },
-
- /**
- * Displays a dialog in which the user can view and modify the list of sites
- * where passwords are never saved.
- */
- showPasswordExceptions: function ()
- {
- document.documentElement.openWindow("Toolkit:PasswordManagerExceptions",
- "chrome://passwordmgr/content/passwordManagerExceptions.xul",
- "resizable", null);
- },
-
- /**
- * Initializes master password UI: the "use master password" checkbox, selects
- * the master password button to show, and enables/disables it as necessary.
- * The master password is controlled by various bits of NSS functionality, so
- * the UI for it can't be controlled by the normal preference bindings.
- */
- _initMasterPasswordUI: function ()
- {
- var noMP = !this._masterPasswordSet();
-
- var button = document.getElementById("changeMasterPassword");
- button.disabled = noMP;
-
- var checkbox = document.getElementById("useMasterPassword");
- checkbox.checked = !noMP;
- },
-
- /**
- * Returns true if the user has a master password set and false otherwise.
- */
- _masterPasswordSet: function ()
- {
- const Cc = Components.classes, Ci = Components.interfaces;
- var secmodDB = Cc["@mozilla.org/security/pkcs11moduledb;1"].
- getService(Ci.nsIPKCS11ModuleDB);
- var slot = secmodDB.findSlotByName("");
- if (slot) {
- var status = slot.status;
- var hasMP = status != Ci.nsIPKCS11Slot.SLOT_UNINITIALIZED &&
- status != Ci.nsIPKCS11Slot.SLOT_READY;
- return hasMP;
- } else {
- // XXX I have no bloody idea what this means
- return false;
- }
- },
-
- /**
- * Enables/disables the master password button depending on the state of the
- * "use master password" checkbox, and prompts for master password removal if
- * one is set.
- */
- updateMasterPasswordButton: function ()
- {
- var checkbox = document.getElementById("useMasterPassword");
- var button = document.getElementById("changeMasterPassword");
- button.disabled = !checkbox.checked;
-
- // unchecking the checkbox should try to immediately remove the master
- // password, because it's impossible to non-destructively remove the master
- // password used to encrypt all the passwords without providing it (by
- // design), and it would be extremely odd to pop up that dialog when the
- // user closes the prefwindow and saves his settings
- if (!checkbox.checked)
- this._removeMasterPassword();
- else
- this.changeMasterPassword();
-
- this._initMasterPasswordUI();
-
- // We might want to hide sync's password engine.
- gSyncPane.updateWeavePrefs();
- },
-
- /**
- * Displays the "remove master password" dialog to allow the user to remove
- * the current master password. When the dialog is dismissed, master password
- * UI is automatically updated.
- */
- _removeMasterPassword: function ()
- {
- const Cc = Components.classes, Ci = Components.interfaces;
- var secmodDB = Cc["@mozilla.org/security/pkcs11moduledb;1"].
- getService(Ci.nsIPKCS11ModuleDB);
- if (secmodDB.isFIPSEnabled) {
- var promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"].
- getService(Ci.nsIPromptService);
- var bundle = document.getElementById("bundlePreferences");
- promptService.alert(window,
- bundle.getString("pw_change_failed_title"),
- bundle.getString("pw_change2empty_in_fips_mode"));
- }
- else {
- document.documentElement.openSubDialog("chrome://mozapps/content/preferences/removemp.xul",
- "", null);
- }
- this._initMasterPasswordUI();
- },
-
- /**
- * Displays a dialog in which the master password may be changed.
- */
- changeMasterPassword: function ()
- {
- document.documentElement.openSubDialog("chrome://mozapps/content/preferences/changemp.xul",
- "", null);
- this._initMasterPasswordUI();
- },
-
- /**
- * Shows the sites where the user has saved passwords and the associated login
- * information.
- */
- showPasswords: function ()
- {
- document.documentElement.openWindow("Toolkit:PasswordManager",
- "chrome://passwordmgr/content/passwordManager.xul",
- "resizable", null);
- }
-
-};
deleted file mode 100644
--- a/browser/components/preferences/security.xul
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -->
-<!-- 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/. -->
-
-<!DOCTYPE overlay [
- <!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
- <!ENTITY % securityDTD SYSTEM "chrome://browser/locale/preferences/security.dtd">
- %brandDTD;
- %securityDTD;
-]>
-
-<overlay id="SecurityPaneOverlay"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
- <prefpane id="paneSecurity"
- onpaneload="gSecurityPane.init();"
- helpTopic="prefs-security">
-
- <preferences id="securityPreferences">
- <!-- XXX buttons -->
- <preference id="pref.privacy.disable_button.view_passwords"
- name="pref.privacy.disable_button.view_passwords"
- type="bool"/>
- <preference id="pref.privacy.disable_button.view_passwords_exceptions"
- name="pref.privacy.disable_button.view_passwords_exceptions"
- type="bool"/>
-
- <!-- Add-ons, malware, phishing -->
- <preference id="xpinstall.whitelist.required"
- name="xpinstall.whitelist.required"
- type="bool"/>
- <preference id="browser.safebrowsing.malware.enabled"
- name="browser.safebrowsing.malware.enabled"
- type="bool"/>
- <preference id="browser.safebrowsing.enabled"
- name="browser.safebrowsing.enabled"
- type="bool"/>
-
- <!-- Passwords -->
- <preference id="signon.rememberSignons" name="signon.rememberSignons" type="bool"/>
-
- </preferences>
-
- <script type="application/javascript" src="chrome://browser/content/preferences/security.js"/>
-
- <stringbundle id="bundlePreferences" src="chrome://browser/locale/preferences/preferences.properties"/>
-
- <!-- addons, forgery (phishing) UI -->
- <groupbox id="addonsPhishingGroup">
- <hbox id="addonInstallBox">
- <checkbox id="warnAddonInstall" flex="1"
- label="&warnAddonInstall.label;"
- accesskey="&warnAddonInstall.accesskey;"
- preference="xpinstall.whitelist.required"
- onsyncfrompreference="return gSecurityPane.readWarnAddonInstall();"/>
- <button id="addonExceptions"
- label="&addonExceptions.label;"
- accesskey="&addonExceptions.accesskey;"
- oncommand="gSecurityPane.showAddonExceptions();"/>
- </hbox>
-
- <separator class="thin"/>
- <checkbox id="blockAttackSites"
- label="&blockAttackSites.label;"
- accesskey="&blockAttackSites.accesskey;"
- preference="browser.safebrowsing.malware.enabled" />
- <checkbox id="blockWebForgeries"
- label="&blockWebForgeries.label;"
- accesskey="&blockWebForgeries.accesskey;"
- preference="browser.safebrowsing.enabled" />
- </groupbox>
-
- <!-- Passwords -->
- <groupbox id="passwordsGroup" orient="vertical">
- <caption label="&passwords.label;"/>
-
- <hbox id="savePasswordsBox">
- <checkbox id="savePasswords" flex="1"
- label="&rememberPasswords.label;" accesskey="&rememberPasswords.accesskey;"
- preference="signon.rememberSignons"
- onsyncfrompreference="return gSecurityPane.readSavePasswords();"/>
- <button id="passwordExceptions"
- label="&passwordExceptions.label;"
- accesskey="&passwordExceptions.accesskey;"
- oncommand="gSecurityPane.showPasswordExceptions();"
- preference="pref.privacy.disable_button.view_passwords_exceptions"/>
- </hbox>
- <hbox id="masterPasswordBox">
- <checkbox id="useMasterPassword" flex="1"
- oncommand="gSecurityPane.updateMasterPasswordButton();"
- label="&useMasterPassword.label;"
- accesskey="&useMasterPassword.accesskey;"/>
- <button id="changeMasterPassword"
- label="&changeMasterPassword.label;"
- accesskey="&changeMasterPassword.accesskey;"
- oncommand="gSecurityPane.changeMasterPassword();"/>
- </hbox>
-
- <hbox id="showPasswordsBox">
- <spacer flex="1"/>
- <button id="showPasswords"
- label="&savedPasswords.label;" accesskey="&savedPasswords.accesskey;"
- oncommand="gSecurityPane.showPasswords();"
- preference="pref.privacy.disable_button.view_passwords"/>
- </hbox>
- </groupbox>
-
- </prefpane>
-
-</overlay>
deleted file mode 100644
--- a/browser/components/preferences/sync.js
+++ /dev/null
@@ -1,513 +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/. */
-
-Components.utils.import("resource://services-sync/main.js");
-Components.utils.import("resource://gre/modules/Services.jsm");
-
-XPCOMUtils.defineLazyGetter(this, "FxAccountsCommon", function () {
- return Components.utils.import("resource://gre/modules/FxAccountsCommon.js", {});
-});
-
-XPCOMUtils.defineLazyModuleGetter(this, "fxAccounts",
- "resource://gre/modules/FxAccounts.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "fxaMigrator",
- "resource://services-sync/FxaMigrator.jsm");
-
-const PAGE_NO_ACCOUNT = 0;
-const PAGE_HAS_ACCOUNT = 1;
-const PAGE_NEEDS_UPDATE = 2;
-const PAGE_PLEASE_WAIT = 3;
-const FXA_PAGE_LOGGED_OUT = 4;
-const FXA_PAGE_LOGGED_IN = 5;
-
-// Indexes into the "login status" deck.
-// We are in a successful verified state - everything should work!
-const FXA_LOGIN_VERIFIED = 0;
-// We have logged in to an unverified account.
-const FXA_LOGIN_UNVERIFIED = 1;
-// We are logged in locally, but the server rejected our credentials.
-const FXA_LOGIN_FAILED = 2;
-
-let gSyncPane = {
- prefArray: ["engine.bookmarks", "engine.passwords", "engine.prefs",
- "engine.tabs", "engine.history"],
-
- get page() {
- return document.getElementById("weavePrefsDeck").selectedIndex;
- },
-
- set page(val) {
- document.getElementById("weavePrefsDeck").selectedIndex = val;
- },
-
- get _usingCustomServer() {
- return Weave.Svc.Prefs.isSet("serverURL");
- },
-
- needsUpdate: function () {
- this.page = PAGE_NEEDS_UPDATE;
- let label = document.getElementById("loginError");
- label.value = Weave.Utils.getErrorString(Weave.Status.login);
- label.className = "error";
- },
-
- init: function () {
- // We use a preference observer to notice changes to the Sync engines
- // enabled state - other techniques are problematic due to the window
- // being instant-apply on Mac etc but modal on Windows.
- let prefObserver = () => {
- // If all our Sync engines are disabled we flip the "master" Sync-enabled pref.
- let prefElts = document.querySelectorAll("#syncEnginePrefs > preference");
- let syncEnabled = false;
- for (let elt of prefElts) {
- if (elt.name.startsWith("services.sync.") && elt.value) {
- syncEnabled = true;
- break;
- }
- }
- Services.prefs.setBoolPref("services.sync.enabled", syncEnabled);
- }
- Services.prefs.addObserver("services.sync.engine.", prefObserver, false);
- window.addEventListener("unload", () => {
- Services.prefs.removeObserver("services.sync.engine.", prefObserver);
- }, false);
-
- // If the Service hasn't finished initializing, wait for it.
- let xps = Components.classes["@mozilla.org/weave/service;1"]
- .getService(Components.interfaces.nsISupports)
- .wrappedJSObject;
-
- if (xps.ready) {
- this._init();
- return;
- }
-
- // it may take some time before we can determine what provider to use
- // and the state of that provider, so show the "please wait" page.
- this.page = PAGE_PLEASE_WAIT;
-
- let onUnload = function () {
- window.removeEventListener("unload", onUnload, false);
- try {
- Services.obs.removeObserver(onReady, "weave:service:ready");
- } catch (e) {}
- };
-
- let onReady = function () {
- Services.obs.removeObserver(onReady, "weave:service:ready");
- window.removeEventListener("unload", onUnload, false);
- this._init();
- }.bind(this);
-
- Services.obs.addObserver(onReady, "weave:service:ready", false);
- window.addEventListener("unload", onUnload, false);
-
- xps.ensureLoaded();
- },
-
- _init: function () {
- let topics = ["weave:service:login:error",
- "weave:service:login:finish",
- "weave:service:start-over:finish",
- "weave:service:setup-complete",
- "weave:service:logout:finish",
- FxAccountsCommon.ONVERIFIED_NOTIFICATION];
- let migrateTopic = "fxa-migration:state-changed";
-
- // Add the observers now and remove them on unload
- //XXXzpao This should use Services.obs.* but Weave's Obs does nice handling
- // of `this`. Fix in a followup. (bug 583347)
- topics.forEach(function (topic) {
- Weave.Svc.Obs.add(topic, this.updateWeavePrefs, this);
- }, this);
- // The FxA migration observer is a special case.
- Weave.Svc.Obs.add(migrateTopic, this.updateMigrationState, this);
-
- window.addEventListener("unload", function() {
- topics.forEach(topic => {
- Weave.Svc.Obs.remove(topic, this.updateWeavePrefs, this);
- });
- Weave.Svc.Obs.remove(migrateTopic, this.updateMigrationState, this);
- }.bind(this), false);
-
- XPCOMUtils.defineLazyGetter(this, '_stringBundle', () => {
- return Services.strings.createBundle("chrome://browser/locale/preferences/preferences.properties");
- });
-
- XPCOMUtils.defineLazyGetter(this, '_accountsStringBundle', () => {
- return Services.strings.createBundle("chrome://browser/locale/accounts.properties");
- });
-
- this.updateWeavePrefs();
- },
-
- updateWeavePrefs: function () {
- // ask the migration module to broadcast its current state (and nothing will
- // happen if it's not loaded - which is good, as that means no migration
- // is pending/necessary) - we don't want to suck that module in just to
- // find there's nothing to do.
- Services.obs.notifyObservers(null, "fxa-migration:state-request", null);
-
- let service = Components.classes["@mozilla.org/weave/service;1"]
- .getService(Components.interfaces.nsISupports)
- .wrappedJSObject;
- // service.fxAccountsEnabled is false iff sync is already configured for
- // the legacy provider.
- if (service.fxAccountsEnabled) {
- // determine the fxa status...
- this.page = PAGE_PLEASE_WAIT;
- fxAccounts.getSignedInUser().then(data => {
- if (!data) {
- this.page = FXA_PAGE_LOGGED_OUT;
- return;
- }
- this.page = FXA_PAGE_LOGGED_IN;
- // We are logged in locally, but maybe we are in a state where the
- // server rejected our credentials (eg, password changed on the server)
- let fxaLoginStatus = document.getElementById("fxaLoginStatus");
- let enginesListDisabled;
- // Not Verfied implies login error state, so check that first.
- if (!data.verified) {
- fxaLoginStatus.selectedIndex = FXA_LOGIN_UNVERIFIED;
- enginesListDisabled = true;
- // So we think we are logged in, so login problems are next.
- // (Although if the Sync identity manager is still initializing, we
- // ignore login errors and assume all will eventually be good.)
- // LOGIN_FAILED_LOGIN_REJECTED explicitly means "you must log back in".
- // All other login failures are assumed to be transient and should go
- // away by themselves, so aren't reflected here.
- } else if (Weave.Status.login == Weave.LOGIN_FAILED_LOGIN_REJECTED) {
- fxaLoginStatus.selectedIndex = FXA_LOGIN_FAILED;
- enginesListDisabled = true;
- // Else we must be golden (or in an error state we expect to magically
- // resolve itself)
- } else {
- fxaLoginStatus.selectedIndex = FXA_LOGIN_VERIFIED;
- enginesListDisabled = false;
- }
- document.getElementById("fxaEmailAddress1").textContent = data.email;
- document.getElementById("fxaEmailAddress2").textContent = data.email;
- document.getElementById("fxaEmailAddress3").textContent = data.email;
- document.getElementById("fxaSyncComputerName").value = Weave.Service.clientsEngine.localName;
- let engines = document.getElementById("fxaSyncEngines")
- for (let checkbox of engines.querySelectorAll("checkbox")) {
- checkbox.disabled = enginesListDisabled;
- }
- });
- // If fxAccountEnabled is false and we are in a "not configured" state,
- // then fxAccounts is probably fully disabled rather than just unconfigured,
- // so handle this case. This block can be removed once we remove support
- // for fxAccounts being disabled.
- } else if (Weave.Status.service == Weave.CLIENT_NOT_CONFIGURED ||
- Weave.Svc.Prefs.get("firstSync", "") == "notReady") {
- this.page = PAGE_NO_ACCOUNT;
- // else: sync was previously configured for the legacy provider, so we
- // make the "old" panels available.
- } else if (Weave.Status.login == Weave.LOGIN_FAILED_INVALID_PASSPHRASE ||
- Weave.Status.login == Weave.LOGIN_FAILED_LOGIN_REJECTED) {
- this.needsUpdate();
- } else {
- this.page = PAGE_HAS_ACCOUNT;
- document.getElementById("accountName").value = Weave.Service.identity.account;
- document.getElementById("syncComputerName").value = Weave.Service.clientsEngine.localName;
- document.getElementById("tosPP-normal").hidden = this._usingCustomServer;
- }
- },
-
- updateMigrationState: function(subject, state) {
- let selIndex;
- let container = document.getElementById("sync-migration");
- switch (state) {
- case fxaMigrator.STATE_USER_FXA: {
- let sb = this._accountsStringBundle;
- // There are 2 cases here - no email address means it is an offer on
- // the first device (so the user is prompted to create an account).
- // If there is an email address it is the "join the party" flow, so the
- // user is prompted to sign in with the address they previously used.
- let email = subject ? subject.QueryInterface(Components.interfaces.nsISupportsString).data : null;
- let elt = document.getElementById("sync-migrate-upgrade-description");
- elt.textContent = email ?
- sb.formatStringFromName("signInAfterUpgradeOnOtherDevice.description",
- [email], 1) :
- sb.GetStringFromName("needUserLong");
-
- // The "Learn more" link.
- if (!email) {
- let learnMoreLink = document.createElement("label");
- learnMoreLink.className = "text-link";
- let { text, href } = fxaMigrator.learnMoreLink;
- learnMoreLink.setAttribute("value", text);
- learnMoreLink.href = href;
- elt.appendChild(learnMoreLink);
- }
-
- // The "upgrade" button.
- let button = document.getElementById("sync-migrate-upgrade");
- button.setAttribute("label",
- sb.GetStringFromName(email
- ? "signInAfterUpgradeOnOtherDevice.label"
- : "upgradeToFxA.label"));
- button.setAttribute("accesskey",
- sb.GetStringFromName(email
- ? "signInAfterUpgradeOnOtherDevice.accessKey"
- : "upgradeToFxA.accessKey"));
- // The "unlink" button - this is only shown for first migration
- button = document.getElementById("sync-migrate-unlink");
- if (email) {
- button.hidden = true;
- } else {
- button.setAttribute("label", sb.GetStringFromName("unlinkMigration.label"));
- button.setAttribute("accesskey", sb.GetStringFromName("unlinkMigration.accessKey"));
- }
- selIndex = 0;
- break;
- }
- case fxaMigrator.STATE_USER_FXA_VERIFIED: {
- let sb = this._accountsStringBundle;
- let email = subject.QueryInterface(Components.interfaces.nsISupportsString).data;
- let label = sb.formatStringFromName("needVerifiedUserLong", [email], 1);
- let elt = document.getElementById("sync-migrate-verify-description");
- elt.textContent = label;
- // The "resend" button.
- let button = document.getElementById("sync-migrate-resend");
- button.setAttribute("label", sb.GetStringFromName("resendVerificationEmail.label"));
- button.setAttribute("accesskey", sb.GetStringFromName("resendVerificationEmail.accessKey"));
- // The "forget" button.
- button = document.getElementById("sync-migrate-forget");
- button.setAttribute("label", sb.GetStringFromName("forgetMigration.label"));
- button.setAttribute("accesskey", sb.GetStringFromName("forgetMigration.accessKey"));
- selIndex = 1;
- break;
- }
- default:
- if (state) { // |null| is expected, but everything else is not.
- Cu.reportError("updateMigrationState has unknown state: " + state);
- }
- if (!container.hidden) {
- window.innerHeight -= container.clientHeight;
- container.hidden = true;
- }
- return;
- }
- document.getElementById("sync-migration-deck").selectedIndex = selIndex;
- if (container.hidden) {
- container.hidden = false;
- window.innerHeight += container.clientHeight;
- }
- },
-
- startOver: function (showDialog) {
- if (showDialog) {
- let flags = Services.prompt.BUTTON_POS_0 * Services.prompt.BUTTON_TITLE_IS_STRING +
- Services.prompt.BUTTON_POS_1 * Services.prompt.BUTTON_TITLE_CANCEL +
- Services.prompt.BUTTON_POS_1_DEFAULT;
- let buttonChoice =
- Services.prompt.confirmEx(window,
- this._stringBundle.GetStringFromName("syncUnlink.title"),
- this._stringBundle.GetStringFromName("syncUnlink.label"),
- flags,
- this._stringBundle.GetStringFromName("syncUnlinkConfirm.label"),
- null, null, null, {});
-
- // If the user selects cancel, just bail
- if (buttonChoice == 1) {
- return;
- }
- }
-
- Weave.Service.startOver();
- this.updateWeavePrefs();
- },
-
- updatePass: function () {
- if (Weave.Status.login == Weave.LOGIN_FAILED_LOGIN_REJECTED) {
- gSyncUtils.changePassword();
- } else {
- gSyncUtils.updatePassphrase();
- }
- },
-
- resetPass: function () {
- if (Weave.Status.login == Weave.LOGIN_FAILED_LOGIN_REJECTED) {
- gSyncUtils.resetPassword();
- } else {
- gSyncUtils.resetPassphrase();
- }
- },
-
- /**
- * Invoke the Sync setup wizard.
- *
- * @param wizardType
- * Indicates type of wizard to launch:
- * null -- regular set up wizard
- * "pair" -- pair a device first
- * "reset" -- reset sync
- */
- openSetup: function (wizardType) {
- let service = Components.classes["@mozilla.org/weave/service;1"]
- .getService(Components.interfaces.nsISupports)
- .wrappedJSObject;
-
- if (service.fxAccountsEnabled) {
- this.openContentInBrowser("about:accounts?entrypoint=preferences", {
- replaceQueryString: true
- });
- } else {
- let win = Services.wm.getMostRecentWindow("Weave:AccountSetup");
- if (win) {
- win.focus();
- } else {
- window.openDialog("chrome://browser/content/sync/setup.xul",
- "weaveSetup", "centerscreen,chrome,resizable=no",
- wizardType);
- }
- }
- },
-
- openContentInBrowser: function(url, options) {
- let win = Services.wm.getMostRecentWindow("navigator:browser");
- if (!win) {
- // no window to use, so use _openLink to create a new one. We don't
- // always use that as it prefers to open a new window rather than use
- // an existing one.
- gSyncUtils._openLink(url);
- return;
- }
- win.switchToTabHavingURI(url, true, options);
- // seeing as we are doing this in a tab we close the prefs dialog.
- window.close();
- },
-
- signUp: function() {
- this.openContentInBrowser("about:accounts?action=signup&entrypoint=preferences", {
- replaceQueryString: true
- });
- },
-
- signIn: function() {
- this.openContentInBrowser("about:accounts?action=signin&entrypoint=preferences", {
- replaceQueryString: true
- });
- },
-
- reSignIn: function() {
- this.openContentInBrowser("about:accounts?action=reauth&entrypoint=preferences", {
- replaceQueryString: true
- });
- },
-
- manageFirefoxAccount: function() {
- fxAccounts.promiseAccountsManageURI()
- .then(url => {
- this.openContentInBrowser(url, {
- replaceQueryString: true
- });
- });
- },
-
- verifyFirefoxAccount: function() {
- fxAccounts.resendVerificationEmail().then(() => {
- fxAccounts.getSignedInUser().then(data => {
- let sb = Services.strings.createBundle("chrome://browser/locale/accounts.properties");
- let title = sb.GetStringFromName("verificationSentTitle");
- let heading = sb.formatStringFromName("verificationSentHeading",
- [data.email], 1);
- let description = sb.GetStringFromName("verificationSentDescription");
-
- Services.prompt.alert(window, title, heading + "\n\n" + description);
- });
- });
- },
-
- openOldSyncSupportPage: function() {
- let url = Services.urlFormatter.formatURLPref('app.support.baseURL') + "old-sync"
- this.openContentInBrowser(url);
- },
-
- unlinkFirefoxAccount: function(confirm) {
- if (confirm) {
- // We use a string bundle shared with aboutAccounts.
- let sb = Services.strings.createBundle("chrome://browser/locale/syncSetup.properties");
- let continueLabel = sb.GetStringFromName("continue.label");
- let title = sb.GetStringFromName("disconnect.verify.title");
- let brandBundle = Services.strings.createBundle("chrome://branding/locale/brand.properties");
- let brandShortName = brandBundle.GetStringFromName("brandShortName");
- let body = sb.GetStringFromName("disconnect.verify.heading") +
- "\n\n" +
- sb.formatStringFromName("disconnect.verify.description",
- [brandShortName], 1);
- let ps = Services.prompt;
- let buttonFlags = (ps.BUTTON_POS_0 * ps.BUTTON_TITLE_IS_STRING) +
- (ps.BUTTON_POS_1 * ps.BUTTON_TITLE_CANCEL) +
- ps.BUTTON_POS_1_DEFAULT;
- let pressed = Services.prompt.confirmEx(window, title, body, buttonFlags,
- continueLabel, null, null, null, {});
- if (pressed != 0) { // 0 is the "continue" button
- return;
- }
- }
- fxAccounts.signOut().then(() => {
- this.updateWeavePrefs();
- });
- },
-
- openAddDevice: function () {
- if (!Weave.Utils.ensureMPUnlocked()) {
- return;
- }
-
- let win = Services.wm.getMostRecentWindow("Sync:AddDevice");
- if (win) {
- win.focus();
- } else {
- window.openDialog("chrome://browser/content/sync/addDevice.xul",
- "syncAddDevice", "centerscreen,chrome,resizable=no");
- }
- },
-
- resetSync: function () {
- this.openSetup("reset");
- },
-
- // click handlers for the FxA migration.
- migrateUpgrade: function() {
- fxaMigrator.getFxAccountCreationOptions().then(({url, options}) => {
- this.openContentInBrowser(url, options);
- });
- },
-
- migrateForget: function() {
- fxaMigrator.forgetFxAccount();
- },
-
- migrateResend: function() {
- fxaMigrator.resendVerificationMail(window);
- },
-
- // When the "Unlink" button in the migration header is selected we display
- // a slightly different message.
- startOverMigration: function () {
- let flags = Services.prompt.BUTTON_POS_0 * Services.prompt.BUTTON_TITLE_IS_STRING +
- Services.prompt.BUTTON_POS_1 * Services.prompt.BUTTON_TITLE_CANCEL +
- Services.prompt.BUTTON_POS_1_DEFAULT;
- let sb = this._accountsStringBundle;
- let buttonChoice =
- Services.prompt.confirmEx(window,
- sb.GetStringFromName("unlinkVerificationTitle"),
- sb.GetStringFromName("unlinkVerificationDescription"),
- flags,
- sb.GetStringFromName("unlinkVerificationConfirm"),
- null, null, null, {});
-
- // If the user selects cancel, just bail
- if (buttonChoice == 1)
- return;
-
- Weave.Service.startOver();
- this.updateWeavePrefs();
- },
-};
-
deleted file mode 100644
--- a/browser/components/preferences/sync.xul
+++ /dev/null
@@ -1,330 +0,0 @@
-<?xml version="1.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/. -->
-
-<!DOCTYPE overlay [
-<!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
-<!ENTITY % syncBrandDTD SYSTEM "chrome://browser/locale/syncBrand.dtd">
-<!ENTITY % syncDTD SYSTEM "chrome://browser/locale/preferences/sync.dtd">
-%brandDTD;
-%syncBrandDTD;
-%syncDTD;
-]>
-
-<overlay id="SyncPaneOverlay"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
- xmlns:html="http://www.w3.org/1999/xhtml">
-
- <prefpane id="paneSync"
- helpTopic="prefs-weave"
- onpaneload="gSyncPane.init()">
-
- <preferences id="syncEnginePrefs">
- <preference id="engine.addons" name="services.sync.engine.addons" type="bool"/>
- <preference id="engine.bookmarks" name="services.sync.engine.bookmarks" type="bool"/>
- <preference id="engine.history" name="services.sync.engine.history" type="bool"/>
- <preference id="engine.tabs" name="services.sync.engine.tabs" type="bool"/>
- <preference id="engine.prefs" name="services.sync.engine.prefs" type="bool"/>
- <preference id="engine.passwords" name="services.sync.engine.passwords" type="bool"/>
- </preferences>
-
-
- <script type="application/javascript"
- src="chrome://browser/content/preferences/sync.js"/>
- <script type="application/javascript"
- src="chrome://browser/content/sync/utils.js"/>
-
- <vbox id="sync-migration" flex="1" hidden="true">
-
- <deck id="sync-migration-deck">
- <!-- When we are in the "need FxA user" state -->
- <hbox align="center">
- <description id="sync-migrate-upgrade-description" flex="1"/>
- <spacer flex="1"/>
- <button id="sync-migrate-unlink"
- onclick="event.stopPropagation(); gSyncPane.startOverMigration();"/>
- <button id="sync-migrate-upgrade"
- onclick="event.stopPropagation(); gSyncPane.migrateUpgrade();"/>
- </hbox>
-
- <!-- When we are in the "need the user to be verified" state -->
- <hbox align="center">
- <description id="sync-migrate-verify-description" flex="1"/>
- <spacer flex="1"/>
- <button id="sync-migrate-forget"
- onclick="event.stopPropagation(); gSyncPane.migrateForget();"/>
- <button id="sync-migrate-resend"
- onclick="event.stopPropagation(); gSyncPane.migrateResend();"/>
- </hbox>
- </deck>
- </vbox>
-
- <deck id="weavePrefsDeck">
-
- <!-- These panels are for the "legacy" sync provider -->
- <vbox id="noAccount" align="center">
- <spacer flex="1"/>
- <description id="syncDesc">
- &weaveDesc.label;
- </description>
- <separator/>
- <label class="text-link"
- onclick="event.stopPropagation(); gSyncPane.openSetup(null);"
- value="&setupButton.label;"/>
- <vbox id="pairDevice">
- <separator/>
- <label class="text-link"
- onclick="event.stopPropagation(); gSyncPane.openSetup('pair');"
- value="&pairDevice.label;"/>
- </vbox>
- <spacer flex="3"/>
- </vbox>
-
- <vbox id="hasAccount">
- <groupbox class="syncGroupBox">
- <!-- label is set to account name -->
- <caption id="accountCaption" align="center">
- <image id="accountCaptionImage"/>
- <label id="accountName" value=""/>
- </caption>
-
- <hbox>
- <button type="menu"
- label="&manageAccount.label;"
- accesskey="&manageAccount.accesskey;">
- <menupopup>
- <menuitem label="&changePassword2.label;"
- oncommand="gSyncUtils.changePassword();"/>
- <menuitem label="&myRecoveryKey.label;"
- oncommand="gSyncUtils.resetPassphrase();"/>
- <menuseparator/>
- <menuitem label="&resetSync2.label;"
- oncommand="gSyncPane.resetSync();"/>
- </menupopup>
- </button>
- </hbox>
-
- <hbox>
- <label id="syncAddDeviceLabel"
- class="text-link"
- onclick="gSyncPane.openAddDevice(); return false;"
- value="&pairDevice.label;"/>
- </hbox>
-
- <vbox>
- <label value="&syncMy.label;" />
- <richlistbox id="syncEnginesList"
- orient="vertical"
- onselect="if (this.selectedCount) this.clearSelection();">
- <richlistitem>
- <checkbox label="&engine.addons.label;"
- accesskey="&engine.addons.accesskey;"
- preference="engine.addons"/>
- </richlistitem>
- <richlistitem>
- <checkbox label="&engine.bookmarks.label;"
- accesskey="&engine.bookmarks.accesskey;"
- preference="engine.bookmarks"/>
- </richlistitem>
- <richlistitem>
- <checkbox label="&engine.passwords.label;"
- accesskey="&engine.passwords.accesskey;"
- preference="engine.passwords"/>
- </richlistitem>
- <richlistitem>
- <checkbox label="&engine.prefs.label;"
- accesskey="&engine.prefs.accesskey;"
- preference="engine.prefs"/>
- </richlistitem>
- <richlistitem>
- <checkbox label="&engine.history.label;"
- accesskey="&engine.history.accesskey;"
- preference="engine.history"/>
- </richlistitem>
- <richlistitem>
- <checkbox label="&engine.tabs.label;"
- accesskey="&engine.tabs.accesskey;"
- preference="engine.tabs"/>
- </richlistitem>
- </richlistbox>
- </vbox>
- </groupbox>
-
- <groupbox class="syncGroupBox">
- <grid>
- <columns>
- <column/>
- <column flex="1"/>
- </columns>
- <rows>
- <row align="center">
- <label value="&syncDeviceName.label;"
- accesskey="&syncDeviceName.accesskey;"
- control="syncComputerName"/>
- <textbox id="syncComputerName"
- onchange="gSyncUtils.changeName(this)"/>
- </row>
- </rows>
- </grid>
- <hbox>
- <label class="text-link"
- onclick="gSyncPane.startOver(true); return false;"
- value="&unlinkDevice.label;"/>
- </hbox>
- </groupbox>
- <hbox id="tosPP-normal" pack="center">
- <label class="text-link"
- onclick="event.stopPropagation();gSyncUtils.openToS();"
- value="&prefs.tosLink.label;"/>
- <label class="text-link"
- onclick="event.stopPropagation();gSyncUtils.openPrivacyPolicy();"
- value="&prefs.ppLink.label;"/>
- </hbox>
- </vbox>
-
- <vbox id="needsUpdate" align="center" pack="center">
- <hbox>
- <label id="loginError" value=""/>
- <label class="text-link"
- onclick="gSyncPane.updatePass(); return false;"
- value="&updatePass.label;"/>
- <label class="text-link"
- onclick="gSyncPane.resetPass(); return false;"
- value="&resetPass.label;"/>
- </hbox>
- <label class="text-link"
- onclick="gSyncPane.startOver(true); return false;"
- value="&unlinkDevice.label;"/>
- </vbox>
-
- <!-- These panels are for the Firefox Accounts identity provider -->
- <vbox id="fxaDeterminingStatus" align="center">
- <spacer flex="1"/>
- <p>&determiningAcctStatus.label;</p>
- <spacer flex="1"/>
- </vbox>
-
- <vbox id="noFxaAccount" align="start">
- <label>&welcome.description;</label>
- <label class="text-link"
- onclick="gSyncPane.signUp(); return false;"
- value="&welcome.createAccount.label;"/>
- <label class="text-link"
- onclick="gSyncPane.signIn(); return false;"
- value="&welcome.signIn.label;"/>
- <separator/>
- <label class="text-link"
- onclick="gSyncPane.openOldSyncSupportPage(); return false;"
- value="&welcome.useOldSync.label;"/>
- </vbox>
-
- <vbox id="hasFxaAccount">
- <groupbox id="fxaGroup">
- <caption label="&syncBrand.fxAccount.label;"/>
-
- <deck id="fxaLoginStatus">
-
- <!-- logged in and verified and all is good -->
- <hbox>
- <label id="fxaEmailAddress1"/>
- <vbox>
- <label class="text-link"
- onclick="gSyncPane.manageFirefoxAccount();"/>
- </vbox>
- <spacer flex="1"/>
- <vbox>
- <button id="fxaUnlinkButton"
- oncommand="gSyncPane.unlinkFirefoxAccount(true);"
- label="&disconnect.label;"/>
- </vbox>
- </hbox>
-
- <!-- logged in to an unverified account -->
- <hbox flex="1">
- <description flex="1">
- &signedInUnverified.beforename.label;
- <span id="fxaEmailAddress2"></span>
- &signedInUnverified.aftername.label;
- </description>
- <vbox align="end">
- <button oncommand="gSyncPane.verifyFirefoxAccount();"
- label="&verify.label;"/>
- <label class="text-link"
- onclick="/* no warning as account can't have previously synced */ gSyncPane.unlinkFirefoxAccount(false);"
- value="&forget.label;"/>
- </vbox>
- </hbox>
-
- <!-- logged in locally but server rejected credentials -->
- <hbox flex="1">
- <description flex="1">
- &signedInLoginFailure.beforename.label;
- <span id="fxaEmailAddress3"></span>
- &signedInLoginFailure.aftername.label;
- </description>
- <vbox align="end">
- <button oncommand="gSyncPane.reSignIn();"
- label="&signIn.label;"/>
- <label class="text-link"
- onclick="gSyncPane.unlinkFirefoxAccount(true);"
- value="&forget.label;"/>
- </vbox>
- </hbox>
- </deck>
- </groupbox>
-
- <groupbox id="syncOptions">
- <caption label="&syncBrand.shortName.label;"/>
- <hbox id="fxaSyncEngines">
- <vbox>
- <checkbox label="&engine.tabs.label;"
- accesskey="&engine.tabs.accesskey;"
- onsynctopreference="gSyncPane.onPreferenceChanged();"
- preference="engine.tabs"/>
- <checkbox label="&engine.bookmarks.label;"
- accesskey="&engine.bookmarks.accesskey;"
- onsynctopreference="gSyncPane.onPreferenceChanged();"
- preference="engine.bookmarks"/>
- <checkbox label="&engine.passwords.label;"
- accesskey="&engine.passwords.accesskey;"
- onsynctopreference="gSyncPane.onPreferenceChanged();"
- preference="engine.passwords"/>
- <checkbox label="&engine.history.label;"
- accesskey="&engine.history.accesskey;"
- onsynctopreference="gSyncPane.onPreferenceChanged(this);"
- preference="engine.history"/>
- <checkbox label="&engine.addons.label;"
- accesskey="&engine.addons.accesskey;"
- onsynctopreference="gSyncPane.onPreferenceChanged();"
- preference="engine.addons"/>
- <checkbox label="&engine.prefs.label;"
- accesskey="&engine.prefs.accesskey;"
- onsynctopreference="gSyncPane.onPreferenceChanged();"
- preference="engine.prefs"/>
- </vbox>
- <spacer/>
- </hbox>
- </groupbox>
- <hbox align="center">
- <label value="&syncDeviceName.label;"
- accesskey="&syncDeviceName.accesskey;"
- control="syncComputerName"/>
- <textbox id="fxaSyncComputerName"
- flex="1"
- onchange="gSyncUtils.changeName(this)"/>
- </hbox>
- <spacer flex="1"/>
- <hbox id="tosPP-small" pack="center">
- <label class="text-link small"
- onclick="event.stopPropagation();gSyncUtils.openToS();"
- value="&prefs.tosLink.label;"/>
- <label class="text-link small"
- onclick="event.stopPropagation();gSyncUtils.openPrivacyPolicy();"
- value="&fxaPrivacyNotice.link.label;"/>
- </hbox>
- </vbox>
- </deck>
- </prefpane>
-</overlay>
deleted file mode 100644
--- a/browser/components/preferences/tabs.js
+++ /dev/null
@@ -1,75 +0,0 @@
-# -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
-# 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/.
-
-var gTabsPane = {
-
- /*
- * Preferences:
- *
- * browser.link.open_newwindow
- * - determines where pages which would open in a new window are opened:
- * 1 opens such links in the most recent window or tab,
- * 2 opens such links in a new window,
- * 3 opens such links in a new tab
- * browser.tabs.loadInBackground
- * - true if display should switch to a new tab which has been opened from a
- * link, false if display shouldn't switch
- * browser.tabs.warnOnClose
- * - true if when closing a window with multiple tabs the user is warned and
- * allowed to cancel the action, false to just close the window
- * browser.tabs.warnOnOpen
- * - true if the user should be warned if he attempts to open a lot of tabs at
- * once (e.g. a large folder of bookmarks), false otherwise
- * browser.taskbar.previews.enable
- * - true if tabs are to be shown in the Windows 7 taskbar
- */
-
- init: function () {
-#ifdef XP_WIN
- const Cc = Components.classes;
- const Ci = Components.interfaces;
- try {
- let sysInfo = Cc["@mozilla.org/system-info;1"].
- getService(Ci.nsIPropertyBag2);
- let ver = parseFloat(sysInfo.getProperty("version"));
- let showTabsInTaskbar = document.getElementById("showTabsInTaskbar");
- showTabsInTaskbar.hidden = ver < 6.1;
- } catch (ex) {}
-#endif
-
- // The "closing multiple tabs" and "opening multiple tabs might slow down
- // &brandShortName;" warnings provide options for not showing these
- // warnings again. When the user disabled them, we provide checkboxes to
- // re-enable the warnings.
- let TransientPrefs =
- Components.utils.import("resource:///modules/TransientPrefs.jsm", {})
- .TransientPrefs;
- if (!TransientPrefs.prefShouldBeVisible("browser.tabs.warnOnClose"))
- document.getElementById("warnCloseMultiple").hidden = true;
- if (!TransientPrefs.prefShouldBeVisible("browser.tabs.warnOnOpen"))
- document.getElementById("warnOpenMany").hidden = true;
- },
-
- /**
- * Determines where a link which opens a new window will open.
- *
- * @returns |true| if such links should be opened in new tabs
- */
- readLinkTarget: function() {
- var openNewWindow = document.getElementById("browser.link.open_newwindow");
- return openNewWindow.value != 2;
- },
-
- /**
- * Determines where a link which opens a new window will open.
- *
- * @returns 2 if such links should be opened in new windows,
- * 3 if such links should be opened in new tabs
- */
- writeLinkTarget: function() {
- var linkTargeting = document.getElementById("linkTargeting");
- return linkTargeting.checked ? 3 : 2;
- }
-};
deleted file mode 100644
--- a/browser/components/preferences/tabs.xul
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0"?>
-
-# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
-# 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/.
-
-<!DOCTYPE overlay [
-<!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
-%brandDTD;
-<!ENTITY % tabsDTD SYSTEM "chrome://browser/locale/preferences/tabs.dtd">
-%tabsDTD;
-]>
-
-<overlay id="TabsPaneOverlay"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
- <prefpane id="paneTabs"
- onpaneload="gTabsPane.init();"
- helpTopic="prefs-tabs">
-
- <preferences i