Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.

Commit 1eec33d

Browse files
committed
Bug 738818 part 1: replace originalDefaultEngine with defaultEngine and make defaultEngine a settable. r=gavin
1 parent 788f813 commit 1eec33d

12 files changed

Lines changed: 150 additions & 46 deletions

File tree

browser/base/content/test/browser_canonizeURL.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ var pairs = [
1717
["1.1.1.1", "http://1.1.1.1/"],
1818
["ftp://example", "ftp://example/"],
1919
["ftp.example.bar", "ftp://ftp.example.bar/"],
20-
["ex ample", Services.search.originalDefaultEngine.getSubmission("ex ample", null, "keyword").uri.spec],
20+
["ex ample", Services.search.defaultEngine.getSubmission("ex ample", null, "keyword").uri.spec],
2121
];
2222

2323
function testNext() {

browser/base/content/test/browser_keywordSearch.js

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,12 @@ var gTests = [
77
{
88
name: "normal search (search service)",
99
testText: "test search",
10-
searchURL: Services.search.originalDefaultEngine.getSubmission("test search", null, "keyword").uri.spec
10+
searchURL: Services.search.defaultEngine.getSubmission("test search", null, "keyword").uri.spec
1111
},
1212
{
1313
name: "?-prefixed search (search service)",
1414
testText: "? foo ",
15-
searchURL: Services.search.originalDefaultEngine.getSubmission("foo", null, "keyword").uri.spec
16-
},
17-
{
18-
name: "normal search (keyword.url)",
19-
testText: "test search",
20-
keywordURLPref: "http://example.com/?q=",
21-
searchURL: "http://example.com/?q=test+search"
22-
},
23-
{
24-
name: "?-prefixed search (keyword.url)",
25-
testText: "? foo ",
26-
keywordURLPref: "http://example.com/?q=",
27-
searchURL: "http://example.com/?q=foo"
28-
},
29-
{
30-
name: "encoding test (keyword.url)",
31-
testText: "test encoded+%/",
32-
keywordURLPref: "http://example.com/?q=",
33-
searchURL: "http://example.com/?q=test+encoded%2B%25%2F"
15+
searchURL: Services.search.defaultEngine.getSubmission("foo", null, "keyword").uri.spec
3416
}
3517
];
3618

browser/components/search/test/browser_google.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ function test() {
5757
let engine = Services.search.getEngineByName("Google");
5858
ok(engine, "Google");
5959

60-
is(Services.search.originalDefaultEngine, engine, "Check that Google is the default search engine");
60+
is(Services.search.defaultEngine, engine, "Check that Google is the default search engine");
6161

6262
let distributionID;
6363
try {

browser/modules/AboutHomeUtils.jsm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ this.AboutHomeUtils = {
2424
* search engine.
2525
*/
2626
XPCOMUtils.defineLazyGetter(AboutHomeUtils, "defaultSearchEngine", function() {
27-
let defaultEngine = Services.search.originalDefaultEngine;
27+
let defaultEngine = Services.search.defaultEngine;
2828
let submission = defaultEngine.getSubmission("_searchTerms_", null, "homepage");
2929
if (submission.postData) {
3030
throw new Error("Home page does not support POST search engines.");

docshell/base/nsDefaultURIFixup.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ NS_IMETHODIMP nsDefaultURIFixup::KeywordToURI(const nsACString& aKeyword,
364364
nsCOMPtr<nsIBrowserSearchService> searchSvc = do_GetService("@mozilla.org/browser/search-service;1");
365365
if (searchSvc) {
366366
nsCOMPtr<nsISearchEngine> defaultEngine;
367-
searchSvc->GetOriginalDefaultEngine(getter_AddRefs(defaultEngine));
367+
searchSvc->GetDefaultEngine(getter_AddRefs(defaultEngine));
368368
if (defaultEngine) {
369369
nsCOMPtr<nsISearchSubmission> submission;
370370
// We allow default search plugins to specify alternate

docshell/test/browser/browser_search_notification.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ function test() {
1111
Services.obs.removeObserver(observer, "keyword-search");
1212
is(topic, "keyword-search", "Got keyword-search notification");
1313

14-
let engine = Services.search.originalDefaultEngine;
14+
let engine = Services.search.defaultEngine;
1515
ok(engine, "Have default search engine.");
1616
is(engine.name, data, "Notification data is engine name.");
1717

mobile/android/chrome/content/browser.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5775,8 +5775,7 @@ var SearchEngines = {
57755775

57765776
getSuggestionEngine: function () {
57775777
let engines = [ Services.search.currentEngine,
5778-
Services.search.defaultEngine,
5779-
Services.search.originalDefaultEngine ];
5778+
Services.search.defaultEngine ];
57805779

57815780
for (let i = 0; i < engines.length; i++) {
57825781
let engine = engines[i];

netwerk/base/public/nsIBrowserSearchService.idl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ interface nsIBrowserSearchInitObserver : nsISupports
154154
void onInitComplete(in nsresult aStatus);
155155
};
156156

157-
[scriptable, uuid(a676eb70-6987-4429-a668-3e253b6f7c7c)]
157+
[scriptable, uuid(89beea9f-61a8-45d3-818d-b259f00195fe)]
158158
interface nsIBrowserSearchService : nsISupports
159159
{
160160
/**
@@ -330,20 +330,13 @@ interface nsIBrowserSearchService : nsISupports
330330
* The default search engine. Returns the first visible engine if the default
331331
* engine is hidden. May be null if there are no visible search engines.
332332
*/
333-
readonly attribute nsISearchEngine defaultEngine;
333+
attribute nsISearchEngine defaultEngine;
334334

335335
/**
336336
* The currently active search engine. May be null if there are no visible
337337
* search engines.
338338
*/
339339
attribute nsISearchEngine currentEngine;
340-
341-
/**
342-
* The original default engine. This differs from the "defaultEngine"
343-
* attribute in that it always returns a given build's default engine,
344-
* regardless of whether it is hidden.
345-
*/
346-
readonly attribute nsISearchEngine originalDefaultEngine;
347340
};
348341

349342
%{ C++
@@ -383,4 +376,11 @@ interface nsIBrowserSearchService : nsISupports
383376
*/
384377
#define SEARCH_ENGINE_CURRENT "engine-current";
385378

379+
/**
380+
* Sent when the "default" engine is changed.
381+
*/
382+
#define SEARCH_ENGINE_DEFAULT "engine-default";
383+
384+
385+
386386
%}

toolkit/components/search/nsSearchService.js

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ const SEARCH_ENGINE_ADDED = "engine-added";
5858
const SEARCH_ENGINE_CHANGED = "engine-changed";
5959
const SEARCH_ENGINE_LOADED = "engine-loaded";
6060
const SEARCH_ENGINE_CURRENT = "engine-current";
61+
const SEARCH_ENGINE_DEFAULT = "engine-default";
6162

6263
// The following constants are left undocumented in nsIBrowserSearchService.idl
6364
// For the moment, they are meant for testing/debugging purposes only.
@@ -3463,15 +3464,22 @@ SearchService.prototype = {
34633464
FAIL("no engine passed to removeEngine!");
34643465

34653466
var engineToRemove = null;
3466-
for (var e in this._engines)
3467+
for (var e in this._engines) {
34673468
if (aEngine.wrappedJSObject == this._engines[e])
34683469
engineToRemove = this._engines[e];
3470+
}
34693471

34703472
if (!engineToRemove)
34713473
FAIL("removeEngine: Can't find engine to remove!", Cr.NS_ERROR_FILE_NOT_FOUND);
34723474

3473-
if (engineToRemove == this.currentEngine)
3475+
if (engineToRemove == this.currentEngine) {
34743476
this._currentEngine = null;
3477+
}
3478+
3479+
if (engineToRemove == this.defaultEngine) {
3480+
this._defaultEngine = null;
3481+
Services.prefs.clearUserPref(BROWSER_SEARCH_PREF + "defaultenginename");
3482+
}
34753483

34763484
if (engineToRemove._readOnly) {
34773485
// Just hide it (the "hidden" setter will notify) and remove its alias to
@@ -3564,18 +3572,36 @@ SearchService.prototype = {
35643572
}
35653573
},
35663574

3567-
get originalDefaultEngine() {
3575+
get defaultEngine() {
35683576
this._ensureInitialized();
3569-
const defPref = BROWSER_SEARCH_PREF + "defaultenginename";
3570-
return this.getEngineByName(getLocalizedPref(defPref, ""));
3577+
if (!this._defaultEngine || this._defaultEngine.hidden) {
3578+
let defPref = BROWSER_SEARCH_PREF + "defaultenginename";
3579+
let defaultEngine = this.getEngineByName(getLocalizedPref(defPref, ""))
3580+
if (!defaultEngine || defaultEngine.hidden)
3581+
defaultEngine = this._getSortedEngines(false)[0] || null;
3582+
this._defaultEngine = defaultEngine;
3583+
}
3584+
return this._defaultEngine;
35713585
},
35723586

3573-
get defaultEngine() {
3587+
set defaultEngine(val) {
35743588
this._ensureInitialized();
3575-
let defaultEngine = this.originalDefaultEngine;
3576-
if (!defaultEngine || defaultEngine.hidden)
3577-
defaultEngine = this._getSortedEngines(false)[0] || null;
3578-
return defaultEngine;
3589+
if (!(val instanceof Ci.nsISearchEngine))
3590+
FAIL("Invalid argument passed to defaultEngine setter");
3591+
3592+
let newDefaultEngine = this.getEngineByName(val.name);
3593+
if (!newDefaultEngine)
3594+
FAIL("Can't find engine in store!", Cr.NS_ERROR_UNEXPECTED);
3595+
3596+
if (newDefaultEngine == this._defaultEngine)
3597+
return;
3598+
3599+
this._defaultEngine = newDefaultEngine;
3600+
3601+
let defPref = BROWSER_SEARCH_PREF + "defaultenginename";
3602+
setLocalizedPref(defPref, this._defaultEngine.name);
3603+
3604+
notifyAction(this._defaultEngine, SEARCH_ENGINE_DEFAULT);
35793605
},
35803606

35813607
get currentEngine() {
@@ -3590,6 +3616,7 @@ SearchService.prototype = {
35903616
this._currentEngine = this.defaultEngine;
35913617
return this._currentEngine;
35923618
},
3619+
35933620
set currentEngine(val) {
35943621
this._ensureInitialized();
35953622
if (!(val instanceof Ci.nsISearchEngine))
@@ -3599,6 +3626,9 @@ SearchService.prototype = {
35993626
if (!newCurrentEngine)
36003627
FAIL("Can't find engine in store!", Cr.NS_ERROR_UNEXPECTED);
36013628

3629+
if (newCurrentEngine == this._currentEngine)
3630+
return;
3631+
36023632
this._currentEngine = newCurrentEngine;
36033633

36043634
var currentEnginePref = BROWSER_SEARCH_PREF + "selectedEngine";
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
3+
<ShortName>A second test engine</ShortName>
4+
<Description>A second test search engine (based on DuckDuckGo)</Description>
5+
<InputEncoding>UTF-8</InputEncoding>
6+
<LongName>A second test search engine (based on DuckDuckGo)</LongName>
7+
<Image width="16" height="16">data:image/vnd.microsoft.icon;base64,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</Image>
8+
<Url type="text/html" method="get" template="https://duckduckgo.com/?q={searchTerms}"/>
9+
</OpenSearchDescription>

0 commit comments

Comments
 (0)