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