Commit a58954c3 authored by Michael Thiessen's avatar Michael Thiessen Committed by Commit Bot

Open links that open in new window in CCT from NoTouchActivity

This will allow NoTouchActivity to support things like oauth flows and
not clear history stack when something opens in a new window.

Bug: 959338
Change-Id: I287f8642cc94d4bc8a7578e296cac1f48be8d194
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1600961Reviewed-by: default avatarYaron Friedman <yfriedman@chromium.org>
Commit-Queue: Michael Thiessen <mthiesse@chromium.org>
Cr-Commit-Position: refs/heads/master@{#658389}
parent 79a9f7a9
......@@ -272,9 +272,13 @@ public class LaunchIntentDispatcher implements IntentHandler.IntentHandlerDelega
*/
public static boolean isCustomTabIntent(Intent intent) {
if (intent == null) return false;
// CCT is disabled in noTouch mode except for some Chrome-internal exceptions.
if (FeatureUtilities.isNoTouchModeEnabled()
&& !IntentHandler.wasIntentSenderChrome(intent)) {
return false;
}
if (CustomTabsIntent.shouldAlwaysUseBrowserUI(intent)
|| !intent.hasExtra(CustomTabsIntent.EXTRA_SESSION)
|| FeatureUtilities.isNoTouchModeEnabled()) {
|| !intent.hasExtra(CustomTabsIntent.EXTRA_SESSION)) {
return false;
}
return IntentHandler.getUrlFromIntent(intent) != null;
......
......@@ -31,6 +31,7 @@ import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabRedirectHandler;
import org.chromium.chrome.browser.tab.TabState;
import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
import org.chromium.chrome.browser.touchless.dialog.TouchlessDialogPresenter;
import org.chromium.chrome.browser.touchless.snackbar.BlackHoleSnackbarManager;
import org.chromium.chrome.browser.touchless.ui.iph.KeyFunctionsIPHCoordinator;
......@@ -330,4 +331,9 @@ public class NoTouchActivity extends SingleTabActivity {
public SnackbarManager getSnackbarManager() {
return mSnackbarManager;
}
@Override
protected TabDelegate createTabDelegate(boolean incognito) {
return new TouchlessTabDelegate(incognito);
}
}
// Copyright 2019 The Chromium Authors. All rights reserved.
// 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.touchless;
import android.content.Intent;
import android.net.Uri;
import android.provider.Browser;
import android.support.customtabs.CustomTabsIntent;
import org.chromium.base.ContextUtils;
import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider;
import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider.LaunchSourceType;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabIdManager;
import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager;
import org.chromium.chrome.browser.tabmodel.TabLaunchType;
import org.chromium.chrome.browser.tabmodel.document.AsyncTabCreationParams;
import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
/**
* Asynchronously creates Tabs for navigation originating from {@link NoTouchActivity}.
*
* This is the same as the parent class with exception of opening a Custom Tab instead of creating a
* new tab in Chrome.
*/
public class TouchlessTabDelegate extends TabDelegate {
public TouchlessTabDelegate(boolean incognito) {
super(incognito);
}
@Override
public void createNewTab(
AsyncTabCreationParams asyncParams, @TabLaunchType int type, int parentId) {
if (!isLinkClickLaunchType(type)) {
// Only link clicks should open in CCT, if the browser opens a tab for, say, intent
// handling, we should continue to open in NoTouchActivity.
super.createNewTab(asyncParams, type, parentId);
return;
}
String url = asyncParams.getLoadUrlParams().getUrl();
int assignedTabId = TabIdManager.getInstance().generateValidId(Tab.INVALID_TAB_ID);
AsyncTabParamsManager.add(assignedTabId, asyncParams);
Intent intent = new CustomTabsIntent.Builder().setShowTitle(true).build().intent;
intent.setData(Uri.parse(url));
intent.putExtra(CustomTabIntentDataProvider.EXTRA_SEND_TO_EXTERNAL_DEFAULT_HANDLER, true);
intent.putExtra(CustomTabIntentDataProvider.EXTRA_IS_OPENED_BY_CHROME, true);
intent.putExtra(CustomTabIntentDataProvider.EXTRA_IS_OPENED_BY_WEBAPK, false);
intent.putExtra(
CustomTabIntentDataProvider.EXTRA_BROWSER_LAUNCH_SOURCE, LaunchSourceType.OTHER);
intent.putExtra(Browser.EXTRA_APPLICATION_ID,
ContextUtils.getApplicationContext().getPackageName());
addAsyncTabExtras(asyncParams, parentId, false /* isChromeUI */, assignedTabId, intent);
IntentHandler.startActivityForTrustedIntent(intent);
}
private boolean isLinkClickLaunchType(@TabLaunchType int type) {
return type == TabLaunchType.FROM_LINK || type == TabLaunchType.FROM_LONGPRESS_FOREGROUND
|| type == TabLaunchType.FROM_LONGPRESS_BACKGROUND;
}
}
......@@ -40,6 +40,7 @@ touchless_java_sources = [
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageTopLayout.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessRecyclerView.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessSuggestionsBinder.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessTabDelegate.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessTabObserver.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessUiController.java",
"touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessZoomHelper.java",
......
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