Index: chrome/android/java/src/org/chromium/chrome/browser/ServiceTabLauncher.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ServiceTabLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/ServiceTabLauncher.java |
index b8b840b967d719ed591910d1cddc24ff7f144350..d15430f1070513a61bf36387124ea19e9faf32b9 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/ServiceTabLauncher.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ServiceTabLauncher.java |
@@ -4,11 +4,19 @@ |
package org.chromium.chrome.browser; |
+import android.app.Activity; |
import android.content.Intent; |
+import android.net.Uri; |
import android.os.AsyncTask; |
+import android.provider.Browser; |
+import android.support.annotation.Nullable; |
+import android.support.customtabs.CustomTabsIntent; |
+import org.chromium.base.ApplicationStatus; |
import org.chromium.base.ContextUtils; |
+import org.chromium.base.ThreadUtils; |
import org.chromium.base.annotations.CalledByNative; |
+import org.chromium.chrome.R; |
import org.chromium.chrome.browser.tab.Tab; |
import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
import org.chromium.chrome.browser.tabmodel.document.AsyncTabCreationParams; |
@@ -21,6 +29,7 @@ import org.chromium.content_public.browser.WebContents; |
import org.chromium.content_public.common.Referrer; |
import org.chromium.content_public.common.ResourceRequestBody; |
import org.chromium.ui.base.PageTransition; |
+import org.chromium.ui.mojom.WindowOpenDisposition; |
import org.chromium.webapk.lib.client.WebApkNavigationClient; |
import org.chromium.webapk.lib.client.WebApkValidator; |
@@ -39,19 +48,34 @@ public class ServiceTabLauncher { |
/** |
* Launches the browser activity and launches a tab for |url|. |
- * @param requestId Id of the request for launching this tab. |
- * @param incognito Whether the tab should be launched in incognito mode. |
- * @param url The URL which should be launched in a tab. |
- * @param disposition The disposition requested by the navigation source. |
- * @param referrerUrl URL of the referrer which is opening the page. |
+ * |
+ * @param requestId Id of the request for launching this tab. |
+ * @param incognito Whether the tab should be launched in incognito mode. |
+ * @param url The URL which should be launched in a tab. |
+ * @param disposition The disposition requested by the navigation source. |
+ * @param referrerUrl URL of the referrer which is opening the page. |
* @param referrerPolicy The referrer policy to consider when applying the referrer. |
- * @param extraHeaders Extra headers to apply when requesting the tab's URL. |
- * @param postData Post-data to include in the tab URL's request body. |
+ * @param extraHeaders Extra headers to apply when requesting the tab's URL. |
+ * @param postData Post-data to include in the tab URL's request body. |
*/ |
@CalledByNative |
public static void launchTab(final int requestId, final boolean incognito, final String url, |
final int disposition, final String referrerUrl, final int referrerPolicy, |
final String extraHeaders, final ResourceRequestBody postData) { |
+ // Open popup window in custom tab. |
+ // Note that this is used by PaymentRequestEvent.openWindow(). |
+ if (disposition == WindowOpenDisposition.NEW_POPUP) { |
+ if (!createPopupCustomTab(requestId, url, incognito)) { |
+ ThreadUtils.postOnUiThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ onWebContentsForRequestAvailable(requestId, null); |
+ } |
+ }); |
+ } |
+ return; |
+ } |
+ |
final TabDelegate tabDelegate = new TabDelegate(incognito); |
// 1. Launch WebAPK if one matches the target URL. |
@@ -118,15 +142,46 @@ public class ServiceTabLauncher { |
} |
} |
+ /** |
+ * Creates a popup custom tab to open the url. The popup tab is animated in from bottom to top |
+ * and out from top to bottom. |
+ * Note that this is used by PaymentRequestEvent.openWindow(). |
+ * |
+ * @param requestId The tab launch request ID from the {@link ServiceTabLauncher}. |
+ * @param url The url to open in the new tab. |
+ */ |
+ private static boolean createPopupCustomTab(int requestId, String url, boolean incognito) { |
+ // Do not open the popup custom tab if the chrome activity is not in the forground. |
+ Activity lastTrackedActivity = ApplicationStatus.getLastTrackedFocusedActivity(); |
+ if (!(lastTrackedActivity instanceof ChromeActivity)) return false; |
+ |
+ CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); |
+ builder.setShowTitle(true); |
+ builder.setStartAnimations(lastTrackedActivity, R.anim.slide_in_up, 0); |
+ builder.setExitAnimations(lastTrackedActivity, 0, R.anim.slide_out_down); |
+ CustomTabsIntent customTabsIntent = builder.build(); |
+ customTabsIntent.intent.setPackage(ContextUtils.getApplicationContext().getPackageName()); |
+ customTabsIntent.intent.putExtra(ServiceTabLauncher.LAUNCH_REQUEST_ID_EXTRA, requestId); |
+ customTabsIntent.intent.putExtra(IntentHandler.EXTRA_OPEN_NEW_INCOGNITO_TAB, incognito); |
+ customTabsIntent.intent.putExtra(Browser.EXTRA_APPLICATION_ID, |
+ ContextUtils.getApplicationContext().getPackageName()); |
+ |
+ customTabsIntent.launchUrl(lastTrackedActivity, Uri.parse(url)); |
+ |
+ return true; |
+ } |
+ |
/** |
* To be called by the activity when the WebContents for |requestId| has been created, or has |
* been recycled from previous use. The |webContents| must not yet have started provisional |
* load for the main frame. |
+ * The |webContents| could be null if the request is failed. |
* |
* @param requestId Id of the tab launching request which has been fulfilled. |
* @param webContents The WebContents instance associated with this request. |
*/ |
- public static void onWebContentsForRequestAvailable(int requestId, WebContents webContents) { |
+ public static void onWebContentsForRequestAvailable( |
+ int requestId, @Nullable WebContents webContents) { |
nativeOnWebContentsForRequestAvailable(requestId, webContents); |
} |