Index: chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
index 630ad2fd63f5863c496353ecfa916084f2cd9656..a90b8c7e449de16a4c5240bceba963066f7a6f02 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
@@ -104,6 +104,7 @@ import org.chromium.printing.PrintManagerDelegateImpl; |
import org.chromium.printing.PrintingController; |
import org.chromium.printing.PrintingControllerImpl; |
import org.chromium.ui.WindowOpenDisposition; |
+import org.chromium.ui.base.DeviceFormFactor; |
import org.chromium.ui.base.LocalizationUtils; |
import org.chromium.ui.base.PageTransition; |
import org.chromium.ui.base.WindowAndroid; |
@@ -371,6 +372,7 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
private View mSadTabView; |
private final int mDefaultThemeColor; |
+ private int mThemeColor; |
private ChromeDownloadDelegate mDownloadDelegate; |
@@ -560,6 +562,12 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
PolicyAuditor.nativeGetCertificateFailure(getWebContents()), |
getApplicationContext()); |
updateFullscreenEnabledState(); |
+ updateThemeColorIfNeeded(); |
+ } |
+ |
+ @Override |
+ public void onUrlUpdated(Tab tab) { |
+ updateThemeColorIfNeeded(); |
} |
@Override |
@@ -630,9 +638,11 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
mDefaultThemeColor = mIncognito |
? ApiCompatibilityUtils.getColor(resources, R.color.incognito_primary_color) |
: ApiCompatibilityUtils.getColor(resources, R.color.default_primary_color); |
+ mThemeColor = calculateThemeColor(); |
} else { |
mIdealFaviconSize = 16; |
mDefaultThemeColor = 0; |
+ mThemeColor = mDefaultThemeColor; |
} |
// Restore data from the TabState, if it existed. |
@@ -1051,9 +1061,48 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
* security state. |
*/ |
public int getThemeColor() { |
+ return mThemeColor; |
+ } |
+ |
+ private int calculateThemeColor() { |
+ // Theme color support is currently disabled for tablets. |
+ if (DeviceFormFactor.isTablet(getApplicationContext())) return getDefaultThemeColor(); |
+ |
if (isNativePage()) return mNativePage.getThemeColor(); |
- if (mWebContentsObserver != null) return mWebContentsObserver.getThemeColor(); |
- return mDefaultThemeColor; |
+ |
+ int themeColor = getDefaultThemeColor(); |
+ if (getWebContents() != null) themeColor = getWebContents().getThemeColor(); |
+ |
+ // Do not apply the theme color if there are any security issues on the page. |
+ int securityLevel = getSecurityLevel(); |
+ if (securityLevel == ConnectionSecurityLevel.SECURITY_ERROR |
+ || securityLevel == ConnectionSecurityLevel.SECURITY_WARNING |
+ || securityLevel == ConnectionSecurityLevel.SECURITY_POLICY_WARNING) { |
+ themeColor = getDefaultThemeColor(); |
+ } |
+ |
+ if (isShowingInterstitialPage()) themeColor = getDefaultThemeColor(); |
+ |
+ if (themeColor == Color.TRANSPARENT) themeColor = getDefaultThemeColor(); |
+ if (isIncognito()) themeColor = getDefaultThemeColor(); |
+ |
+ // Ensure there is no alpha component to the theme color as that is not supported in the |
+ // dependent UI. |
+ themeColor |= 0xFF000000; |
+ return themeColor; |
+ } |
+ |
+ /** |
+ * Determines if the theme color has changed and notifies the listeners if it has. |
+ */ |
+ void updateThemeColorIfNeeded() { |
+ int themeColor = calculateThemeColor(); |
+ if (themeColor == mThemeColor) return; |
+ mThemeColor = themeColor; |
+ RewindableIterator<TabObserver> observers = getTabObservers(); |
+ while (observers.hasNext()) { |
+ observers.next().onDidChangeThemeColor(this, themeColor); |
+ } |
} |
/** |
@@ -1315,9 +1364,7 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
// Notifying of theme color change before content change because some of |
// the observers depend on the theme information being correct in |
// onContentChanged(). |
- for (TabObserver observer : mObservers) { |
- observer.onDidChangeThemeColor(this, mDefaultThemeColor); |
- } |
+ updateThemeColorIfNeeded(); |
notifyContentChanged(); |
destroyNativePageInternal(previousNativePage); |
} |
@@ -1800,6 +1847,7 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
mSwipeRefreshHandler = new SwipeRefreshHandler(mThemedApplicationContext); |
mSwipeRefreshHandler.setContentViewCore(mContentViewCore); |
+ updateThemeColorIfNeeded(); |
notifyContentChanged(); |
// For browser tabs, we want to set accessibility focus to the page |
@@ -2457,8 +2505,6 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
} |
destroyNativePageInternal(previousNativePage); |
- mWebContentsObserver.didChangeThemeColor( |
- getWebContents().getThemeColor(mDefaultThemeColor)); |
for (TabObserver observer : mObservers) { |
observer.onWebContentsSwapped(this, didStartLoad, didFinishLoad); |
} |