Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(387)

Side by Side Diff: chrome/browser/extensions/webstore_inline_installer_browsertest.cc

Issue 1403293008: Don't allow inline install if frame is deleted before user accepts (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/strings/utf_string_conversions.h" 5 #include "base/strings/utf_string_conversions.h"
6 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" 6 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
7 #include "chrome/browser/extensions/extension_install_prompt.h" 7 #include "chrome/browser/extensions/extension_install_prompt.h"
8 #include "chrome/browser/extensions/extension_service.h" 8 #include "chrome/browser/extensions/extension_service.h"
9 #include "chrome/browser/extensions/tab_helper.h" 9 #include "chrome/browser/extensions/tab_helper.h"
10 #include "chrome/browser/extensions/webstore_inline_installer.h" 10 #include "chrome/browser/extensions/webstore_inline_installer.h"
11 #include "chrome/browser/extensions/webstore_inline_installer_factory.h" 11 #include "chrome/browser/extensions/webstore_inline_installer_factory.h"
12 #include "chrome/browser/extensions/webstore_installer_test.h" 12 #include "chrome/browser/extensions/webstore_installer_test.h"
13 #include "chrome/browser/extensions/webstore_standalone_installer.h" 13 #include "chrome/browser/extensions/webstore_standalone_installer.h"
14 #include "chrome/browser/profiles/profile.h" 14 #include "chrome/browser/profiles/profile.h"
15 #include "chrome/browser/ui/browser.h" 15 #include "chrome/browser/ui/browser.h"
16 #include "chrome/browser/ui/browser_finder.h" 16 #include "chrome/browser/ui/browser_finder.h"
17 #include "chrome/browser/ui/tabs/tab_strip_model.h" 17 #include "chrome/browser/ui/tabs/tab_strip_model.h"
18 #include "chrome/test/base/ui_test_utils.h" 18 #include "chrome/test/base/ui_test_utils.h"
19 #include "components/content_settings/core/browser/host_content_settings_map.h" 19 #include "components/content_settings/core/browser/host_content_settings_map.h"
20 #include "content/public/browser/web_contents.h" 20 #include "content/public/browser/web_contents.h"
21 #include "content/public/test/browser_test_utils.h"
21 #include "extensions/browser/extension_registry.h" 22 #include "extensions/browser/extension_registry.h"
22 #include "extensions/browser/extension_system.h" 23 #include "extensions/browser/extension_system.h"
23 #include "url/gurl.h" 24 #include "url/gurl.h"
24 25
25 using content::WebContents; 26 using content::WebContents;
26 27
27 namespace extensions { 28 namespace extensions {
28 29
30 class WebstoreInlineInstallerForTest;
31
29 namespace { 32 namespace {
30 33
31 const char kWebstoreDomain[] = "cws.com"; 34 const char kWebstoreDomain[] = "cws.com";
32 const char kAppDomain[] = "app.com"; 35 const char kAppDomain[] = "app.com";
33 const char kNonAppDomain[] = "nonapp.com"; 36 const char kNonAppDomain[] = "nonapp.com";
34 const char kTestExtensionId[] = "ecglahbcnmdpdciemllbhojghbkagdje"; 37 const char kTestExtensionId[] = "ecglahbcnmdpdciemllbhojghbkagdje";
35 const char kTestDataPath[] = "extensions/api_test/webstore_inline_install"; 38 const char kTestDataPath[] = "extensions/api_test/webstore_inline_install";
36 const char kCrxFilename[] = "extension.crx"; 39 const char kCrxFilename[] = "extension.crx";
37 40
41 class InstallerFactoryObserver {
Devlin 2015/11/05 17:40:40 nit: I think this is a little more than we need.
asargent_no_longer_on_chrome 2015/11/18 21:42:44 Much simpler, I like it. Done.
42 public:
43 virtual void OnInstallerCreated(
44 WebstoreInlineInstallerForTest* installer) = 0;
45 };
46
38 } // namespace 47 } // namespace
39 48
40 class WebstoreInlineInstallerTest : public WebstoreInstallerTest { 49 class WebstoreInlineInstallerTest : public WebstoreInstallerTest,
50 public InstallerFactoryObserver {
41 public: 51 public:
42 WebstoreInlineInstallerTest() 52 WebstoreInlineInstallerTest()
43 : WebstoreInstallerTest( 53 : WebstoreInstallerTest(kWebstoreDomain,
44 kWebstoreDomain, 54 kTestDataPath,
45 kTestDataPath, 55 kCrxFilename,
46 kCrxFilename, 56 kAppDomain,
47 kAppDomain, 57 kNonAppDomain),
48 kNonAppDomain) {} 58 last_installer_(nullptr) {}
59
60 void OnInstallerCreated(WebstoreInlineInstallerForTest* installer) override {
61 last_installer_ = installer;
62 }
63
64 protected:
65 WebstoreInlineInstallerForTest* last_installer_;
49 }; 66 };
50 67
51 class ProgrammableInstallPrompt : public ExtensionInstallPrompt { 68 class ProgrammableInstallPrompt : public ExtensionInstallPrompt {
52 public: 69 public:
53 explicit ProgrammableInstallPrompt(WebContents* contents) 70 explicit ProgrammableInstallPrompt(WebContents* contents)
54 : ExtensionInstallPrompt(contents) 71 : ExtensionInstallPrompt(contents)
55 {} 72 {}
56 73
57 ~ProgrammableInstallPrompt() override {} 74 ~ProgrammableInstallPrompt() override {}
58 75
(...skipping 21 matching lines...) Expand all
80 static Delegate* delegate_; 97 static Delegate* delegate_;
81 }; 98 };
82 99
83 ExtensionInstallPrompt::Delegate* ProgrammableInstallPrompt::delegate_; 100 ExtensionInstallPrompt::Delegate* ProgrammableInstallPrompt::delegate_;
84 101
85 // Fake inline installer which creates a programmable prompt in place of 102 // Fake inline installer which creates a programmable prompt in place of
86 // the normal dialog UI. 103 // the normal dialog UI.
87 class WebstoreInlineInstallerForTest : public WebstoreInlineInstaller { 104 class WebstoreInlineInstallerForTest : public WebstoreInlineInstaller {
88 public: 105 public:
89 WebstoreInlineInstallerForTest(WebContents* contents, 106 WebstoreInlineInstallerForTest(WebContents* contents,
107 content::RenderFrameHost* host,
90 const std::string& extension_id, 108 const std::string& extension_id,
91 const GURL& requestor_url, 109 const GURL& requestor_url,
92 const Callback& callback) 110 const Callback& callback)
93 : WebstoreInlineInstaller( 111 : WebstoreInlineInstaller(contents,
94 contents, 112 host,
95 kTestExtensionId, 113 kTestExtensionId,
96 requestor_url, 114 requestor_url,
97 base::Bind(DummyCallback)), 115 base::Bind(DummyCallback)),
98 programmable_prompt_(NULL) { 116 programmable_prompt_(NULL) {}
99 }
100 117
101 scoped_ptr<ExtensionInstallPrompt> CreateInstallUI() override { 118 scoped_ptr<ExtensionInstallPrompt> CreateInstallUI() override {
102 programmable_prompt_ = new ProgrammableInstallPrompt(web_contents()); 119 programmable_prompt_ = new ProgrammableInstallPrompt(web_contents());
103 return make_scoped_ptr(programmable_prompt_); 120 return make_scoped_ptr(programmable_prompt_);
104 } 121 }
105 122
123 bool CheckRequestorAlive() const override {
124 return WebstoreInlineInstaller::CheckRequestorAlive();
Devlin 2015/11/05 17:40:40 Is this needed?
asargent_no_longer_on_chrome 2015/11/18 21:42:44 It's just needed to make the method publicly visib
125 }
126
106 private: 127 private:
107 ~WebstoreInlineInstallerForTest() override {} 128 ~WebstoreInlineInstallerForTest() override {}
108 129
109 friend class base::RefCountedThreadSafe<WebstoreStandaloneInstaller>; 130 friend class base::RefCountedThreadSafe<WebstoreStandaloneInstaller>;
110 131
111 static void DummyCallback(bool success, 132 static void DummyCallback(bool success,
112 const std::string& error, 133 const std::string& error,
113 webstore_install::Result result) { 134 webstore_install::Result result) {
114 } 135 }
115 136
116 ProgrammableInstallPrompt* programmable_prompt_; 137 ProgrammableInstallPrompt* programmable_prompt_;
117 }; 138 };
118 139
119 class WebstoreInlineInstallerForTestFactory : 140 class WebstoreInlineInstallerForTestFactory :
120 public WebstoreInlineInstallerFactory { 141 public WebstoreInlineInstallerFactory {
142 public:
143 explicit WebstoreInlineInstallerForTestFactory(
144 InstallerFactoryObserver* observer)
145 : observer_(observer) {}
146
121 ~WebstoreInlineInstallerForTestFactory() override {} 147 ~WebstoreInlineInstallerForTestFactory() override {}
122 WebstoreInlineInstaller* CreateInstaller( 148 WebstoreInlineInstaller* CreateInstaller(
123 WebContents* contents, 149 WebContents* contents,
150 content::RenderFrameHost* host,
124 const std::string& webstore_item_id, 151 const std::string& webstore_item_id,
125 const GURL& requestor_url, 152 const GURL& requestor_url,
126 const WebstoreStandaloneInstaller::Callback& callback) override { 153 const WebstoreStandaloneInstaller::Callback& callback) override {
127 return new WebstoreInlineInstallerForTest( 154 WebstoreInlineInstallerForTest* installer =
128 contents, webstore_item_id, requestor_url, callback); 155 new WebstoreInlineInstallerForTest(contents, host, webstore_item_id,
156 requestor_url, callback);
157 observer_->OnInstallerCreated(installer);
158 return installer;
129 } 159 }
160
161 protected:
162 InstallerFactoryObserver* observer_;
130 }; 163 };
131 164
132 IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerTest, 165 IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerTest,
133 CloseTabBeforeInstallConfirmation) { 166 CloseTabBeforeInstallConfirmation) {
134 GURL install_url = GenerateTestServerUrl(kAppDomain, "install.html"); 167 GURL install_url = GenerateTestServerUrl(kAppDomain, "install.html");
135 ui_test_utils::NavigateToURL(browser(), install_url); 168 ui_test_utils::NavigateToURL(browser(), install_url);
136 WebContents* web_contents = 169 WebContents* web_contents =
137 browser()->tab_strip_model()->GetActiveWebContents(); 170 browser()->tab_strip_model()->GetActiveWebContents();
138 TabHelper* tab_helper = TabHelper::FromWebContents(web_contents); 171 TabHelper* tab_helper = TabHelper::FromWebContents(web_contents);
139 tab_helper->SetWebstoreInlineInstallerFactoryForTests( 172 tab_helper->SetWebstoreInlineInstallerFactoryForTests(
140 new WebstoreInlineInstallerForTestFactory()); 173 new WebstoreInlineInstallerForTestFactory(this));
141 RunTestAsync("runTest"); 174 RunTestAsync("runTest");
142 while (!ProgrammableInstallPrompt::Ready()) 175 while (!ProgrammableInstallPrompt::Ready())
143 base::RunLoop().RunUntilIdle(); 176 base::RunLoop().RunUntilIdle();
144 web_contents->Close(); 177 web_contents->Close();
145 ProgrammableInstallPrompt::Accept(); 178 ProgrammableInstallPrompt::Accept();
146 } 179 }
147 180
181 IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerTest,
182 NavigateBeforeInstallConfirmation) {
183 GURL install_url = GenerateTestServerUrl(kAppDomain, "install.html");
184 ui_test_utils::NavigateToURL(browser(), install_url);
185 WebContents* web_contents =
186 browser()->tab_strip_model()->GetActiveWebContents();
187 TabHelper* tab_helper = TabHelper::FromWebContents(web_contents);
188 tab_helper->SetWebstoreInlineInstallerFactoryForTests(
189 new WebstoreInlineInstallerForTestFactory(this));
190 RunTestAsync("runTest");
191 while (!ProgrammableInstallPrompt::Ready())
192 base::RunLoop().RunUntilIdle();
193 GURL new_url = GenerateTestServerUrl(kNonAppDomain, "empty.html");
194 web_contents->GetController().LoadURL(
195 new_url, content::Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
196 EXPECT_TRUE(content::WaitForLoadStop(web_contents));
197 ASSERT_NE(last_installer_, nullptr);
198 EXPECT_NE(last_installer_->web_contents(), nullptr);
199 EXPECT_FALSE(last_installer_->CheckRequestorAlive());
Devlin 2015/11/05 17:40:40 Can we also test inline installation from a frame,
asargent_no_longer_on_chrome 2015/11/18 21:42:44 I wrote up a test for it, and in the process of tr
200 }
201
148 // Flaky: https://crbug.com/537526. 202 // Flaky: https://crbug.com/537526.
149 IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerTest, 203 IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerTest,
150 DISABLED_ShouldBlockInlineInstallFromPopupWindow) { 204 DISABLED_ShouldBlockInlineInstallFromPopupWindow) {
151 GURL install_url = 205 GURL install_url =
152 GenerateTestServerUrl(kAppDomain, "install_from_popup.html"); 206 GenerateTestServerUrl(kAppDomain, "install_from_popup.html");
153 // Disable popup blocking for the test url. 207 // Disable popup blocking for the test url.
154 HostContentSettingsMapFactory::GetForProfile(browser()->profile()) 208 HostContentSettingsMapFactory::GetForProfile(browser()->profile())
155 ->SetContentSetting(ContentSettingsPattern::FromURL(install_url), 209 ->SetContentSetting(ContentSettingsPattern::FromURL(install_url),
156 ContentSettingsPattern::Wildcard(), 210 ContentSettingsPattern::Wildcard(),
157 CONTENT_SETTINGS_TYPE_POPUPS, 211 CONTENT_SETTINGS_TYPE_POPUPS,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerListenerTest, 296 IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerListenerTest,
243 DownloadProgressListenerTest) { 297 DownloadProgressListenerTest) {
244 RunTest("download_progress_listener.html"); 298 RunTest("download_progress_listener.html");
245 } 299 }
246 300
247 IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerListenerTest, BothListenersTest) { 301 IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerListenerTest, BothListenersTest) {
248 RunTest("both_listeners.html"); 302 RunTest("both_listeners.html");
249 } 303 }
250 304
251 } // namespace extensions 305 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698