| 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 package org.chromium.chrome.browser.document; | 5 package org.chromium.chrome.browser.document; |
| 6 | 6 |
| 7 import android.annotation.TargetApi; | 7 import android.annotation.TargetApi; |
| 8 import android.content.Intent; | 8 import android.content.Intent; |
| 9 import android.graphics.Bitmap; | 9 import android.graphics.Bitmap; |
| 10 import android.os.Build; | 10 import android.os.Build; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 import org.chromium.base.library_loader.LibraryLoader; | 22 import org.chromium.base.library_loader.LibraryLoader; |
| 23 import org.chromium.base.metrics.RecordUserAction; | 23 import org.chromium.base.metrics.RecordUserAction; |
| 24 import org.chromium.chrome.R; | 24 import org.chromium.chrome.R; |
| 25 import org.chromium.chrome.browser.ChromeActivity; | 25 import org.chromium.chrome.browser.ChromeActivity; |
| 26 import org.chromium.chrome.browser.ChromeApplication; | 26 import org.chromium.chrome.browser.ChromeApplication; |
| 27 import org.chromium.chrome.browser.IntentHandler; | 27 import org.chromium.chrome.browser.IntentHandler; |
| 28 import org.chromium.chrome.browser.KeyboardShortcuts; | 28 import org.chromium.chrome.browser.KeyboardShortcuts; |
| 29 import org.chromium.chrome.browser.TabState; | 29 import org.chromium.chrome.browser.TabState; |
| 30 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChange
Reason; | 30 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChange
Reason; |
| 31 import org.chromium.chrome.browser.compositor.layouts.LayoutManagerDocument; | 31 import org.chromium.chrome.browser.compositor.layouts.LayoutManagerDocument; |
| 32 import org.chromium.chrome.browser.document.DocumentTab.DocumentTabObserver; | |
| 33 import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkUtils; | 32 import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkUtils; |
| 34 import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor; | 33 import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor; |
| 35 import org.chromium.chrome.browser.firstrun.FirstRunStatus; | 34 import org.chromium.chrome.browser.firstrun.FirstRunStatus; |
| 36 import org.chromium.chrome.browser.metrics.StartupMetrics; | 35 import org.chromium.chrome.browser.metrics.StartupMetrics; |
| 37 import org.chromium.chrome.browser.metrics.UmaUtils; | 36 import org.chromium.chrome.browser.metrics.UmaUtils; |
| 38 import org.chromium.chrome.browser.ntp.NewTabPage; | 37 import org.chromium.chrome.browser.ntp.NewTabPage; |
| 39 import org.chromium.chrome.browser.preferences.ChromePreferenceManager; | 38 import org.chromium.chrome.browser.preferences.ChromePreferenceManager; |
| 40 import org.chromium.chrome.browser.preferences.PrefServiceBridge; | 39 import org.chromium.chrome.browser.preferences.PrefServiceBridge; |
| 41 import org.chromium.chrome.browser.preferences.datareduction.DataReductionPrefer
ences; | 40 import org.chromium.chrome.browser.preferences.datareduction.DataReductionPrefer
ences; |
| 42 import org.chromium.chrome.browser.preferences.datareduction.DataReductionPromoS
creen; | 41 import org.chromium.chrome.browser.preferences.datareduction.DataReductionPromoS
creen; |
| 43 import org.chromium.chrome.browser.signin.SigninPromoScreen; | 42 import org.chromium.chrome.browser.signin.SigninPromoScreen; |
| 44 import org.chromium.chrome.browser.ssl.ConnectionSecurityLevel; | 43 import org.chromium.chrome.browser.ssl.ConnectionSecurityLevel; |
| 44 import org.chromium.chrome.browser.tab.EmptyTabObserver; |
| 45 import org.chromium.chrome.browser.tab.Tab; | 45 import org.chromium.chrome.browser.tab.Tab; |
| 46 import org.chromium.chrome.browser.tab.TabUma.TabCreationState; | 46 import org.chromium.chrome.browser.tab.TabUma.TabCreationState; |
| 47 import org.chromium.chrome.browser.tabmodel.SingleTabModelSelector; | 47 import org.chromium.chrome.browser.tabmodel.SingleTabModelSelector; |
| 48 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; | 48 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
| 49 import org.chromium.chrome.browser.tabmodel.document.ActivityDelegate; | 49 import org.chromium.chrome.browser.tabmodel.document.ActivityDelegate; |
| 50 import org.chromium.chrome.browser.tabmodel.document.AsyncTabCreationParams; | 50 import org.chromium.chrome.browser.tabmodel.document.AsyncTabCreationParams; |
| 51 import org.chromium.chrome.browser.tabmodel.document.AsyncTabCreationParamsManag
er; | 51 import org.chromium.chrome.browser.tabmodel.document.AsyncTabCreationParamsManag
er; |
| 52 import org.chromium.chrome.browser.tabmodel.document.DocumentTabModel; | 52 import org.chromium.chrome.browser.tabmodel.document.DocumentTabModel; |
| 53 import org.chromium.chrome.browser.tabmodel.document.DocumentTabModel.Initializa
tionObserver; | 53 import org.chromium.chrome.browser.tabmodel.document.DocumentTabModel.Initializa
tionObserver; |
| 54 import org.chromium.chrome.browser.tabmodel.document.DocumentTabModelImpl; | 54 import org.chromium.chrome.browser.tabmodel.document.DocumentTabModelImpl; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 80 "com.google.android.apps.chrome.document.IncognitoDocumentActivity"; | 80 "com.google.android.apps.chrome.document.IncognitoDocumentActivity"; |
| 81 | 81 |
| 82 protected static final String KEY_INITIAL_URL = "DocumentActivity.KEY_INITIA
L_URL"; | 82 protected static final String KEY_INITIAL_URL = "DocumentActivity.KEY_INITIA
L_URL"; |
| 83 | 83 |
| 84 private static final String TAG = "DocumentActivity"; | 84 private static final String TAG = "DocumentActivity"; |
| 85 | 85 |
| 86 // Animation exit duration defined in chrome/android/java/res/anim/menu_exit
.xml as 150ms, | 86 // Animation exit duration defined in chrome/android/java/res/anim/menu_exit
.xml as 150ms, |
| 87 // plus add another 20ms for a re-layout. | 87 // plus add another 20ms for a re-layout. |
| 88 private static final int MENU_EXIT_ANIMATION_WAIT_MS = 170; | 88 private static final int MENU_EXIT_ANIMATION_WAIT_MS = 170; |
| 89 | 89 |
| 90 private class DocumentTabObserver extends EmptyTabObserver { |
| 91 @Override |
| 92 public void onPageLoadStarted(Tab tab, String url) { |
| 93 // Discard startup navigation measurements when the user interfered
and started the |
| 94 // 2nd navigation (in activity lifetime) in parallel. |
| 95 if (!sIsFirstPageLoadStart) { |
| 96 UmaUtils.setRunningApplicationStart(false); |
| 97 } else { |
| 98 sIsFirstPageLoadStart = false; |
| 99 } |
| 100 } |
| 101 |
| 102 @Override |
| 103 public void onWebContentsSwapped(Tab tab, boolean didStartLoad, boolean
didFinishLoad) { |
| 104 if (!didStartLoad) return; |
| 105 resetIcon(); |
| 106 } |
| 107 |
| 108 @Override |
| 109 public void onFaviconUpdated(Tab tab, Bitmap icon) { |
| 110 if (mLargestFavicon == null || icon.getWidth() > mLargestFavicon.get
Width() |
| 111 || icon.getHeight() > mLargestFavicon.getHeight()) { |
| 112 mLargestFavicon = icon; |
| 113 updateTaskDescription(); |
| 114 } |
| 115 } |
| 116 |
| 117 @Override |
| 118 public void onUrlUpdated(Tab tab) { |
| 119 assert mDocumentTab == tab; |
| 120 |
| 121 updateTaskDescription(); |
| 122 mTabModel.updateEntry(getIntent(), mDocumentTab); |
| 123 } |
| 124 |
| 125 @Override |
| 126 public void onTitleUpdated(Tab tab) { |
| 127 super.onTitleUpdated(tab); |
| 128 updateTaskDescription(); |
| 129 } |
| 130 |
| 131 @Override |
| 132 public void onSSLStateUpdated(Tab tab) { |
| 133 if (hasSecurityWarningOrError(tab)) resetIcon(); |
| 134 } |
| 135 |
| 136 @Override |
| 137 public void onDidNavigateMainFrame(Tab tab, String url, String baseUrl, |
| 138 boolean isNavigationToDifferentPage, boolean isFragmentNavigatio
n, |
| 139 int statusCode) { |
| 140 if (!isNavigationToDifferentPage) return; |
| 141 mLargestFavicon = null; |
| 142 } |
| 143 |
| 144 @Override |
| 145 public void onLoadStopped(Tab tab, boolean toDifferentDocument) { |
| 146 assert mDocumentTab == tab; |
| 147 |
| 148 updateTaskDescription(); |
| 149 mTabModel.updateEntry(getIntent(), mDocumentTab); |
| 150 } |
| 151 |
| 152 @Override |
| 153 public void onDidChangeThemeColor(Tab tab, int color) { |
| 154 updateTaskDescription(); |
| 155 } |
| 156 |
| 157 @Override |
| 158 public void onDidAttachInterstitialPage(Tab tab) { |
| 159 resetIcon(); |
| 160 } |
| 161 |
| 162 @Override |
| 163 public void onDidDetachInterstitialPage(Tab tab) { |
| 164 resetIcon(); |
| 165 } |
| 166 |
| 167 @Override |
| 168 public void onCrash(Tab tab, boolean sadTabShown) { |
| 169 int currentState = ApplicationStatus.getStateForActivity(DocumentAct
ivity.this); |
| 170 if (currentState != ActivityState.STOPPED) return; |
| 171 |
| 172 if (!isTaskRoot() || IntentUtils.safeGetBooleanExtra(getIntent(), |
| 173 IntentHandler.EXTRA_APPEND_TASK, false)) { |
| 174 return; |
| 175 } |
| 176 |
| 177 // Finishing backgrounded Activities whose renderers have crashed al
lows us to |
| 178 // destroy them and return resources sooner than if we wait for Andr
oid to destroy |
| 179 // the Activities themselves. Problematically, this also removes |
| 180 // IncognitoDocumentActivity instances from Android's Recents menu a
nd auto-closes |
| 181 // the tab. Instead, take a hit and keep the Activities alive -- An
droid will |
| 182 // eventually destroy the Activities, anyway (crbug.com/450292). |
| 183 if (!isIncognito()) finish(); |
| 184 } |
| 185 |
| 186 private boolean hasSecurityWarningOrError(Tab tab) { |
| 187 int securityLevel = tab.getSecurityLevel(); |
| 188 return securityLevel == ConnectionSecurityLevel.SECURITY_ERROR |
| 189 || securityLevel == ConnectionSecurityLevel.SECURITY_WARNING |
| 190 || securityLevel == ConnectionSecurityLevel.SECURITY_POLICY_
WARNING; |
| 191 } |
| 192 } |
| 90 private DocumentTabModel mTabModel; | 193 private DocumentTabModel mTabModel; |
| 91 private InitializationObserver mTabInitializationObserver; | 194 private InitializationObserver mTabInitializationObserver; |
| 92 | 195 |
| 93 /** | 196 /** |
| 94 * Generates the icon to use in the recent task list. | 197 * Generates the icon to use in the recent task list. |
| 95 */ | 198 */ |
| 96 private DocumentActivityIcon mIcon; | 199 private DocumentActivityIcon mIcon; |
| 97 | 200 |
| 98 /** | 201 /** |
| 99 * The tab's largest favicon. | 202 * The tab's largest favicon. |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 | 627 |
| 525 if (getContextualSearchManager() != null) { | 628 if (getContextualSearchManager() != null) { |
| 526 getContextualSearchManager().setFindToolbarManager(mFindToolbarManag
er); | 629 getContextualSearchManager().setFindToolbarManager(mFindToolbarManag
er); |
| 527 } | 630 } |
| 528 | 631 |
| 529 getToolbarManager().initializeWithNative(getTabModelSelector(), getFulls
creenManager(), | 632 getToolbarManager().initializeWithNative(getTabModelSelector(), getFulls
creenManager(), |
| 530 mFindToolbarManager, null, layoutDriver, null, null, null, null)
; | 633 mFindToolbarManager, null, layoutDriver, null, null, null, null)
; |
| 531 | 634 |
| 532 mDocumentTab.setFullscreenManager(getFullscreenManager()); | 635 mDocumentTab.setFullscreenManager(getFullscreenManager()); |
| 533 | 636 |
| 534 mDocumentTab.addObserver(new DocumentTabObserver() { | 637 mDocumentTab.addObserver(new DocumentTabObserver()); |
| 535 @Override | |
| 536 public void onPageLoadStarted(Tab tab, String url) { | |
| 537 // Discard startup navigation measurements when the user interfe
red and started the | |
| 538 // 2nd navigation (in activity lifetime) in parallel. | |
| 539 if (!sIsFirstPageLoadStart) { | |
| 540 UmaUtils.setRunningApplicationStart(false); | |
| 541 } else { | |
| 542 sIsFirstPageLoadStart = false; | |
| 543 } | |
| 544 } | |
| 545 | |
| 546 @Override | |
| 547 public void onWebContentsSwapped(Tab tab, boolean didStartLoad, bool
ean didFinishLoad) { | |
| 548 if (!didStartLoad) return; | |
| 549 resetIcon(); | |
| 550 } | |
| 551 | |
| 552 @Override | |
| 553 protected void onFaviconReceived(Bitmap image) { | |
| 554 super.onFaviconReceived(image); | |
| 555 if (mLargestFavicon == null || image.getWidth() > mLargestFavico
n.getWidth() | |
| 556 || image.getHeight() > mLargestFavicon.getHeight()) { | |
| 557 mLargestFavicon = image; | |
| 558 updateTaskDescription(); | |
| 559 } | |
| 560 } | |
| 561 | |
| 562 @Override | |
| 563 public void onUrlUpdated(Tab tab) { | |
| 564 assert mDocumentTab == tab; | |
| 565 | |
| 566 updateTaskDescription(); | |
| 567 mTabModel.updateEntry(getIntent(), mDocumentTab); | |
| 568 } | |
| 569 | |
| 570 @Override | |
| 571 public void onTitleUpdated(Tab tab) { | |
| 572 super.onTitleUpdated(tab); | |
| 573 updateTaskDescription(); | |
| 574 } | |
| 575 | |
| 576 @Override | |
| 577 public void onSSLStateUpdated(Tab tab) { | |
| 578 if (hasSecurityWarningOrError(tab)) resetIcon(); | |
| 579 } | |
| 580 | |
| 581 @Override | |
| 582 public void onDidNavigateMainFrame(Tab tab, String url, String baseU
rl, | |
| 583 boolean isNavigationToDifferentPage, boolean isFragmentNavig
ation, | |
| 584 int statusCode) { | |
| 585 if (!isNavigationToDifferentPage) return; | |
| 586 mLargestFavicon = null; | |
| 587 } | |
| 588 | |
| 589 @Override | |
| 590 public void onLoadStopped(Tab tab, boolean toDifferentDocument) { | |
| 591 assert mDocumentTab == tab; | |
| 592 | |
| 593 updateTaskDescription(); | |
| 594 mTabModel.updateEntry(getIntent(), mDocumentTab); | |
| 595 } | |
| 596 | |
| 597 @Override | |
| 598 public void onDidChangeThemeColor(Tab tab, int color) { | |
| 599 updateTaskDescription(); | |
| 600 } | |
| 601 | |
| 602 @Override | |
| 603 public void onDidAttachInterstitialPage(Tab tab) { | |
| 604 resetIcon(); | |
| 605 } | |
| 606 | |
| 607 @Override | |
| 608 public void onDidDetachInterstitialPage(Tab tab) { | |
| 609 resetIcon(); | |
| 610 } | |
| 611 | |
| 612 @Override | |
| 613 public void onCrash(Tab tab, boolean sadTabShown) { | |
| 614 int currentState = ApplicationStatus.getStateForActivity(Documen
tActivity.this); | |
| 615 if (currentState != ActivityState.STOPPED) return; | |
| 616 | |
| 617 if (!isTaskRoot() || IntentUtils.safeGetBooleanExtra(getIntent()
, | |
| 618 IntentHandler.EXTRA_APPEND_TASK, false)) { | |
| 619 return; | |
| 620 } | |
| 621 | |
| 622 // Finishing backgrounded Activities whose renderers have crashe
d allows us to | |
| 623 // destroy them and return resources sooner than if we wait for
Android to destroy | |
| 624 // the Activities themselves. Problematically, this also remove
s | |
| 625 // IncognitoDocumentActivity instances from Android's Recents me
nu and auto-closes | |
| 626 // the tab. Instead, take a hit and keep the Activities alive -
- Android will | |
| 627 // eventually destroy the Activities, anyway (crbug.com/450292). | |
| 628 if (!isIncognito()) finish(); | |
| 629 } | |
| 630 | |
| 631 private boolean hasSecurityWarningOrError(Tab tab) { | |
| 632 int securityLevel = tab.getSecurityLevel(); | |
| 633 return securityLevel == ConnectionSecurityLevel.SECURITY_ERROR | |
| 634 || securityLevel == ConnectionSecurityLevel.SECURITY_WAR
NING | |
| 635 || securityLevel == ConnectionSecurityLevel.SECURITY_POL
ICY_WARNING; | |
| 636 } | |
| 637 }); | |
| 638 | 638 |
| 639 removeWindowBackground(); | 639 removeWindowBackground(); |
| 640 | 640 |
| 641 if (mDocumentTab != null) { | 641 if (mDocumentTab != null) { |
| 642 DataReductionPreferences.launchDataReductionSSLInfoBar( | 642 DataReductionPreferences.launchDataReductionSSLInfoBar( |
| 643 DocumentActivity.this, mDocumentTab.getWebContents()); | 643 DocumentActivity.this, mDocumentTab.getWebContents()); |
| 644 } | 644 } |
| 645 } | 645 } |
| 646 | 646 |
| 647 private void resetIcon() { | 647 private void resetIcon() { |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 847 | 847 |
| 848 /** | 848 /** |
| 849 * Launch a new DocumentActivity showing the new tab page. | 849 * Launch a new DocumentActivity showing the new tab page. |
| 850 * @param incognito Whether the new NTP should be in incognito mode. | 850 * @param incognito Whether the new NTP should be in incognito mode. |
| 851 */ | 851 */ |
| 852 private void launchNtp(boolean incognito) { | 852 private void launchNtp(boolean incognito) { |
| 853 if (incognito && !PrefServiceBridge.getInstance().isIncognitoModeEnabled
()) return; | 853 if (incognito && !PrefServiceBridge.getInstance().isIncognitoModeEnabled
()) return; |
| 854 getTabCreator(incognito).launchNTP(); | 854 getTabCreator(incognito).launchNTP(); |
| 855 } | 855 } |
| 856 } | 856 } |
| OLD | NEW |