Index: chrome/android/java/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetector.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetector.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetector.java |
index 1420c9a641be72d061425d213bfac3592a4a3b1c..e7f78fe7a9579c4ccf093a231636d44038d3ee0e 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetector.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetector.java |
@@ -8,7 +8,8 @@ import android.text.TextUtils; |
import org.chromium.chrome.browser.tab.Tab; |
import org.chromium.chrome.browser.util.UrlUtilities; |
-import org.chromium.chrome.browser.webapps.ManifestUpgradeDetectorFetcher.FetchedManifestData; |
+ |
+import java.util.Map; |
/** |
* This class checks whether the WebAPK needs to be re-installed and sends a request to re-install |
@@ -23,20 +24,24 @@ public class ManifestUpgradeDetector implements ManifestUpgradeDetectorFetcher.C |
* TODO(pkotwicz): Add calls to {@link #onFinishedFetchingWebManifestForInitialUrl()}. |
* @param needsUpgrade Whether the WebAPK should be updated because the Web Manifest has |
* changed. False if the Web Manifest could not be fetched. |
- * @param data The fetched Web Manifest data. Null if the initial URL does not point |
+ * @param info The fetched Web Manifest data. Null if the initial URL does not point |
* to a Web Manifest. |
+ * @param bestIconUrl The icon URL in {@link WebApkInfo#iconUrlToMurmur2HashMap()} best |
+ * suited for use as the launcher icon on this device. |
*/ |
void onFinishedFetchingWebManifestForInitialUrl( |
- boolean needsUpgrade, FetchedManifestData data); |
+ boolean needsUpgrade, WebApkInfo info, String bestIconUrl); |
/** |
* Called when the Web Manifest has been successfully fetched (including on the initial URL |
* load). |
* @param needsUpgrade Whether the WebAPK should be updated because the Web Manifest has |
- * changed. |
- * @param data The fetched Web Manifest data. |
+ * changed. |
+ * @param info The fetched Web Manifest data. |
+ * @param bestIconUrl The icon URL in {@link WebApkInfo#iconUrlToMurmur2HashMap()} best |
+ * suited for use as the launcher icon on this device. |
*/ |
- void onGotManifestData(boolean needsUpgrade, FetchedManifestData data); |
+ void onGotManifestData(boolean needsUpgrade, WebApkInfo info, String bestIconUrl); |
} |
private static final String TAG = "cr_UpgradeDetector"; |
@@ -47,7 +52,7 @@ public class ManifestUpgradeDetector implements ManifestUpgradeDetectorFetcher.C |
/** |
* Web Manifest data at time that the WebAPK was generated. |
*/ |
- private WebApkMetaData mMetaData; |
+ private WebApkInfo mInfo; |
/** |
* Fetches the WebAPK's Web Manifest from the web. |
@@ -61,12 +66,12 @@ public class ManifestUpgradeDetector implements ManifestUpgradeDetectorFetcher.C |
* @param tab WebAPK's tab. |
* @param webappInfo Parameters used for generating the WebAPK. Extracted from WebAPK's Android |
* manifest. |
- * @param metadata Metadata from WebAPK's Android Manifest. |
- * @param callback Called once it has been determined whether the WebAPK needs to be upgraded. |
+ * @param info Web Manifest data at the time that the WebAPK was generated. |
+ * @param callback Called once it has been determined whether the WebAPK needs to be upgraded. |
*/ |
- public ManifestUpgradeDetector(Tab tab, WebApkMetaData metaData, Callback callback) { |
+ public ManifestUpgradeDetector(Tab tab, WebApkInfo info, Callback callback) { |
mTab = tab; |
- mMetaData = metaData; |
+ mInfo = info; |
mCallback = callback; |
} |
@@ -76,12 +81,8 @@ public class ManifestUpgradeDetector implements ManifestUpgradeDetectorFetcher.C |
public boolean start() { |
if (mFetcher != null) return false; |
- if (TextUtils.isEmpty(mMetaData.manifestUrl)) { |
- return false; |
- } |
- |
mFetcher = createFetcher(); |
- return mFetcher.start(mTab, mMetaData.scope, mMetaData.manifestUrl, this); |
+ return mFetcher.start(mTab, mInfo, this); |
} |
/** |
@@ -105,32 +106,51 @@ public class ManifestUpgradeDetector implements ManifestUpgradeDetectorFetcher.C |
* Called when the updated Web Manifest has been fetched. |
*/ |
@Override |
- public void onGotManifestData(FetchedManifestData fetchedData) { |
+ public void onGotManifestData(WebApkInfo fetchedInfo, String bestIconUrl) { |
mFetcher.destroy(); |
mFetcher = null; |
// TODO(hanxi): crbug.com/627824. Validate whether the new fetched data is |
// WebAPK-compatible. |
- boolean upgrade = needsUpgrade(fetchedData); |
- mCallback.onGotManifestData(upgrade, fetchedData); |
+ boolean upgrade = needsUpgrade(fetchedInfo, bestIconUrl); |
+ mCallback.onGotManifestData(upgrade, fetchedInfo, bestIconUrl); |
} |
/** |
* Checks whether the WebAPK needs to be upgraded provided the fetched manifest data. |
*/ |
- private boolean needsUpgrade(FetchedManifestData fetchedData) { |
- String metaDataBestIconMurmur2Hash = |
- mMetaData.iconUrlAndIconMurmur2HashMap.get(fetchedData.bestIconUrl); |
- |
- return !TextUtils.equals(metaDataBestIconMurmur2Hash, fetchedData.bestIconMurmur2Hash) |
- || !urlsMatchIgnoringFragments(mMetaData.scope, fetchedData.scopeUrl) |
- || !urlsMatchIgnoringFragments(mMetaData.startUrl, fetchedData.startUrl) |
- || !TextUtils.equals(mMetaData.shortName, fetchedData.shortName) |
- || !TextUtils.equals(mMetaData.name, fetchedData.name) |
- || mMetaData.backgroundColor != fetchedData.backgroundColor |
- || mMetaData.themeColor != fetchedData.themeColor |
- || mMetaData.orientation != fetchedData.orientation |
- || mMetaData.displayMode != fetchedData.displayMode; |
+ private boolean needsUpgrade(WebApkInfo fetchedInfo, String bestIconUrl) { |
+ // We should have computed the Murmur2 hash for the bitmap at the best icon URL for |
+ // {@link fetchedInfo} (but not the other icon URLs.) |
+ String fetchedBestIconMurmur2Hash = fetchedInfo.iconUrlToMurmur2HashMap().get(bestIconUrl); |
+ String bestIconMurmur2Hash = |
+ findMurmur2HashForUrlIgnoringFragment(mInfo.iconUrlToMurmur2HashMap(), bestIconUrl); |
+ |
+ return !TextUtils.equals(bestIconMurmur2Hash, fetchedBestIconMurmur2Hash) |
+ || !urlsMatchIgnoringFragments( |
+ mInfo.scopeUri().toString(), fetchedInfo.scopeUri().toString()) |
+ || !urlsMatchIgnoringFragments( |
+ mInfo.manifestStartUrl(), fetchedInfo.manifestStartUrl()) |
+ || !TextUtils.equals(mInfo.shortName(), fetchedInfo.shortName()) |
+ || !TextUtils.equals(mInfo.name(), fetchedInfo.name()) |
+ || mInfo.backgroundColor() != fetchedInfo.backgroundColor() |
+ || mInfo.themeColor() != fetchedInfo.themeColor() |
+ || mInfo.orientation() != fetchedInfo.orientation() |
+ || mInfo.displayMode() != fetchedInfo.displayMode(); |
+ } |
+ |
+ /** |
+ * Returns the Murmur2 hash for entry in {@link iconUrlToMurmur2HashMap} whose canonical |
+ * representation, ignoring fragments, matches {@link iconUrlToMatch}. |
+ */ |
+ private String findMurmur2HashForUrlIgnoringFragment( |
+ Map<String, String> iconUrlToMurmur2HashMap, String iconUrlToMatch) { |
+ for (Map.Entry<String, String> entry : iconUrlToMurmur2HashMap.entrySet()) { |
+ if (urlsMatchIgnoringFragments(entry.getKey(), iconUrlToMatch)) { |
+ return entry.getValue(); |
+ } |
+ } |
+ return null; |
} |
/** |