Test Pilot/Universal Search
Universal Search is a project to unify the search access points in Firefox and offer a deeper, more engaging search experience by making local results richer and by including results from the best of the web.
People to know
|Nick Chapman (irc: nchapman)
|Chuck Harmston (irc: chuck)
|Jared Hirsch (irc: _6a68)
The Universal Search project modifies the contents of the dropdown panel that is shown when you type in the urlbar.
We've implemented this in two different ways:
- The current focus is an add-on that inserts a server-generated recommendation above the existing results, using XUL for the UI.
- There is also an older add-on that replaces the entire results list with an iframe, using HTML5 for the UI.
Both add-ons generate recommended results using the same naive algorithm: given a search string, get search suggestions; send the top suggestion to a search engine; return the top search result to the user.
We switched from HTML to XUL mid-Q1 in response to changes in product's short-term (Q1 2016) roadmap. Rather than experiment with the layout and appearance of the UI, we are now simply inserting a single recommendation above the results list, in order to see if users like recommendations at all. When we get a longer-term roadmap, the iframe-based prototype might turn out to be the better choice for some or all future experiments.
- Add-on repo: https://github.com/mozilla/universal-search
- Recommendation server repo: https://github.com/mozilla/universal-search-recommendation
- Waffle board tracks work in progress: https://waffle.io/mozilla/universal-search
Older, inactive, iframe-based add-on:
- Add-on repo: https://github.com/mozilla/universal-search-addon
- iframe repo: https://github.com/mozilla/universal-search-content
- The older add-on does work, and can be downloaded from https://people.mozilla.org/~jhirsch/universal-search-addon.
XBL is the language used to modify the popup contents. XBL is a relic from the era of profound XML optimism, so code is written as XML data; and the documentation describes versions of the language that were never implemented, but no docs exist that describe how it actually works in Firefox. XBL shares the global window with JS, but has its own set of DOM bindings; you'll have to override XBL event handlers to hook into existing event-driven behavior, like key or mouse events, but you'll have fewer surprises if you actually handle the event in JS.
- XUL School contains a trustworthy intro to XBL.
- The main XBL docs are a mix of real, implemented XBL features, and never-implemented features. Fortunately, many pages have warning notes about which is which.
- The XBL binding docs and moz-binding MDN page are particularly important reading.
Existing Gecko Code
To understand how our prototype works, take a look at the code it modifies:
- autocomplete.xml (just the rich result popup)
- urlbarBindings.xml (just the rich result popup)
- Note that this controller is a UI controller written in C++. Our JS prototypes can't easily override this code, or get access to private members, so changing code in this file requires reimplementing in JS. Just another odd constraint to be aware of.
Reading this code will lead to older service and IDL definitions, most of which are in the toolkit/components/autocomplete (autocomplete code and places search) and toolkit/components/search (search suggestions) modules.