Commit 20433584 authored by Colin Blundell's avatar Colin Blundell Committed by Commit Bot

[Android] Componentize InterceptNavigationDelegateImpl

After preceding CLs this class has no remaining //chrome dependencies
other than resources, which this CL componentizes along with the class
itself. As this implementation of InterceptNavigationDelegate is
specific to the overall intent launching logic in
//components/external_intents, this CL componentizes it into that
component. Componentizing this class will enable it to be reused in
WebLayer.

TBR=jochen@chromium.org

Bug: 1031465
Change-Id: Iea7f68ebdee3fc4d766604c46ba5868429c14e65
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2133984
Commit-Queue: Colin Blundell <blundell@chromium.org>
Reviewed-by: default avatarMugdha Lakhani <nator@chromium.org>
Reviewed-by: default avatarMichael Thiessen <mthiesse@chromium.org>
Cr-Commit-Position: refs/heads/master@{#759187}
parent fb91b131
......@@ -2940,7 +2940,6 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java",
"java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java",
"java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java",
"java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java",
"java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java",
"java/src/org/chromium/chrome/browser/tab/TabFavicon.java",
"java/src/org/chromium/chrome/browser/tab/TabImpl.java",
......
......@@ -1582,7 +1582,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/tab/AuthenticatorNavigationInterceptor.java",
"java/src/org/chromium/chrome/browser/tab/AuthenticatorNavigationInterceptorTabHelper.java",
"java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java",
"java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java",
"java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper.java",
"java/src/org/chromium/chrome/browser/tab/RedirectHandlerTabHelper.java",
"java/src/org/chromium/chrome/browser/tab/SadTab.java",
......
......@@ -14,6 +14,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.components.external_intents.AuthenticatorNavigationInterceptor;
import org.chromium.components.external_intents.ExternalNavigationHandler;
import org.chromium.components.external_intents.InterceptNavigationDelegateClient;
import org.chromium.components.external_intents.InterceptNavigationDelegateImpl;
import org.chromium.components.external_intents.RedirectHandlerImpl;
import org.chromium.content_public.browser.NavigationHandle;
import org.chromium.content_public.browser.WebContents;
......
......@@ -5,6 +5,7 @@
package org.chromium.chrome.browser.tab;
import org.chromium.base.UserData;
import org.chromium.components.external_intents.InterceptNavigationDelegateImpl;
/**
* Class that glues InterceptNavigationDelegateImpl objects to Tabs.
......
......@@ -11,7 +11,6 @@ import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.homepage.HomepageManager;
import org.chromium.chrome.browser.ntp.RecentlyClosedBridge;
import org.chromium.chrome.browser.tab.InterceptNavigationDelegateImpl;
import org.chromium.chrome.browser.tab.InterceptNavigationDelegateTabHelper;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabCreationState;
......@@ -20,6 +19,7 @@ import org.chromium.chrome.browser.tab.TabSelectionType;
import org.chromium.chrome.browser.tab.TabState;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator;
import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
import org.chromium.components.external_intents.InterceptNavigationDelegateImpl;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.common.ResourceRequestBody;
......
......@@ -28,13 +28,13 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.LaunchIntentDispatcher;
import org.chromium.chrome.browser.customtabs.CustomTabDelegateFactory.CustomTabNavigationDelegate;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.tab.InterceptNavigationDelegateImpl;
import org.chromium.chrome.browser.tab.InterceptNavigationDelegateTabHelper;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabDelegateFactory;
import org.chromium.chrome.browser.tab.TabTestUtils;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.components.external_intents.ExternalNavigationHandler.OverrideUrlLoadingResult;
import org.chromium.components.external_intents.InterceptNavigationDelegateImpl;
import org.chromium.content_public.browser.test.util.Criteria;
import org.chromium.content_public.browser.test.util.CriteriaHelper;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
......
......@@ -32,7 +32,6 @@ import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.document.ChromeLauncherActivity;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.InterceptNavigationDelegateImpl;
import org.chromium.chrome.browser.tab.InterceptNavigationDelegateTabHelper;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabCreationState;
......@@ -40,6 +39,7 @@ import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
import org.chromium.chrome.test.ChromeActivityTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.components.external_intents.ExternalNavigationHandler.OverrideUrlLoadingResult;
import org.chromium.components.external_intents.InterceptNavigationDelegateImpl;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.NavigationHandle;
import org.chromium.content_public.browser.test.util.Criteria;
......
......@@ -24,6 +24,7 @@ import org.chromium.chrome.test.ChromeActivityTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.components.external_intents.ExternalNavigationHandler;
import org.chromium.components.external_intents.ExternalNavigationParams;
import org.chromium.components.external_intents.InterceptNavigationDelegateImpl;
import org.chromium.components.navigation_interception.NavigationParams;
import org.chromium.content_public.browser.test.util.Criteria;
import org.chromium.content_public.browser.test.util.CriteriaHelper;
......
......@@ -2577,7 +2577,6 @@ jumbo_static_library("browser") {
"android/instantapps/instant_apps_settings.h",
"android/intent_helper.cc",
"android/intent_helper.h",
"android/intercept_navigation_delegate_impl.cc",
"android/large_icon_bridge.cc",
"android/large_icon_bridge.h",
"android/locale/locale_manager.cc",
......
......@@ -3255,14 +3255,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
Unsupported number of Chrome instances.
</message>
<!-- Override URL -->
<message name="IDS_BLOCKED_NAVIGATION_WARNING" desc="Warning message added to dev tools console when navigation to a given URL is blocked.">
Navigation is blocked: <ph name="URL">%1$s<ex>intent://abcd</ex></ph>
</message>
<message name="IDS_UNREACHABLE_NAVIGATION_WARNING" desc="Warning message added to dev tools console when navigation to a given URL is unreachable.">
Navigation is unreachable: <ph name="URL">%1$s<ex>intent://abcd</ex></ph>
</message>
<message name="IDS_CLOSE_TAB" desc="Context menu option that allows the user to close the selected tab.">
Close tab
</message>
......
......@@ -404,6 +404,14 @@
<message name="IDS_DOWNLOAD_UI_GB" desc="String indicating the size of a downloaded file (in progress or complete), in gigabytes.">
<ph name="gigabytes">%1$3.2f<ex>12.5</ex></ph> GB
</message>
<!-- Override URL -->
<message name="IDS_BLOCKED_NAVIGATION_WARNING" desc="Warning message added to dev tools console when navigation to a given URL is blocked.">
Navigation is blocked: <ph name="URL">%1$s<ex>intent://abcd</ex></ph>
</message>
<message name="IDS_UNREACHABLE_NAVIGATION_WARNING" desc="Warning message added to dev tools console when navigation to a given URL is unreachable.">
Navigation is unreachable: <ph name="URL">%1$s<ex>intent://abcd</ex></ph>
</message>
</messages>
</release>
</grit>
......@@ -13,15 +13,18 @@ android_library("java") {
"java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java",
"java/src/org/chromium/components/external_intents/ExternalNavigationParams.java",
"java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java",
"java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java",
"java/src/org/chromium/components/external_intents/RedirectHandler.java",
"java/src/org/chromium/components/external_intents/RedirectHandlerImpl.java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
deps = [
":java_resources",
"//base:base_java",
"//base:jni_java",
"//components/embedder_support/android:util_java",
"//components/navigation_interception/android:navigation_interception_java",
"//content/public/android:content_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
"//ui/android:ui_java",
......@@ -29,19 +32,31 @@ android_library("java") {
]
}
android_resources("java_resources") {
sources = []
custom_package = "org.chromium.components.external_intents"
deps = [ "//components/browser_ui/strings/android:browser_ui_strings_grd" ]
}
generate_jni("jni_headers") {
sources = [ "java/src/org/chromium/components/external_intents/ExternalIntentsFeatureList.java" ]
sources = [
"java/src/org/chromium/components/external_intents/ExternalIntentsFeatureList.java",
"java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java",
]
}
static_library("android") {
sources = [
"external_intents_feature_list.cc",
"external_intents_feature_list.h",
"intercept_navigation_delegate_impl.cc",
]
deps = [
":jni_headers",
"//base",
"//components/navigation_interception",
"//content/public/browser",
]
}
......
include_rules = [
"+components/embedder_support/android",
"+components/navigation_interception",
"+content/public/browser",
"-content/public/android/java",
"+content/public/android/java/src/org/chromium/content_public",
......
......@@ -2,11 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/android/chrome_jni_headers/InterceptNavigationDelegateImpl_jni.h"
#include "components/external_intents/android/jni_headers/InterceptNavigationDelegateImpl_jni.h"
#include "components/navigation_interception/intercept_navigation_delegate.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
namespace external_intents {
static void JNI_InterceptNavigationDelegateImpl_AssociateWithWebContents(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jdelegate,
......@@ -19,3 +21,5 @@ static void JNI_InterceptNavigationDelegateImpl_AssociateWithWebContents(
std::make_unique<navigation_interception::InterceptNavigationDelegate>(
env, jdelegate, /*escape_external_handler_value=*/true));
}
} // namespace external_intents
......@@ -2,21 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.tab;
package org.chromium.components.external_intents;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.ContextUtils;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.task.PostTask;
import org.chromium.chrome.R;
import org.chromium.components.external_intents.AuthenticatorNavigationInterceptor;
import org.chromium.components.external_intents.ExternalNavigationHandler;
import org.chromium.components.external_intents.ExternalNavigationHandler.OverrideUrlLoadingResult;
import org.chromium.components.external_intents.ExternalNavigationParams;
import org.chromium.components.external_intents.InterceptNavigationDelegateClient;
import org.chromium.components.external_intents.RedirectHandlerImpl;
import org.chromium.components.navigation_interception.InterceptNavigationDelegate;
import org.chromium.components.navigation_interception.NavigationParams;
import org.chromium.content_public.browser.NavigationController;
......@@ -33,6 +28,7 @@ import org.chromium.content_public.common.ConsoleMessageLevel;
* hence can cause UAF error. It should be done in an asynchronous fashion to avoid it.
* See https://crbug.com/732260.
*/
@JNINamespace("external_intents")
public class InterceptNavigationDelegateImpl implements InterceptNavigationDelegate {
private final AuthenticatorNavigationInterceptor mAuthenticatorHelper;
private InterceptNavigationDelegateClient mClient;
......@@ -50,8 +46,7 @@ public class InterceptNavigationDelegateImpl implements InterceptNavigationDeleg
/**
* Default constructor of {@link InterceptNavigationDelegateImpl}.
*/
@VisibleForTesting
InterceptNavigationDelegateImpl(InterceptNavigationDelegateClient client) {
public InterceptNavigationDelegateImpl(InterceptNavigationDelegateClient client) {
mClient = client;
mAuthenticatorHelper = mClient.createAuthenticatorNavigationInterceptor();
associateWithWebContents(mClient.getWebContents());
......@@ -85,9 +80,8 @@ public class InterceptNavigationDelegateImpl implements InterceptNavigationDeleg
return true;
}
ExternalNavigationParams params = new ExternalNavigationParams.Builder(url, incognito)
.setOpenInNewTab(true)
.build();
ExternalNavigationParams params =
new ExternalNavigationParams.Builder(url, incognito).setOpenInNewTab(true).build();
mLastOverrideUrlLoadingResult = mExternalNavHandler.shouldOverrideUrlLoading(params);
return mLastOverrideUrlLoadingResult
!= ExternalNavigationHandler.OverrideUrlLoadingResult.NO_OVERRIDE;
......@@ -199,12 +193,10 @@ public class InterceptNavigationDelegateImpl implements InterceptNavigationDeleg
WebContents webContents = mClient.getWebContents();
if (mClearAllForwardHistoryRequired && webContents != null) {
webContents.getNavigationController().pruneForwardEntries();
} else if (mShouldClearRedirectHistoryForTabClobbering
&& webContents != null) {
} else if (mShouldClearRedirectHistoryForTabClobbering && webContents != null) {
// http://crbug/479056: Even if we clobber the current tab, we want to remove
// redirect history to be consistent.
NavigationController navigationController =
webContents.getNavigationController();
NavigationController navigationController = webContents.getNavigationController();
int indexBeforeRedirection =
mClient.getOrCreateRedirectHandler()
.getLastCommittedEntryIndexBeforeStartingNavigation();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment