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 // Condtionally invoke parent class so that Wait will not exit |
| 215 // until the target URL arrives. |
| 216 content::WindowedNotificationObserver::Observe(type, source, details); |
| 217 } |
| 218 } |
| 219 |
| 220 private: |
| 221 GURL url_; |
| 222 }; |
| 223 |
192 } // namespace | 224 } // namespace |
193 | 225 |
194 class MockGetAuthTokenFunction : public IdentityGetAuthTokenFunction { | 226 class MockGetAuthTokenFunction : public IdentityGetAuthTokenFunction { |
195 public: | 227 public: |
196 MockGetAuthTokenFunction() : login_ui_result_(true), | 228 MockGetAuthTokenFunction() : login_ui_result_(true), |
197 scope_ui_result_(true), | 229 scope_ui_result_(true), |
198 login_ui_shown_(false), | 230 login_ui_shown_(false), |
199 scope_ui_shown_(false) { | 231 scope_ui_shown_(false) { |
200 } | 232 } |
201 | 233 |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
538 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); | 570 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); |
539 func->set_scope_ui_failure(GaiaWebAuthFlow::WINDOW_CLOSED); | 571 func->set_scope_ui_failure(GaiaWebAuthFlow::WINDOW_CLOSED); |
540 std::string error = utils::RunFunctionAndReturnError( | 572 std::string error = utils::RunFunctionAndReturnError( |
541 func.get(), "[{\"interactive\": true}]", browser()); | 573 func.get(), "[{\"interactive\": true}]", browser()); |
542 EXPECT_EQ(std::string(errors::kUserRejected), error); | 574 EXPECT_EQ(std::string(errors::kUserRejected), error); |
543 EXPECT_FALSE(func->login_ui_shown()); | 575 EXPECT_FALSE(func->login_ui_shown()); |
544 EXPECT_TRUE(func->scope_ui_shown()); | 576 EXPECT_TRUE(func->scope_ui_shown()); |
545 } | 577 } |
546 | 578 |
547 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, | 579 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, |
| 580 InteractiveApprovalLoadFailed) { |
| 581 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); |
| 582 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); |
| 583 EXPECT_CALL(*func.get(), HasLoginToken()) |
| 584 .WillOnce(Return(true)); |
| 585 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( |
| 586 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); |
| 587 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); |
| 588 func->set_scope_ui_failure(GaiaWebAuthFlow::LOAD_FAILED); |
| 589 std::string error = utils::RunFunctionAndReturnError( |
| 590 func.get(), "[{\"interactive\": true}]", browser()); |
| 591 EXPECT_EQ(std::string(errors::kPageLoadFailure), error); |
| 592 EXPECT_FALSE(func->login_ui_shown()); |
| 593 EXPECT_TRUE(func->scope_ui_shown()); |
| 594 } |
| 595 |
| 596 IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionTest, |
548 InteractiveApprovalInvalidRedirect) { | 597 InteractiveApprovalInvalidRedirect) { |
549 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); | 598 scoped_refptr<MockGetAuthTokenFunction> func(new MockGetAuthTokenFunction()); |
550 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); | 599 func->set_extension(CreateExtension(CLIENT_ID | SCOPES)); |
551 EXPECT_CALL(*func.get(), HasLoginToken()) | 600 EXPECT_CALL(*func.get(), HasLoginToken()) |
552 .WillOnce(Return(true)); | 601 .WillOnce(Return(true)); |
553 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( | 602 TestOAuth2MintTokenFlow* flow = new TestOAuth2MintTokenFlow( |
554 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); | 603 TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS, func.get()); |
555 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); | 604 EXPECT_CALL(*func.get(), CreateMintTokenFlow(_)).WillOnce(Return(flow)); |
556 func->set_scope_ui_failure(GaiaWebAuthFlow::INVALID_REDIRECT); | 605 func->set_scope_ui_failure(GaiaWebAuthFlow::INVALID_REDIRECT); |
557 std::string error = utils::RunFunctionAndReturnError( | 606 std::string error = utils::RunFunctionAndReturnError( |
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
954 "chrome/test/data/extensions/api_test/identity"))); | 1003 "chrome/test/data/extensions/api_test/identity"))); |
955 ASSERT_TRUE(https_server.Start()); | 1004 ASSERT_TRUE(https_server.Start()); |
956 GURL auth_url(https_server.GetURL("files/interaction_required.html")); | 1005 GURL auth_url(https_server.GetURL("files/interaction_required.html")); |
957 | 1006 |
958 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( | 1007 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( |
959 new IdentityLaunchWebAuthFlowFunction()); | 1008 new IdentityLaunchWebAuthFlowFunction()); |
960 scoped_refptr<Extension> empty_extension( | 1009 scoped_refptr<Extension> empty_extension( |
961 utils::CreateEmptyExtension()); | 1010 utils::CreateEmptyExtension()); |
962 function->set_extension(empty_extension.get()); | 1011 function->set_extension(empty_extension.get()); |
963 | 1012 |
964 content::WindowedNotificationObserver popup_observer( | 1013 WaitForGURLAndCloseWindow popup_observer(auth_url); |
965 chrome::NOTIFICATION_BROWSER_WINDOW_READY, | |
966 content::NotificationService::AllSources()); | |
967 | 1014 |
968 std::string args = "[{\"interactive\": true, \"url\": \"" + | 1015 std::string args = "[{\"interactive\": true, \"url\": \"" + |
969 auth_url.spec() + "\"}]"; | 1016 auth_url.spec() + "\"}]"; |
970 RunFunctionAsync(function, args); | 1017 RunFunctionAsync(function, args); |
971 | 1018 |
972 popup_observer.Wait(); | 1019 popup_observer.Wait(); |
973 content::Source<Browser>(popup_observer.source())->window()->Close(); | |
974 | 1020 |
975 EXPECT_EQ(std::string(errors::kUserRejected), WaitForError(function)); | 1021 EXPECT_EQ(std::string(errors::kUserRejected), WaitForError(function)); |
976 } | 1022 } |
977 | 1023 |
978 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, InteractionRequired) { | 1024 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, InteractionRequired) { |
979 net::SpawnedTestServer https_server( | 1025 net::SpawnedTestServer https_server( |
980 net::SpawnedTestServer::TYPE_HTTPS, | 1026 net::SpawnedTestServer::TYPE_HTTPS, |
981 net::SpawnedTestServer::kLocalhost, | 1027 net::SpawnedTestServer::kLocalhost, |
982 base::FilePath(FILE_PATH_LITERAL( | 1028 base::FilePath(FILE_PATH_LITERAL( |
983 "chrome/test/data/extensions/api_test/identity"))); | 1029 "chrome/test/data/extensions/api_test/identity"))); |
984 ASSERT_TRUE(https_server.Start()); | 1030 ASSERT_TRUE(https_server.Start()); |
985 GURL auth_url(https_server.GetURL("files/interaction_required.html")); | 1031 GURL auth_url(https_server.GetURL("files/interaction_required.html")); |
986 | 1032 |
987 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( | 1033 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( |
988 new IdentityLaunchWebAuthFlowFunction()); | 1034 new IdentityLaunchWebAuthFlowFunction()); |
989 scoped_refptr<Extension> empty_extension( | 1035 scoped_refptr<Extension> empty_extension( |
990 utils::CreateEmptyExtension()); | 1036 utils::CreateEmptyExtension()); |
991 function->set_extension(empty_extension.get()); | 1037 function->set_extension(empty_extension.get()); |
992 | 1038 |
993 std::string args = "[{\"interactive\": false, \"url\": \"" + | 1039 std::string args = "[{\"interactive\": false, \"url\": \"" + |
994 auth_url.spec() + "\"}]"; | 1040 auth_url.spec() + "\"}]"; |
995 std::string error = utils::RunFunctionAndReturnError(function, args, | 1041 std::string error = utils::RunFunctionAndReturnError(function, args, |
996 browser()); | 1042 browser()); |
997 | 1043 |
998 EXPECT_EQ(std::string(errors::kInteractionRequired), error); | 1044 EXPECT_EQ(std::string(errors::kInteractionRequired), error); |
999 } | 1045 } |
1000 | 1046 |
| 1047 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, LoadFailed) { |
| 1048 net::SpawnedTestServer https_server( |
| 1049 net::SpawnedTestServer::TYPE_HTTPS, |
| 1050 net::SpawnedTestServer::kLocalhost, |
| 1051 base::FilePath(FILE_PATH_LITERAL( |
| 1052 "chrome/test/data/extensions/api_test/identity"))); |
| 1053 ASSERT_TRUE(https_server.Start()); |
| 1054 GURL auth_url(https_server.GetURL("files/five_hundred.html")); |
| 1055 |
| 1056 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( |
| 1057 new IdentityLaunchWebAuthFlowFunction()); |
| 1058 scoped_refptr<Extension> empty_extension( |
| 1059 utils::CreateEmptyExtension()); |
| 1060 function->set_extension(empty_extension.get()); |
| 1061 |
| 1062 std::string args = "[{\"interactive\": true, \"url\": \"" + |
| 1063 auth_url.spec() + "\"}]"; |
| 1064 std::string error = utils::RunFunctionAndReturnError(function, args, |
| 1065 browser()); |
| 1066 |
| 1067 EXPECT_EQ(std::string(errors::kPageLoadFailure), error); |
| 1068 } |
| 1069 |
1001 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, NonInteractiveSuccess) { | 1070 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, NonInteractiveSuccess) { |
1002 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( | 1071 scoped_refptr<IdentityLaunchWebAuthFlowFunction> function( |
1003 new IdentityLaunchWebAuthFlowFunction()); | 1072 new IdentityLaunchWebAuthFlowFunction()); |
1004 scoped_refptr<Extension> empty_extension( | 1073 scoped_refptr<Extension> empty_extension( |
1005 utils::CreateEmptyExtension()); | 1074 utils::CreateEmptyExtension()); |
1006 function->set_extension(empty_extension.get()); | 1075 function->set_extension(empty_extension.get()); |
1007 | 1076 |
1008 function->InitFinalRedirectURLPrefixForTest("abcdefghij"); | 1077 function->InitFinalRedirectURLPrefixForTest("abcdefghij"); |
1009 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( | 1078 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( |
1010 function, | 1079 function, |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( | 1130 scoped_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( |
1062 function, args, browser())); | 1131 function, args, browser())); |
1063 | 1132 |
1064 std::string url; | 1133 std::string url; |
1065 EXPECT_TRUE(value->GetAsString(&url)); | 1134 EXPECT_TRUE(value->GetAsString(&url)); |
1066 EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), | 1135 EXPECT_EQ(std::string("https://abcdefghij.chromiumapp.org/callback#test"), |
1067 url); | 1136 url); |
1068 } | 1137 } |
1069 | 1138 |
1070 } // namespace extensions | 1139 } // namespace extensions |
OLD | NEW |