147

I have noticed that certain websites (e.g. Stack Exchange sites, Dell, etc.) are automatically added to my list of search engines in Google Chrome.

They even add a keyboard shortcut to their entry. Here are some examples:

  • Dell: Keyboard -> Dell.com
  • Stack Exchange Web masters: Keyboard -> webmasters.stackexchange.com
  • Reuters: Keyboard -> reuters.com

Q1: Is this the default behavior in Chrome? (to let websites add themselves to the list of search engines?)

Q2: Is it possible to disable this behavior in Chrome?

Note: I'm running the latest version of Chrome: 11.0.696.57 on Windows 7 64, and I only have one extension installed: Google URL shortener.

7
  • 35
    @ Sathya, Why? I want to have the flexibility to disable it. If your question is why would I disable something like this: the interface to edit search engines is not particularly good, and as the list grows it's hard tell which search engines I added manually and which ones were added automatically. It's also harder to find a particular entry within a large list. Apr 27, 2011 at 17:41
  • 18
    @Sathya - Many reasons: * Convenience: Sometimes you want to search ABOUT a site, rather than ON that site. * Consistency: Randomly and silently adding new "search engines" causes unexpected behavior in the omnibox. * Privacy: Chrome does not inform you when it decides to add new "search engines," and they don't go away when you clear your browsing history. * Common courtesy: Shouldn't I be able to choose whether to enable this "feature" is enabled, or—failing that—at least choose to be informed when Chrome decides to add a site, so I can countermand this decision?
    – phenry
    Oct 28, 2011 at 17:43
  • 2
    It seems like I am not worthy of deciding myself which search engines my browser should be aware of. Mar 1, 2019 at 10:14
  • 1
    There is a bug report on the Chromium tracker here: bugs.chromium.org/p/chromium/issues/detail?id=750534
    – Mike Hill
    Feb 23, 2021 at 16:28
  • 1
    I have given up, and just changed keyword to some random string, so the search engine will not be tiggered
    – prime23
    Feb 24, 2021 at 2:47

14 Answers 14

48

Thanks to @10basetom's code and inspired by @shthed, I've released the Don't add custom search engines Chrome extension which does just that.

You'll find the source code here.

Let me know what you think!

10
  • 1
    @O'Rooney Thank you! I see some sites slip by the extension from time to time, but it's much better cleaning out a few search engines in a month than having to do an almost complete weekly "purge"... Cheers! Jul 14, 2016 at 14:04
  • 5
    Does not actually work anymore: a lot of custom search engines still end up being added.
    – onnodb
    Dec 3, 2017 at 19:11
  • 1
    @onnodb thanks for the note, I have unfortunately not had enough time to update the extension. Dec 7, 2017 at 11:00
  • 1
    @onnodb, Greg, would you (or any others interested) please try out this fork? Check out, then load .../src as an unpacked extension. Let me know how it goes. Thanks!
    – cxw
    Mar 7, 2018 at 18:49
  • 3
    Small note that the extension has just been updated with a much improved detection/blocking algorithm, thanks to many efforts from a number of contributors! Give it a ago if it was not working well for you earlier. Cheers Mar 19, 2018 at 19:04
69

This was making me absolutely insane, so I found a hackish, but effective solution to the issue.

Chrome stores it's search engines in a simple sqlite3 database. I found that you can create a trigger when chrome goes to add the search engine that causes the database insert statement to be ignored.
Note that the search engines are still kept in memory, so they will still show up in the list until the browser is restarted. However you wont have to clear them out all the time, and so if you want to add your own search engines, you won't have to worry about accidentally deleting them (yes, manually adding search engines will still work).

First you must locate the Web data file.

  • Mac OS X: ~/Library/Application Support/Google/Chrome/Default/Web Data

  • XP: C:\Documents and Settings\<username>\Local Settings\Application Data\Google\Chrome\User Data\Default\Web Data

  • Vista/7: C:\Users\<username>\AppData\Local\Google\Chrome\User Data\Default\Web Data

  • Linux: ~/.config/google-chrome/Default/Web Data or ~/.config/chromium/Default/Web Data

Then open it with an sqlite3 editor.

Chrome must be shut down at this point.

The official sqlite web site has a download page with a pre-compiled command line utility for the various operating systems. Though any editor capable of working with sqlite3 databases will work.

For the command line utility, use a command such as the following (don't forget to escape or quote the space in the file name):

sqlite3 /path/to/Web\ Data

Add the trigger.

CREATE TRIGGER no_auto_keywords BEFORE INSERT ON keywords WHEN (NEW.originating_url IS NOT NULL AND NEW.originating_url != '') BEGIN SELECT RAISE(IGNORE); END;

You're done. Close the editor and start chrome back up.


The way it works is that when chrome goes to add auto-add a search engine to the keywords table, chrome sets the originating_url field to the web site it came from. The trigger basically looks for any inserts with a non-empty originating_url field, and issues a RAISE(IGNORE) which causes the statement to be silently skipped.
Manually added search engines don't have an originating_url, and so the trigger allows them to be added.

11
  • 2
    After trying a few editors out, SQLiteStudio my favorite. No way am I related to this product. Just a useful tool I found after some searching.
    – mateuscb
    Mar 14, 2014 at 21:55
  • 1
    This is great and it works. However, for me, Chrome still added search engines, not in the database, but in another folder, "Sync Data Backup". Disable write permissions for that folder in Windows/Linux and it will be gone for good. Sep 13, 2014 at 10:01
  • This doesn't appear to work anymore, at least in Chrome v47beta. After restarting Chrome, the auto-added search engine is still in the list, although typing the keyword doesn't trigger it anymore.
    – thdoan
    Nov 6, 2015 at 3:34
  • FYI: 1/ make a copy of this file first in case you mess it up :) 2/ on Mac 10.11.4 (El Capitan) I was unable to open the file/database with sqlitebrowser.app ("Error: unable to open database "~/Library/Application Support/Google/Chrome/Default/Web Data": unable to open database file). 3/ if you try and run the CREATE TRIGGER command whilst Chrome is open, you get Error: database is locked so exit Chrome first. 4/ once Chrome was closed, this opened the database successfully worked: /Volumes/Macintosh\ HD/Applications/sqlite3 ./Web\ Data (in Terminal, when in specified directory) HTH
    – sming
    Apr 7, 2016 at 12:26
  • I tried delete from keywords where id > 2; and google just syncs them back from server. I guess it's too late after I already have thousands of searchengines installed.
    – Qi Fan
    Oct 18, 2016 at 22:58
38

There are two ways to do this:

  1. Add this userscript to Tamper Monkey:

    var elOpenSearch = document.querySelector('[type="application/opensearchdescription+xml"]');
    if (elOpenSearch) elOpenSearch.remove();
    
  2. If you're not a regular Tamper Monkey user and don't feel like wasting 15-20 MB of RAM just to load the Tamper Monkey extension for this purpose, then you can roll your own super lightweight extension that won't consume any memory. Instructions are provided below.

How to create your own extension to remove the OpenSearch <link> tag and prevent Chrome from auto-adding search engines:

  1. Create a folder where you will be putting the extension files.

  2. Inside this folder, create two text files named manifest.json and content.js containing the code provided below.

    manifest.json

    {
      "manifest_version": 2,
      "name": "Disable OpenSearch",
      "version": "1.0.0",
      "description": "Remove the OpenSearch <link> tag to prevent Google Chrome from auto-adding custom search engines.",
      "content_scripts": [
        {
          "matches": ["<all_urls>"],
          "js": ["content.js"]
        }
      ],
      "permissions": [
        "http://*/*",
        "https://*/*"
      ]
    }
    

    content.js

    var elOpenSearch = document.querySelector('[type="application/opensearchdescription+xml"]');
    if (elOpenSearch) elOpenSearch.remove();
    
  3. In Chrome, go to chrome://extensions/ (enter this into the URL bar).

  4. Enable Developer Mode.

  5. Click on 'Load unpacked extension', select the folder you created in step 1, and click 'OK'.

Congratulations! Now Google Chrome should be a little less annoying to use :-).

Limitation: This solution is not 100% reliable. If you go to a URL that contains a search parameter (e.g., https://cdnjs.com/#q=fastclick), then in rare cases a custom search engine will still be added. I suspect this is because Chrome can parse the OpenSearch <link> tag before the userscript or extension has a chance to remove it from the DOM.

5
  • 2
    I'm surprised nobody has posted this as an official extension to the store, seems like it would be popular. Ideally I'd like an extension to ask me before adding a search engine, or have an icon in the address bar that lets me add it, just like RSS feeds.
    – ryanmonk
    Feb 21, 2016 at 4:27
  • 7
    Thanks for the great code and @shthed thanks for the inspiration! I've just released a Google Chrome Extension which does just that. You can find it here. Source code here. Let me know what you think! :-) Mar 31, 2016 at 18:03
  • @GregSadetsky Post this as an answer and we could vote for it :)
    – O'Rooney
    Jul 12, 2016 at 4:51
  • This works fine when I just visit the site (for example go to superuser.com), but when I use the search bar (for example the one on top of the page here on Super User), it still adds the search engine. Jun 19, 2020 at 22:06
  • To disable it even when you use the search bar on Stack Exchange sites, you need to change the method of the search bar to POST by adding this code: if(/stackoverflow|stackexchange|superuser|serverfault/i.test(location.hostname)){var searchBar = document.querySelector('form[role="search"][method="get"]'); if(searchBar) searchBar.method = "post";} I limited it to Stack Exchange sites because I've tested it here so I know it works, but it might cause search to stop working on certain other sites. Jun 19, 2020 at 22:07
28
  1. Yes, this is by design.
  2. No, there's no way to disable this.
4
  • 15
    Yet there are ways to disable it, as other answers explain :)
    – Enrico
    Mar 11, 2017 at 14:25
  • 7
    "Yes, this is by design." It's a poor and improper design to automatically add things to a system without the users input on the matter. Malicious websites could easily take advantage of this. "No, there's no way to disable this." Obviously there is, when it is software, there is always a way. Being lazy and saying there isn't, is not a solution. This answer should be removed, and the writer warned. Sep 26, 2017 at 23:18
  • My custom search engine lost after a cache clear. I have opened some sites for hours but these engines didn't go back. Do you know how to get them back ?(I don't want to add them manually, too many )
    – Mithril
    Jan 22, 2019 at 1:52
  • this wrong answer gets upvoted. Shouldn't it be deleted, or edited to correct it? Mar 10, 2019 at 2:02
11

Here a somewhat hacky workaround which works just fine for me. Just rename the search alias to something cryptic like "§$%!/()&/". While the search engine is still there you won't see it again, ever. Pretty annoying if you can't google for "jenkins" because chrome forces you to search in jenkins.

5
  • 2
    It does this to me for jenkins, jira, and confluence - It drives me absolutely crazy that I can not initiate a general search from my address bar for anything related to these three. This, is by far the best and only working workaround I have seen. Cheers.
    – Matt Clark
    Aug 4, 2015 at 22:35
  • 1
    @MattClark jira exactly! I want to search about jira, not in it!
    – ErikE
    Sep 23, 2015 at 18:22
  • How is it behaving in your case? For me, to trigger the search on site, I have to type its keyword into omnibar a press Tab. Then it changes into the on site search and I can continue to type the search string. If I want to search just the keyword or a string containing the keyword, I type the keyword, Space, rest of the search string and Enter and I'm searching using the default search engine. So it doesn't interfere with each other. Just use the Space after the keyword to search using the default search engine and the Tab to search on site. Dec 12, 2016 at 16:37
  • @DawidFerenczy: That's not how it works for the rest of us. A space still uses that search engine. I type in git, then a space and it instantly changes to use git's search engine (which I've removed countless times).
    – Gerrat
    Apr 24, 2017 at 18:30
  • 1
    If you start your search with a ? then it will search Google by default. For example ?jira or ?jenkins. Apr 16, 2018 at 14:01
11

Edit: this no longer works in Chrome version 84 and upwards

To quickly remove large numbers of search engines, browse to chrome://settings/searchEngines, hit Ctrl-Shift-J (Opt-Cmd-J on OSX) to enter the Javascript console, and paste this:

settings
    .SearchEnginesBrowserProxyImpl
    .prototype
    .getSearchEnginesList()
    .then(function (val) {
        val.others.sort(function (a, b) { return b.modelIndex - a.modelIndex; });
        val.others.forEach(function (engine) {
            settings
                .SearchEnginesBrowserProxyImpl
                .prototype
                .removeSearchEngine(engine.modelIndex);
        });
    });

You may need to paste and run this a few times to clear everything.

5
  • I had to copy/paste this about 10 times into the dev-console to remove the 100+ entries I had. Wish I knew how to turn it into a single-click bookmarklet.
    – jiggunjer
    Sep 7, 2017 at 8:31
  • 1
    I modified it to sort the list in reverse first (based on modelIndex), since its value gets reset each time an entry gets deleted (so you usually end up deleting around half of the current list only) when working from top to bottom. When working from bottom to top, this issue does not occur.
    – alcohol
    Nov 7, 2017 at 15:10
  • First one I saw that can do this in one run! Kudos.
    – bnieland
    Dec 22, 2017 at 14:37
  • Worked in one run on my Windows 10, version 1709 installation of Chrome Version 64.0.3282.186 (Official Build) (64-bit).
    – joharr
    Mar 2, 2018 at 5:53
  • I was hoping this would work on Brave (Version 1.14.84 Chromium: 85.0.4183.121 (Official Build) (64-bit)) but it did not. It didn't work with Windows Chrome Version 85.0.4183.121 (Official Build) (64-bit) either.
    – Ryan
    Oct 7, 2020 at 14:16
8

If I'm understanding what you're describing correctly, then this isn't the websites doing anything at all. Rather, Chrome itself identifies search boxes on websites and then itself adds those to its list of search options in the omnibar.

A1: Yes, this is default behavior, but it's not the websites adding themselves, it's Chrome adding the websites.

A2: I do not believe you can disable this behavior, however you can remove search engines by going to the tool menu -> Options -> Manage Search Engines; they will appear under "Other Search Engines". You may be able to specify that one should not be re-added when you remove it, I'm not sure -- I happen to like this feature, so I'm not going to try removing them.

3
  • Thanks @Kromey, That's a good point. I just updated the question to reflect your comment. Apr 27, 2011 at 17:49
  • 2
    This answer is incorrect, websites do effectively add themselves to Chrome as they use what is called an OpenSearch description document to enable Chrome to add their website's search engine to Chrome's list of search engines your browser can interface with.
    – Marcel
    Jun 11, 2015 at 12:01
  • @Marcel OpenSearch merely lets sites describe their search feature. It still requires the browser to act upon that. Therefore this is not incorrect, I just didn't include the technical spec that's being used to "...[identify] search boxes on websites..." in my answer, as I felt it would have complicated an otherwise-simple matter -- the exact mechanism of how the browser finds a search box isn't relevant to the average user, only to webmasters who want theirs to be added.
    – Kromey
    Jun 11, 2015 at 16:35
8

Try using this simple userscript:

// ==UserScript==
// @name       Block Opensearch XML specs
// @namespace  *
// @version    0.3
// @description  Block opensearch xml links
// @match      *
// @copyright  2012+, Christian Huang
// ==/UserScript==

var i;
var val;
var len;
var opensearches;

opensearches = document.getElementsByTagName('link');
len = opensearches.length;
for (i = 0; i < len;i++) {
    val = opensearches[i].type;
    if ( val == "application/opensearchdescription+xml") {
        opensearches[i].parentNode.removeChild(opensearches[i]);
    }
}
6
  • 2
    where do add this script? or execute it?
    – mateuscb
    Mar 14, 2014 at 21:23
  • 2
    @mateuscb You can get it from here. Then just drop the script in the extensions settings page in chrome, chrome://extensions/. May 14, 2014 at 14:39
  • This. Is. Awesome. I needed to create a dummy manifest.json (as per this SO answer and install it via dev mode (as an unpacked extension), but apart from that it worked like a treat.
    – womble
    Jun 11, 2014 at 5:58
  • 1
    Or, you can use it in Tamper Monkey. If you're used to making modifications to websites, TM should be a must-have addon.
    – JasonXA
    Dec 28, 2014 at 17:19
  • You can also use this one-liner: document.querySelector('[type="application/opensearchdescription+xml"]').remove(); (see my answer below).
    – thdoan
    Nov 6, 2015 at 6:12
7

One workaround I've found for this is to acquire the habit of starting all my searches with a space. If you type ・Splunk median (where represents the space character), Chrome will perform a Google search on Splunk median.

3
  • 2
    Starting the search with a question mark (?) will also use your default search engine.
    – Ari
    May 30, 2014 at 2:07
  • 1
    For me it didn't work. On Chrome 39, Win 7, typing spacekeyword didn't bring up the search interface. However, your solution was useful elsewhere, in naming. If I want my defined searches to appear on top of the automated ones, one space in front of the name and presto. All automated search engines go below and now it's easier to manage / remove them.
    – JasonXA
    Dec 28, 2014 at 17:21
  • just press ctrl+k to get that behavior.
    – jiggunjer
    Sep 7, 2017 at 8:25
6

<-- Background -->

I have an alternate, less-intrusive idea for you here (at least if you're running an ad blocker, as so many of us are for our own sanity/safety). I like using existing extensions/scripts as much as possible to avoid the bloat of a whole extension for just one feature (worst-case scenario) so this solution works under this principle.

Adblock, and its variants/successors (uBlock is my weapon of choice), have the ability to block web page elements, including <link> elements, which is used for autodiscovery of OpenSearch Descriptions (OSDs), the XML files that contain the information which permits auto-adding search engines and causes us these headaches. I say "permits" because it's hardly mandatory, as, so far as my research has shown, Firefox simply reads this information and makes it available for easy addition under the Search Engines dropdown box, rather than quietly auto-adding it like Chrome does.

The use of the feature is described in the Opensearch specifications in multiple places:

http://www.opensearch.org/Specifications/OpenSearch/1.1#Autodiscovery_in_RSS.2FAtom (ignore the specific subtltle of this section for our purposes as it's just an example of it in use)


<-- The Solution -->

As it states that OpenSearch Descriptions (OSDs) have a unique type, we can filter them out with the following AdblockPlus/uBlock rule:

##link[type="application/opensearchdescription+xml"]

I've tested this and the rule shows the correct match on my test sites (filehippo.com etc) and the search engines are no longer auto-adding, so I believe this is a full solution.


A quick note on the history I've found behind this: Chromium's engineers have labeled this "WontFix" several times over the years (a power-user disable option/flag was requested multiple times) stating that this is considered a niche issue since the feature is "generally useful", their stance is that niche issues should be solved by extensions or 3rd-party scripts rather than by the devs adding countless flags and the like to cater to all whims, so basically what we're doing here is just in line with their preference and keeps it nice and manageable.

Best of luck! If anyone else tries this let us/me know how it works!

2
  • 1
    This didn't work for me (try searching on cdnjs.com). I've come to the conclusion that there is no 100% reliable solution :(
    – thdoan
    Nov 6, 2015 at 3:46
  • This isn't working for me either - if I search on 4inkjets.com it gets added as a search engine (strangely, I cannot find a application/opensearchdescription+xml link on the page.)
    – Ivan Kozik
    Sep 26, 2017 at 23:58
4
  1. Go to chrome://settings/searchEngines
  2. Open the Developer Tools
  3. Run the following in the Javascript console tab
const otherEngines = document.querySelector("body > settings-ui")
                    .shadowRoot.querySelector("#main")
                    .shadowRoot.querySelector("settings-basic-page")
                    .shadowRoot.querySelector("#basicPage > settings-section.expanded > settings-search-page")
                    .shadowRoot.querySelector("#pages > settings-subpage > settings-search-engines-page")
                    .shadowRoot.querySelector("#otherEngines").shadowRoot

let n = otherEngines.querySelector('iron-list').childElementCount - 1;
let rmbtn = otherEngines.querySelector('#frb0')
                        .shadowRoot.querySelector('#delete')

const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));

while(n--) {
    rmbtn.click();
    await sleep(2000);
}

Adjust the sleep duration between clicks as you see fit.

1

Based on the javascript provided by others, I have created my own hackish script to remove all custom search engines in the list except any that you have nicknamed with the text "(KEEP)".

var engineList=document.querySelector("body > settings-ui").shadowRoot.querySelector("#main").shadowRoot.querySelector("settings-basic-page").shadowRoot.querySelector("#basicPage > settings-section.expanded > settings-search-page").shadowRoot.querySelector("#pages > settings-subpage > settings-search-engines-page").shadowRoot.querySelector("#otherEngines")
function get_engines_list() {
    return engineList.shadowRoot.querySelector("#container").children[0].children;
}
function get_engine_count(){
    // "Templates" is first entry.
    return get_engines_list().length - 1;
}
var i;
for (i = 1; i <= get_engine_count(); i++) {
    var entry=get_engines_list()[i]
    var engineName = entry.shadowRoot.querySelector('.list-item').querySelector('#name-column').childNodes[1].innerText;
    if(!engineName.includes("(KEEP)")){
        entry.shadowRoot.querySelector("#delete").click();
    }
}
0

I can Confirm that Mahmoud K's answer from May 1, 2020 Works as of today's latest release (Version 89.0.4389.90 Windows 10 1909).

I had to run 4-5 times since it stalled out. s I had to search and find an answer how to handle the 1st stall. This post shows how to pause a script, and then stumbled about the answer of stopping. See this post's picture stackoverflow.com/a/51802310/14947713 In the current version of come there is small arrow on that pause button that shows a Start and Stop symbol. I also had to reload the Settings page twice as I was figuring out how to use the script

Sorry I was unable to comment, but I thought it best to let others know who were search as it was difficult hunting to find this answer among the many prior SU.com questions

Be fore-warned, it seems I actually saw an increase in the Search Engines in the first couple of runs but think I saw removal activity, I am assuming it may have just been loading off-display entries, so just be patent and follow-through

Mahmoud K.'s Code here, but I changed to as low as 200ms on the final run and plan to go lower if need be in the future, as he notes :

const otherEngines = document.querySelector("body > settings-ui")
                    .shadowRoot.querySelector("#main")
                    .shadowRoot.querySelector("settings-basic-page")
                    .shadowRoot.querySelector("#basicPage > settings-section.expanded > settings-search-page")
                    .shadowRoot.querySelector("#pages > settings-subpage > settings-search-engines-page")
                    .shadowRoot.querySelector("#otherEngines").shadowRoot

let n = otherEngines.querySelector('iron-list').childElementCount - 1;
let rmbtn = otherEngines.querySelector('#frb0')
                        .shadowRoot.querySelector('#delete')

const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));

while(n--) {
    rmbtn.click();
    await sleep(200);
}
0

I deleted all other search engines as follow.

  1. Go to the engine (link)
  2. Then hit ctrl + shift + j
  3. Then use paste the following code:
for (let i of document.querySelector("body > settings-ui")
     .shadowRoot.querySelector('#main')
     .shadowRoot.querySelector("settings-basic-page")
     .shadowRoot.querySelector("#basicPage > settings-section.expanded > settings-search-page")
     .shadowRoot.querySelector("#pages > settings-subpage > settings-search-engines-page")
     .shadowRoot.querySelector("#otherEngines")
     .shadowRoot.querySelectorAll(":scope settings-search-engine-entry"))
     {
         console.log(i);
         i.shadowRoot.querySelector("#delete").click();
     }

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .