| 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/utf_string_conversions.h" | 5 #include "base/utf_string_conversions.h" |
| 6 #include "chrome/browser/profiles/profile.h" | 6 #include "chrome/browser/profiles/profile.h" |
| 7 #include "chrome/browser/tab_contents/tab_util.h" | 7 #include "chrome/browser/tab_contents/tab_util.h" |
| 8 #include "chrome/browser/ui/browser.h" | 8 #include "chrome/browser/ui/browser.h" |
| 9 #include "chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet_co
ntroller.h" | 9 #include "chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet_co
ntroller.h" |
| 10 #import "chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.
h" | 10 #import "chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.
h" |
| 11 #import "chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h" | 11 #import "chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h" |
| 12 #import "chrome/browser/ui/cocoa/intents/web_intent_choose_service_view_controll
er.h" | 12 #import "chrome/browser/ui/cocoa/intents/web_intent_choose_service_view_controll
er.h" |
| 13 #import "chrome/browser/ui/cocoa/intents/web_intent_extension_prompt_view_contro
ller.h" | 13 #import "chrome/browser/ui/cocoa/intents/web_intent_extension_prompt_view_contro
ller.h" |
| 14 #import "chrome/browser/ui/cocoa/intents/web_intent_inline_service_view_controll
er.h" | 14 #import "chrome/browser/ui/cocoa/intents/web_intent_inline_service_view_controll
er.h" |
| 15 #import "chrome/browser/ui/cocoa/intents/web_intent_message_view_controller.h" | 15 #import "chrome/browser/ui/cocoa/intents/web_intent_message_view_controller.h" |
| 16 #import "chrome/browser/ui/cocoa/intents/web_intent_picker_cocoa2.h" | 16 #import "chrome/browser/ui/cocoa/intents/web_intent_picker_cocoa2.h" |
| 17 #import "chrome/browser/ui/cocoa/intents/web_intent_picker_view_controller.h" | 17 #import "chrome/browser/ui/cocoa/intents/web_intent_picker_view_controller.h" |
| 18 #import "chrome/browser/ui/cocoa/intents/web_intent_progress_view_controller.h" | 18 #import "chrome/browser/ui/cocoa/intents/web_intent_progress_view_controller.h" |
| 19 #import "chrome/browser/ui/cocoa/intents/web_intent_service_row_view_controller.
h" | 19 #import "chrome/browser/ui/cocoa/intents/web_intent_service_row_view_controller.
h" |
| 20 #import "chrome/browser/ui/cocoa/key_equivalent_constants.h" | 20 #import "chrome/browser/ui/cocoa/key_equivalent_constants.h" |
| 21 #include "chrome/browser/ui/cocoa/run_loop_testing.h" | 21 #include "chrome/browser/ui/cocoa/run_loop_testing.h" |
| 22 #import "chrome/browser/ui/cocoa/spinner_progress_indicator.h" | 22 #import "chrome/browser/ui/cocoa/spinner_progress_indicator.h" |
| 23 #include "chrome/browser/ui/intents/web_intent_picker_delegate_mock.h" | 23 #include "chrome/browser/ui/intents/web_intent_picker_delegate_mock.h" |
| 24 #include "chrome/browser/ui/tab_contents/tab_contents.h" | 24 #include "chrome/browser/ui/tab_contents/tab_contents.h" |
| 25 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 25 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 26 #include "chrome/common/extensions/extension.h" | 26 #include "chrome/common/extensions/extension.h" |
| 27 #include "chrome/test/base/in_process_browser_test.h" | 27 #include "chrome/test/base/in_process_browser_test.h" |
| 28 #include "content/public/browser/web_contents.h" | 28 #include "content/public/browser/web_contents.h" |
| 29 #include "content/public/test/test_utils.h" |
| 29 #include "ipc/ipc_message.h" | 30 #include "ipc/ipc_message.h" |
| 30 #import "testing/gtest_mac.h" | 31 #import "testing/gtest_mac.h" |
| 31 | 32 |
| 32 namespace { | 33 namespace { |
| 33 | 34 |
| 34 NSString* const kTitle = @"A quick brown fox jumps over the lazy dog."; | 35 NSString* const kTitle = @"A quick brown fox jumps over the lazy dog."; |
| 35 | 36 |
| 36 } // namespace | 37 } // namespace |
| 37 | 38 |
| 38 class WebIntentPickerViewControllerTest : public InProcessBrowserTest { | 39 class WebIntentPickerViewControllerTest : public InProcessBrowserTest { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 EXPECT_EQ(PICKER_STATE_WAITING, [controller_ state]); | 88 EXPECT_EQ(PICKER_STATE_WAITING, [controller_ state]); |
| 88 WebIntentProgressViewController* progress_controller = | 89 WebIntentProgressViewController* progress_controller = |
| 89 [controller_ progressViewController]; | 90 [controller_ progressViewController]; |
| 90 EXPECT_NSEQ([controller_ view], [[progress_controller view] superview]); | 91 EXPECT_NSEQ([controller_ view], [[progress_controller view] superview]); |
| 91 EXPECT_TRUE([[progress_controller progressIndicator] isIndeterminate]); | 92 EXPECT_TRUE([[progress_controller progressIndicator] isIndeterminate]); |
| 92 } | 93 } |
| 93 | 94 |
| 94 // Test the "no matching services" state. | 95 // Test the "no matching services" state. |
| 95 IN_PROC_BROWSER_TEST_F(WebIntentPickerViewControllerTest, NoServices) { | 96 IN_PROC_BROWSER_TEST_F(WebIntentPickerViewControllerTest, NoServices) { |
| 96 model_.SetWaitingForSuggestions(false); | 97 model_.SetWaitingForSuggestions(false); |
| 98 content::RunAllPendingInMessageLoop(); |
| 97 EXPECT_EQ(PICKER_STATE_NO_SERVICE, [controller_ state]); | 99 EXPECT_EQ(PICKER_STATE_NO_SERVICE, [controller_ state]); |
| 98 WebIntentMessageViewController* message_controller = | 100 WebIntentMessageViewController* message_controller = |
| 99 [controller_ messageViewController]; | 101 [controller_ messageViewController]; |
| 100 EXPECT_NSEQ([controller_ view], [[message_controller view] superview]); | 102 EXPECT_NSEQ([controller_ view], [[message_controller view] superview]); |
| 101 } | 103 } |
| 102 | 104 |
| 103 // Test the "choose a service" state. | 105 // Test the "choose a service" state. |
| 104 IN_PROC_BROWSER_TEST_F(WebIntentPickerViewControllerTest, ChooseService) { | 106 IN_PROC_BROWSER_TEST_F(WebIntentPickerViewControllerTest, ChooseService) { |
| 105 testing::InSequence dummy; | 107 testing::InSequence dummy; |
| 106 model_.SetWaitingForSuggestions(false); | 108 model_.SetWaitingForSuggestions(false); |
| 107 | 109 |
| 108 // Add a installed service. | 110 // Add a installed service. |
| 109 GURL url("http://example.com"); | 111 GURL url("http://example.com"); |
| 110 webkit_glue::WebIntentServiceData::Disposition disposition = | 112 webkit_glue::WebIntentServiceData::Disposition disposition = |
| 111 webkit_glue::WebIntentServiceData::DISPOSITION_INLINE; | 113 webkit_glue::WebIntentServiceData::DISPOSITION_INLINE; |
| 112 model_.AddInstalledService(ASCIIToUTF16("Title"), url, disposition); | 114 model_.AddInstalledService(ASCIIToUTF16("Title"), url, disposition); |
| 113 | 115 |
| 114 // Add a suggested service. | 116 // Add a suggested service. |
| 115 std::vector<WebIntentPickerModel::SuggestedExtension> suggestions; | 117 std::vector<WebIntentPickerModel::SuggestedExtension> suggestions; |
| 116 WebIntentPickerModel::SuggestedExtension suggestion( | 118 WebIntentPickerModel::SuggestedExtension suggestion( |
| 117 ASCIIToUTF16("Title"), "1234", 2); | 119 ASCIIToUTF16("Title"), "1234", 2); |
| 118 suggestions.push_back(suggestion); | 120 suggestions.push_back(suggestion); |
| 119 model_.AddSuggestedExtensions(suggestions); | 121 model_.AddSuggestedExtensions(suggestions); |
| 120 | 122 |
| 123 content::RunAllPendingInMessageLoop(); |
| 121 EXPECT_EQ(PICKER_STATE_CHOOSE_SERVICE, [controller_ state]); | 124 EXPECT_EQ(PICKER_STATE_CHOOSE_SERVICE, [controller_ state]); |
| 122 WebIntentChooseServiceViewController* choose_controller = | 125 WebIntentChooseServiceViewController* choose_controller = |
| 123 [controller_ chooseServiceViewController]; | 126 [controller_ chooseServiceViewController]; |
| 124 EXPECT_NSEQ([controller_ view], [[choose_controller view] superview]); | 127 EXPECT_NSEQ([controller_ view], [[choose_controller view] superview]); |
| 125 NSArray* rows = [choose_controller rows]; | 128 NSArray* rows = [choose_controller rows]; |
| 126 EXPECT_EQ(2u, [rows count]); | 129 EXPECT_EQ(2u, [rows count]); |
| 127 | 130 |
| 128 // Test clicking "show more services in web store" button. | 131 // Test clicking "show more services in web store" button. |
| 129 EXPECT_CALL(delegate_, OnSuggestionsLinkClicked(CURRENT_TAB)); | 132 EXPECT_CALL(delegate_, OnSuggestionsLinkClicked(CURRENT_TAB)); |
| 130 [[choose_controller showMoreServicesButton] performClick:nil]; | 133 [[choose_controller showMoreServicesButton] performClick:nil]; |
| 131 | 134 |
| 132 // Test click "select" in the installed service row. | 135 // Test click "select" in the installed service row. |
| 133 EXPECT_CALL(delegate_, | 136 EXPECT_CALL(delegate_, |
| 134 OnServiceChosen(url, disposition, | 137 OnServiceChosen(url, disposition, |
| 135 WebIntentPickerDelegate::kEnableDefaults)); | 138 WebIntentPickerDelegate::kEnableDefaults)); |
| 136 [[[rows objectAtIndex:0] selectButton] performClick:nil]; | 139 [[[rows objectAtIndex:0] selectButton] performClick:nil]; |
| 137 | 140 |
| 138 // Test click "select" in the suggested service row. | 141 // Test click "select" in the suggested service row. |
| 139 EXPECT_CALL(delegate_, OnExtensionInstallRequested(suggestion.id)); | 142 EXPECT_CALL(delegate_, OnExtensionInstallRequested(suggestion.id)); |
| 140 [[[rows objectAtIndex:1] selectButton] performClick:nil]; | 143 [[[rows objectAtIndex:1] selectButton] performClick:nil]; |
| 141 | 144 |
| 142 // Test click suggested service web store link. | 145 // Test click suggested service web store link. |
| 143 EXPECT_CALL(delegate_, OnExtensionLinkClicked(suggestion.id, CURRENT_TAB)); | 146 EXPECT_CALL(delegate_, OnExtensionLinkClicked(suggestion.id, CURRENT_TAB)); |
| 144 [[[rows objectAtIndex:1] titleLinkButton] performClick:nil]; | 147 [[[rows objectAtIndex:1] titleLinkButton] performClick:nil]; |
| 145 | 148 |
| 146 // Remove everything but suggested extensions. | 149 // Remove everything but suggested extensions. |
| 147 model_.Clear(); | 150 model_.Clear(); |
| 151 content::RunAllPendingInMessageLoop(); |
| 148 EXPECT_EQ(PICKER_STATE_CHOOSE_SERVICE, [controller_ state]); | 152 EXPECT_EQ(PICKER_STATE_CHOOSE_SERVICE, [controller_ state]); |
| 149 rows = [choose_controller rows]; | 153 rows = [choose_controller rows]; |
| 150 EXPECT_EQ(1u, [rows count]); | 154 EXPECT_EQ(1u, [rows count]); |
| 151 } | 155 } |
| 152 | 156 |
| 153 // Test showing an inline service. | 157 // Test showing an inline service. |
| 154 IN_PROC_BROWSER_TEST_F(WebIntentPickerViewControllerTest, InlineService) { | 158 IN_PROC_BROWSER_TEST_F(WebIntentPickerViewControllerTest, InlineService) { |
| 155 testing::InSequence dummy; | 159 testing::InSequence dummy; |
| 156 | 160 |
| 157 // Create a web view | 161 // Create a web view |
| 158 GURL url("about:blank"); | 162 GURL url("about:blank"); |
| 159 content::WebContents* web_contents = content::WebContents::Create( | 163 content::WebContents* web_contents = content::WebContents::Create( |
| 160 browser()->profile(), | 164 browser()->profile(), |
| 161 tab_util::GetSiteInstanceForNewTab(browser()->profile(), url), | 165 tab_util::GetSiteInstanceForNewTab(browser()->profile(), url), |
| 162 MSG_ROUTING_NONE, | 166 MSG_ROUTING_NONE, |
| 163 NULL); | 167 NULL); |
| 164 EXPECT_CALL(delegate_, | 168 EXPECT_CALL(delegate_, |
| 165 CreateWebContentsForInlineDisposition(testing::_, testing::_)) | 169 CreateWebContentsForInlineDisposition(testing::_, testing::_)) |
| 166 .WillOnce(testing::Return(web_contents)); | 170 .WillOnce(testing::Return(web_contents)); |
| 167 | 171 |
| 168 model_.SetWaitingForSuggestions(false); | 172 model_.SetWaitingForSuggestions(false); |
| 169 | 173 |
| 170 webkit_glue::WebIntentServiceData::Disposition disposition = | 174 webkit_glue::WebIntentServiceData::Disposition disposition = |
| 171 webkit_glue::WebIntentServiceData::DISPOSITION_INLINE; | 175 webkit_glue::WebIntentServiceData::DISPOSITION_INLINE; |
| 172 model_.AddInstalledService(ASCIIToUTF16("Title"), url, disposition); | 176 model_.AddInstalledService(ASCIIToUTF16("Title"), url, disposition); |
| 173 model_.SetInlineDisposition(url); | 177 model_.SetInlineDisposition(url); |
| 178 content::RunAllPendingInMessageLoop(); |
| 174 EXPECT_EQ(PICKER_STATE_INLINE_SERVICE, [controller_ state]); | 179 EXPECT_EQ(PICKER_STATE_INLINE_SERVICE, [controller_ state]); |
| 175 | 180 |
| 176 WebIntentInlineServiceViewController * inline_controller = | 181 WebIntentInlineServiceViewController * inline_controller = |
| 177 [controller_ inlineServiceViewController]; | 182 [controller_ inlineServiceViewController]; |
| 178 EXPECT_NSEQ([controller_ view], [[inline_controller view] superview]); | 183 EXPECT_NSEQ([controller_ view], [[inline_controller view] superview]); |
| 179 | 184 |
| 180 // Test clicking "choose another service". | 185 // Test clicking "choose another service". |
| 181 EXPECT_CALL(delegate_, OnChooseAnotherService()); | 186 EXPECT_CALL(delegate_, OnChooseAnotherService()); |
| 182 [[inline_controller chooseServiceButton] performClick:nil]; | 187 [[inline_controller chooseServiceButton] performClick:nil]; |
| 183 | 188 |
| 184 // Test hiding "choose another service". | 189 // Test hiding "choose another service". |
| 185 EXPECT_FALSE([[inline_controller chooseServiceButton] isHidden]); | 190 EXPECT_FALSE([[inline_controller chooseServiceButton] isHidden]); |
| 186 model_.set_show_use_another_service(false); | 191 model_.set_show_use_another_service(false); |
| 187 [controller_ update]; | 192 [controller_ update]; |
| 188 EXPECT_TRUE([[inline_controller chooseServiceButton] isHidden]); | 193 EXPECT_TRUE([[inline_controller chooseServiceButton] isHidden]); |
| 189 } | 194 } |
| 190 | 195 |
| 191 // Test the "installing a service" state. | 196 // Test the "installing a service" state. |
| 192 IN_PROC_BROWSER_TEST_F(WebIntentPickerViewControllerTest, Installing) { | 197 IN_PROC_BROWSER_TEST_F(WebIntentPickerViewControllerTest, Installing) { |
| 193 // Add a suggested service. | 198 // Add a suggested service. |
| 194 std::vector<WebIntentPickerModel::SuggestedExtension> suggestions; | 199 std::vector<WebIntentPickerModel::SuggestedExtension> suggestions; |
| 195 WebIntentPickerModel::SuggestedExtension suggestion( | 200 WebIntentPickerModel::SuggestedExtension suggestion( |
| 196 ASCIIToUTF16("Title"), "1234", 2); | 201 ASCIIToUTF16("Title"), "1234", 2); |
| 197 suggestions.push_back(suggestion); | 202 suggestions.push_back(suggestion); |
| 198 model_.AddSuggestedExtensions(suggestions); | 203 model_.AddSuggestedExtensions(suggestions); |
| 199 | 204 |
| 200 // Set a pending extension download. | 205 // Set a pending extension download. |
| 201 model_.SetWaitingForSuggestions(false); | 206 model_.SetWaitingForSuggestions(false); |
| 202 model_.SetPendingExtensionInstallId(suggestion.id); | 207 model_.SetPendingExtensionInstallId(suggestion.id); |
| 208 content::RunAllPendingInMessageLoop(); |
| 203 EXPECT_EQ(PICKER_STATE_INSTALLING_EXTENSION, [controller_ state]); | 209 EXPECT_EQ(PICKER_STATE_INSTALLING_EXTENSION, [controller_ state]); |
| 204 | 210 |
| 205 WebIntentProgressViewController* progress_controller = | 211 WebIntentProgressViewController* progress_controller = |
| 206 [controller_ progressViewController]; | 212 [controller_ progressViewController]; |
| 207 EXPECT_NSEQ([controller_ view], [[progress_controller view] superview]); | 213 EXPECT_NSEQ([controller_ view], [[progress_controller view] superview]); |
| 208 SpinnerProgressIndicator* progress_indicator = | 214 SpinnerProgressIndicator* progress_indicator = |
| 209 [progress_controller progressIndicator]; | 215 [progress_controller progressIndicator]; |
| 210 EXPECT_FALSE([progress_indicator isIndeterminate]); | 216 EXPECT_FALSE([progress_indicator isIndeterminate]); |
| 211 | 217 |
| 212 int percent_done = 50; | 218 int percent_done = 50; |
| 213 model_.SetPendingExtensionInstallDownloadProgress(percent_done); | 219 model_.SetPendingExtensionInstallDownloadProgress(percent_done); |
| 220 content::RunAllPendingInMessageLoop(); |
| 214 EXPECT_EQ(percent_done, [progress_indicator percentDone]); | 221 EXPECT_EQ(percent_done, [progress_indicator percentDone]); |
| 215 } | 222 } |
| 216 | 223 |
| 217 // Test show the extension install prompt. | 224 // Test show the extension install prompt. |
| 218 IN_PROC_BROWSER_TEST_F(WebIntentPickerViewControllerTest, ExtensionPrompt) { | 225 IN_PROC_BROWSER_TEST_F(WebIntentPickerViewControllerTest, ExtensionPrompt) { |
| 219 scoped_refptr<extensions::Extension> extension = | 226 scoped_refptr<extensions::Extension> extension = |
| 220 chrome::LoadInstallPromptExtension(); | 227 chrome::LoadInstallPromptExtension(); |
| 221 chrome::MockExtensionInstallPromptDelegate delegate; | 228 chrome::MockExtensionInstallPromptDelegate delegate; |
| 222 ExtensionInstallPrompt::Prompt prompt = | 229 ExtensionInstallPrompt::Prompt prompt = |
| 223 chrome::BuildExtensionInstallPrompt(extension.get()); | 230 chrome::BuildExtensionInstallPrompt(extension.get()); |
| 224 | 231 |
| 225 // Set a pending install prompt. | 232 // Set a pending install prompt. |
| 226 model_.SetPendingExtensionInstallDelegate(&delegate); | 233 model_.SetPendingExtensionInstallDelegate(&delegate); |
| 227 model_.SetPendingExtensionInstallPrompt(prompt); | 234 model_.SetPendingExtensionInstallPrompt(prompt); |
| 235 content::RunAllPendingInMessageLoop(); |
| 228 EXPECT_EQ(PICKER_STATE_EXTENSION_PROMPT, [controller_ state]); | 236 EXPECT_EQ(PICKER_STATE_EXTENSION_PROMPT, [controller_ state]); |
| 229 | 237 |
| 230 // Verify that the view controll is embedded. | 238 // Verify that the view controll is embedded. |
| 231 WebIntentExtensionPromptViewController* extension_prompt_controller = | 239 WebIntentExtensionPromptViewController* extension_prompt_controller = |
| 232 [controller_ extensionPromptViewController]; | 240 [controller_ extensionPromptViewController]; |
| 233 EXPECT_NSEQ([controller_ view], | 241 EXPECT_NSEQ([controller_ view], |
| 234 [[extension_prompt_controller view] superview]); | 242 [[extension_prompt_controller view] superview]); |
| 235 | 243 |
| 236 // Press cancel. | 244 // Press cancel. |
| 237 [[[extension_prompt_controller viewController] cancelButton] | 245 [[[extension_prompt_controller viewController] cancelButton] |
| 238 performClick:nil]; | 246 performClick:nil]; |
| 239 EXPECT_EQ(1, delegate.abort_count()); | 247 EXPECT_EQ(1, delegate.abort_count()); |
| 240 } | 248 } |
| OLD | NEW |