Commit 55752a3b authored by Olivier Robin's avatar Olivier Robin Committed by Commit Bot

Do not check sourceApplication when opening URL.

Starting with iOS 13, sourceApplication is only set when openURL is
called from an application with the same team identifier.
Oddly, it is also nil when calling from extension.

Bug: 1020228
Change-Id: I9876647c30350e2242d20da2ab045805a9864932
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1903349Reviewed-by: default avatarMark Cogan <marq@chromium.org>
Reviewed-by: default avatarOlivier Robin <olivierrobin@chromium.org>
Reviewed-by: default avatarJustin Cohen <justincohen@chromium.org>
Commit-Queue: Olivier Robin <olivierrobin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#715221}
parent 54053993
...@@ -118,12 +118,16 @@ const char* const kUMAMobileSessionStartFromAppsHistogram = ...@@ -118,12 +118,16 @@ const char* const kUMAMobileSessionStartFromAppsHistogram =
startupInformation:(id<StartupInformation>)startupInformation startupInformation:(id<StartupInformation>)startupInformation
appState:(AppState*)appState { appState:(AppState*)appState {
NSURL* url = launchOptions[UIApplicationLaunchOptionsURLKey]; NSURL* url = launchOptions[UIApplicationLaunchOptionsURLKey];
NSString* sourceApplication =
launchOptions[UIApplicationLaunchOptionsSourceApplicationKey];
if (url && sourceApplication) { if (url) {
NSDictionary<NSString*, id>* options = NSMutableDictionary<NSString*, id>* options =
@{UIApplicationOpenURLOptionsSourceApplicationKey : sourceApplication}; [[NSMutableDictionary alloc] init];
NSString* sourceApplication =
launchOptions[UIApplicationLaunchOptionsSourceApplicationKey];
if (sourceApplication) {
options[UIApplicationOpenURLOptionsSourceApplicationKey] =
sourceApplication;
}
BOOL openURLResult = [URLOpener openURL:url BOOL openURLResult = [URLOpener openURL:url
applicationActive:applicationActive applicationActive:applicationActive
......
...@@ -16,8 +16,8 @@ ...@@ -16,8 +16,8 @@
#import "ios/chrome/browser/ui/main/test/stub_browser_interface_provider.h" #import "ios/chrome/browser/ui/main/test/stub_browser_interface_provider.h"
#import "ios/chrome/browser/url_loading/url_loading_params.h" #import "ios/chrome/browser/url_loading/url_loading_params.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/testing/scoped_block_swizzler.h"
#include "ios/web/public/test/web_task_environment.h" #include "ios/web/public/test/web_task_environment.h"
#include "net/base/mac/url_conversions.h"
#include "testing/gtest_mac.h" #include "testing/gtest_mac.h"
#include "testing/platform_test.h" #include "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h" #import "third_party/ocmock/OCMock/OCMock.h"
...@@ -207,30 +207,21 @@ TEST_F(URLOpenerTest, VerifyLaunchOptions) { ...@@ -207,30 +207,21 @@ TEST_F(URLOpenerTest, VerifyLaunchOptions) {
id startupInformationMock = id startupInformationMock =
[OCMockObject mockForProtocol:@protocol(StartupInformation)]; [OCMockObject mockForProtocol:@protocol(StartupInformation)];
[[[startupInformationMock expect] andReturnValue:@NO] isPresentingFirstRunUI];
[[startupInformationMock expect] resetFirstUserActionRecorder];
__block ChromeAppStartupParameters* params = nil;
[[startupInformationMock expect]
setStartupParameters:[OCMArg checkWithBlock:^(
ChromeAppStartupParameters* p) {
params = p;
EXPECT_NSEQ(net::NSURLWithGURL(p.completeURL), url);
EXPECT_EQ(p.callerApp, CALLER_APP_APPLE_MOBILESAFARI);
return YES;
}]];
[[[startupInformationMock expect] andReturn:params] startupParameters];
id appStateMock = [OCMockObject mockForClass:[AppState class]]; id appStateMock = [OCMockObject mockForClass:[AppState class]];
[[appStateMock expect] launchFromURLHandled:YES]; [[appStateMock expect] launchFromURLHandled:NO];
__block BOOL hasBeenCalled = NO;
id implementation_block = ^BOOL(
id self, NSURL* urlArg, BOOL applicationActive, NSDictionary* options,
id<TabOpening> tabOpener, id<StartupInformation> startupInformation) {
hasBeenCalled = YES;
EXPECT_NSEQ([url absoluteString], [urlArg absoluteString]);
EXPECT_NSEQ(@"com.apple.mobilesafari",
options[UIApplicationOpenURLOptionsSourceApplicationKey]);
EXPECT_EQ(startupInformationMock, startupInformation);
EXPECT_EQ(tabOpenerMock, tabOpener);
return YES;
};
ScopedBlockSwizzler URL_opening_openURL_swizzler([URLOpener class],
@selector(openURL:
applicationActive:
options:
tabOpener:
startupInformation:),
implementation_block);
// Action. // Action.
[URLOpener handleLaunchOptions:launchOptions [URLOpener handleLaunchOptions:launchOptions
...@@ -240,7 +231,6 @@ TEST_F(URLOpenerTest, VerifyLaunchOptions) { ...@@ -240,7 +231,6 @@ TEST_F(URLOpenerTest, VerifyLaunchOptions) {
appState:appStateMock]; appState:appStateMock];
// Test. // Test.
EXPECT_TRUE(hasBeenCalled);
EXPECT_OCMOCK_VERIFY(startupInformationMock); EXPECT_OCMOCK_VERIFY(startupInformationMock);
} }
...@@ -270,18 +260,34 @@ TEST_F(URLOpenerTest, VerifyLaunchOptionsWithNoSourceApplication) { ...@@ -270,18 +260,34 @@ TEST_F(URLOpenerTest, VerifyLaunchOptionsWithNoSourceApplication) {
UIApplicationLaunchOptionsURLKey : url, UIApplicationLaunchOptionsURLKey : url,
}; };
// Creates a mock with no stub. This test will pass only if we don't use these MockTabOpener* tabOpenerMock = [[MockTabOpener alloc] init];
// objects.
id startupInformationMock = id startupInformationMock =
[OCMockObject mockForProtocol:@protocol(StartupInformation)]; [OCMockObject mockForProtocol:@protocol(StartupInformation)];
[[[startupInformationMock expect] andReturnValue:@NO] isPresentingFirstRunUI];
__block ChromeAppStartupParameters* params = nil;
[[startupInformationMock expect]
setStartupParameters:[OCMArg checkWithBlock:^(
ChromeAppStartupParameters* p) {
params = p;
EXPECT_NSEQ(net::NSURLWithGURL(p.completeURL), url);
EXPECT_EQ(p.callerApp, CALLER_APP_NOT_AVAILABLE);
return YES;
}]];
[[[startupInformationMock expect] andReturn:params] startupParameters];
id appStateMock = [OCMockObject mockForClass:[AppState class]]; id appStateMock = [OCMockObject mockForClass:[AppState class]];
[[appStateMock expect] launchFromURLHandled:YES];
// Action. // Action.
[URLOpener handleLaunchOptions:launchOptions [URLOpener handleLaunchOptions:launchOptions
applicationActive:YES applicationActive:YES
tabOpener:nil tabOpener:tabOpenerMock
startupInformation:startupInformationMock startupInformation:startupInformationMock
appState:appStateMock]; appState:appStateMock];
// Test.
EXPECT_OCMOCK_VERIFY(startupInformationMock);
} }
// Tests that -handleApplication set startup parameters as expected with no url. // Tests that -handleApplication set startup parameters as expected with no url.
...@@ -319,30 +325,13 @@ TEST_F(URLOpenerTest, VerifyLaunchOptionsWithBadURL) { ...@@ -319,30 +325,13 @@ TEST_F(URLOpenerTest, VerifyLaunchOptionsWithBadURL) {
id startupInformationMock = id startupInformationMock =
[OCMockObject mockForProtocol:@protocol(StartupInformation)]; [OCMockObject mockForProtocol:@protocol(StartupInformation)];
[[startupInformationMock expect] resetFirstUserActionRecorder];
[[[startupInformationMock expect] andReturnValue:@NO] isPresentingFirstRunUI];
[[startupInformationMock expect] setStartupParameters:[OCMArg isNil]];
[[[startupInformationMock expect] andReturn:nil] startupParameters];
id appStateMock = [OCMockObject mockForClass:[AppState class]]; id appStateMock = [OCMockObject mockForClass:[AppState class]];
[[appStateMock expect] launchFromURLHandled:YES]; [[appStateMock expect] launchFromURLHandled:NO];
__block BOOL hasBeenCalled = NO;
id implementation_block = ^BOOL(
id self, NSURL* urlArg, BOOL applicationActive, NSDictionary* options,
id<TabOpening> tabOpener, id<StartupInformation> startupInformation) {
hasBeenCalled = YES;
EXPECT_NSEQ([url absoluteString], [urlArg absoluteString]);
EXPECT_NSEQ(@"com.apple.mobilesafari",
options[UIApplicationOpenURLOptionsSourceApplicationKey]);
EXPECT_EQ(startupInformationMock, startupInformation);
EXPECT_EQ(tabOpenerMock, tabOpener);
return YES;
};
ScopedBlockSwizzler URL_opening_openURL_swizzler([URLOpener class],
@selector(openURL:
applicationActive:
options:
tabOpener:
startupInformation:),
implementation_block);
// Action. // Action.
[URLOpener handleLaunchOptions:launchOptions [URLOpener handleLaunchOptions:launchOptions
...@@ -352,6 +341,5 @@ TEST_F(URLOpenerTest, VerifyLaunchOptionsWithBadURL) { ...@@ -352,6 +341,5 @@ TEST_F(URLOpenerTest, VerifyLaunchOptionsWithBadURL) {
appState:appStateMock]; appState:appStateMock];
// Test. // Test.
EXPECT_TRUE(hasBeenCalled);
EXPECT_OCMOCK_VERIFY(startupInformationMock); EXPECT_OCMOCK_VERIFY(startupInformationMock);
} }
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