| Index: ios/chrome/browser/tabs/tab.mm
|
| diff --git a/ios/chrome/browser/tabs/tab.mm b/ios/chrome/browser/tabs/tab.mm
|
| index fe6b85467c6750529995709bcb6de808aa801ee6..6bb0c4ab49b34abb3b75b8b970a06213c483dd4f 100644
|
| --- a/ios/chrome/browser/tabs/tab.mm
|
| +++ b/ios/chrome/browser/tabs/tab.mm
|
| @@ -62,6 +62,7 @@
|
| #include "ios/chrome/browser/history/top_sites_factory.h"
|
| #include "ios/chrome/browser/infobars/infobar_manager_impl.h"
|
| #import "ios/chrome/browser/metrics/tab_usage_recorder.h"
|
| +#import "ios/chrome/browser/native_app_launcher/native_app_navigation_controller.h"
|
| #import "ios/chrome/browser/passwords/password_controller.h"
|
| #import "ios/chrome/browser/passwords/passwords_ui_delegate_impl.h"
|
| #include "ios/chrome/browser/pref_names.h"
|
| @@ -70,6 +71,8 @@
|
| #include "ios/chrome/browser/sessions/ios_chrome_session_tab_helper.h"
|
| #include "ios/chrome/browser/signin/account_consistency_service_factory.h"
|
| #include "ios/chrome/browser/signin/account_reconcilor_factory.h"
|
| +#include "ios/chrome/browser/signin/authentication_service.h"
|
| +#include "ios/chrome/browser/signin/authentication_service_factory.h"
|
| #include "ios/chrome/browser/signin/signin_capability.h"
|
| #import "ios/chrome/browser/snapshots/snapshot_manager.h"
|
| #import "ios/chrome/browser/snapshots/snapshot_overlay_provider.h"
|
| @@ -104,6 +107,9 @@
|
| #include "ios/chrome/browser/web/print_observer.h"
|
| #import "ios/chrome/browser/xcallback_parameters.h"
|
| #include "ios/chrome/grit/ios_strings.h"
|
| +#include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
|
| +#import "ios/public/provider/chrome/browser/native_app_launcher/native_app_metadata.h"
|
| +#import "ios/public/provider/chrome/browser/native_app_launcher/native_app_whitelist_manager.h"
|
| #import "ios/web/navigation/crw_session_controller.h"
|
| #import "ios/web/navigation/navigation_item_impl.h"
|
| #import "ios/web/navigation/navigation_manager_impl.h"
|
| @@ -277,6 +283,10 @@
|
| // Handles autofill.
|
| base::scoped_nsobject<AutofillController> autofillController_;
|
|
|
| + // Handles GAL infobar on web pages.
|
| + base::scoped_nsobject<NativeAppNavigationController>
|
| + nativeAppNavigationController_;
|
| +
|
| // Handles caching and retrieving of snapshots.
|
| base::scoped_nsobject<SnapshotManager> snapshotManager_;
|
|
|
| @@ -340,6 +350,9 @@
|
|
|
| // Returns the OpenInController for this tab.
|
| - (OpenInController*)openInController;
|
| +
|
| +// Initialize the Native App Launcher controller.
|
| +- (void)initNativeAppNavigationController;
|
|
|
| // Handles exportable files if possible.
|
| - (void)handleExportableFile:(net::HttpResponseHeaders*)headers;
|
| @@ -492,6 +505,8 @@
|
| webControllerSnapshotHelper_.reset([[WebControllerSnapshotHelper alloc]
|
| initWithSnapshotManager:snapshotManager_
|
| tab:self]);
|
| +
|
| + [self initNativeAppNavigationController];
|
|
|
| [[NSNotificationCenter defaultCenter]
|
| addObserver:self
|
| @@ -1611,8 +1626,29 @@
|
| - (BOOL)urlTriggersNativeAppLaunch:(const GURL&)url
|
| sourceURL:(const GURL&)sourceURL
|
| linkClicked:(BOOL)linkClicked {
|
| - // TODO(crbug/711511): Returning NO bypasses all Link Navigation logic
|
| - // for Native App Launcher. This call should eventually be eliminated.
|
| + // Don't open any native app directly when prerendering or from Incognito.
|
| + if (isPrerenderTab_ || self.browserState->IsOffTheRecord())
|
| + return NO;
|
| +
|
| + base::scoped_nsprotocol<id<NativeAppMetadata>> metadata(
|
| + [[ios::GetChromeBrowserProvider()->GetNativeAppWhitelistManager()
|
| + nativeAppForURL:url] retain]);
|
| + if (![metadata shouldAutoOpenLinks])
|
| + return NO;
|
| +
|
| + AuthenticationService* authenticationService =
|
| + AuthenticationServiceFactory::GetForBrowserState(self.browserState);
|
| + ChromeIdentity* identity = authenticationService->GetAuthenticatedIdentity();
|
| +
|
| + // Attempts to open external app without x-callback.
|
| + if ([self openExternalURL:[metadata launchURLWithURL:url identity:identity]
|
| + sourceURL:sourceURL
|
| + linkClicked:linkClicked]) {
|
| + return YES;
|
| + }
|
| +
|
| + // Auto-open didn't work. Reset the auto-open flag.
|
| + [metadata unsetShouldAutoOpenLinks];
|
| return NO;
|
| }
|
|
|
| @@ -1878,8 +1914,16 @@
|
| }
|
|
|
| - (NativeAppNavigationController*)nativeAppNavigationController {
|
| - // TODO(crbug.com/711511): This call should eventually be eliminated.
|
| - return nil;
|
| + return nativeAppNavigationController_;
|
| +}
|
| +
|
| +- (void)initNativeAppNavigationController {
|
| + if (browserState_->IsOffTheRecord())
|
| + return;
|
| + DCHECK(!nativeAppNavigationController_);
|
| + nativeAppNavigationController_.reset(
|
| + [[NativeAppNavigationController alloc] initWithWebState:self.webState]);
|
| + DCHECK(nativeAppNavigationController_);
|
| }
|
|
|
| - (id<PassKitDialogProvider>)passKitDialogProvider {
|
|
|