Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 /** |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 271 /** | 271 /** |
| 272 * Called when the host page wants to add a suggestion tile. | 272 * Called when the host page wants to add a suggestion tile. |
| 273 * For Most Visited, it grabs the data from Chrome and pass on. | 273 * For Most Visited, it grabs the data from Chrome and pass on. |
| 274 * For host page generated it just passes the data. | 274 * For host page generated it just passes the data. |
| 275 * @param {object} args Data for the tile to be rendered. | 275 * @param {object} args Data for the tile to be rendered. |
| 276 */ | 276 */ |
| 277 var addTile = function(args) { | 277 var addTile = function(args) { |
| 278 if (args.rid) { | 278 if (args.rid) { |
| 279 var data = chrome.embeddedSearch.searchBox.getMostVisitedItemData(args.rid); | 279 var data = chrome.embeddedSearch.searchBox.getMostVisitedItemData(args.rid); |
| 280 data.tid = data.rid; | 280 data.tid = data.rid; |
| 281 data.thumbnailUrl = [data.thumbnailUrl]; | |
|
huangs
2015/05/11 20:31:16
This is hacky, please have:
data.thumbnailUrlLis
fserb
2015/05/11 20:39:56
Done.
| |
| 281 data.faviconUrl = 'chrome-search://favicon/size/16@' + | 282 data.faviconUrl = 'chrome-search://favicon/size/16@' + |
| 282 window.devicePixelRatio + 'x/' + data.renderViewId + '/' + data.tid; | 283 window.devicePixelRatio + 'x/' + data.renderViewId + '/' + data.tid; |
| 283 tiles.appendChild(renderTile(data)); | 284 tiles.appendChild(renderTile(data)); |
| 284 logEvent(LOG_TYPE.NTP_CLIENT_SIDE_SUGGESTION); | 285 logEvent(LOG_TYPE.NTP_CLIENT_SIDE_SUGGESTION); |
| 285 } else if (args.id) { | 286 } else if (args.id) { |
| 286 tiles.appendChild(renderTile(args)); | 287 tiles.appendChild(renderTile(args)); |
| 287 logEvent(LOG_TYPE.NTP_SERVER_SIDE_SUGGESTION); | 288 logEvent(LOG_TYPE.NTP_SERVER_SIDE_SUGGESTION); |
| 288 } else { | 289 } else { |
| 289 tiles.appendChild(renderTile(null)); | 290 tiles.appendChild(renderTile(null)); |
| 290 } | 291 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 349 logEvent(LOG_TYPE.NTP_MOUSEOVER); | 350 logEvent(LOG_TYPE.NTP_MOUSEOVER); |
| 350 }); | 351 }); |
| 351 | 352 |
| 352 var title = tile.querySelector('.mv-title'); | 353 var title = tile.querySelector('.mv-title'); |
| 353 title.innerText = data.title; | 354 title.innerText = data.title; |
| 354 title.style.direction = data.direction || 'ltr'; | 355 title.style.direction = data.direction || 'ltr'; |
| 355 if (NUM_TITLE_LINES > 1) { | 356 if (NUM_TITLE_LINES > 1) { |
| 356 title.classList.add('multiline'); | 357 title.classList.add('multiline'); |
| 357 } | 358 } |
| 358 | 359 |
| 359 var hasIcon = USE_ICONS && data.largeIconUrl; | 360 if (USE_ICONS) { |
| 360 var hasThumb = !USE_ICONS && data.thumbnailUrl; | 361 var thumb = tile.querySelector('.mv-thumb'); |
| 361 var thumb = tile.querySelector('.mv-thumb'); | 362 if (data.largeIconUrl) { |
| 362 if (hasIcon || hasThumb) { | 363 var img = document.createElement('img'); |
| 363 var img = document.createElement('img'); | 364 img.title = data.title; |
| 364 img.title = data.title; | |
| 365 if (hasIcon) { | |
| 366 img.src = data.largeIconUrl; | 365 img.src = data.largeIconUrl; |
| 367 img.classList.add('large-icon'); | 366 img.classList.add('large-icon'); |
| 368 } else { // hasThumb | 367 loadedCounter += 1; |
| 369 img.src = data.thumbnailUrl; | 368 img.addEventListener('load', countLoad); |
| 370 img.classList.add('thumbnail'); | |
| 371 } | |
| 372 loadedCounter += 1; | |
| 373 img.addEventListener('load', countLoad); | |
| 374 if (data.largeIconUrl) { | |
| 375 img.addEventListener('load', function(ev) { | 369 img.addEventListener('load', function(ev) { |
| 376 thumb.classList.add('large-icon-outer'); | 370 thumb.classList.add('large-icon-outer'); |
| 377 }); | 371 }); |
| 372 img.addEventListener('error', countLoad); | |
| 373 img.addEventListener('error', function(ev) { | |
| 374 thumb.classList.add('failed-img'); | |
| 375 thumb.removeChild(img); | |
| 376 logEvent(LOG_TYPE.NTP_THUMBNAIL_ERROR); | |
| 377 }); | |
| 378 thumb.appendChild(img); | |
| 379 logEvent(LOG_TYPE.NTP_THUMBNAIL_TILE); | |
| 380 } else { | |
| 381 thumb.classList.add('failed-img'); | |
| 378 } | 382 } |
| 383 } else { // THUMBNAILS | |
| 384 var thumb = tile.querySelector('.mv-thumb'); | |
| 385 | |
|
Mathieu
2015/05/11 20:27:24
nit: extra newline
fserb
2015/05/11 20:39:56
Done.
| |
| 386 var img = document.createElement('img'); | |
| 387 var loaded = false; | |
| 388 var results = []; | |
|
Mathieu
2015/05/11 20:27:24
Add a comment like: // Used to keep track of loadi
fserb
2015/05/11 20:39:56
Done.
| |
| 389 | |
| 390 var loadBestImage = function() { | |
| 391 if (loaded) return; | |
|
huangs
2015/05/11 20:31:16
Move return to next line.
fserb
2015/05/11 20:39:56
Done.
| |
| 392 for (i = 0; i < results.length; ++i) { | |
| 393 if (results[i] === null) return; | |
|
huangs
2015/05/11 20:31:16
Move return to next line.
fserb
2015/05/11 20:39:56
Done.
| |
| 394 if (results[i] != false) { | |
| 395 img.src = results[i]; | |
| 396 loaded = true; | |
| 397 return; | |
| 398 } | |
| 399 } | |
| 400 thumb.classList.add('failed-img'); | |
| 401 thumb.removeChild(img); | |
| 402 logEvent(LOG_TYPE.NTP_THUMBNAIL_ERROR); | |
| 403 }; | |
| 404 | |
| 405 var acceptImage = function(idx, url) { | |
| 406 return function(ev) { | |
| 407 results[idx] = url; | |
| 408 loadBestImage(); | |
| 409 }; | |
| 410 }; | |
| 411 | |
| 412 var rejectImage = function(i) { | |
|
huangs
2015/05/11 20:31:16
This |i| is a number.
fserb
2015/05/11 20:39:56
Done.
| |
| 413 return function(ev) { | |
| 414 results[i] = false; | |
| 415 loadBestImage(); | |
| 416 }; | |
| 417 }; | |
| 418 | |
| 419 var images = []; | |
|
Mathieu
2015/05/11 20:27:24
remove
fserb
2015/05/11 20:39:56
Done.
| |
| 420 | |
| 421 for (var t = 0; t < data.thumbnailUrl.length; ++t) { | |
|
Mathieu
2015/05/11 20:27:24
could you add a comment above saying that the best
fserb
2015/05/11 20:39:56
Done.
| |
| 422 results.push(null); | |
| 423 var i = new Image(); | |
|
huangs
2015/05/11 20:31:16
This |i| is an Image, and |t| is now the index. P
fserb
2015/05/11 20:39:56
Done.
| |
| 424 i.src = data.thumbnailUrl[t]; | |
|
Mathieu
2015/05/11 20:28:58
does it completely poop out if data.thumbnailUrl i
fserb
2015/05/11 20:39:56
it does get an onerror for undefined. But I added
| |
| 425 i.onload = acceptImage(t, data.thumbnailUrl[t]); | |
| 426 i.onerror = rejectImage(t); | |
| 427 } | |
| 428 | |
| 429 img.title = data.title; | |
| 430 img.classList.add('thumbnail'); | |
| 431 loadedCounter += 1; | |
| 432 img.addEventListener('load', countLoad); | |
| 379 img.addEventListener('error', countLoad); | 433 img.addEventListener('error', countLoad); |
| 380 img.addEventListener('error', function(ev) { | 434 img.addEventListener('error', function(ev) { |
| 381 thumb.classList.add('failed-img'); | 435 thumb.classList.add('failed-img'); |
| 382 thumb.removeChild(img); | 436 thumb.removeChild(img); |
| 383 logEvent(LOG_TYPE.NTP_THUMBNAIL_ERROR); | 437 logEvent(LOG_TYPE.NTP_THUMBNAIL_ERROR); |
| 384 }); | 438 }); |
| 385 thumb.appendChild(img); | 439 thumb.appendChild(img); |
| 386 logEvent(LOG_TYPE.NTP_THUMBNAIL_TILE); | 440 logEvent(LOG_TYPE.NTP_THUMBNAIL_TILE); |
| 387 } else { | |
| 388 thumb.classList.add('failed-img'); | |
| 389 } | |
| 390 | 441 |
| 391 if (!USE_ICONS) { | |
| 392 var favicon = tile.querySelector('.mv-favicon'); | 442 var favicon = tile.querySelector('.mv-favicon'); |
| 393 if (data.faviconUrl) { | 443 if (data.faviconUrl) { |
| 394 var fi = document.createElement('img'); | 444 var fi = document.createElement('img'); |
| 395 fi.src = data.faviconUrl; | 445 fi.src = data.faviconUrl; |
| 396 // Set the title to empty so screen readers won't say the image name. | 446 // Set the title to empty so screen readers won't say the image name. |
| 397 fi.title = ''; | 447 fi.title = ''; |
| 398 loadedCounter += 1; | 448 loadedCounter += 1; |
| 399 fi.addEventListener('load', countLoad); | 449 fi.addEventListener('load', countLoad); |
| 400 fi.addEventListener('error', countLoad); | 450 fi.addEventListener('error', countLoad); |
| 401 fi.addEventListener('error', function(ev) { | 451 fi.addEventListener('error', function(ev) { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 452 var html = document.querySelector('html'); | 502 var html = document.querySelector('html'); |
| 453 html.dir = 'rtl'; | 503 html.dir = 'rtl'; |
| 454 } | 504 } |
| 455 | 505 |
| 456 window.addEventListener('message', handlePostMessage); | 506 window.addEventListener('message', handlePostMessage); |
| 457 }; | 507 }; |
| 458 | 508 |
| 459 | 509 |
| 460 window.addEventListener('DOMContentLoaded', init); | 510 window.addEventListener('DOMContentLoaded', init); |
| 461 })(); | 511 })(); |
| OLD | NEW |