1// Copyright (c) 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5'use strict';
6
7/**
8 * @fileoverview This is the content script injected by the opt in helper.
9 *   It is injected into the newtab page and also google.com and notifies the
10 *   page to show an opt-in message for the user to enable the built-in hotword
11 *   extension.
12 */
13
14
15
16/** @constructor */
17var OptInClient = function() {};
18
19
20/**
21 * Commands sent from this injected content scripts to the page.
22 * @enum {string}
23 */
24OptInClient.CommandToPage = {
25  // Allow hotword opt-in message bubble to be displayed.
26  ALLOW_OPTIN_MESSAGE: 'chwom'
27};
28
29
30/**
31 * Commands sent from the page to this content script.
32 * @enum {string}
33 */
34OptInClient.CommandFromPage = {
35  // User has explicitly clicked 'no'.
36  CLICKED_NO_OPTIN: 'hcno',
37  // User has opted in.
38  CLICKED_OPTIN: 'hco',
39  // Audio logging is opted in.
40  AUDIO_LOGGING_ON: 'alon',
41  // Audio logging is opted out.
42  AUDIO_LOGGING_OFF: 'aloff',
43};
44
45
46/**
47 * Used to determine if this content script has already been injected.
48 * @const {string}
49 * @private
50 */
51OptInClient.EXISTS_ = 'chwoihe';
52
53
54/**
55 * Handles the messages posted to the window, mainly listening for
56 * the optin and no optin clicks. Also listening for preference on
57 * audio logging.
58 * @param {!MessageEvent} messageEvent Message event from the window.
59 * @private
60 */
61OptInClient.prototype.handleCommandFromPage_ = function(messageEvent) {
62  if (messageEvent.source === window && messageEvent.data.type) {
63    var command = messageEvent.data.type;
64    chrome.runtime.sendMessage({'type': command});
65  }
66};
67
68
69/**
70 * Sends a command to the page allowing it to display the hotword opt-in
71 * message. It is up to the page whether it is actually displayed.
72 * @private
73 */
74OptInClient.prototype.notifyPageAllowOptIn_ = function() {
75  if (document.readyState === 'complete') {
76    window.postMessage(
77        {'type': OptInClient.CommandToPage.ALLOW_OPTIN_MESSAGE}, '*');
78  }
79};
80
81
82/**
83 * Initializes the content script.
84 */
85OptInClient.prototype.initialize = function() {
86  if (OptInClient.EXISTS_ in window)
87    return;
88  window[OptInClient.EXISTS_] = true;
89  window.addEventListener(
90      'message', this.handleCommandFromPage_.bind(this), false);
91
92  if (document.readyState === 'complete')
93    this.notifyPageAllowOptIn_();
94  else
95    document.onreadystatechange = this.notifyPageAllowOptIn_;
96};
97
98
99new OptInClient().initialize();
100