Commit 7ab74d2d authored by Andy Lu's avatar Andy Lu Committed by Commit Bot

Enable Multiple URLs for Open URLs In Chrome Siri Shortcut

Change the existing Open URLs in Chrome Siri shortcut so that instead of
only one URL, it can now accept multiple URLs. Also refactored the code
for creating the std::vector of URLs to avoid duplication of code with
Open URLs In Chrome Incognito.

Bug: 1114012
Change-Id: I22896c3cf1b05c78d5838793c01d2e1bb0b1e211
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2342207
Commit-Queue: Andy Lu <andyhylu@google.com>
Reviewed-by: default avatarMark Cogan <marq@chromium.org>
Reviewed-by: default avatarJustin Cohen <justincohen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#796929}
parent 5c23d300
...@@ -61,6 +61,14 @@ NSString* const kSiriShortcutOpenInChrome = @"OpenInChromeIntent"; ...@@ -61,6 +61,14 @@ NSString* const kSiriShortcutOpenInChrome = @"OpenInChromeIntent";
NSString* const kSiriShortcutSearchInChrome = @"SearchInChromeIntent"; NSString* const kSiriShortcutSearchInChrome = @"SearchInChromeIntent";
NSString* const kSiriShortcutOpenInIncognito = @"OpenInChromeIncognitoIntent"; NSString* const kSiriShortcutOpenInIncognito = @"OpenInChromeIncognitoIntent";
std::vector<GURL> createGURLVectorFromIntentURLs(NSArray<NSURL*>* intentURLs) {
std::vector<GURL> URLs;
for (NSURL* URL in intentURLs) {
URLs.push_back(net::GURLWithNSURL(URL));
}
return URLs;
}
} // namespace } // namespace
@interface UserActivityHandler () @interface UserActivityHandler ()
...@@ -176,18 +184,23 @@ NSString* const kSiriShortcutOpenInIncognito = @"OpenInChromeIncognitoIntent"; ...@@ -176,18 +184,23 @@ NSString* const kSiriShortcutOpenInIncognito = @"OpenInChromeIncognitoIntent";
base::RecordAction(UserMetricsAction("IOSLaunchedByOpenInChromeIntent")); base::RecordAction(UserMetricsAction("IOSLaunchedByOpenInChromeIntent"));
OpenInChromeIntent* intent = base::mac::ObjCCastStrict<OpenInChromeIntent>( OpenInChromeIntent* intent = base::mac::ObjCCastStrict<OpenInChromeIntent>(
userActivity.interaction.intent); userActivity.interaction.intent);
if (!intent.url)
return NO;
GURL webpageGURL(net::GURLWithNSURL(intent.url)); if (!intent.url || intent.url.count == 0) {
if (!webpageGURL.is_valid())
return NO; return NO;
}
std::vector<GURL> URLs = createGURLVectorFromIntentURLs(intent.url);
AppStartupParameters* startupParams = AppStartupParameters* startupParams =
[[AppStartupParameters alloc] initWithExternalURL:webpageGURL [[AppStartupParameters alloc] initWithURLs:URLs];
completeURL:webpageGURL];
[connectionInformation setStartupParameters:startupParams]; [connectionInformation setStartupParameters:startupParams];
webpageURL = intent.url; return [self continueUserActivityURLs:URLs
applicationIsActive:applicationIsActive
tabOpener:tabOpener
connectionInformation:connectionInformation
startupInformation:startupInformation
Incognito:NO];
} else if ([userActivity.activityType } else if ([userActivity.activityType
isEqualToString:kSiriShortcutOpenInIncognito]) { isEqualToString:kSiriShortcutOpenInIncognito]) {
base::RecordAction(UserMetricsAction("IOSLaunchedByOpenInIncognitoIntent")); base::RecordAction(UserMetricsAction("IOSLaunchedByOpenInIncognitoIntent"));
...@@ -199,13 +212,11 @@ NSString* const kSiriShortcutOpenInIncognito = @"OpenInChromeIncognitoIntent"; ...@@ -199,13 +212,11 @@ NSString* const kSiriShortcutOpenInIncognito = @"OpenInChromeIncognitoIntent";
return NO; return NO;
} }
std::vector<GURL> URLs; std::vector<GURL> URLs = createGURLVectorFromIntentURLs(intent.urls);
for (NSURL* URL in intent.urls) {
URLs.push_back(net::GURLWithNSURL(URL));
}
AppStartupParameters* startupParams = AppStartupParameters* startupParams =
[[AppStartupParameters alloc] initWithURLs:URLs]; [[AppStartupParameters alloc] initWithURLs:URLs];
startupParams.launchInIncognito = YES; startupParams.launchInIncognito = YES;
[connectionInformation setStartupParameters:startupParams]; [connectionInformation setStartupParameters:startupParams];
return [self continueUserActivityURLs:URLs return [self continueUserActivityURLs:URLs
......
...@@ -515,8 +515,13 @@ TEST_F(UserActivityHandlerTest, ContinueUserActivityIntentBackground) { ...@@ -515,8 +515,13 @@ TEST_F(UserActivityHandlerTest, ContinueUserActivityIntentBackground) {
NSUserActivity* userActivity = NSUserActivity* userActivity =
[[NSUserActivity alloc] initWithActivityType:@"OpenInChromeIntent"]; [[NSUserActivity alloc] initWithActivityType:@"OpenInChromeIntent"];
OpenInChromeIntent* intent = [[OpenInChromeIntent alloc] init]; OpenInChromeIntent* intent = [[OpenInChromeIntent alloc] init];
NSURL* nsurl = [NSURL URLWithString:@"http://www.google.com"];
intent.url = nsurl; NSURL* url1 = [[NSURL alloc] initWithString:@"http://www.google.com"];
NSURL* url2 = [[NSURL alloc] initWithString:@"http://www.apple.com"];
NSURL* url3 = [[NSURL alloc] initWithString:@"http://www.espn.com"];
NSArray<NSURL*>* urls = [NSArray arrayWithObjects:url1, url2, url3, nil];
intent.url = urls;
INInteraction* interaction = [[INInteraction alloc] initWithIntent:intent INInteraction* interaction = [[INInteraction alloc] initWithIntent:intent
response:nil]; response:nil];
userActivity.interaction = interaction; userActivity.interaction = interaction;
...@@ -525,13 +530,21 @@ TEST_F(UserActivityHandlerTest, ContinueUserActivityIntentBackground) { ...@@ -525,13 +530,21 @@ TEST_F(UserActivityHandlerTest, ContinueUserActivityIntentBackground) {
[OCMockObject niceMockForProtocol:@protocol(StartupInformation)]; [OCMockObject niceMockForProtocol:@protocol(StartupInformation)];
id connectionInformationMock = id connectionInformationMock =
[OCMockObject niceMockForProtocol:@protocol(ConnectionInformation)]; [OCMockObject niceMockForProtocol:@protocol(ConnectionInformation)];
[[connectionInformationMock expect] [[connectionInformationMock expect]
setStartupParameters:[OCMArg checkWithBlock:^BOOL(id value) { setStartupParameters:[OCMArg checkWithBlock:^BOOL(id value) {
EXPECT_TRUE([value isKindOfClass:[AppStartupParameters class]]); EXPECT_TRUE([value isKindOfClass:[AppStartupParameters class]] ||
value == nil);
AppStartupParameters* startupParameters = (AppStartupParameters*)value; if (value != nil) {
const GURL calledURL = startupParameters.externalURL; AppStartupParameters* startupParameters =
return calledURL == net::GURLWithNSURL(nsurl); (AppStartupParameters*)value;
const GURL calledURL = startupParameters.externalURL;
EXPECT_TRUE((int)[intent.url count] == 3);
return [intent.url containsObject:(net::NSURLWithGURL(calledURL))];
} else {
return YES;
}
}]]; }]];
// The test will fail if a method of this object is called. // The test will fail if a method of this object is called.
...@@ -617,15 +630,20 @@ TEST_F(UserActivityHandlerTest, ContinueUserActivityIntentIncognitoForeground) { ...@@ -617,15 +630,20 @@ TEST_F(UserActivityHandlerTest, ContinueUserActivityIntentIncognitoForeground) {
// Test. // Test.
EXPECT_OCMOCK_VERIFY(startupInformationMock); EXPECT_OCMOCK_VERIFY(startupInformationMock);
EXPECT_TRUE(result); EXPECT_TRUE(result);
EXPECT_EQ(3U, tabOpener.URLs.size());
} }
// Tests that Chrome responds to open intents in the foreground. // Tests that Chrome responds to open intents in the foreground.
TEST_F(UserActivityHandlerTest, ContinueUserActivityIntentForeground) { TEST_F(UserActivityHandlerTest, ContinueUserActivityIntentForeground) {
GURL gurl("http://www.google.com");
NSUserActivity* userActivity = NSUserActivity* userActivity =
[[NSUserActivity alloc] initWithActivityType:@"OpenInChromeIntent"]; [[NSUserActivity alloc] initWithActivityType:@"OpenInChromeIntent"];
OpenInChromeIntent* intent = [[OpenInChromeIntent alloc] init]; OpenInChromeIntent* intent = [[OpenInChromeIntent alloc] init];
intent.url = net::NSURLWithGURL(gurl); NSURL* url1 = [[NSURL alloc] initWithString:@"http://www.google.com"];
NSURL* url2 = [[NSURL alloc] initWithString:@"http://www.apple.com"];
NSURL* url3 = [[NSURL alloc] initWithString:@"http://www.espn.com"];
NSArray<NSURL*>* urls = [NSArray arrayWithObjects:url1, url2, url3, nil];
intent.url = urls;
INInteraction* interaction = [[INInteraction alloc] initWithIntent:intent INInteraction* interaction = [[INInteraction alloc] initWithIntent:intent
response:nil]; response:nil];
userActivity.interaction = interaction; userActivity.interaction = interaction;
...@@ -636,19 +654,32 @@ TEST_F(UserActivityHandlerTest, ContinueUserActivityIntentForeground) { ...@@ -636,19 +654,32 @@ TEST_F(UserActivityHandlerTest, ContinueUserActivityIntentForeground) {
id connectionInformationMock = id connectionInformationMock =
[OCMockObject niceMockForProtocol:@protocol(ConnectionInformation)]; [OCMockObject niceMockForProtocol:@protocol(ConnectionInformation)];
[[connectionInformationMock expect] [[connectionInformationMock expect]
setStartupParameters:[OCMArg checkWithBlock:^BOOL(id value) { setStartupParameters:[OCMArg checkWithBlock:^BOOL(id value) {
EXPECT_TRUE([value isKindOfClass:[AppStartupParameters class]]); EXPECT_TRUE([value isKindOfClass:[AppStartupParameters class]] ||
value == nil);
AppStartupParameters* startupParameters = (AppStartupParameters*)value; if (value != nil) {
const GURL calledURL = startupParameters.externalURL; AppStartupParameters* startupParameters =
return calledURL == net::GURLWithNSURL(intent.url); (AppStartupParameters*)value;
const GURL calledURL = startupParameters.externalURL;
EXPECT_TRUE((int)[intent.url count] == 3);
return [intent.url containsObject:(net::NSURLWithGURL(calledURL))];
} else {
return YES;
}
}]]; }]];
MockTabOpener* tabOpener = [[MockTabOpener alloc] init]; MockTabOpener* tabOpener = [[MockTabOpener alloc] init];
std::vector<GURL> URLs;
for (NSURL* URL in urls) {
URLs.push_back(net::GURLWithNSURL(URL));
}
AppStartupParameters* startupParams = AppStartupParameters* startupParams =
[[AppStartupParameters alloc] initWithExternalURL:gurl completeURL:gurl]; [[AppStartupParameters alloc] initWithURLs:URLs];
[[[connectionInformationMock stub] andReturn:startupParams] [[[connectionInformationMock stub] andReturn:startupParams]
startupParameters]; startupParameters];
...@@ -661,9 +692,9 @@ TEST_F(UserActivityHandlerTest, ContinueUserActivityIntentForeground) { ...@@ -661,9 +692,9 @@ TEST_F(UserActivityHandlerTest, ContinueUserActivityIntentForeground) {
startupInformation:startupInformationMock]; startupInformation:startupInformationMock];
// Test. // Test.
EXPECT_EQ(gurl, tabOpener.urlLoadParams.web_params.url); EXPECT_OCMOCK_VERIFY(startupInformationMock);
EXPECT_TRUE(tabOpener.urlLoadParams.web_params.virtual_url.is_empty());
EXPECT_TRUE(result); EXPECT_TRUE(result);
EXPECT_EQ(3U, tabOpener.URLs.size());
} }
// Tests that handleStartupParameters with a file url. "external URL" gets // Tests that handleStartupParameters with a file url. "external URL" gets
......
...@@ -29,8 +29,6 @@ ...@@ -29,8 +29,6 @@
<true/> <true/>
<key>INIntentInput</key> <key>INIntentInput</key>
<string>url</string> <string>url</string>
<key>INIntentKeyParameter</key>
<string>url</string>
<key>INIntentLastParameterTag</key> <key>INIntentLastParameterTag</key>
<integer>6</integer> <integer>6</integer>
<key>INIntentManagedParameterCombinations</key> <key>INIntentManagedParameterCombinations</key>
...@@ -68,13 +66,15 @@ ...@@ -68,13 +66,15 @@
<key>INIntentParameterPromptDialogCustom</key> <key>INIntentParameterPromptDialogCustom</key>
<true/> <true/>
<key>INIntentParameterPromptDialogFormatString</key> <key>INIntentParameterPromptDialogFormatString</key>
<string>Which URL?</string> <string>What URL?</string>
<key>INIntentParameterPromptDialogFormatStringID</key> <key>INIntentParameterPromptDialogFormatStringID</key>
<string>3PpdH5</string> <string>3PpdH5</string>
<key>INIntentParameterPromptDialogType</key> <key>INIntentParameterPromptDialogType</key>
<string>Primary</string> <string>Primary</string>
</dict> </dict>
</array> </array>
<key>INIntentParameterSupportsMultipleValues</key>
<true/>
<key>INIntentParameterSupportsResolution</key> <key>INIntentParameterSupportsResolution</key>
<true/> <true/>
<key>INIntentParameterTag</key> <key>INIntentParameterTag</key>
......
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