OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/string_util.h" | 5 #include "base/string_util.h" |
6 #include "base/stringprintf.h" | 6 #include "base/stringprintf.h" |
7 #include "base/values.h" | 7 #include "base/values.h" |
8 #include "chrome/browser/extensions/api/identity/identity_api.h" | 8 #include "chrome/browser/extensions/api/identity/identity_api.h" |
9 #include "chrome/browser/extensions/component_loader.h" | |
9 #include "chrome/browser/extensions/extension_apitest.h" | 10 #include "chrome/browser/extensions/extension_apitest.h" |
10 #include "chrome/browser/extensions/extension_browsertest.h" | 11 #include "chrome/browser/extensions/extension_browsertest.h" |
11 #include "chrome/browser/extensions/extension_function_test_utils.h" | 12 #include "chrome/browser/extensions/extension_function_test_utils.h" |
12 #include "chrome/browser/extensions/extension_service.h" | 13 #include "chrome/browser/extensions/extension_service.h" |
13 #include "chrome/browser/ui/browser.h" | 14 #include "chrome/browser/ui/browser.h" |
14 #include "chrome/browser/ui/browser_window.h" | 15 #include "chrome/browser/ui/browser_window.h" |
15 #include "chrome/common/chrome_notification_types.h" | 16 #include "chrome/common/chrome_notification_types.h" |
16 #include "chrome/common/chrome_switches.h" | 17 #include "chrome/common/chrome_switches.h" |
17 #include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h" | 18 #include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h" |
18 #include "chrome/test/base/in_process_browser_test.h" | 19 #include "chrome/test/base/in_process_browser_test.h" |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
182 private: | 183 private: |
183 ResultType result_; | 184 ResultType result_; |
184 OAuth2MintTokenFlow::Delegate* delegate_; | 185 OAuth2MintTokenFlow::Delegate* delegate_; |
185 }; | 186 }; |
186 | 187 |
187 BrowserContextKeyedService* IdentityAPITestFactory( | 188 BrowserContextKeyedService* IdentityAPITestFactory( |
188 content::BrowserContext* profile) { | 189 content::BrowserContext* profile) { |
189 return new IdentityAPI(static_cast<Profile*>(profile)); | 190 return new IdentityAPI(static_cast<Profile*>(profile)); |
190 } | 191 } |
191 | 192 |
193 // Waits for a specific GURL to generate a NOTIFICATION_LOAD_STOP | |
194 // event, and closes the window embedding the webcontents. | |
195 class WaitForGURLAndCloseWindow : public content::WindowedNotificationObserver { | |
196 public: | |
197 explicit WaitForGURLAndCloseWindow(GURL url) | |
198 : WindowedNotificationObserver( | |
199 content::NOTIFICATION_LOAD_STOP, | |
200 content::NotificationService::AllSources()), | |
201 url_(url) {} | |
202 | |
203 // NotificationObserver: | |
204 virtual void Observe(int type, | |
205 const content::NotificationSource& source, | |
206 const content::NotificationDetails& details) OVERRIDE { | |
207 content::NavigationController* web_auth_flow_controller = | |
208 content::Source<content::NavigationController>(source).ptr(); | |
209 content::WebContents* web_contents = | |
210 web_auth_flow_controller->GetWebContents(); | |
211 | |
212 if (web_contents->GetURL() == url_) { | |
213 web_contents->GetEmbedderWebContents()->Close(); | |
214 content::WindowedNotificationObserver::Observe(type, source, details); | |
miket_OOO
2013/05/24 16:37:56
Did you mean to call the inherited behavior only c
Michael Courage
2013/05/30 22:27:03
Yes, added a comment to that effect.
| |
215 } | |
216 } | |
217 | |
218 private: | |
219 GURL url_; | |
220 }; | |
221 | |
192 } // namespace | 222 } // namespace |
193 | 223 |
194 class MockGetAuthTokenFunction : public IdentityGetAuthTokenFunction { | 224 class MockGetAuthTokenFunction : public IdentityGetAuthTokenFunction { |
195 public: | 225 public: |
196 MockGetAuthTokenFunction() : login_ui_result_(true), | 226 MockGetAuthTokenFunction() : login_ui_result_(true), |
197 scope_ui_result_(true), | 227 scope_ui_result_(true), |
198 login_ui_shown_(false), | 228 login_ui_shown_(false), |
199 scope_ui_shown_(false) { | 229 scope_ui_shown_(false) { |
200 } | 230 } |
201 | 231 |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
538 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); | 568 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); |
539 func->set_scope_ui_failure(GaiaWebAuthFlow::WINDOW_CLOSED); | 569 func->set_scope_ui_failure(GaiaWebAuthFlow::WINDOW_CLOSED); |
540 std::string error = utils::RunFunctionAndReturnError( | 570 std::string error = utils::RunFunctionAndReturnError( |
541 func.get(), "[{\"interactive\": true}]", browser()); | 571 func.get(), "[{\"interactive\": true}]", browser()); |
542 EXPECT_EQ(std::string(errors::kUserRejected), error); | 572 EXPECT_EQ(std::string(errors::kUserRejected), error); |
543 EXPECT_FALSE(func->login_ui_shown()); | 573 EXPECT_FALSE(func->login_ui_shown()); |
544 EXPECT_TRUE(func->scope_ui_shown()); | 574 EXPECT_TRUE(func->scope_ui_shown()); |
545 } | 575 } |
546 | 576 |
547 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, | 577 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, |
578 InteractiveApprovalLoadFailed) { | |
579 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); | |
580 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); | |
581 EXPECT_CALL(*func.get(), HasLoginToken()) | |
582 .WillOnce(Return(true)); | |
583 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( | |
584 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); | |
585 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); | |
586 func->set_scope_ui_failure(GaiaWebAuthFlow::LOAD_FAILED); | |
587 std::string error = utils::RunFunctionAndReturnError( | |
588 func.get(), "[{\"interactive\": true}]", browser()); | |
589 EXPECT_EQ(std::string(errors::kPageLoadFailure), error); | |
590 EXPECT_FALSE(func->login_ui_shown()); | |
591 EXPECT_TRUE(func->scope_ui_shown()); | |
592 } | |
593 | |
594 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, | |
548 InteractiveApprovalInvalidRedirect) { | 595 InteractiveApprovalInvalidRedirect) { |
549 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); | 596 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); |
550 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); | 597 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); |
551 EXPECT_CALL(*func.get(), HasLoginToken()) | 598 EXPECT_CALL(*func.get(), HasLoginToken()) |
552 .WillOnce(Return(true)); | 599 .WillOnce(Return(true)); |
553 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( | 600 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( |
554 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); | 601 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); |
555 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); | 602 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); |
556 func->set_scope_ui_failure(GaiaWebAuthFlow::INVALID_REDIRECT); | 603 func->set_scope_ui_failure(GaiaWebAuthFlow::INVALID_REDIRECT); |
557 std::string error = utils::RunFunctionAndReturnError( | 604 std::string error = utils::RunFunctionAndReturnError( |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
933 IdentityTokenCacheValue token(kAccessToken, | 980 IdentityTokenCacheValue token(kAccessToken, |
934 base::TimeDelta::FromSeconds(3600)); | 981 base::TimeDelta::FromSeconds(3600)); |
935 SetCachedToken(token); | 982 SetCachedToken(token); |
936 EXPECT_TRUE(InvalidateDefaultToken()); | 983 EXPECT_TRUE(InvalidateDefaultToken()); |
937 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND, | 984 EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND, |
938 GetCachedToken().status()); | 985 GetCachedToken().status()); |
939 } | 986 } |
940 | 987 |
941 class LaunchWebAuthFlowFunctionTest : public AsyncExtensionBrowserTest { | 988 class LaunchWebAuthFlowFunctionTest : public AsyncExtensionBrowserTest { |
942 public: | 989 public: |
990 void LoadComponent() { | |
991 // Normally the ComponentLoader won't load the component in tests. | |
992 ExtensionService* service = extensions::ExtensionSystem::Get( | |
993 profile())->extension_service(); | |
994 | |
995 service->component_loader()->Add( | |
996 IDR_IDENTITY_API_SCOPE_APPROVAL_MANIFEST, | |
997 base::FilePath(FILE_PATH_LITERAL("identity_scope_approval_dialog"))); | |
998 } | |
999 | |
943 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | 1000 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
944 // Reduce performance test variance by disabling background networking. | 1001 // Reduce performance test variance by disabling background networking. |
945 command_line->AppendSwitch(switches::kDisableBackgroundNetworking); | 1002 command_line->AppendSwitch(switches::kDisableBackgroundNetworking); |
946 } | 1003 } |
947 }; | 1004 }; |
948 | 1005 |
949 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, UserCloseWindow) { | 1006 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, UserCloseWindow) { |
1007 LoadComponent(); | |
950 net::SpawnedTestServer https_server( | 1008 net::SpawnedTestServer https_server( |
951 net::SpawnedTestServer::TYPE_HTTPS, | 1009 net::SpawnedTestServer::TYPE_HTTPS, |
952 net::SpawnedTestServer::kLocalhost, | 1010 net::SpawnedTestServer::kLocalhost, |
953 base::FilePath(FILE_PATH_LITERAL( | 1011 base::FilePath(FILE_PATH_LITERAL( |
954 "chrome/test/data/extensions/api_test/identity"))); | 1012 "chrome/test/data/extensions/api_test/identity"))); |
955 ASSERT_TRUE(https_server.Start()); | 1013 ASSERT_TRUE(https_server.Start()); |
956 GURL auth_url(https_server.GetURL("files/interaction_required.html")); | 1014 GURL auth_url(https_server.GetURL("files/interaction_required.html")); |
957 | 1015 |
958 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( | 1016 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( |
959 new IdentityLaunchWebAuthFlowFunction()); | 1017 new IdentityLaunchWebAuthFlowFunction()); |
960 scoped_refptr<Extension> empty_extension( | 1018 scoped_refptr<Extension> empty_extension( |
961 utils::CreateEmptyExtension()); | 1019 utils::CreateEmptyExtension()); |
962 function->set_extension(empty_extension.get()); | 1020 function->set_extension(empty_extension.get()); |
963 | 1021 |
964 content::WindowedNotificationObserver popup_observer( | 1022 WaitForGURLAndCloseWindow popup_observer(auth_url); |
965 chrome::NOTIFICATION_BROWSER_WINDOW_READY, | |
966 content::NotificationService::AllSources()); | |
967 | 1023 |
968 std::string args = "[{\"interactive\": true, \"url\": \"" + | 1024 std::string args = "[{\"interactive\": true, \"url\": \"" + |
969 auth_url.spec() + "\"}]"; | 1025 auth_url.spec() + "\"}]"; |
970 RunFunctionAsync(function, args); | 1026 RunFunctionAsync(function, args); |
971 | 1027 |
972 popup_observer.Wait(); | 1028 popup_observer.Wait(); |
973 content::Source<Browser>(popup_observer.source())->window()->Close(); | |
974 | 1029 |
975 EXPECT_EQ(std::string(errors::kUserRejected), WaitForError(function)); | 1030 EXPECT_EQ(std::string(errors::kUserRejected), WaitForError(function)); |
976 } | 1031 } |
977 | 1032 |
978 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, InteractionRequired) { | 1033 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, InteractionRequired) { |
1034 LoadComponent(); | |
979 net::SpawnedTestServer https_server( | 1035 net::SpawnedTestServer https_server( |
980 net::SpawnedTestServer::TYPE_HTTPS, | 1036 net::SpawnedTestServer::TYPE_HTTPS, |
981 net::SpawnedTestServer::kLocalhost, | 1037 net::SpawnedTestServer::kLocalhost, |
982 base::FilePath(FILE_PATH_LITERAL( | 1038 base::FilePath(FILE_PATH_LITERAL( |
983 "chrome/test/data/extensions/api_test/identity"))); | 1039 "chrome/test/data/extensions/api_test/identity"))); |
984 ASSERT_TRUE(https_server.Start()); | 1040 ASSERT_TRUE(https_server.Start()); |
985 GURL auth_url(https_server.GetURL("files/interaction_required.html")); | 1041 GURL auth_url(https_server.GetURL("files/interaction_required.html")); |
986 | 1042 |
987 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( | 1043 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( |
988 new IdentityLaunchWebAuthFlowFunction()); | 1044 new IdentityLaunchWebAuthFlowFunction()); |
989 scoped_refptr<Extension> empty_extension( | 1045 scoped_refptr<Extension> empty_extension( |
990 utils::CreateEmptyExtension()); | 1046 utils::CreateEmptyExtension()); |
991 function->set_extension(empty_extension.get()); | 1047 function->set_extension(empty_extension.get()); |
992 | 1048 |
993 std::string args = "[{\"interactive\": false, \"url\": \"" + | 1049 std::string args = "[{\"interactive\": false, \"url\": \"" + |
994 auth_url.spec() + "\"}]"; | 1050 auth_url.spec() + "\"}]"; |
995 std::string error = utils::RunFunctionAndReturnError(function, args, | 1051 std::string error = utils::RunFunctionAndReturnError(function, args, |
996 browser()); | 1052 browser()); |
997 | 1053 |
998 EXPECT_EQ(std::string(errors::kInteractionRequired), error); | 1054 EXPECT_EQ(std::string(errors::kInteractionRequired), error); |
999 } | 1055 } |
1000 | 1056 |
1001 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, NonInteractiveSuccess) { | 1057 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, LoadFailed) { |
1058 LoadComponent(); | |
1059 net::SpawnedTestServer https_server( | |
1060 net::SpawnedTestServer::TYPE_HTTPS, | |
1061 net::SpawnedTestServer::kLocalhost, | |
1062 base::FilePath(FILE_PATH_LITERAL( | |
1063 "chrome/test/data/extensions/api_test/identity"))); | |
1064 ASSERT_TRUE(https_server.Start()); | |
1065 GURL auth_url(https_server.GetURL("files/five_hundred.html")); | |
1066 | |
1002 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( | 1067 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( |
1003 new IdentityLaunchWebAuthFlowFunction()); | 1068 new IdentityLaunchWebAuthFlowFunction()); |
1004 scoped_refptr<Extension> empty_extension( | 1069 scoped_refptr<Extension> empty_extension( |
1070 utils::CreateEmptyExtension()); | |
1071 function->set_extension(empty_extension.get()); | |
1072 | |
1073 std::string args = "[{\"interactive\": true, \"url\": \"" + | |
1074 auth_url.spec() + "\"}]"; | |
1075 std::string error = utils::RunFunctionAndReturnError(function, args, | |
1076 browser()); | |
1077 | |
1078 EXPECT_EQ(std::string(errors::kPageLoadFailure), error); | |
1079 } | |
1080 | |
1081 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, NonInteractiveSuccess) { | |
1082 LoadComponent(); | |
1083 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( | |
1084 new IdentityLaunchWebAuthFlowFunction()); | |
1085 scoped_refptr<Extension> empty_extension( | |
1005 utils::CreateEmptyExtension()); | 1086 utils::CreateEmptyExtension()); |
1006 function->set_extension(empty_extension.get()); | 1087 function->set_extension(empty_extension.get()); |
1007 | 1088 |
1008 function->InitFinalRedirectURLPrefixForTest("abcdefghij"); | 1089 function->InitFinalRedirectURLPrefixForTest("abcdefghij"); |
1009 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( | 1090 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( |
1010 function, | 1091 function, |
1011 "[{\"interactive\": false," | 1092 "[{\"interactive\": false," |
1012 "\"url\": \"https://abcdefghij.chromiumapp.org/callback#test\"}]", | 1093 "\"url\": \"https://abcdefghij.chromiumapp.org/callback#test\"}]", |
1013 browser())); | 1094 browser())); |
1014 | 1095 |
1015 std::string url; | 1096 std::string url; |
1016 EXPECT_TRUE(value->GetAsString(&url)); | 1097 EXPECT_TRUE(value->GetAsString(&url)); |
1017 EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), | 1098 EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), |
1018 url); | 1099 url); |
1019 } | 1100 } |
1020 | 1101 |
1021 IN_PROC_BROWSER_TEST_F( | 1102 IN_PROC_BROWSER_TEST_F( |
1022 LaunchWebAuthFlowFunctionTest, InteractiveFirstNavigationSuccess) { | 1103 LaunchWebAuthFlowFunctionTest, InteractiveFirstNavigationSuccess) { |
1104 LoadComponent(); | |
1023 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( | 1105 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( |
1024 new IdentityLaunchWebAuthFlowFunction()); | 1106 new IdentityLaunchWebAuthFlowFunction()); |
1025 scoped_refptr<Extension> empty_extension( | 1107 scoped_refptr<Extension> empty_extension( |
1026 utils::CreateEmptyExtension()); | 1108 utils::CreateEmptyExtension()); |
1027 function->set_extension(empty_extension.get()); | 1109 function->set_extension(empty_extension.get()); |
1028 | 1110 |
1029 function->InitFinalRedirectURLPrefixForTest("abcdefghij"); | 1111 function->InitFinalRedirectURLPrefixForTest("abcdefghij"); |
1030 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( | 1112 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( |
1031 function, | 1113 function, |
1032 "[{\"interactive\": true," | 1114 "[{\"interactive\": true," |
1033 "\"url\": \"https://abcdefghij.chromiumapp.org/callback#test\"}]", | 1115 "\"url\": \"https://abcdefghij.chromiumapp.org/callback#test\"}]", |
1034 browser())); | 1116 browser())); |
1035 | 1117 |
1036 std::string url; | 1118 std::string url; |
1037 EXPECT_TRUE(value->GetAsString(&url)); | 1119 EXPECT_TRUE(value->GetAsString(&url)); |
1038 EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), | 1120 EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), |
1039 url); | 1121 url); |
1040 } | 1122 } |
1041 | 1123 |
1042 IN_PROC_BROWSER_TEST_F( | 1124 IN_PROC_BROWSER_TEST_F( |
1043 LaunchWebAuthFlowFunctionTest, InteractiveSecondNavigationSuccess) { | 1125 LaunchWebAuthFlowFunctionTest, InteractiveSecondNavigationSuccess) { |
1126 LoadComponent(); | |
1044 net::SpawnedTestServer https_server( | 1127 net::SpawnedTestServer https_server( |
1045 net::SpawnedTestServer::TYPE_HTTPS, | 1128 net::SpawnedTestServer::TYPE_HTTPS, |
1046 net::SpawnedTestServer::kLocalhost, | 1129 net::SpawnedTestServer::kLocalhost, |
1047 base::FilePath(FILE_PATH_LITERAL( | 1130 base::FilePath(FILE_PATH_LITERAL( |
1048 "chrome/test/data/extensions/api_test/identity"))); | 1131 "chrome/test/data/extensions/api_test/identity"))); |
1049 ASSERT_TRUE(https_server.Start()); | 1132 ASSERT_TRUE(https_server.Start()); |
1050 GURL auth_url(https_server.GetURL("files/redirect_to_chromiumapp.html")); | 1133 GURL auth_url(https_server.GetURL("files/redirect_to_chromiumapp.html")); |
1051 | 1134 |
1052 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( | 1135 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( |
1053 new IdentityLaunchWebAuthFlowFunction()); | 1136 new IdentityLaunchWebAuthFlowFunction()); |
1054 scoped_refptr<Extension> empty_extension( | 1137 scoped_refptr<Extension> empty_extension( |
1055 utils::CreateEmptyExtension()); | 1138 utils::CreateEmptyExtension()); |
1056 function->set_extension(empty_extension.get()); | 1139 function->set_extension(empty_extension.get()); |
1057 | 1140 |
1058 function->InitFinalRedirectURLPrefixForTest("abcdefghij"); | 1141 function->InitFinalRedirectURLPrefixForTest("abcdefghij"); |
1059 std::string args = "[{\"interactive\": true, \"url\": \"" + | 1142 std::string args = "[{\"interactive\": true, \"url\": \"" + |
1060 auth_url.spec() + "\"}]"; | 1143 auth_url.spec() + "\"}]"; |
1061 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( | 1144 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( |
1062 function, args, browser())); | 1145 function, args, browser())); |
1063 | 1146 |
1064 std::string url; | 1147 std::string url; |
1065 EXPECT_TRUE(value->GetAsString(&url)); | 1148 EXPECT_TRUE(value->GetAsString(&url)); |
1066 EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), | 1149 EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), |
1067 url); | 1150 url); |
1068 } | 1151 } |
1069 | 1152 |
1070 } // namespace extensions | 1153 } // namespace extensions |
OLD | NEW |