Index: chrome/browser/resources/history/history.js |
diff --git a/chrome/browser/resources/history/history.js b/chrome/browser/resources/history/history.js |
index 6429683e0abd53abbdeb83bb7c384e7031eb5f60..1f1c40b9a6c229355ae6ed6627b5d2d323d67d47 100644 |
--- a/chrome/browser/resources/history/history.js |
+++ b/chrome/browser/resources/history/history.js |
@@ -92,6 +92,7 @@ function Visit(result, continued, model) { |
this.url_ = result.url; |
this.domain_ = result.domain; |
this.starred_ = result.starred; |
+ this.fallbackFaviconText_ = result.fallbackFaviconText; |
// These identify the name and type of the device on which this visit |
// occurred. They will be empty if the visit occurred on the current device. |
@@ -219,6 +220,15 @@ Visit.prototype.getResultDOM = function(propertyBag) { |
entryBox.appendChild(bookmarkSection); |
+ if (addTitleFavicon || this.blockedVisit) { |
+ var faviconSection = createElementWithClassName('div', 'favicon'); |
+ if (this.blockedVisit) |
+ faviconSection.classList.add('blocked-icon'); |
+ else |
+ this.loadFavicon_(faviconSection); |
+ entryBox.appendChild(faviconSection); |
+ } |
+ |
var visitEntryWrapper = /** @type {HTMLElement} */( |
entryBox.appendChild(document.createElement('div'))); |
if (addTitleFavicon || this.blockedVisit) |
@@ -230,9 +240,6 @@ Visit.prototype.getResultDOM = function(propertyBag) { |
var title = visitEntryWrapper.appendChild( |
this.getTitleDOM_(isSearchResult)); |
- if (addTitleFavicon) |
- this.addFaviconToElement_(visitEntryWrapper); |
- |
if (focusless) |
title.querySelector('a').tabIndex = -1; |
@@ -440,15 +447,42 @@ Visit.prototype.getVisitAttemptDOM_ = function() { |
}; |
/** |
- * Set the favicon for an element. |
- * @param {Element} el The DOM element to which to add the icon. |
+ * Load the favicon for an element. |
+ * @param {Element} faviconDiv The DOM element for which to load the icon. |
* @private |
*/ |
-Visit.prototype.addFaviconToElement_ = function(el) { |
- var url = isMobileVersion() ? |
- getFaviconImageSet(this.url_, 32, 'touch-icon') : |
- getFaviconImageSet(this.url_); |
- el.style.backgroundImage = url; |
+Visit.prototype.loadFavicon_ = function(faviconDiv) { |
+ if (cr.isAndroid) { |
+ // On Android, if a large icon is unavailable, an HTML/CSS fallback favicon |
+ // is generated because Android does not yet support text drawing in native. |
+ |
+ // Check whether a fallback favicon needs to be generated. |
+ var desiredPixelSize = 32 * window.devicePixelRatio; |
+ var img = new Image(); |
+ img.onload = this.onLargeFaviconLoadedAndroid_.bind(this, faviconDiv); |
+ img.src = 'chrome://large-icon/' + desiredPixelSize + '/' + this.url_; |
+ } else { |
+ faviconDiv.style.backgroundImage = getFaviconImageSet(this.url_); |
+ } |
+}; |
+ |
+/** |
+ * Called when the chrome://large-icon image has finished loading. |
+ * @param {Element} faviconDiv The DOM element to add the favicon to. |
+ * @param {Event} event The onload event. |
+ * @private |
+ */ |
+Visit.prototype.onLargeFaviconLoadedAndroid_ = function(faviconDiv, event) { |
+ // The loaded image should either: |
+ // - Have the desired size. |
+ // OR |
+ // - Be 1x1 px with the background color for the fallback icon. |
+ var loadedImg = event.target; |
+ if (loadedImg.width == 1) { |
+ faviconDiv.classList.add('fallback-favicon'); |
+ faviconDiv.textContent = this.fallbackFaviconText_; |
+ } |
+ faviconDiv.style.backgroundImage = url(loadedImg.src); |
}; |
/** |
@@ -1341,6 +1375,8 @@ HistoryView.prototype.getGroupedVisitsDOM_ = function( |
var siteArrow = siteDomainRow.appendChild( |
createElementWithClassName('div', 'site-domain-arrow')); |
+ var siteFavicon = siteDomainRow.appendChild( |
+ createElementWithClassName('div', 'favicon')); |
var siteDomain = siteDomainRow.appendChild( |
createElementWithClassName('div', 'site-domain')); |
var siteDomainLink = siteDomain.appendChild(new ActionLink); |
@@ -1352,7 +1388,7 @@ HistoryView.prototype.getGroupedVisitsDOM_ = function( |
domainVisits.length); |
siteDomain.appendChild(numberOfVisits); |
- domainVisits[0].addFaviconToElement_(siteDomain); |
+ domainVisits[0].loadFavicon_(siteFavicon); |
siteDomainWrapper.addEventListener( |
'click', this.toggleGroupedVisits_.bind(this)); |