RLZ Chrome API Proposal

Overview

Google client products use a system called RLZ to perform cohort tagging to manage promotion analysis.  This is accomplished by having the product record certain events in its life cycle, such as installation, first Google search performed, home page set to Google, and so on, and then forwarding that information to Google.


This document proposes exposing some RLZ function as a Chrome Extension.


Familiarity with the RLZ open source project and how it is used is strongly recommended before reading this proposal.


Use Cases

This API can be useful to any chrome-internal extension that wants do promotion analysis.


Could this API be part of the web platform?

No.  This API is specifically for managing promotions of chrome-internal extensions.


Do you expect this API to be fairly stable?

This API is expected to be very stable.  No changes are required to this API to support new chrome extensions.


What UI does this API expose?

This API proposal does not expose any UI elements.


How could this API be abused?

An extension could record events for different products or for access points it does not own.  This could result in incorrect assessment of partnership distribution.  This problem could be mitigated by restricting the products and/or access points made visible through this API.  For example, a chrome extension should not affect Google Desktop or Chrome Omnibox access points.


DoS attacks on Google are not possible since the underlying RLZ code prevents more than one financial ping per product per 24 hour period for all RLZ users on the same machine, not only chrome extensions.


This API is hidden behind the command line argument used for experimental APIs.


How would you implement your desired features if this API didn't exist?

If this API did not exist, we would need to re-implement the existing RLZ open source library as a combination of javascript and NPAPI plugin.


Are you willing and able to develop and maintain this API?

Yes.



Will the API work on all platforms?


The RLZ library is Windows-only at the moment, so this API will only be supported on Windows until RLZ is adapted to work on other platforms.


Draft API spec

Use the chrome.experimental.rlz module to record an RLZ events in your extension's life cycle.

Methods

recordProductEvent
chrome.experimental.rlz.recordProductEvent(string product, string accessPoint, string event)

Records an RLZ event for a given product's access point.

Parameters
product (string)
A one-letter product name for the chrome-internal extension.  This name should be unique within the RLZ product name space.  Refer to the function GetProductName() in the RLZ code.

accessPoint (string)
A two-letter access point name used within the extension.  This name should be unique within the RLZ access point name space.  Refer to the function GetAccessPointName() in the RLZ code.

event (string)
A string representing the name of the event that occurred on the access point.  Valid possibilities:

NameDescription
installAccess point installed on the system
set-to-googlePoint set from non-Google provider to Google
first-searchA first search has been performed from this access point since installation 
activateProduct being used for a period of time 



clearProductState
chrome.experimental.rlz.clearProductState(string product, string[] accessPoints)

Clears all product-specific RLZ state from the machine, as well as clearing all events for the specified access points.  This function should be called when the extension is uninstalled.

Is there any way for an extension to know it is being uninstalled so that it can make this call?

Parameters
product (string)
A one-letter product name for the chrome-internal extension.  This name should be unique within the RLZ product name space.  Refer to the function GetProductName() in the RLZ code.

accessPoints (array of string)
An array of two-letter access point names used within the extension.  Each name should be unique within the RLZ access point name space.  Refer to the function GetAccessPointName() in the RLZ code.


sendFinancialPing
chrome.experimental.rlz.sendFinancialPing(string product, string[] accessPoints, signature, brand, id, lang, exclude_machine_id, callback)

Sends a ping with promotional RLZ  information to Google.

Parameters
product (string)
A one-letter product name for the chrome-internal extension.  This name should be unique within the RLZ product name space.  Refer to the function GetProductName() in the RLZ code.

accessPoints (array of string)
An array of two-letter access point names used within the extension.  Each name should be unique within the RLZ access point name space.  Refer to the function GetAccessPointName() in the RLZ code.

signature (string)
product-specific signature 
string of the product.

brand (string)
A promotional brand code assigned to the product.  
Can be an empty string.

id (string)
A product-specific installation id.  Can be an empty string.

lang (string)
The language of the product.  Used to determine cohort.  
Can be an empty string.

exclude_machine_id (boolean)
If true, the machine specific id will be excluded from the ping.

callback (function)
A function that takes one boolean argument indicating whether the ping was successfully sent or not.

getAccessPointRlz
chrome.experimental.rlz.getAccessPointRlz(string accessPoint, function callback)

Gets the RLZ string to be used when accessing a Google property through the given access point.  This string should be used in an rlz= CGI parameter in the Google property URLs.

Parameters
accessPoint (string)
A two-letter access point name used within the extension.  This name should be unique within the RLZ access point name space.  Refer to the function GetAccessPointName() in the RLZ code.

callback (function)
A function that takes one string argument, which is the RLZ string for the given access point.


Comments