fune/browser/components/extensions/parent/ext-search.js
Rob Wu 36516a10a8 Bug 1475842 - Change parameter format in browser.search API r=rpl
Changes to browser.search.search API:
- Change the positional parameters to an object parameter.
- Rename "engineName" to "engine", and make this an optional parameter.
- Rename "searchTerms" to "query".

Changes to browser.search.search implementation:
- Simplify gBrowser getter. None of the "!gBrowser" conditionals are
  necessary, as demonstrated by the new options page+sidebar tests
  (which passed even after  removing the `if (!gBrowser ...)` blocks).
  Use windowTracker.topWindow for consistency with our other code.

Test changes:
- Remove unneeded name / "TEST_ID" in tests
- Use SEARCH_TERM constant in more places.
- New test: Using API from options page.
- New test: Using API from sidebar.
- New test: Using API without explicit "engine" parameter.

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

--HG--
extra : moz-landing-system : lando
2018-08-21 14:43:46 +00:00

90 lines
3.1 KiB
JavaScript

/* 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/. */
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
ChromeUtils.defineModuleGetter(this, "Services",
"resource://gre/modules/Services.jsm");
XPCOMUtils.defineLazyPreferenceGetter(this, "searchLoadInBackground",
"browser.search.context.loadInBackground");
XPCOMUtils.defineLazyGlobalGetters(this, ["fetch", "btoa"]);
var {
ExtensionError,
} = ExtensionUtils;
async function getDataURI(resourceURI) {
let response = await fetch(resourceURI);
let buffer = await response.arrayBuffer();
let contentType = response.headers.get("content-type");
let bytes = new Uint8Array(buffer);
let str = String.fromCharCode.apply(null, bytes);
return `data:${contentType};base64,${btoa(str)}`;
}
this.search = class extends ExtensionAPI {
getAPI(context) {
return {
search: {
async get() {
await searchInitialized;
let engines = Services.search.getEngines();
let visibleEngines = engines.filter(engine => !engine.hidden);
return Promise.all(visibleEngines.map(async engine => {
let favIconUrl;
if (engine.iconURI) {
if (engine.iconURI.schemeIs("resource") ||
engine.iconURI.schemeIs("chrome")) {
// Convert internal URLs to data URLs
favIconUrl = await getDataURI(engine.iconURI.spec);
} else {
favIconUrl = engine.iconURI.spec;
}
}
return {
name: engine.name,
isDefault: engine === Services.search.currentEngine,
alias: engine.alias || undefined,
favIconUrl,
};
}));
},
async search(searchProperties) {
await searchInitialized;
let engine;
if (searchProperties.engine) {
engine = Services.search.getEngineByName(searchProperties.engine);
if (!engine) {
throw new ExtensionError(`${searchProperties.engine} was not found`);
}
} else {
engine = Services.search.currentEngine;
}
let submission = engine.getSubmission(searchProperties.query, null, "webextension");
let options = {
postData: submission.postData,
triggeringPrincipal: context.principal,
};
if (searchProperties.tabId === null) {
let {gBrowser} = windowTracker.topWindow;
let nativeTab = gBrowser.addTab(submission.uri.spec, options);
if (!searchLoadInBackground) {
gBrowser.selectedTab = nativeTab;
}
} else {
let tab = tabTracker.getTab(searchProperties.tabId);
tab.linkedBrowser.loadURI(submission.uri.spec, options);
}
},
},
};
}
};