1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * @fileoverview The local InstantExtended NTP.
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Controls rendering the new tab page for InstantExtended.
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * @return {Object} A limited interface for testing the local NTP.
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochfunction LocalNTP() {
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)<include src="../../../../ui/webui/resources/js/assert.js">
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)<include src="local_ntp_design.js">
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)<include src="local_ntp_util.js">
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)<include src="window_disposition_util.js">
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Enum for classnames.
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @enum {string}
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @const
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var CLASSES = {
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ALTERNATE_LOGO: 'alternate-logo', // Shows white logo if required by theme
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BLACKLIST: 'mv-blacklist', // triggers tile blacklist animation
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BLACKLIST_BUTTON: 'mv-x',
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BLACKLIST_BUTTON_INNER: 'mv-x-inner',
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DARK: 'dark',
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DEFAULT_THEME: 'default-theme',
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DELAYED_HIDE_NOTIFICATION: 'mv-notice-delayed-hide',
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DOT: 'dot',
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FAKEBOX_DISABLE: 'fakebox-disable', // Makes fakebox non-interactive
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FAKEBOX_FOCUS: 'fakebox-focused', // Applies focus styles to the fakebox
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Applies drag focus style to the fakebox
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FAKEBOX_DRAG_FOCUS: 'fakebox-drag-focused',
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FAVICON: 'mv-favicon',
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  FAVICON_FALLBACK: 'mv-favicon-fallback',
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FOCUSED: 'mv-focused',
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HIDE_BLACKLIST_BUTTON: 'mv-x-hide', // hides blacklist button during animation
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  HIDE_FAKEBOX_AND_LOGO: 'hide-fakebox-logo',
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HIDE_NOTIFICATION: 'mv-notice-hide',
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Vertically centers the most visited section for a non-Google provided page.
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NON_GOOGLE_PAGE: 'non-google-page',
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PAGE: 'mv-page', // page tiles
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PAGE_READY: 'mv-page-ready',  // page tile when ready
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RTL: 'rtl',  // Right-to-left language text.
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  THUMBNAIL: 'mv-thumb',
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  THUMBNAIL_FALLBACK: 'mv-thumb-fallback',
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  THUMBNAIL_MASK: 'mv-mask',
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TILE: 'mv-tile',
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  TILE_INNER: 'mv-tile-inner',
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TITLE: 'mv-title'
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Enum for HTML element ids.
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @enum {string}
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @const
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var IDS = {
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ATTRIBUTION: 'attribution',
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ATTRIBUTION_TEXT: 'attribution-text',
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CUSTOM_THEME_STYLE: 'ct-style',
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FAKEBOX: 'fakebox',
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FAKEBOX_INPUT: 'fakebox-input',
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  FAKEBOX_TEXT: 'fakebox-text',
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LOGO: 'logo',
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NOTIFICATION: 'mv-notice',
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NOTIFICATION_CLOSE_BUTTON: 'mv-notice-x',
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NOTIFICATION_MESSAGE: 'mv-msg',
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NTP_CONTENTS: 'ntp-contents',
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RESTORE_ALL_LINK: 'mv-restore',
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TILES: 'mv-tiles',
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UNDO_LINK: 'mv-undo'
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * Enum for keycodes.
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @enum {number}
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @const
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)var KEYCODE = {
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ENTER: 13
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/**
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Enum for the state of the NTP when it is disposed.
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * @enum {number}
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * @const
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)var NTP_DISPOSE_STATE = {
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  NONE: 0,  // Preserve the NTP appearance and functionality
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISABLE_FAKEBOX: 1,
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  HIDE_FAKEBOX_AND_LOGO: 2
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * The JavaScript button event value for a middle click.
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * @type {number}
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * @const
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvar MIDDLE_MOUSE_BUTTON = 1;
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/**
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * Specifications for the NTP design.
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @const {NtpDesign}
1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)var NTP_DESIGN = getNtpDesign(configData.ntpDesignName);
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/**
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * The container for the tile elements.
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @type {Element}
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var tilesContainer;
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * The notification displayed when a page is blacklisted.
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @type {Element}
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var notification;
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * The container for the theme attribution.
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @type {Element}
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var attribution;
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * The "fakebox" - an input field that looks like a regular searchbox.  When it
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * is focused, any text the user types goes directly into the omnibox.
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @type {Element}
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var fakebox;
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * The container for NTP elements.
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @type {Element}
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var ntpContents;
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * The array of rendered tiles, ordered by appearance.
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @type {!Array.<Tile>}
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var tiles = [];
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * The last blacklisted tile if any, which by definition should not be filler.
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @type {?Tile}
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var lastBlacklistedTile = null;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * The iframe element which is currently keyboard focused, or null.
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @type {?Element}
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivar focusedIframe = null;
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * True if a page has been blacklisted and we're waiting on the
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * onmostvisitedchange callback. See onMostVisitedChange() for how this
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * is used.
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @type {boolean}
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivar isBlacklisting = false;
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/**
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Current number of tiles columns shown based on the window width, including
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * those that just contain filler.
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @type {number}
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var numColumnsShown = 0;
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * A flag to indicate Most Visited changed caused by user action. If true, then
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * in onMostVisitedChange() tiles remain visible so no flickering occurs.
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * @type {boolean}
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) */
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)var userInitiatedMostVisitedChange = false;
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)/**
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * The browser embeddedSearch.newTabPage object.
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @type {Object}
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var ntpApiHandle;
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * The browser embeddedSearch.searchBox object.
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * @type {Object}
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)var searchboxApiHandle;
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/**
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * The state of the NTP when a query is entered into the Omnibox.
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * @type {NTP_DISPOSE_STATE}
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)var omniboxInputBehavior = NTP_DISPOSE_STATE.NONE;
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/**
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * The state of the NTP when a query is entered into the Fakebox.
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * @type {NTP_DISPOSE_STATE}
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)var fakeboxInputBehavior = NTP_DISPOSE_STATE.HIDE_FAKEBOX_AND_LOGO;
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** @type {number} @const */
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var MAX_NUM_TILES_TO_SHOW = 8;
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** @type {number} @const */
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var MIN_NUM_COLUMNS = 2;
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** @type {number} @const */
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var MAX_NUM_COLUMNS = 4;
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** @type {number} @const */
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var NUM_ROWS = 2;
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Minimum total padding to give to the left and right of the most visited
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * section. Used to determine how many tiles to show.
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @type {number}
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @const
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var MIN_TOTAL_HORIZONTAL_PADDING = 200;
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * The filename for a most visited iframe src which shows a page title.
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @type {string}
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @const
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var MOST_VISITED_TITLE_IFRAME = 'title.html';
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * The filename for a most visited iframe src which shows a thumbnail image.
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @type {string}
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @const
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var MOST_VISITED_THUMBNAIL_IFRAME = 'thumbnail.html';
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * The color of the title in RRGGBBAA format.
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @type {?string}
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivar titleColor = null;
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/**
279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Hide most visited tiles for at most this many milliseconds while painting.
280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * @type {number}
281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * @const
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */
283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvar MOST_VISITED_PAINT_TIMEOUT_MSEC = 500;
284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/**
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * A Tile is either a rendering of a Most Visited page or "filler" used to
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * pad out the section when not enough pages exist.
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {Element} elem The element for rendering the tile.
2916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @param {Element=} opt_innerElem The element for contents of tile.
2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * @param {Element=} opt_titleElem The element for rendering the title.
2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * @param {Element=} opt_thumbnailElem The element for rendering the thumbnail.
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {number=} opt_rid The RID for the corresponding Most Visited page.
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *     Should only be left unspecified when creating a filler tile.
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @constructor
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
2986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)function Tile(elem, opt_innerElem, opt_titleElem, opt_thumbnailElem, opt_rid) {
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /** @type {Element} */
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.elem = elem;
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  /** @type {Element|undefined} */
3036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  this.innerElem = opt_innerElem;
3046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  /** @type {Element|undefined} */
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  this.titleElem = opt_titleElem;
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  /** @type {Element|undefined} */
3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  this.thumbnailElem = opt_thumbnailElem;
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /** @type {number|undefined} */
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.rid = opt_rid;
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Heuristic to determine whether a theme should be considered to be dark, so
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * the colors of various UI elements can be adjusted.
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {ThemeBackgroundInfo|undefined} info Theme background information.
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @return {boolean} Whether the theme is dark.
3216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @private
3226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction getIsThemeDark(info) {
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!info)
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Heuristic: light text implies dark theme.
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var rgba = info.textColorRgba;
3286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  var luminance = 0.3 * rgba[0] + 0.59 * rgba[1] + 0.11 * rgba[2];
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return luminance >= 128;
3306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
3316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/**
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Updates the NTP based on the current theme.
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @private
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
3376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)function renderTheme() {
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var fakeboxText = $(IDS.FAKEBOX_TEXT);
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (fakeboxText) {
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    fakeboxText.innerHTML = '';
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (NTP_DESIGN.showFakeboxHint &&
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        configData.translatedStrings.searchboxPlaceholder) {
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      fakeboxText.textContent =
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          configData.translatedStrings.searchboxPlaceholder;
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var info = ntpApiHandle.themeBackgroundInfo;
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var isThemeDark = getIsThemeDark(info);
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ntpContents.classList.toggle(CLASSES.DARK, isThemeDark);
3516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!info) {
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    titleColor = NTP_DESIGN.titleColor;
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
3546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
3556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!info.usingDefaultTheme && info.textColorRgba) {
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    titleColor = convertToRRGGBBAAColor(info.textColorRgba);
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    titleColor = isThemeDark ?
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        NTP_DESIGN.titleColorAgainstDark : NTP_DESIGN.titleColor;
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  var background = [convertToRGBAColor(info.backgroundColorRgba),
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    info.imageUrl,
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    info.imageTiling,
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    info.imageHorizontalAlignment,
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    info.imageVerticalAlignment].join(' ').trim();
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  document.body.style.background = background;
3707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  document.body.classList.toggle(CLASSES.ALTERNATE_LOGO, info.alternateLogo);
3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  updateThemeAttribution(info.attributionUrl);
3727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  setCustomThemeStyle(info);
3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/**
3776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * Updates the NTP based on the current theme, then rerenders all tiles.
3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @private
3796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */
3806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)function onThemeChange() {
3816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  renderTheme();
3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  tilesContainer.innerHTML = '';
3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  renderAndShowTiles();
3847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/**
3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * Updates the NTP style according to theme.
3897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @param {Object=} opt_themeInfo The information about the theme. If it is
3907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * omitted the style will be reverted to the default.
3917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @private
3927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */
3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochfunction setCustomThemeStyle(opt_themeInfo) {
3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  var customStyleElement = $(IDS.CUSTOM_THEME_STYLE);
3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  var head = document.head;
3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (opt_themeInfo && !opt_themeInfo.usingDefaultTheme) {
3976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ntpContents.classList.remove(CLASSES.DEFAULT_THEME);
3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    var themeStyle =
3997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '#attribution {' +
4007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '  color: ' + convertToRGBAColor(opt_themeInfo.textColorLightRgba) + ';' +
4017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '}' +
4027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '#mv-msg {' +
4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '  color: ' + convertToRGBAColor(opt_themeInfo.textColorRgba) + ';' +
4047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '}' +
4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '#mv-notice-links span {' +
4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '  color: ' + convertToRGBAColor(opt_themeInfo.textColorLightRgba) + ';' +
4077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '}' +
4087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '#mv-notice-x {' +
4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '  -webkit-filter: drop-shadow(0 0 0 ' +
4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          convertToRGBAColor(opt_themeInfo.textColorRgba) + ');' +
4117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '}' +
4126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      '.mv-page-ready .mv-mask {' +
4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '  border: 1px solid ' +
4146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          convertToRGBAColor(opt_themeInfo.sectionBorderColorRgba) + ';' +
4157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '}' +
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      '.mv-page-ready:hover .mv-mask, .mv-page-ready .mv-focused ~ .mv-mask {' +
4177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '  border-color: ' +
4187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          convertToRGBAColor(opt_themeInfo.headerColorRgba) + ';' +
4197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      '}';
4207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (customStyleElement) {
4227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      customStyleElement.textContent = themeStyle;
4237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    } else {
4247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      customStyleElement = document.createElement('style');
4257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      customStyleElement.type = 'text/css';
4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      customStyleElement.id = IDS.CUSTOM_THEME_STYLE;
4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      customStyleElement.textContent = themeStyle;
4287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      head.appendChild(customStyleElement);
4297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } else {
4326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ntpContents.classList.add(CLASSES.DEFAULT_THEME);
4336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (customStyleElement)
4346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      head.removeChild(customStyleElement);
4357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
44058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch * Renders the attribution if the URL is present, otherwise hides it.
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string} url The URL of the attribution image, if any.
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @private
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
4447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochfunction updateThemeAttribution(url) {
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!url) {
4467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    setAttributionVisibility_(false);
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
44958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
45058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  var attributionImage = attribution.querySelector('img');
45158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  if (!attributionImage) {
45258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    attributionImage = new Image();
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    attribution.appendChild(attributionImage);
45458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  }
45558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  attributionImage.style.content = url;
45658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  setAttributionVisibility_(true);
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
4617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * Sets the visibility of the theme attribution.
4627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @param {boolean} show True to show the attribution.
4637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @private
4647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */
4657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochfunction setAttributionVisibility_(show) {
4667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (attribution) {
4677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    attribution.style.display = show ? '' : 'none';
4687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
4697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch /**
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Converts an Array of color components into RRGGBBAA format.
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {Array.<number>} color Array of rgba color components.
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @return {string} Color string in RRGGBBAA format.
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @private
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction convertToRRGGBBAAColor(color) {
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return color.map(function(t) {
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return ('0' + t.toString(16)).slice(-2);  // To 2-digit, 0-padded hex.
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }).join('');
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /**
4867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * Converts an Array of color components into RGBA format "rgba(R,G,B,A)".
4877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @param {Array.<number>} color Array of rgba color components.
4887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @return {string} CSS color in RGBA format.
4897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @private
4907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */
4917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochfunction convertToRGBAColor(color) {
4927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return 'rgba(' + color[0] + ',' + color[1] + ',' + color[2] + ',' +
4937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    color[3] / 255 + ')';
4947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/**
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Handles a new set of Most Visited page data.
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function onMostVisitedChange() {
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (isBlacklisting) {
5025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Trigger the blacklist animation, which then triggers reloadAllTiles().
5036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    var lastBlacklistedTileElem = lastBlacklistedTile.elem;
5046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    lastBlacklistedTileElem.addEventListener(
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        'webkitTransitionEnd', blacklistAnimationDone);
5066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    lastBlacklistedTileElem.classList.add(CLASSES.BLACKLIST);
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    reloadAllTiles();
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Handles the end of the blacklist animation by showing the notification and
5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * re-rendering the new set of tiles.
5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) */
5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)function blacklistAnimationDone() {
5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  showNotification();
5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  isBlacklisting = false;
5205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  tilesContainer.classList.remove(CLASSES.HIDE_BLACKLIST_BUTTON);
5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  lastBlacklistedTile.elem.removeEventListener(
5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      'webkitTransitionEnd', blacklistAnimationDone);
5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Need to call explicitly to re-render the tiles, since the initial
5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // onmostvisitedchange issued by the blacklist function only triggered
5255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // the animation.
5265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  reloadAllTiles();
5275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/**
5315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Fetches new data, creates, and renders tiles.
5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) */
5335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)function reloadAllTiles() {
5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  var pages = ntpApiHandle.mostVisited;
5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  tiles = [];
5375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (var i = 0; i < MAX_NUM_TILES_TO_SHOW; ++i)
5385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tiles.push(createTile(pages[i], i));
5395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  tilesContainer.innerHTML = '';
5415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  renderAndShowTiles();
5425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/**
5465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Binds onload events for a tile's internal <iframe> elements.
5475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * @param {Tile} tile The main tile to bind events to.
5486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @param {Barrier} tileVisibilityBarrier A barrier to make all tiles visible
5496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) *   the moment all tiles are loaded.
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
5515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)function bindTileOnloadEvents(tile, tileVisibilityBarrier) {
5525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (tile.titleElem) {
5535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tileVisibilityBarrier.add();
5545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tile.titleElem.onload = function() {
5555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      tileVisibilityBarrier.remove();
5565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    };
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
5585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (tile.thumbnailElem) {
5595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tileVisibilityBarrier.add();
5605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tile.thumbnailElem.onload = function() {
5615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      tile.elem.classList.add(CLASSES.PAGE_READY);
5625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      tileVisibilityBarrier.remove();
5635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    };
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
5695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Renders the current list of visible tiles to DOM, and hides tiles that are
5705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * already in the DOM but should not be seen.
571868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) */
5725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)function renderAndShowTiles() {
5735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  var numExisting = tilesContainer.querySelectorAll('.' + CLASSES.TILE).length;
5745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Only add visible tiles to the DOM, to avoid creating invisible tiles that
5755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // produce meaningless impression metrics. However, if a tile becomes
5765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // invisible then we leave it in DOM to prevent reload if it's shown again.
5775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  var numDesired = Math.min(tiles.length, numColumnsShown * NUM_ROWS);
5785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If we need to render new tiles, manage the visibility to hide intermediate
5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // load states of the <iframe>s.
5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (numExisting < numDesired) {
5826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    var showAll = function() {
5836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      for (var i = 0; i < numDesired; ++i) {
5846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        if (tiles[i].titleElem || tiles[i].thumbnailElem)
5856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          tiles[i].elem.classList.add(CLASSES.PAGE_READY);
5866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      }
5876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    };
5886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    var tileVisibilityBarrier = new Barrier(showAll);
5895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!userInitiatedMostVisitedChange) {
5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // Make titleContainer invisible, but still taking up space.
5925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // titleContainer becomes visible again (1) on timeout, or (2) when all
5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // tiles finish loading (using tileVisibilityBarrier).
5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      window.setTimeout(function() {
5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        tileVisibilityBarrier.cancel();
5966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        showAll();
5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      }, MOST_VISITED_PAINT_TIMEOUT_MSEC);
598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    userInitiatedMostVisitedChange = false;
6005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for (var i = numExisting; i < numDesired; ++i) {
6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      bindTileOnloadEvents(tiles[i], tileVisibilityBarrier);
6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      tilesContainer.appendChild(tiles[i].elem);
6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Show only the desired tiles. Note that .hidden does not work for
6086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // inline-block elements like tiles[i].elem.
6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (var i = 0; i < numDesired; ++i)
6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tiles[i].elem.style.display = 'inline-block';
6115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If |numDesired| < |numExisting| then hide extra tiles (e.g., this occurs
6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // when window is downsized).
6135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (; i < numExisting; ++i)
6145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tiles[i].elem.style.display = 'none';
615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)/**
6196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * Builds a URL to display a most visited tile title in an iframe.
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {number} rid The restricted ID.
62190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @param {number} position The position of the iframe in the UI.
6226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @return {string} An URL to display the most visited title in an iframe.
6236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */
6246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)function getMostVisitedTitleIframeUrl(rid, position) {
6256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  var url = 'chrome-search://most-visited/' +
6266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      encodeURIComponent(MOST_VISITED_TITLE_IFRAME);
6276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  var params = [
6286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      'rid=' + encodeURIComponent(rid),
6296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      'f=' + encodeURIComponent(NTP_DESIGN.fontFamily),
6306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      'fs=' + encodeURIComponent(NTP_DESIGN.fontSize),
6316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      'c=' + encodeURIComponent(titleColor),
6326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      'pos=' + encodeURIComponent(position)];
6336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (NTP_DESIGN.titleTextAlign)
6346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    params.push('ta=' + encodeURIComponent(NTP_DESIGN.titleTextAlign));
6356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (NTP_DESIGN.titleTextFade)
6366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    params.push('tf=' + encodeURIComponent(NTP_DESIGN.titleTextFade));
6376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return url + '?' + params.join('&');
6386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
6396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/**
6426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * Builds a URL to display a most visited tile thumbnail in an iframe.
6436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @param {number} rid The restricted ID.
6446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @param {number} position The position of the iframe in the UI.
6456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * @return {string} An URL to display the most visited thumbnail in an iframe.
6466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */
6476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)function getMostVisitedThumbnailIframeUrl(rid, position) {
6486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  var url = 'chrome-search://most-visited/' +
6496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      encodeURIComponent(MOST_VISITED_THUMBNAIL_IFRAME);
6506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  var params = [
6516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      'rid=' + encodeURIComponent(rid),
6526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      'f=' + encodeURIComponent(NTP_DESIGN.fontFamily),
6536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      'fs=' + encodeURIComponent(NTP_DESIGN.fontSize),
6546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      'c=' + encodeURIComponent(NTP_DESIGN.thumbnailTextColor),
6556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      'pos=' + encodeURIComponent(position)];
6566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (NTP_DESIGN.thumbnailFallback)
6576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    params.push('etfb=1');
6586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return url + '?' + params.join('&');
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Creates a Tile with the specified page data. If no data is provided, a
664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * filler Tile is created.
665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {Object} page The page data.
66690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @param {number} position The position of the tile.
667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return {Tile} The new Tile.
668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
66990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)function createTile(page, position) {
6706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  var tileElem = document.createElement('div');
6716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  tileElem.classList.add(CLASSES.TILE);
6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Prevent tile from being selected (and highlighted) when areas outside the
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // <iframe>s are clicked.
6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tileElem.addEventListener('mousedown', function(e) {
6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    e.preventDefault();
6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  });
6776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  var innerElem = createAndAppendElement(tileElem, 'div', CLASSES.TILE_INNER);
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (page) {
680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    var rid = page.rid;
6816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    tileElem.classList.add(CLASSES.PAGE);
682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    var navigateFunction = function(e) {
684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      e.preventDefault();
685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ntpApiHandle.navigateContentWindow(rid, getDispositionFromEvent(e));
68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    };
68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // The click handler for navigating to the page identified by the RID.
6896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    tileElem.addEventListener('click', navigateFunction);
69090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The iframe which renders the page title.
6926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    var titleElem = document.createElement('iframe');
6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Enable tab navigation on the iframe, which will move the selection to the
6941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // link element (which also has a tabindex).
6951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    titleElem.tabIndex = '0';
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Why iframes have IDs:
698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    //
699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // On navigating back to the NTP we see several onmostvisitedchange() events
700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // in series with incrementing RIDs. After the first event, a set of iframes
701868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // begins loading RIDs n, n+1, ..., n+k-1; after the second event, these get
702868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // destroyed and a new set begins loading RIDs n+k, n+k+1, ..., n+2k-1.
703868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Now due to crbug.com/68841, Chrome incorrectly loads the content for the
704868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // first set of iframes into the most recent set of iframes.
705868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    //
706868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Giving iframes distinct ids seems to cause some invalidation and prevent
707868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // associating the incorrect data.
708868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    //
709868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // TODO(jered): Find and fix the root (probably Blink) bug.
710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Keep this ID here. See comment above.
7126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    titleElem.id = 'title-' + rid;
7136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    titleElem.className = CLASSES.TITLE;
7146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    titleElem.src = getMostVisitedTitleIframeUrl(rid, position);
7156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    innerElem.appendChild(titleElem);
7166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // A fallback element for missing thumbnails.
7186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (NTP_DESIGN.thumbnailFallback) {
7196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      var fallbackElem = createAndAppendElement(
7206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          innerElem, 'div', CLASSES.THUMBNAIL_FALLBACK);
7216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      if (NTP_DESIGN.thumbnailFallback === THUMBNAIL_FALLBACK.DOT)
7226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        createAndAppendElement(fallbackElem, 'div', CLASSES.DOT);
7236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The iframe which renders either a thumbnail or domain element.
7266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    var thumbnailElem = document.createElement('iframe');
7276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    thumbnailElem.tabIndex = '-1';
7281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    thumbnailElem.setAttribute('aria-hidden', 'true');
7295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Keep this ID here. See comment above.
7306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    thumbnailElem.id = 'thumb-' + rid;
7316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    thumbnailElem.className = CLASSES.THUMBNAIL;
7326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    thumbnailElem.src = getMostVisitedThumbnailIframeUrl(rid, position);
7336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    innerElem.appendChild(thumbnailElem);
734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The button used to blacklist this page.
736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    var blacklistButton = createAndAppendElement(
7376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        innerElem, 'div', CLASSES.BLACKLIST_BUTTON);
7381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    createAndAppendElement(
7391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        blacklistButton, 'div', CLASSES.BLACKLIST_BUTTON_INNER);
74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    var blacklistFunction = generateBlacklistFunction(rid);
74190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    blacklistButton.addEventListener('click', blacklistFunction);
7429ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    blacklistButton.title = configData.translatedStrings.removeThumbnailTooltip;
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // A helper mask on top of the tile that is used to create hover border
7456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // and/or to darken the thumbnail on focus.
7466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    var maskElement = createAndAppendElement(
7476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        innerElem, 'div', CLASSES.THUMBNAIL_MASK);
7486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // The page favicon, or a fallback.
7506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    var favicon = createAndAppendElement(innerElem, 'div', CLASSES.FAVICON);
7516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (page.faviconUrl) {
7526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      favicon.style.backgroundImage = 'url(' + page.faviconUrl + ')';
7536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    } else {
7546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      favicon.classList.add(CLASSES.FAVICON_FALLBACK);
755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
7566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return new Tile(tileElem, innerElem, titleElem, thumbnailElem, rid);
757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
7586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return new Tile(tileElem);
759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Generates a function to be called when the page with the corresponding RID
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * is blacklisted.
766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {number} rid The RID of the page being blacklisted.
7671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @return {function(Event=)} A function which handles the blacklisting of the
768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *     page by updating state variables and notifying Chrome.
769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function generateBlacklistFunction(rid) {
771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return function(e) {
772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Prevent navigation when the page is being blacklisted.
7731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (e)
7741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      e.stopPropagation();
775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    userInitiatedMostVisitedChange = true;
777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    isBlacklisting = true;
778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    tilesContainer.classList.add(CLASSES.HIDE_BLACKLIST_BUTTON);
779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    lastBlacklistedTile = getTileByRid(rid);
780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ntpApiHandle.deleteMostVisitedItem(rid);
781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Shows the blacklist notification and triggers a delay to hide it.
787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function showNotification() {
789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  notification.classList.remove(CLASSES.HIDE_NOTIFICATION);
790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  notification.classList.remove(CLASSES.DELAYED_HIDE_NOTIFICATION);
791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  notification.scrollTop;
792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  notification.classList.add(CLASSES.DELAYED_HIDE_NOTIFICATION);
793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Hides the blacklist notification.
798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function hideNotification() {
800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  notification.classList.add(CLASSES.HIDE_NOTIFICATION);
8011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  notification.classList.remove(CLASSES.DELAYED_HIDE_NOTIFICATION);
802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Handles a click on the notification undo link by hiding the notification and
807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * informing Chrome.
808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function onUndo() {
810868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  userInitiatedMostVisitedChange = true;
811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  hideNotification();
812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var lastBlacklistedRID = lastBlacklistedTile.rid;
813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (typeof lastBlacklistedRID != 'undefined')
814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ntpApiHandle.undoMostVisitedDeletion(lastBlacklistedRID);
815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Handles a click on the restore all notification link by hiding the
820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * notification and informing Chrome.
821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function onRestoreAll() {
823868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  userInitiatedMostVisitedChange = true;
824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  hideNotification();
825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ntpApiHandle.undoAllMostVisitedDeletions();
826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
8301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Recomputes the number of tile columns, and width of various contents based
8311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * on the width of the window.
8321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @return {boolean} Whether the number of tile columns has changed.
833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction updateContentWidth() {
8356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  var tileRequiredWidth = NTP_DESIGN.tileWidth + NTP_DESIGN.tileMargin;
836868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // If innerWidth is zero, then use the maximum snap size.
8376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  var maxSnapSize = MAX_NUM_COLUMNS * tileRequiredWidth -
8386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      NTP_DESIGN.tileMargin + MIN_TOTAL_HORIZONTAL_PADDING;
8396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  var innerWidth = window.innerWidth || maxSnapSize;
8406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Each tile has left and right margins that sum to NTP_DESIGN.tileMargin.
8416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  var availableWidth = innerWidth + NTP_DESIGN.tileMargin -
8426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      MIN_TOTAL_HORIZONTAL_PADDING;
8435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  var newNumColumns = Math.floor(availableWidth / tileRequiredWidth);
8445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (newNumColumns < MIN_NUM_COLUMNS)
8455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    newNumColumns = MIN_NUM_COLUMNS;
8465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  else if (newNumColumns > MAX_NUM_COLUMNS)
8475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    newNumColumns = MAX_NUM_COLUMNS;
8485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (numColumnsShown === newNumColumns)
8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  numColumnsShown = newNumColumns;
8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var tilesContainerWidth = numColumnsShown * tileRequiredWidth;
8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tilesContainer.style.width = tilesContainerWidth + 'px';
8551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (fakebox) {
8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // -2 to account for border.
8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var fakeboxWidth = (tilesContainerWidth - NTP_DESIGN.tileMargin - 2);
8581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    fakebox.style.width = fakeboxWidth + 'px';
8591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/**
8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Resizes elements because the number of tile columns may need to change in
8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * response to resizing. Also shows or hides extra tiles tiles according to the
8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * new width of the page.
8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */
8691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction onResize() {
8701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (updateContentWidth()) {
8715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Render without clearing tiles.
8725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    renderAndShowTiles();
873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Returns the tile corresponding to the specified page RID.
879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {number} rid The page RID being looked up.
880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return {Tile} The corresponding tile.
881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function getTileByRid(rid) {
883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (var i = 0, length = tiles.length; i < length; ++i) {
884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    var tile = tiles[i];
885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (tile.rid == rid)
886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return tile;
887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return null;
889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
8937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Handles new input by disposing the NTP, according to where the input was
8947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * entered.
895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
8967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)function onInputStart() {
8977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (fakebox && isFakeboxFocused()) {
898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    setFakeboxFocus(false);
899ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    setFakeboxDragFocus(false);
9007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    disposeNtp(true);
9017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  } else if (!isFakeboxFocused()) {
9027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    disposeNtp(false);
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
9087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Disposes the NTP, according to where the input was entered.
9097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * @param {boolean} wasFakeboxInput True if the input was in the fakebox.
9107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */
9117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)function disposeNtp(wasFakeboxInput) {
9127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  var behavior = wasFakeboxInput ? fakeboxInputBehavior : omniboxInputBehavior;
9137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (behavior == NTP_DISPOSE_STATE.DISABLE_FAKEBOX)
9147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    setFakeboxActive(false);
9157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  else if (behavior == NTP_DISPOSE_STATE.HIDE_FAKEBOX_AND_LOGO)
9167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    setFakeboxAndLogoVisibility(false);
9177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
9187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
9197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
9207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/**
921558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch * Restores the NTP (re-enables the fakebox and unhides the logo.)
922b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) */
92390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)function restoreNtp() {
9247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  setFakeboxActive(true);
9257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  setFakeboxAndLogoVisibility(true);
926b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
927b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
9287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
929b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)/**
930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {boolean} focus True to focus the fakebox.
931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function setFakeboxFocus(focus) {
9337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  document.body.classList.toggle(CLASSES.FAKEBOX_FOCUS, focus);
934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
936ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch/**
937ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch * @param {boolean} focus True to show a dragging focus to the fakebox.
938ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch */
939ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochfunction setFakeboxDragFocus(focus) {
940ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  document.body.classList.toggle(CLASSES.FAKEBOX_DRAG_FOCUS, focus);
941ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
9427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return {boolean} True if the fakebox has focus.
945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function isFakeboxFocused() {
947ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return document.body.classList.contains(CLASSES.FAKEBOX_FOCUS) ||
948ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      document.body.classList.contains(CLASSES.FAKEBOX_DRAG_FOCUS);
949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
9537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * @param {boolean} enable True to enable the fakebox.
954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
9557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)function setFakeboxActive(enable) {
9567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  document.body.classList.toggle(CLASSES.FAKEBOX_DISABLE, !enable);
957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
9617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * @param {!Event} event The click event.
9627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * @return {boolean} True if the click occurred in an enabled fakebox.
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
9647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)function isFakeboxClick(event) {
9657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return fakebox.contains(event.target) &&
9667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      !document.body.classList.contains(CLASSES.FAKEBOX_DISABLE);
967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
9717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * @param {boolean} show True to show the fakebox and logo.
972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
9737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)function setFakeboxAndLogoVisibility(show) {
9747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  document.body.classList.toggle(CLASSES.HIDE_FAKEBOX_AND_LOGO, !show);
975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Shortcut for document.getElementById.
980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string} id of the element.
981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return {HTMLElement} with the id.
982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function $(id) {
984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return document.getElementById(id);
985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Utility function which creates an element with an optional classname and
990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * appends it to the specified parent.
991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {Element} parent The parent to append the new element.
992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string} name The name of the new element.
993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string=} opt_class The optional classname of the new element.
994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return {Element} The new element.
995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function createAndAppendElement(parent, name, opt_class) {
997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var child = document.createElement(name);
998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (opt_class)
999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    child.classList.add(opt_class);
1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  parent.appendChild(child);
1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return child;
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Removes a node from its parent.
1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {Node} node The node to remove.
1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function removeNode(node) {
1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  node.parentNode.removeChild(node);
1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
101590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @param {!Element} element The element to register the handler for.
101690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @param {number} keycode The keycode of the key to register.
101790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @param {!Function} handler The key handler to register.
101890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) */
101990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)function registerKeyHandler(element, keycode, handler) {
102090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  element.addEventListener('keydown', function(event) {
102190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (event.keyCode == keycode)
102290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      handler(event);
102390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  });
102490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
102590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
102690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
102790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)/**
1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return {Object} the handle to the embeddedSearch API.
1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function getEmbeddedSearchApiHandle() {
1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (window.cideb)
1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return window.cideb;
1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (window.chrome && window.chrome.embeddedSearch)
1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return window.chrome.embeddedSearch;
1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return null;
1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1038eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1039eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/**
10401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Event handler for the focus changed and blacklist messages on link elements.
10411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Used to toggle visual treatment on the tiles (depending on the message).
10421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {Event} event Event received.
10431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */
10441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction handlePostMessage(event) {
10451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (event.origin !== 'chrome-search://most-visited')
10461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
10471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (event.data === 'linkFocused') {
10491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var activeElement = document.activeElement;
10501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (activeElement.classList.contains(CLASSES.TITLE)) {
10511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      activeElement.classList.add(CLASSES.FOCUSED);
10521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      focusedIframe = activeElement;
10531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
10541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (event.data === 'linkBlurred') {
10551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (focusedIframe)
10561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      focusedIframe.classList.remove(CLASSES.FOCUSED);
10571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    focusedIframe = null;
10581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (event.data.indexOf('tileBlacklisted') === 0) {
10591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var tilePosition = event.data.split(',')[1];
10601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (tilePosition)
10611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      generateBlacklistFunction(tiles[parseInt(tilePosition, 10)].rid)();
10621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
10631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
10641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/**
1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Prepares the New Tab Page by adding listeners, rendering the current
1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * theme, the most visited pages section, and Google-specific elements for a
1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Google-provided page.
1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function init() {
1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  tilesContainer = $(IDS.TILES);
1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  notification = $(IDS.NOTIFICATION);
1074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  attribution = $(IDS.ATTRIBUTION);
1075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ntpContents = $(IDS.NTP_CONTENTS);
1076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10779ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (configData.isGooglePage) {
1078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    var logo = document.createElement('div');
1079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    logo.id = IDS.LOGO;
1080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    fakebox = document.createElement('div');
1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    fakebox.id = IDS.FAKEBOX;
10836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    var fakeboxHtml = [];
10846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    fakeboxHtml.push('<input id="' + IDS.FAKEBOX_INPUT +
10851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        '" autocomplete="off" tabindex="-1" type="url" aria-hidden="true">');
10861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    fakeboxHtml.push('<div id="' + IDS.FAKEBOX_TEXT + '"></div>');
10876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    fakeboxHtml.push('<div id="cursor"></div>');
10886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    fakebox.innerHTML = fakeboxHtml.join('');
1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ntpContents.insertBefore(fakebox, ntpContents.firstChild);
1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ntpContents.insertBefore(logo, ntpContents.firstChild);
109290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else {
109390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    document.body.classList.add(CLASSES.NON_GOOGLE_PAGE);
1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Hide notifications after fade out, so we can't focus on links via keyboard.
10971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  notification.addEventListener('webkitTransitionEnd', hideNotification);
10981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var notificationMessage = $(IDS.NOTIFICATION_MESSAGE);
11009ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  notificationMessage.textContent =
11019ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      configData.translatedStrings.thumbnailRemovedNotification;
11026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var undoLink = $(IDS.UNDO_LINK);
1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  undoLink.addEventListener('click', onUndo);
110590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  registerKeyHandler(undoLink, KEYCODE.ENTER, onUndo);
11069ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  undoLink.textContent = configData.translatedStrings.undoThumbnailRemove;
11076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var restoreAllLink = $(IDS.RESTORE_ALL_LINK);
1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  restoreAllLink.addEventListener('click', onRestoreAll);
111090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  registerKeyHandler(restoreAllLink, KEYCODE.ENTER, onUndo);
11119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  restoreAllLink.textContent =
11129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      configData.translatedStrings.restoreThumbnailsShort;
11136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
11149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  $(IDS.ATTRIBUTION_TEXT).textContent =
11159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      configData.translatedStrings.attributionIntro;
1116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var notificationCloseButton = $(IDS.NOTIFICATION_CLOSE_BUTTON);
11181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  createAndAppendElement(
11191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      notificationCloseButton, 'div', CLASSES.BLACKLIST_BUTTON_INNER);
1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  notificationCloseButton.addEventListener('click', hideNotification);
1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  window.addEventListener('resize', onResize);
11231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  updateContentWidth();
1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var topLevelHandle = getEmbeddedSearchApiHandle();
1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ntpApiHandle = topLevelHandle.newTabPage;
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ntpApiHandle.onthemechange = onThemeChange;
1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ntpApiHandle.onmostvisitedchange = onMostVisitedChange;
1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ntpApiHandle.oninputstart = onInputStart;
11327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ntpApiHandle.oninputcancel = restoreNtp;
11337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (ntpApiHandle.isInputInProgress)
11357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    onInputStart();
11367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  renderTheme();
1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  onMostVisitedChange();
1139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  searchboxApiHandle = topLevelHandle.searchBox;
1141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (fakebox) {
1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Listener for updating the key capture state.
1144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    document.body.onmousedown = function(event) {
1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (isFakeboxClick(event))
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        searchboxApiHandle.startCapturingKeyStrokes();
1147b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      else if (isFakeboxFocused())
1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        searchboxApiHandle.stopCapturingKeyStrokes();
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    };
1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    searchboxApiHandle.onkeycapturechange = function() {
1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      setFakeboxFocus(searchboxApiHandle.isKeyCaptureEnabled);
1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    };
1153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    var inputbox = $(IDS.FAKEBOX_INPUT);
1154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (inputbox) {
1155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      inputbox.onpaste = function(event) {
1156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        event.preventDefault();
1157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        searchboxApiHandle.paste();
1158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      };
1159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      inputbox.ondrop = function(event) {
1160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        event.preventDefault();
1161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        var text = event.dataTransfer.getData('text/plain');
1162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        if (text) {
1163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          searchboxApiHandle.paste(text);
1164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        }
1165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      };
1166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      inputbox.ondragenter = function() {
1167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        setFakeboxDragFocus(true);
1168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      };
1169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      inputbox.ondragleave = function() {
1170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        setFakeboxDragFocus(false);
1171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      };
1172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
11733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
11743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Update the fakebox style to match the current key capturing state.
11753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    setFakeboxFocus(searchboxApiHandle.isKeyCaptureEnabled);
117690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (searchboxApiHandle.rtl) {
117990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    $(IDS.NOTIFICATION).dir = 'rtl';
11806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    document.body.setAttribute('dir', 'rtl');
118190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Add class for setting alignments based on language directionality.
11827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    document.body.classList.add(CLASSES.RTL);
118390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    $(IDS.TILES).dir = 'rtl';
1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
11851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  window.addEventListener('message', handlePostMessage);
1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/**
11917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Binds event listeners.
11927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */
11937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)function listen() {
11947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  document.addEventListener('DOMContentLoaded', init);
11957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
11967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)return {
11987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  init: init,
11997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  listen: listen
12007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
12017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
12027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
12037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)if (!window.localNTPUnitTest) {
12049ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  LocalNTP().listen();
12057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1206