| 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.tab; | 5 package org.chromium.chrome.browser.tab; |
| 6 | 6 |
| 7 import org.chromium.base.VisibleForTesting; | 7 import org.chromium.base.VisibleForTesting; |
| 8 import org.chromium.chrome.R; | 8 import org.chromium.chrome.R; |
| 9 import org.chromium.chrome.browser.ChromeActivity; | |
| 10 import org.chromium.chrome.browser.ChromeApplication; | 9 import org.chromium.chrome.browser.ChromeApplication; |
| 11 import org.chromium.chrome.browser.datausage.DataUseTabUIManager; | 10 import org.chromium.chrome.browser.datausage.DataUseTabUIManager; |
| 12 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler; | 11 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler; |
| 13 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler.Overrid
eUrlLoadingResult; | 12 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler.Overrid
eUrlLoadingResult; |
| 14 import org.chromium.chrome.browser.externalnav.ExternalNavigationParams; | 13 import org.chromium.chrome.browser.externalnav.ExternalNavigationParams; |
| 15 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; | 14 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
| 16 import org.chromium.components.navigation_interception.InterceptNavigationDelega
te; | 15 import org.chromium.components.navigation_interception.InterceptNavigationDelega
te; |
| 17 import org.chromium.components.navigation_interception.NavigationParams; | 16 import org.chromium.components.navigation_interception.NavigationParams; |
| 18 import org.chromium.content_public.browser.NavigationController; | 17 import org.chromium.content_public.browser.NavigationController; |
| 19 import org.chromium.content_public.browser.WebContents; | 18 import org.chromium.content_public.browser.WebContents; |
| 20 import org.chromium.content_public.common.ConsoleMessageLevel; | 19 import org.chromium.content_public.common.ConsoleMessageLevel; |
| 21 | 20 |
| 22 /** | 21 /** |
| 23 * Class that controls navigations and allows to intercept them. It is used on A
ndroid to 'convert' | 22 * Class that controls navigations and allows to intercept them. It is used on A
ndroid to 'convert' |
| 24 * certain navigations to Intents to 3rd party applications and to "pause" navig
ations when data use | 23 * certain navigations to Intents to 3rd party applications and to "pause" navig
ations when data use |
| 25 * tracking has ended. | 24 * tracking has ended. |
| 26 */ | 25 */ |
| 27 public class InterceptNavigationDelegateImpl implements InterceptNavigationDeleg
ate { | 26 public class InterceptNavigationDelegateImpl implements InterceptNavigationDeleg
ate { |
| 28 private final ChromeActivity mActivity; | |
| 29 private final Tab mTab; | 27 private final Tab mTab; |
| 30 private final ExternalNavigationHandler mExternalNavHandler; | 28 private final ExternalNavigationHandler mExternalNavHandler; |
| 31 private final AuthenticatorNavigationInterceptor mAuthenticatorHelper; | 29 private final AuthenticatorNavigationInterceptor mAuthenticatorHelper; |
| 32 private ExternalNavigationHandler.OverrideUrlLoadingResult mLastOverrideUrlL
oadingResult = | 30 private ExternalNavigationHandler.OverrideUrlLoadingResult mLastOverrideUrlL
oadingResult = |
| 33 ExternalNavigationHandler.OverrideUrlLoadingResult.NO_OVERRIDE; | 31 ExternalNavigationHandler.OverrideUrlLoadingResult.NO_OVERRIDE; |
| 34 | 32 |
| 35 /** | 33 /** |
| 36 * Whether forward history should be cleared after navigation is committed. | 34 * Whether forward history should be cleared after navigation is committed. |
| 37 */ | 35 */ |
| 38 private boolean mClearAllForwardHistoryRequired; | 36 private boolean mClearAllForwardHistoryRequired; |
| 39 private boolean mShouldClearRedirectHistoryForTabClobbering; | 37 private boolean mShouldClearRedirectHistoryForTabClobbering; |
| 40 | 38 |
| 41 /** | 39 /** |
| 42 * Default constructor of {@link InterceptNavigationDelegateImpl}. | 40 * Default constructor of {@link InterceptNavigationDelegateImpl}. |
| 43 */ | 41 */ |
| 44 public InterceptNavigationDelegateImpl(ChromeActivity activity, Tab tab) { | 42 public InterceptNavigationDelegateImpl(Tab tab) { |
| 45 this(new ExternalNavigationHandler(activity), activity, tab); | 43 this(new ExternalNavigationHandler(tab), tab); |
| 46 } | 44 } |
| 47 | 45 |
| 48 /** | 46 /** |
| 49 * Constructs a new instance of {@link InterceptNavigationDelegateImpl} with
the given | 47 * Constructs a new instance of {@link InterceptNavigationDelegateImpl} with
the given |
| 50 * {@link ExternalNavigationHandler}. | 48 * {@link ExternalNavigationHandler}. |
| 51 */ | 49 */ |
| 52 public InterceptNavigationDelegateImpl(ExternalNavigationHandler externalNav
Handler, | 50 public InterceptNavigationDelegateImpl(ExternalNavigationHandler externalNav
Handler, Tab tab) { |
| 53 ChromeActivity activity, Tab tab) { | |
| 54 mActivity = activity; | |
| 55 mTab = tab; | 51 mTab = tab; |
| 56 mExternalNavHandler = externalNavHandler; | 52 mExternalNavHandler = externalNavHandler; |
| 57 mAuthenticatorHelper = ((ChromeApplication) mTab.getApplicationContext()
) | 53 mAuthenticatorHelper = ((ChromeApplication) mTab.getApplicationContext()
) |
| 58 .createAuthenticatorNavigationInterceptor(mTab); | 54 .createAuthenticatorNavigationInterceptor(mTab); |
| 59 } | 55 } |
| 60 | 56 |
| 61 public boolean shouldIgnoreNewTab(String url, boolean incognito) { | 57 public boolean shouldIgnoreNewTab(String url, boolean incognito) { |
| 62 if (mAuthenticatorHelper != null && mAuthenticatorHelper.handleAuthentic
atorUrl(url)) { | 58 if (mAuthenticatorHelper != null && mAuthenticatorHelper.handleAuthentic
atorUrl(url)) { |
| 63 return true; | 59 return true; |
| 64 } | 60 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 81 String url = navigationParams.url; | 77 String url = navigationParams.url; |
| 82 | 78 |
| 83 if (mAuthenticatorHelper != null && mAuthenticatorHelper.handleAuthentic
atorUrl(url)) { | 79 if (mAuthenticatorHelper != null && mAuthenticatorHelper.handleAuthentic
atorUrl(url)) { |
| 84 return true; | 80 return true; |
| 85 } | 81 } |
| 86 | 82 |
| 87 TabRedirectHandler tabRedirectHandler = mTab.getTabRedirectHandler(); | 83 TabRedirectHandler tabRedirectHandler = mTab.getTabRedirectHandler(); |
| 88 tabRedirectHandler.updateNewUrlLoading(navigationParams.pageTransitionTy
pe, | 84 tabRedirectHandler.updateNewUrlLoading(navigationParams.pageTransitionTy
pe, |
| 89 navigationParams.isRedirect, | 85 navigationParams.isRedirect, |
| 90 navigationParams.hasUserGesture || navigationParams.hasUserGestu
reCarryover, | 86 navigationParams.hasUserGesture || navigationParams.hasUserGestu
reCarryover, |
| 91 mActivity.getLastUserInteractionTime(), getLastCommittedEntryInd
ex()); | 87 mTab.getActivity().getLastUserInteractionTime(), getLastCommitte
dEntryIndex()); |
| 92 boolean shouldCloseTab = shouldCloseContentsOnOverrideUrlLoadingAndLaunc
hIntent(); | 88 boolean shouldCloseTab = shouldCloseContentsOnOverrideUrlLoadingAndLaunc
hIntent(); |
| 93 boolean isInitialTabLaunchInBackground = | 89 boolean isInitialTabLaunchInBackground = |
| 94 mTab.getLaunchType() == TabLaunchType.FROM_LONGPRESS_BACKGROUND
&& shouldCloseTab; | 90 mTab.getLaunchType() == TabLaunchType.FROM_LONGPRESS_BACKGROUND
&& shouldCloseTab; |
| 95 // http://crbug.com/448977: If a new tab is closed by this overriding, w
e should open an | 91 // http://crbug.com/448977: If a new tab is closed by this overriding, w
e should open an |
| 96 // Intent in a new tab when Chrome receives it again. | 92 // Intent in a new tab when Chrome receives it again. |
| 97 ExternalNavigationParams params = new ExternalNavigationParams.Builder( | 93 ExternalNavigationParams params = new ExternalNavigationParams.Builder( |
| 98 url, mTab.isIncognito(), navigationParams.referrer, | 94 url, mTab.isIncognito(), navigationParams.referrer, |
| 99 navigationParams.pageTransitionType, | 95 navigationParams.pageTransitionType, |
| 100 navigationParams.isRedirect) | 96 navigationParams.isRedirect) |
| 101 .setTab(mTab) | 97 .setTab(mTab) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 124 if (!shouldCloseTab && navigationParams.isMainFrame) { | 120 if (!shouldCloseTab && navigationParams.isMainFrame) { |
| 125 onOverrideUrlLoadingAndLaunchIntent(); | 121 onOverrideUrlLoadingAndLaunchIntent(); |
| 126 } | 122 } |
| 127 return true; | 123 return true; |
| 128 case NO_OVERRIDE: | 124 case NO_OVERRIDE: |
| 129 default: | 125 default: |
| 130 if (navigationParams.isExternalProtocol) { | 126 if (navigationParams.isExternalProtocol) { |
| 131 logBlockedNavigationToDevToolsConsole(url); | 127 logBlockedNavigationToDevToolsConsole(url); |
| 132 return true; | 128 return true; |
| 133 } | 129 } |
| 134 return DataUseTabUIManager.shouldOverrideUrlLoading(mActivity, m
Tab, url, | 130 return DataUseTabUIManager.shouldOverrideUrlLoading(mTab.getActi
vity(), mTab, url, |
| 135 navigationParams.pageTransitionType, navigationParams.re
ferrer); | 131 navigationParams.pageTransitionType, navigationParams.re
ferrer); |
| 136 } | 132 } |
| 137 } | 133 } |
| 138 | 134 |
| 139 /** | 135 /** |
| 140 * Updates navigation history if navigation is canceled due to intent handle
r. We go back to the | 136 * Updates navigation history if navigation is canceled due to intent handle
r. We go back to the |
| 141 * last committed entry index which was saved before the navigation, and rem
ove the empty | 137 * last committed entry index which was saved before the navigation, and rem
ove the empty |
| 142 * entries from the navigation history. See crbug.com/426679 | 138 * entries from the navigation history. See crbug.com/426679 |
| 143 */ | 139 */ |
| 144 public void maybeUpdateNavigationHistory() { | 140 public void maybeUpdateNavigationHistory() { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 | 198 |
| 203 // Before leaving Chrome, close the empty child tab. | 199 // Before leaving Chrome, close the empty child tab. |
| 204 // If a new tab is created through JavaScript open to load this | 200 // If a new tab is created through JavaScript open to load this |
| 205 // url, we would like to close it as we will load this url in a | 201 // url, we would like to close it as we will load this url in a |
| 206 // different Activity. | 202 // different Activity. |
| 207 if (shouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent()) { | 203 if (shouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent()) { |
| 208 if (mTab.getLaunchType() == TabLaunchType.FROM_EXTERNAL_APP) { | 204 if (mTab.getLaunchType() == TabLaunchType.FROM_EXTERNAL_APP) { |
| 209 // Moving task back before closing the tab allows back button to
function better | 205 // Moving task back before closing the tab allows back button to
function better |
| 210 // when Chrome was an intermediate link redirector between two a
pps. | 206 // when Chrome was an intermediate link redirector between two a
pps. |
| 211 // crbug.com/487938. | 207 // crbug.com/487938. |
| 212 mActivity.moveTaskToBack(true); | 208 mTab.getActivity().moveTaskToBack(true); |
| 213 } | 209 } |
| 214 mActivity.getTabModelSelector().closeTab(mTab); | 210 mTab.getTabModelSelector().closeTab(mTab); |
| 215 } else if (mTab.getTabRedirectHandler().isOnNavigation()) { | 211 } else if (mTab.getTabRedirectHandler().isOnNavigation()) { |
| 216 int lastCommittedEntryIndexBeforeNavigation = mTab.getTabRedirectHan
dler() | 212 int lastCommittedEntryIndexBeforeNavigation = mTab.getTabRedirectHan
dler() |
| 217 .getLastCommittedEntryIndexBeforeStartingNavigation(); | 213 .getLastCommittedEntryIndexBeforeStartingNavigation(); |
| 218 if (getLastCommittedEntryIndex() > lastCommittedEntryIndexBeforeNavi
gation) { | 214 if (getLastCommittedEntryIndex() > lastCommittedEntryIndexBeforeNavi
gation) { |
| 219 // http://crbug/426679 : we want to go back to the last committe
d entry index which | 215 // http://crbug/426679 : we want to go back to the last committe
d entry index which |
| 220 // was saved before this navigation, and remove the empty entrie
s from the | 216 // was saved before this navigation, and remove the empty entrie
s from the |
| 221 // navigation history. | 217 // navigation history. |
| 222 mClearAllForwardHistoryRequired = true; | 218 mClearAllForwardHistoryRequired = true; |
| 223 mTab.getWebContents().getNavigationController().goToNavigationIn
dex( | 219 mTab.getWebContents().getNavigationController().goToNavigationIn
dex( |
| 224 lastCommittedEntryIndexBeforeNavigation); | 220 lastCommittedEntryIndexBeforeNavigation); |
| 225 } | 221 } |
| 226 } | 222 } |
| 227 } | 223 } |
| 228 | 224 |
| 229 private void logBlockedNavigationToDevToolsConsole(String url) { | 225 private void logBlockedNavigationToDevToolsConsole(String url) { |
| 230 int resId = mExternalNavHandler.canExternalAppHandleUrl(url) | 226 int resId = mExternalNavHandler.canExternalAppHandleUrl(url) |
| 231 ? R.string.blocked_navigation_warning | 227 ? R.string.blocked_navigation_warning |
| 232 : R.string.unreachable_navigation_warning; | 228 : R.string.unreachable_navigation_warning; |
| 233 mTab.getWebContents().addMessageToDevToolsConsole( | 229 mTab.getWebContents().addMessageToDevToolsConsole( |
| 234 ConsoleMessageLevel.WARNING, mTab.getApplicationContext().getStr
ing(resId, url)); | 230 ConsoleMessageLevel.WARNING, mTab.getApplicationContext().getStr
ing(resId, url)); |
| 235 } | 231 } |
| 236 } | 232 } |
| OLD | NEW |