Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(360)

Side by Side Diff: chrome/browser/resources/local_ntp/most_visited_single.js

Issue 2117373002: Cleanup: Change LogMostVisitedImpression|Navigation APIs to take an enum (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ntp_uma_cleanup
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* Copyright 2015 The Chromium Authors. All rights reserved. 1 /* Copyright 2015 The Chromium Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be 2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file. */ 3 * found in the LICENSE file. */
4 4
5 // Single iframe for NTP tiles. 5 // Single iframe for NTP tiles.
6 (function() { 6 (function() {
7 'use strict'; 7 'use strict';
8 8
9 9
10 /** 10 /**
11 * The different types of events that are logged from the NTP. This enum is 11 * The different types of events that are logged from the NTP. This enum is
12 * used to transfer information from the NTP JavaScript to the renderer and is 12 * used to transfer information from the NTP JavaScript to the renderer and is
13 * not used as a UMA enum histogram's logged value. 13 * not used as a UMA enum histogram's logged value.
14 * Note: Keep in sync with common/ntp_logging_events.h 14 * Note: Keep in sync with common/ntp_logging_events.h
15 * @enum {number} 15 * @enum {number}
16 * @const 16 * @const
17 */ 17 */
18 var LOG_TYPE = { 18 var LOG_TYPE = {
19 // The suggestion is coming from the server. Unused here. 19 // The suggestion is coming from the server.
20 NTP_SERVER_SIDE_SUGGESTION: 0, 20 NTP_SERVER_SIDE_SUGGESTION: 0,
21 // The suggestion is coming from the client. 21 // The suggestion is coming from the client.
22 NTP_CLIENT_SIDE_SUGGESTION: 1, 22 NTP_CLIENT_SIDE_SUGGESTION: 1,
23 // Indicates a tile was rendered, no matter if it's a thumbnail, a gray tile 23 // Indicates a tile was rendered, no matter if it's a thumbnail, a gray tile
24 // or an external tile. 24 // or an external tile.
25 NTP_TILE: 2, 25 NTP_TILE: 2,
26 // The tile uses a local thumbnail image. 26 // The tile uses a local thumbnail image.
27 NTP_THUMBNAIL_TILE: 3, 27 NTP_THUMBNAIL_TILE: 3,
28 // Used when no thumbnail is specified and a gray tile with the domain is used 28 // Used when no thumbnail is specified and a gray tile with the domain is used
29 // as the main tile. Unused here. 29 // as the main tile. Unused here.
(...skipping 10 matching lines...) Expand all
40 // The visuals of that tile's fallback are handled externally. Unused here. 40 // The visuals of that tile's fallback are handled externally. Unused here.
41 NTP_EXTERNAL_TILE_FALLBACK: 8, 41 NTP_EXTERNAL_TILE_FALLBACK: 8,
42 // The user moused over an NTP tile. 42 // The user moused over an NTP tile.
43 NTP_MOUSEOVER: 9, 43 NTP_MOUSEOVER: 9,
44 // A NTP Tile has finished loading (successfully or failing). 44 // A NTP Tile has finished loading (successfully or failing).
45 NTP_TILE_LOADED: 10, 45 NTP_TILE_LOADED: 10,
46 }; 46 };
47 47
48 48
49 /** 49 /**
50 * The different sources that an NTP tile can have.
51 * Note: Keep in sync with common/ntp_logging_events.h
52 * @enum {number}
53 * @const
54 */
55 var TILE_SOURCE = {
56 NTP_TILE_SOURCE_CLIENT: 0,
Bernhard Bauer 2016/07/05 14:31:54 Nit: you get the equivalent of namespacing here --
Marc Treib 2016/07/05 14:37:53 I'd like to keep the entries identical to the C++
57 NTP_TILE_SOURCE_SERVER: 1,
58 };
59
60
61 /**
50 * Total number of tiles to show at any time. If the host page doesn't send 62 * Total number of tiles to show at any time. If the host page doesn't send
51 * enough tiles, we fill them blank. 63 * enough tiles, we fill them blank.
52 * @const {number} 64 * @const {number}
53 */ 65 */
54 var NUMBER_OF_TILES = 8; 66 var NUMBER_OF_TILES = 8;
55 67
56 68
57 /** 69 /**
58 * Whether to use icons instead of thumbnails. 70 * Whether to use icons instead of thumbnails.
59 * @type {boolean} 71 * @type {boolean}
60 */ 72 */
61 var USE_ICONS = false; 73 var USE_ICONS = false;
62 74
63 75
64 /** 76 /**
65 * Number of lines to display in titles. 77 * Number of lines to display in titles.
66 * @type {number} 78 * @type {number}
67 */ 79 */
68 var NUM_TITLE_LINES = 1; 80 var NUM_TITLE_LINES = 1;
69 81
70 /**
71 * Type of the impression provider for a generic client-provided suggestion.
72 * @type {string}
73 * @const
74 */
75 var CLIENT_PROVIDER_NAME = 'client';
76
77 /**
78 * Type of the impression provider for a generic server-provided suggestion.
79 * @type {string}
80 * @const
81 */
82 var SERVER_PROVIDER_NAME = 'server';
83 82
84 /** 83 /**
85 * The origin of this request. 84 * The origin of this request.
86 * @const {string} 85 * @const {string}
87 */ 86 */
88 var DOMAIN_ORIGIN = '{{ORIGIN}}'; 87 var DOMAIN_ORIGIN = '{{ORIGIN}}';
89 88
90 89
91 /** 90 /**
92 * Counter for DOM elements that we are waiting to finish loading. 91 * Counter for DOM elements that we are waiting to finish loading.
(...skipping 24 matching lines...) Expand all
117 116
118 /** 117 /**
119 * Log an event on the NTP. 118 * Log an event on the NTP.
120 * @param {number} eventType Event from LOG_TYPE. 119 * @param {number} eventType Event from LOG_TYPE.
121 */ 120 */
122 var logEvent = function(eventType) { 121 var logEvent = function(eventType) {
123 chrome.embeddedSearch.newTabPage.logEvent(eventType); 122 chrome.embeddedSearch.newTabPage.logEvent(eventType);
124 }; 123 };
125 124
126 /** 125 /**
127 * Log impression of a most visited tile on the NTP. 126 * Log impression of an NTP tile.
128 * @param {number} tileIndex position of the tile, >= 0 and < NUMBER_OF_TILES 127 * @param {number} tileIndex Position of the tile, >= 0 and < NUMBER_OF_TILES.
129 * @param {string} provider specifies the UMA histogram to be reported 128 * @param {number} tileSource The source from TILE_SOURCE.
130 * (NewTabPage.SuggestionsImpression.{provider})
131 */ 129 */
132 function logMostVisitedImpression(tileIndex, provider) { 130 function logMostVisitedImpression(tileIndex, tileSource) {
133 chrome.embeddedSearch.newTabPage.logMostVisitedImpression(tileIndex, 131 chrome.embeddedSearch.newTabPage.logMostVisitedImpression(tileIndex,
134 provider); 132 tileSource);
135 } 133 }
136 134
137 /** 135 /**
138 * Log click on a most visited tile on the NTP. 136 * Log click on an NTP tile.
139 * @param {number} tileIndex position of the tile, >= 0 and < NUMBER_OF_TILES 137 * @param {number} tileIndex Position of the tile, >= 0 and < NUMBER_OF_TILES.
140 * @param {string} provider specifies the UMA histogram to be reported 138 * @param {number} tileSource The source from TILE_SOURCE.
141 * (NewTabPage.SuggestionsImpression.{provider})
142 */ 139 */
143 function logMostVisitedNavigation(tileIndex, provider) { 140 function logMostVisitedNavigation(tileIndex, tileSource) {
144 chrome.embeddedSearch.newTabPage.logMostVisitedNavigation(tileIndex, 141 chrome.embeddedSearch.newTabPage.logMostVisitedNavigation(tileIndex,
145 provider); 142 tileSource);
146 } 143 }
147 144
148 /** 145 /**
149 * Down counts the DOM elements that we are waiting for the page to load. 146 * Down counts the DOM elements that we are waiting for the page to load.
150 * When we get to 0, we send a message to the parent window. 147 * When we get to 0, we send a message to the parent window.
151 * This is usually used as an EventListener of onload/onerror. 148 * This is usually used as an EventListener of onload/onerror.
152 */ 149 */
153 var countLoad = function() { 150 var countLoad = function() {
154 loadedCounter -= 1; 151 loadedCounter -= 1;
155 if (loadedCounter <= 0) { 152 if (loadedCounter <= 0) {
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 * @param {object} args Data for the tile to be rendered. 315 * @param {object} args Data for the tile to be rendered.
319 */ 316 */
320 var addTile = function(args) { 317 var addTile = function(args) {
321 if (isFinite(args.rid)) { 318 if (isFinite(args.rid)) {
322 // If a valid number passed in |args.rid|: a local chrome suggestion. 319 // If a valid number passed in |args.rid|: a local chrome suggestion.
323 var data = chrome.embeddedSearch.searchBox.getMostVisitedItemData(args.rid); 320 var data = chrome.embeddedSearch.searchBox.getMostVisitedItemData(args.rid);
324 if (!data) 321 if (!data)
325 return; 322 return;
326 323
327 data.tid = data.rid; 324 data.tid = data.rid;
328 data.provider = CLIENT_PROVIDER_NAME; 325 data.tileSource = TILE_SOURCE.NTP_TILE_SOURCE_CLIENT;
329 if (!data.faviconUrl) { 326 if (!data.faviconUrl) {
330 data.faviconUrl = 'chrome-search://favicon/size/16@' + 327 data.faviconUrl = 'chrome-search://favicon/size/16@' +
331 window.devicePixelRatio + 'x/' + data.renderViewId + '/' + data.tid; 328 window.devicePixelRatio + 'x/' + data.renderViewId + '/' + data.tid;
332 } 329 }
333 logEvent(LOG_TYPE.NTP_CLIENT_SIDE_SUGGESTION); 330 logEvent(LOG_TYPE.NTP_CLIENT_SIDE_SUGGESTION);
334 tiles.appendChild(renderTile(data)); 331 tiles.appendChild(renderTile(data));
335 } else if (args.url) { 332 } else if (args.url) {
336 // If a URL is passed: a server-side suggestion. 333 // If a URL is passed: a server-side suggestion.
337 args.provider = args.provider || SERVER_PROVIDER_NAME; 334 args.tileSource = TILE_SOURCE.NTP_TILE_SOURCE_SERVER;
338 // check sanity of the arguments 335 // check sanity of the arguments
339 if (/^javascript:/i.test(args.url) || 336 if (/^javascript:/i.test(args.url) ||
340 /^javascript:/i.test(args.thumbnailUrl) || 337 /^javascript:/i.test(args.thumbnailUrl))
341 !/^[a-z0-9]{0,8}$/i.test(args.provider))
342 return; 338 return;
343 logEvent(LOG_TYPE.NTP_SERVER_SIDE_SUGGESTION); 339 logEvent(LOG_TYPE.NTP_SERVER_SIDE_SUGGESTION);
344 tiles.appendChild(renderTile(args)); 340 tiles.appendChild(renderTile(args));
345 } else { // an empty tile 341 } else { // an empty tile
346 tiles.appendChild(renderTile(null)); 342 tiles.appendChild(renderTile(null));
347 } 343 }
348 }; 344 };
349 345
350 /** 346 /**
351 * Called when the user decided to add a tile to the blacklist. 347 * Called when the user decided to add a tile to the blacklist.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 var tile = document.createElement('a'); 381 var tile = document.createElement('a');
386 382
387 if (data == null) { 383 if (data == null) {
388 tile.className = 'mv-empty-tile'; 384 tile.className = 'mv-empty-tile';
389 return tile; 385 return tile;
390 } 386 }
391 387
392 logEvent(LOG_TYPE.NTP_TILE); 388 logEvent(LOG_TYPE.NTP_TILE);
393 // The tile will be appended to tiles. 389 // The tile will be appended to tiles.
394 var position = tiles.children.length; 390 var position = tiles.children.length;
395 if (data.provider) { 391 logMostVisitedImpression(position, data.tileSource);
396 logMostVisitedImpression(position, data.provider);
397 }
398 392
399 tile.className = 'mv-tile'; 393 tile.className = 'mv-tile';
400 tile.setAttribute('data-tid', data.tid); 394 tile.setAttribute('data-tid', data.tid);
401 var html = []; 395 var html = [];
402 if (!USE_ICONS) { 396 if (!USE_ICONS) {
403 html.push('<div class="mv-favicon"></div>'); 397 html.push('<div class="mv-favicon"></div>');
404 } 398 }
405 html.push('<div class="mv-title"></div><div class="mv-thumb"></div>'); 399 html.push('<div class="mv-title"></div><div class="mv-thumb"></div>');
406 html.push('<div class="mv-x"></div>'); 400 html.push('<div class="mv-x"></div>');
407 tile.innerHTML = html.join(''); 401 tile.innerHTML = html.join('');
408 tile.lastElementChild.title = queryArgs['removeTooltip'] || ''; 402 tile.lastElementChild.title = queryArgs['removeTooltip'] || '';
409 403
410 if (isSchemeAllowed(data.url)) { 404 if (isSchemeAllowed(data.url)) {
411 tile.href = data.url; 405 tile.href = data.url;
412 } 406 }
413 tile.title = data.title; 407 tile.title = data.title;
414 if (data.impressionUrl) { 408 if (data.impressionUrl) {
415 impressionUrl = data.impressionUrl; 409 impressionUrl = data.impressionUrl;
416 } 410 }
417 if (data.pingUrl) { 411 if (data.pingUrl) {
418 tile.addEventListener('click', function(ev) { 412 tile.addEventListener('click', function(ev) {
419 navigator.sendBeacon(data.pingUrl); 413 navigator.sendBeacon(data.pingUrl);
420 }); 414 });
421 } 415 }
422 416
423 tile.addEventListener('click', function(ev) { 417 tile.addEventListener('click', function(ev) {
424 if (data.provider) { 418 logMostVisitedNavigation(position, data.tileSource);
425 logMostVisitedNavigation(position, data.provider);
426 }
427 }); 419 });
428 420
429 tile.addEventListener('keydown', function(event) { 421 tile.addEventListener('keydown', function(event) {
430 if (event.keyCode == 46 /* DELETE */ || 422 if (event.keyCode == 46 /* DELETE */ ||
431 event.keyCode == 8 /* BACKSPACE */) { 423 event.keyCode == 8 /* BACKSPACE */) {
432 event.preventDefault(); 424 event.preventDefault();
433 event.stopPropagation(); 425 event.stopPropagation();
434 blacklistTile(this); 426 blacklistTile(this);
435 } else if (event.keyCode == 13 /* ENTER */ || 427 } else if (event.keyCode == 13 /* ENTER */ ||
436 event.keyCode == 32 /* SPACE */) { 428 event.keyCode == 32 /* SPACE */) {
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 var html = document.querySelector('html'); 637 var html = document.querySelector('html');
646 html.dir = 'rtl'; 638 html.dir = 'rtl';
647 } 639 }
648 640
649 window.addEventListener('message', handlePostMessage); 641 window.addEventListener('message', handlePostMessage);
650 }; 642 };
651 643
652 644
653 window.addEventListener('DOMContentLoaded', init); 645 window.addEventListener('DOMContentLoaded', init);
654 })(); 646 })();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698