Bug 1547301 - Add openViewOnFocus API. r=mak,mixedpuppy

Differential Revision: https://phabricator.services.mozilla.com/D34509

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Dão Gottwald 2019-06-19 00:46:40 +00:00
Родитель 624887abc5
Коммит b0f92762cd
6 изменённых файлов: 99 добавлений и 8 удалений

Просмотреть файл

@ -331,6 +331,8 @@ pref("browser.urlbar.usepreloadedtopurls.expire_days", 14);
// Enable the new Address Bar code.
pref("browser.urlbar.quantumbar", true);
pref("browser.urlbar.openViewOnFocus", false);
pref("browser.altClickSave", false);
// Enable logging downloads operations to the Console.

Просмотреть файл

@ -1,9 +1,22 @@
"use strict";
XPCOMUtils.defineLazyModuleGetters(this, {
UrlbarPrefs: "resource:///modules/UrlbarPrefs.jsm",
UrlbarProvidersManager: "resource:///modules/UrlbarProvidersManager.jsm",
});
var {ExtensionPreferencesManager} = ChromeUtils.import("resource://gre/modules/ExtensionPreferencesManager.jsm");
var {getSettingsAPI} = ExtensionPreferencesManager;
ExtensionPreferencesManager.addSetting("openViewOnFocus", {
prefNames: [
"browser.urlbar.openViewOnFocus",
],
setCallback(value) {
return {[this.prefNames[0]]: value};
},
});
this.urlbar = class extends ExtensionAPI {
getAPI(context) {
return {
@ -23,6 +36,12 @@ this.urlbar = class extends ExtensionAPI {
UrlbarProvidersManager.removeExtensionListener(name, "queryready");
};
}).api(),
openViewOnFocus: getSettingsAPI(
context.extension.id, "openViewOnFocus",
() => {
return UrlbarPrefs.get("openViewOnFocus");
}),
},
};
}

Просмотреть файл

@ -55,6 +55,12 @@
}
}
],
"properties": {
"openViewOnFocus": {
"$ref": "types.Setting",
"description": "Enables or disables the open-view-on-focus mode."
}
},
"events": [
{
"name": "onQueryReady",

Просмотреть файл

@ -1,11 +1,22 @@
"use strict";
const {AddonTestUtils} = ChromeUtils.import("resource://testing-common/AddonTestUtils.jsm");
XPCOMUtils.defineLazyModuleGetters(this, {
UrlbarController: "resource:///modules/UrlbarController.jsm",
UrlbarPrefs: "resource:///modules/UrlbarPrefs.jsm",
UrlbarProvidersManager: "resource:///modules/UrlbarProvidersManager.jsm",
UrlbarQueryContext: "resource:///modules/UrlbarUtils.jsm",
});
AddonTestUtils.init(this);
AddonTestUtils.overrideCertDB();
AddonTestUtils.createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42");
add_task(async function startup() {
await AddonTestUtils.promiseStartupManager();
});
add_task(async function test_urlbar_without_urlbar_permission() {
let ext = ExtensionTestUtils.loadExtension({
isPrivileged: true,
@ -179,3 +190,31 @@ add_task(async function test_registerProvider() {
Assert.deepEqual(UrlbarProvidersManager.providers, providers,
"Should return to the default providers");
});
add_task(async function test_setOpenViewOnFocus() {
let getPrefValue = () => UrlbarPrefs.get("openViewOnFocus");
Assert.equal(getPrefValue(), false,
"Open-view-on-focus mode should be disabled by default");
let ext = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["urlbar"],
},
isPrivileged: true,
incognitoOverride: "spanning",
useAddonManager: "temporary",
background() {
browser.urlbar.openViewOnFocus.set({value: true});
},
});
await ext.startup();
Assert.equal(getPrefValue(), true,
"Successfully enabled the open-view-on-focus mode");
await ext.unload();
Assert.equal(getPrefValue(), false,
"Open-view-on-focus mode should be reset after unloading the add-on");
});

Просмотреть файл

@ -49,6 +49,7 @@ class UrlbarInput {
this.window = this.textbox.ownerGlobal;
this.document = this.window.document;
this.window.addEventListener("unload", this);
// Create the panel to contain results.
// In the future this may be moved to the view, so it can customize
@ -97,7 +98,6 @@ class UrlbarInput {
this._resultForCurrentValue = null;
this._suppressStartQuery = false;
this._untrimmedValue = "";
this._openViewOnFocus = false;
// This exists only for tests.
this._enableAutofillPlaceholder = true;
@ -121,7 +121,7 @@ class UrlbarInput {
Object.defineProperty(this, property, {
enumerable: true,
get() {
return this.textbox[property];
return this.textbox && this.textbox[property];
},
});
}
@ -130,7 +130,7 @@ class UrlbarInput {
Object.defineProperty(this, property, {
enumerable: true,
get() {
return this.textbox[property];
return this.textbox && this.textbox[property];
},
set(val) {
return this.textbox[property] = val;
@ -179,12 +179,16 @@ class UrlbarInput {
this.editor.QueryInterface(Ci.nsIPlaintextEditor).newlineHandling =
Ci.nsIPlaintextEditor.eNewlinesStripSurroundingWhitespace;
this._setOpenViewOnFocus();
Services.prefs.addObserver("browser.urlbar.openViewOnFocus", this);
}
/**
* Uninitializes this input object, detaching it from the inputField.
*/
uninit() {
this.window.removeEventListener("unload", this);
for (let name of this._inputFieldEvents) {
this.inputField.removeEventListener(name, this);
}
@ -211,6 +215,8 @@ class UrlbarInput {
this.valueFormatter.uninit();
}
Services.prefs.removeObserver("browser.urlbar.openViewOnFocus", this);
delete this.document;
delete this.window;
delete this.eventBufferer;
@ -297,6 +303,14 @@ class UrlbarInput {
return uri;
}
observe(subject, topic, data) {
switch (data) {
case "browser.urlbar.openViewOnFocus":
this._setOpenViewOnFocus();
break;
}
}
/**
* Passes DOM events for the textbox to the _on_<event type> methods.
* @param {Event} event
@ -721,13 +735,16 @@ class UrlbarInput {
return this._openViewOnFocus;
}
set openViewOnFocus(val) {
this._openViewOnFocus = val;
this.toggleAttribute("hidedropmarker", val);
}
// Private methods below.
_setOpenViewOnFocus() {
// FIXME: Not using UrlbarPrefs because its pref observer may run after
// this call, so we'd get the previous openViewOnFocus value here. This
// can be cleaned up after bug 1560013.
this._openViewOnFocus = Services.prefs.getBoolPref("browser.urlbar.openViewOnFocus");
this.toggleAttribute("hidedropmarker", this._openViewOnFocus);
}
_setValue(val, allowTrim) {
this._untrimmedValue = val;
@ -1551,6 +1568,12 @@ class UrlbarInput {
this.window.URLBarSetURI(null, true);
}
}
_on_unload() {
// FIXME: This is needed because uninit calls removePrefObserver. We can
// remove this once UrlbarPrefs has support for listeners. (bug 1560013)
this.uninit();
}
}
/**

Просмотреть файл

@ -100,6 +100,8 @@ const PREF_URLBAR_DEFAULTS = new Map([
// should be opened in new tabs by default.
["openintab", false],
["openViewOnFocus", false],
// Whether the quantum bar is enabled.
["quantumbar", false],