forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			278 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			278 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| =============================================
 | |
| Directory Links Architecture and Data Formats
 | |
| =============================================
 | |
| 
 | |
| Directory links are enhancements to the new tab experience that combine content
 | |
| Firefox already knows about from user browsing with external content. There are
 | |
| 3 kinds of links:
 | |
| 
 | |
| - directory links fill in additional tiles on the new tab page if there would
 | |
|   have been empty tiles because the user has a clean profile or cleared history
 | |
| - suggested links are shown if certain triggering criteria matches the user's
 | |
|   browsing behavior, i.e., if the user has a top site that matches one of
 | |
|   several possible sites. E.g., only show a sports suggestion if the user has a
 | |
|   sport site as a top site
 | |
| - enhanced links replace a matching user's visible history tile from the same
 | |
|   site but only the visual aspects: title, image, and rollover image
 | |
| 
 | |
| To power the above features, DirectoryLinksProvider module downloads, at most
 | |
| once per 24 hours, the directory source links as JSON with enough data for
 | |
| Firefox to determine what should be shown or not. This module also handles
 | |
| reporting back data about the tiles via asynchronous pings that don't return
 | |
| data from the server.
 | |
| 
 | |
| For the directory source and ping endpoints, the default preference values point
 | |
| to Mozilla key-pinned servers with encryption. No cookies are set by the servers
 | |
| and Firefox enforces this by making anonymous requests.
 | |
| 
 | |
| - default directory source endpoint:
 | |
|   https://tiles.services.mozilla.com/v3/links/fetch/%LOCALE%/%CHANNEL%
 | |
| - default directory ping endpoint: https://tiles.services.mozilla.com/v3/links/
 | |
| 
 | |
| 
 | |
| Preferences
 | |
| ===========
 | |
| 
 | |
| There are two main preferences that control downloading links and reporting
 | |
| metrics.
 | |
| 
 | |
| ``browser.newtabpage.directory.source``
 | |
| ---------------------------------------
 | |
| 
 | |
| This endpoint tells Firefox where to download directory source file as a GET
 | |
| request. It should return JSON of the appropriate format containing the relevant
 | |
| links data. The value can be a data URI, e.g., an empty JSON object effectively
 | |
| turns off remote downloading: ``data:text/plain,{}``
 | |
| 
 | |
| The preference value will have %LOCALE% and %CHANNEL% replaced by the
 | |
| appropriate values for the build of Firefox, e.g.,
 | |
| 
 | |
| - directory source endpoint:
 | |
|   https://tiles.services.mozilla.com/v3/links/fetch/en-US/release
 | |
| 
 | |
| ``browser.newtabpage.directory.ping``
 | |
| -------------------------------------
 | |
| 
 | |
| This endpoint tells Firefox where to report Tiles metrics as a POST request. The
 | |
| data is sent as a JSON blob. Setting it to empty effectively turns off reporting
 | |
| of Tiles data.
 | |
| 
 | |
| A path segment will be appended to the endpoint of "view" or "click" depending
 | |
| on the type of ping, e.g.,
 | |
| 
 | |
| - ``view`` ping endpoint: https://tiles.services.mozilla.com/v3/links/view
 | |
| - ``click`` ping endpoint: https://tiles.services.mozilla.com/v3/links/click
 | |
| 
 | |
| 
 | |
| Data Flow
 | |
| =========
 | |
| 
 | |
| When Firefox starts, it checks for a cached directory source file. If one
 | |
| exists, it checks for its timestamp to determine if a new file should be
 | |
| downloaded.
 | |
| 
 | |
| If a directory source file needs to be downloaded, a GET request is made then
 | |
| cacheed and unpacked the JSON into the different types of links. Various checks
 | |
| filter out invalid links, e.g., those with http-hosted images or those that
 | |
| don't fit the allowed suggestions.
 | |
| 
 | |
| When a new tab page is built, DirectoryLinksProvider module provides additional
 | |
| link data that is combined with history link data to determine which links can
 | |
| be displayed or not.
 | |
| 
 | |
| When a new tab page is shown, a ``view`` ping is sent with relevant tiles data.
 | |
| Similarly, when the user clicks on various parts of tiles (to load the page,
 | |
| pin, block, etc.), a ``click`` ping is sent with similar data. Both of these can
 | |
| trigger downloading of fresh directory source links if 24 hours have elapsed
 | |
| since last download.
 | |
| 
 | |
| Users can turn off the ping with in-new-tab-page controls.
 | |
| 
 | |
| As the new tab page is rendered, any images for tiles are downloaded if not
 | |
| already cached. The default servers hosting the images are Mozilla CDN that
 | |
| don't use cookies: https://tiles.cdn.mozilla.net/ and Firefox enforces that the
 | |
| images come from mozilla.net or data URIs when using the default directory
 | |
| source.
 | |
| 
 | |
| 
 | |
| Source JSON Format
 | |
| ==================
 | |
| 
 | |
| Firefox expects links data in a JSON object with top level keys each providing
 | |
| an array of tile objects. The keys correspond to the different types of links:
 | |
| ``directory``, ``suggested``, and ``enhanced``.
 | |
| 
 | |
| Example
 | |
| -------
 | |
| 
 | |
| Below is an example directory source file::
 | |
| 
 | |
|   {
 | |
|       "directory": [
 | |
|           {
 | |
|               "bgColor": "",
 | |
|               "directoryId": 498,
 | |
|               "enhancedImageURI": "https://tiles.cdn.mozilla.net/images/d11ba0b3095bb19d8092cd29be9cbb9e197671ea.28088.png",
 | |
|               "imageURI": "https://tiles.cdn.mozilla.net/images/1332a68badf11e3f7f69bf7364e79c0a7e2753bc.5316.png",
 | |
|               "title": "Mozilla Community",
 | |
|               "type": "affiliate",
 | |
|               "url": "http://contribute.mozilla.org/"
 | |
|           }
 | |
|       ],
 | |
|       "enhanced": [
 | |
|           {
 | |
|               "bgColor": "",
 | |
|               "directoryId": 776,
 | |
|               "enhancedImageURI": "https://tiles.cdn.mozilla.net/images/44a14fc405cebc299ead86514dff0e3735c8cf65.10814.png",
 | |
|               "imageURI": "https://tiles.cdn.mozilla.net/images/20e24aa2219ec7542cc8cf0fd79f0c81e16ebeac.11859.png",
 | |
|               "title": "TurboTax",
 | |
|               "type": "sponsored",
 | |
|               "url": "https://turbotax.intuit.com/"
 | |
|           }
 | |
|       ],
 | |
|       "suggested": [
 | |
|           {
 | |
|               "adgroup_name": "open-source browser",
 | |
|               "bgColor": "#cae1f4",
 | |
|               "check_inadjacency": true,
 | |
|               "directoryId": 702,
 | |
|               "explanation": "Suggested for %1$S enthusiasts who visit sites like %2$S",
 | |
|               "frecent_sites": [
 | |
|                   "addons.mozilla.org",
 | |
|                   "air.mozilla.org",
 | |
|                   "blog.mozilla.org",
 | |
|                   "bugzilla.mozilla.org",
 | |
|                   "developer.mozilla.org",
 | |
|                   "etherpad.mozilla.org",
 | |
|                   "hacks.mozilla.org",
 | |
|                   "hg.mozilla.org",
 | |
|                   "mozilla.org",
 | |
|                   "planet.mozilla.org",
 | |
|                   "quality.mozilla.org",
 | |
|                   "support.mozilla.org",
 | |
|                   "treeherder.mozilla.org",
 | |
|                   "wiki.mozilla.org"
 | |
|               ],
 | |
|               "frequency_caps": {"daily": 3, "total": 10},
 | |
|               "imageURI": "https://tiles.cdn.mozilla.net/images/9ee2b265678f2775de2e4bf680df600b502e6038.3875.png",
 | |
|               "time_limits": {"start": "2014-01-01T00:00:00.000Z", "end": "2014-02-01T00:00:00.000Z"},
 | |
|               "title": "Thanks for testing!",
 | |
|               "type": "affiliate",
 | |
|               "url": "https://www.mozilla.com/firefox/tiles"
 | |
|           }
 | |
|       ]
 | |
|   }
 | |
| 
 | |
| Link Object
 | |
| -----------
 | |
| 
 | |
| Each link object has various values that Firefox uses to display a tile:
 | |
| 
 | |
| - ``url`` - string url for the page to be loaded when the tile is clicked. Only
 | |
|   https and http URLs are allowed.
 | |
| - ``title`` - string that appears below the tile.
 | |
| - ``type`` - string relationship of the link to Mozilla. Expected values:
 | |
|   affiliate, organic, sponsored.
 | |
| - ``imageURI`` - string url for the tile image to show. Only https and data URIs
 | |
|   are allowed.
 | |
| - ``enhancedImageURI`` - string url for the image to be shown before the user
 | |
|   hovers. Only https and data URIs are allowed.
 | |
| - ``bgColor`` - string css color for additional fill background color.
 | |
| - ``directoryId`` - id of the tile to be used during ping reporting
 | |
| 
 | |
| Suggested Link Object Extras
 | |
| ----------------------------
 | |
| 
 | |
| A suggested link has additional values:
 | |
| 
 | |
| - ``adgroup_name`` - string to override the hardcoded display name of the
 | |
|   triggering set of sites in Firefox.
 | |
| - ``check_inadjacency`` - boolean if true prevents the suggested link from being
 | |
|   shown if the new tab page is showing a site from an inadjacency list.
 | |
| - ``explanation`` - string to override the default explanation that appears
 | |
|   below a Suggested Tile. %1$S is replaced by the triggering adgroup name and
 | |
|   %2$S is replaced by the triggering site.
 | |
| - ``frecent_sites`` - array of strings of the sites that can trigger showing a
 | |
|   Suggested Tile if the user has the site in one of the top 100 most-frecent
 | |
|   pages.
 | |
| - ``frequency_caps`` - an object consisting of daily and total frequency caps
 | |
|   that limit the number of times a Suggested Tile can be shown in the new tab
 | |
|   per day and overall.
 | |
| - ``time_limits`` - an object consisting of start and end timestamps specifying
 | |
|   when a Suggested Tile may start and has to stop showing in the newtab.
 | |
|   The timestamp is expected in ISO_8601 format: '2014-01-10T20:00:00.000Z'
 | |
| 
 | |
| The inadjacency list is packaged with Firefox as base64-encoded 1-way-hashed
 | |
| sites that tend to have adult, gambling, alcohol, drug, and similar content.
 | |
| Its location: chrome://browser/content/newtab/newTab.inadjacent.json
 | |
| 
 | |
| The preapproved arrays follow a policy for determining what topic grouping is
 | |
| allowed as well as the composition of a grouping. The topics are broad
 | |
| uncontroversial categories, e.g., Mobile Phone, News, Technology, Video Game,
 | |
| Web Development. There are at least 5 sites within a grouping, and as many
 | |
| popular sites relevant to the topic are included to avoid having one site be
 | |
| clearly dominant. These requirements provide some deniability of which site
 | |
| actually triggered a suggestion during ping reporting, so it's more difficult to
 | |
| determine if a user has gone to a specific site.
 | |
| 
 | |
| 
 | |
| Ping JSON Format
 | |
| ================
 | |
| 
 | |
| Firefox reports back an action and the state of tiles on the new tab page based
 | |
| on the user opening a new tab or clicking a tile. The top level keys of the
 | |
| ping:
 | |
| 
 | |
| - ``locale`` - string locale of the Firefox build
 | |
| - ``tiles`` - array of tiles ping objects
 | |
| 
 | |
| An additional key at the top level indicates which action triggered the ping.
 | |
| The value associated to the action key is the 0-based index into the tiles array
 | |
| of which tile triggered the action. Valid actions: block, click, pin, sponsored,
 | |
| sponsored_link, unpin, view. E.g., if the second tile is being clicked, the ping
 | |
| will have ``"click": 1``
 | |
| 
 | |
| Example
 | |
| -------
 | |
| 
 | |
| Below is an example ``click`` ping with 3 tiles: a pinned suggested tile
 | |
| followed by a history tile and a directory tile. The first tile is being
 | |
| blocked::
 | |
| 
 | |
|   {
 | |
|       "locale": "en-US",
 | |
|       "tiles": [
 | |
|           {
 | |
|               "id": 702,
 | |
|               "pin": 1,
 | |
|               "past_impressions": {"total": 5, "daily": 1},
 | |
|           },
 | |
|           {},
 | |
|           {
 | |
|               "id": 498,
 | |
|           }
 | |
|       ],
 | |
|       "block": 0
 | |
|   }
 | |
| 
 | |
| Tiles Ping Object
 | |
| -----------------
 | |
| 
 | |
| Each tile of the new tab page is reported back as part of the ping with some or
 | |
| none of the following optional values:
 | |
| 
 | |
| - ``id`` - id that was provided as part of the downloaded link object (for all
 | |
|   types of links: directory, suggested, enhanced); not present if the tile was
 | |
|   created from user behavior, e.g., visiting pages
 | |
| - ``past_impressions`` - number of impressions (new tab "views") a suggested
 | |
|   tile was shown before it was clicked, pinned or blocked. Where the "total"
 | |
|   counter is the overall number of impressions accumulated prior to a click action,
 | |
|   and "daily" counter is the number impressions occurred on same calendar day of
 | |
|   a click. This infomration is submitted once per a suggested tile upon click,
 | |
|   pin or block
 | |
| - ``pinned`` - 1 if the tile is pinned; not present otherwise
 | |
| - ``pos`` - integer position if the tile is not in the natural order, e.g., a
 | |
|   pinned tile after an empty slot; not present otherwise
 | |
| - ``score`` - integer truncated score based on the tile's frecency; not present
 | |
|   if 0
 | |
| - ``url`` - empty string if it's an enhanced tile; not present otherwise
 | 
