1 // Copyright 2018 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.chrome.browser.native_page; 6 7 import android.app.Activity; 8 9 import androidx.annotation.Nullable; 10 11 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; 12 import org.chromium.chrome.browser.offlinepages.DownloadUiActionFlags; 13 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; 14 import org.chromium.chrome.browser.offlinepages.RequestCoordinatorBridge; 15 import org.chromium.chrome.browser.profiles.Profile; 16 import org.chromium.chrome.browser.tab.Tab; 17 import org.chromium.chrome.browser.tab.TabLaunchType; 18 import org.chromium.chrome.browser.tabmodel.TabModelSelector; 19 import org.chromium.chrome.browser.tabmodel.document.TabDelegate; 20 import org.chromium.chrome.browser.ui.native_page.NativePageHost; 21 import org.chromium.content_public.browser.LoadUrlParams; 22 import org.chromium.ui.mojom.WindowOpenDisposition; 23 24 /** 25 * {@link NativePageNavigationDelegate} implementation. 26 */ 27 public class NativePageNavigationDelegateImpl implements NativePageNavigationDelegate { 28 private static final String TAG = "PageNavDelegate"; 29 private final Profile mProfile; 30 private final TabModelSelector mTabModelSelector; 31 private final Tab mTab; 32 33 protected final Activity mActivity; 34 protected final NativePageHost mHost; 35 NativePageNavigationDelegateImpl(Activity activity, Profile profile, NativePageHost host, TabModelSelector tabModelSelector, Tab tab)36 public NativePageNavigationDelegateImpl(Activity activity, Profile profile, NativePageHost host, 37 TabModelSelector tabModelSelector, Tab tab) { 38 mActivity = activity; 39 mProfile = profile; 40 mHost = host; 41 mTabModelSelector = tabModelSelector; 42 mTab = tab; 43 } 44 45 @Override isOpenInNewWindowEnabled()46 public boolean isOpenInNewWindowEnabled() { 47 return MultiWindowUtils.getInstance().isOpenInOtherWindowSupported(mActivity); 48 } 49 50 @Override 51 @Nullable openUrl(int windowOpenDisposition, LoadUrlParams loadUrlParams)52 public Tab openUrl(int windowOpenDisposition, LoadUrlParams loadUrlParams) { 53 Tab loadingTab = null; 54 55 switch (windowOpenDisposition) { 56 case WindowOpenDisposition.CURRENT_TAB: 57 mHost.loadUrl(loadUrlParams, mTabModelSelector.isIncognitoSelected()); 58 loadingTab = mTab; 59 break; 60 case WindowOpenDisposition.NEW_FOREGROUND_TAB: 61 loadingTab = openUrlInNewTab(loadUrlParams, windowOpenDisposition); 62 break; 63 case WindowOpenDisposition.NEW_BACKGROUND_TAB: 64 loadingTab = openUrlInNewTab(loadUrlParams, windowOpenDisposition); 65 break; 66 case WindowOpenDisposition.OFF_THE_RECORD: 67 mHost.loadUrl(loadUrlParams, true); 68 break; 69 case WindowOpenDisposition.NEW_WINDOW: 70 openUrlInNewWindow(loadUrlParams); 71 break; 72 case WindowOpenDisposition.SAVE_TO_DISK: 73 saveUrlForOffline(loadUrlParams.getUrl()); 74 break; 75 default: 76 assert false; 77 } 78 79 return loadingTab; 80 } 81 openUrlInNewWindow(LoadUrlParams loadUrlParams)82 private void openUrlInNewWindow(LoadUrlParams loadUrlParams) { 83 TabDelegate tabDelegate = new TabDelegate(false); 84 tabDelegate.createTabInOtherWindow(loadUrlParams, mActivity, mHost.getParentId()); 85 } 86 openUrlInNewTab(LoadUrlParams loadUrlParams, int windowOpenDisposition)87 private Tab openUrlInNewTab(LoadUrlParams loadUrlParams, int windowOpenDisposition) { 88 int tabLaunchType = TabLaunchType.FROM_LONGPRESS_BACKGROUND; 89 if (windowOpenDisposition == WindowOpenDisposition.NEW_FOREGROUND_TAB) { 90 tabLaunchType = TabLaunchType.FROM_LONGPRESS_FOREGROUND; 91 } 92 return mTabModelSelector.openNewTab( 93 loadUrlParams, tabLaunchType, mTab, /* incognito = */ false); 94 } 95 saveUrlForOffline(String url)96 private void saveUrlForOffline(String url) { 97 if (mTab != null) { 98 OfflinePageBridge.getForProfile(mProfile).scheduleDownload(mTab.getWebContents(), 99 OfflinePageBridge.NTP_SUGGESTIONS_NAMESPACE, url, DownloadUiActionFlags.ALL); 100 } else { 101 RequestCoordinatorBridge.getForProfile(mProfile).savePageLater( 102 url, OfflinePageBridge.NTP_SUGGESTIONS_NAMESPACE, true /* userRequested */); 103 } 104 } 105 } 106