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

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

Issue 9508008: Allow apps with background pages to request process-per-app-instance. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Clean up tests. Created 8 years, 9 months 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 | Annotate | Revision Log
OLDNEW
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/extensions/extension_apitest.h" 6 #include "chrome/browser/extensions/extension_apitest.h"
7 #include "chrome/browser/extensions/extension_host.h" 7 #include "chrome/browser/extensions/extension_host.h"
8 #include "chrome/browser/extensions/extension_service.h" 8 #include "chrome/browser/extensions/extension_service.h"
9 #include "chrome/browser/extensions/process_map.h" 9 #include "chrome/browser/extensions/process_map.h"
10 #include "chrome/browser/profiles/profile.h" 10 #include "chrome/browser/profiles/profile.h"
(...skipping 10 matching lines...) Expand all
21 #include "content/public/browser/navigation_entry.h" 21 #include "content/public/browser/navigation_entry.h"
22 #include "content/public/browser/notification_service.h" 22 #include "content/public/browser/notification_service.h"
23 #include "content/public/browser/render_process_host.h" 23 #include "content/public/browser/render_process_host.h"
24 #include "content/public/browser/web_contents.h" 24 #include "content/public/browser/web_contents.h"
25 #include "content/test/test_navigation_observer.h" 25 #include "content/test/test_navigation_observer.h"
26 #include "net/base/mock_host_resolver.h" 26 #include "net/base/mock_host_resolver.h"
27 27
28 using content::NavigationController; 28 using content::NavigationController;
29 using content::WebContents; 29 using content::WebContents;
30 30
31 class AppApiTest : public ExtensionApiTest {
32 protected:
33 // Gets the base URL for files for a specific test, making sure that it uses
34 // "localhost" as the hostname, since that is what the extent is declared
35 // as in the test apps manifests.
36 GURL GetTestBaseURL(std::string test_directory) {
37 GURL::Replacements replace_host;
38 std::string host_str("localhost"); // must stay in scope with replace_host
39 replace_host.SetHostStr(host_str);
40 GURL base_url = test_server()->GetURL(
41 "files/extensions/api_test/" + test_directory + "/");
42 return base_url.ReplaceComponents(replace_host);
43 }
44 };
45
46 // Simulates a page calling window.open on an URL, and waits for the navigation. 31 // Simulates a page calling window.open on an URL, and waits for the navigation.
47 static void WindowOpenHelper(Browser* browser, 32 static void WindowOpenHelper(Browser* browser,
48 RenderViewHost* opener_host, 33 RenderViewHost* opener_host,
49 const GURL& url, 34 const GURL& url,
50 bool newtab_process_should_equal_opener) { 35 bool newtab_process_should_equal_opener) {
51 ui_test_utils::WindowedNotificationObserver observer( 36 ui_test_utils::WindowedNotificationObserver observer(
52 content::NOTIFICATION_LOAD_STOP, 37 content::NOTIFICATION_LOAD_STOP,
53 content::NotificationService::AllSources()); 38 content::NotificationService::AllSources());
54 ASSERT_TRUE(ui_test_utils::ExecuteJavaScript( 39 ASSERT_TRUE(ui_test_utils::ExecuteJavaScript(
55 opener_host, L"", L"window.open('" + UTF8ToWide(url.spec()) + L"');")); 40 opener_host, L"", L"window.open('" + UTF8ToWide(url.spec()) + L"');"));
(...skipping 24 matching lines...) Expand all
80 L"window.addEventListener('unload', function() {" 65 L"window.addEventListener('unload', function() {"
81 L" window.domAutomationController.send(true);" 66 L" window.domAutomationController.send(true);"
82 L"}, false);" 67 L"}, false);"
83 L"window.location = '" + UTF8ToWide(url.spec()) + L"';", 68 L"window.location = '" + UTF8ToWide(url.spec()) + L"';",
84 &result)); 69 &result));
85 ASSERT_TRUE(result); 70 ASSERT_TRUE(result);
86 observer.Wait(); 71 observer.Wait();
87 EXPECT_EQ(url, contents->GetController().GetLastCommittedEntry()->GetURL()); 72 EXPECT_EQ(url, contents->GetController().GetLastCommittedEntry()->GetURL());
88 } 73 }
89 74
75 class AppApiTest : public ExtensionApiTest {
76 protected:
77 // Gets the base URL for files for a specific test, making sure that it uses
78 // "localhost" as the hostname, since that is what the extent is declared
79 // as in the test apps manifests.
80 GURL GetTestBaseURL(std::string test_directory) {
81 GURL::Replacements replace_host;
82 std::string host_str("localhost"); // must stay in scope with replace_host
83 replace_host.SetHostStr(host_str);
84 GURL base_url = test_server()->GetURL(
85 "files/extensions/api_test/" + test_directory + "/");
86 return base_url.ReplaceComponents(replace_host);
87 }
88
89 // Pass flags to make testing apps easier.
90 void SetUpCommandLine(CommandLine* command_line) {
91 ExtensionApiTest::SetUpCommandLine(command_line);
92 CommandLine::ForCurrentProcess()->AppendSwitch(
93 switches::kDisablePopupBlocking);
94 CommandLine::ForCurrentProcess()->AppendSwitch(
95 switches::kAllowHTTPBackgroundPage);
96 }
97
98 // Helper function to test that independent tabs of the named app are loaded
99 // into separate processes.
100 void TestAppInstancesHelper(std::string app_name) {
101 LOG(INFO) << "Start of test.";
102
103 extensions::ProcessMap* process_map =
104 browser()->profile()->GetExtensionService()->process_map();
105
106 host_resolver()->AddRule("*", "127.0.0.1");
107 ASSERT_TRUE(test_server()->Start());
108
109 ASSERT_TRUE(LoadExtension(
110 test_data_dir_.AppendASCII(app_name)));
111
112 // Open two tabs in the app, one outside it.
113 GURL base_url = GetTestBaseURL(app_name);
114
115 // Test both opening a URL in a new tab, and opening a tab and then
116 // navigating it. Either way, app tabs should be considered extension
117 // processes, but they have no elevated privileges and thus should not
118 // have WebUI bindings.
119 ui_test_utils::NavigateToURLWithDisposition(
120 browser(), base_url.Resolve("path1/empty.html"), NEW_FOREGROUND_TAB,
121 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
122 LOG(INFO) << "Nav 1.";
123 EXPECT_TRUE(process_map->Contains(
124 browser()->GetWebContentsAt(1)->GetRenderProcessHost()->GetID()));
125 EXPECT_FALSE(browser()->GetWebContentsAt(1)->GetWebUI());
126
127 ui_test_utils::WindowedNotificationObserver tab_added_observer(
128 content::NOTIFICATION_TAB_ADDED,
129 content::NotificationService::AllSources());
130 browser()->NewTab();
131 tab_added_observer.Wait();
132 LOG(INFO) << "New tab.";
133 ui_test_utils::NavigateToURL(browser(),
134 base_url.Resolve("path2/empty.html"));
135 LOG(INFO) << "Nav 2.";
136 EXPECT_TRUE(process_map->Contains(
137 browser()->GetWebContentsAt(2)->GetRenderProcessHost()->GetID()));
138 EXPECT_FALSE(browser()->GetWebContentsAt(2)->GetWebUI());
139
140 // We should have opened 2 new extension tabs. Including the original blank
141 // tab, we now have 3 tabs. The two app tabs should not be in the same
142 // process, since they do not have the background permission. (Thus, we
143 // want to separate them to improve responsiveness.)
144 ASSERT_EQ(3, browser()->tab_count());
145 RenderViewHost* host1 = browser()->GetWebContentsAt(1)->GetRenderViewHost();
146 RenderViewHost* host2 = browser()->GetWebContentsAt(2)->GetRenderViewHost();
147 EXPECT_NE(host1->process(), host2->process());
148
149 // Opening tabs with window.open should keep the page in the opener's
150 // process.
151 ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile()));
152 WindowOpenHelper(browser(), host1,
153 base_url.Resolve("path1/empty.html"), true);
154 LOG(INFO) << "WindowOpenHelper 1.";
155 WindowOpenHelper(browser(), host2,
156 base_url.Resolve("path2/empty.html"), true);
157 LOG(INFO) << "End of test.";
158 }
159 };
160
161 // Tests that hosted apps with the background permission get a process-per-app
162 // model, since all pages need to be able to script the background page.
90 IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcess) { 163 IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcess) {
91 LOG(INFO) << "Start of test."; 164 LOG(INFO) << "Start of test.";
92 165
93 CommandLine::ForCurrentProcess()->AppendSwitch(
94 switches::kDisablePopupBlocking);
95
96 extensions::ProcessMap* process_map = 166 extensions::ProcessMap* process_map =
97 browser()->profile()->GetExtensionService()->process_map(); 167 browser()->profile()->GetExtensionService()->process_map();
98 168
99 host_resolver()->AddRule("*", "127.0.0.1"); 169 host_resolver()->AddRule("*", "127.0.0.1");
100 ASSERT_TRUE(test_server()->Start()); 170 ASSERT_TRUE(test_server()->Start());
101 171
102 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app_process"))); 172 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app_process")));
103 173
104 LOG(INFO) << "Loaded extension."; 174 LOG(INFO) << "Loaded extension.";
105 175
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 L"window.domAutomationController.send(window.opener != null)", 263 L"window.domAutomationController.send(window.opener != null)",
194 &windowOpenerValid)); 264 &windowOpenerValid));
195 ASSERT_TRUE(windowOpenerValid); 265 ASSERT_TRUE(windowOpenerValid);
196 266
197 LOG(INFO) << "End of test."; 267 LOG(INFO) << "End of test.";
198 } 268 }
199 269
200 // Test that hosted apps without the background permission use a process per app 270 // Test that hosted apps without the background permission use a process per app
201 // instance model, such that separate instances are in separate processes. 271 // instance model, such that separate instances are in separate processes.
202 IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcessInstances) { 272 IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcessInstances) {
203 LOG(INFO) << "Start of test."; 273 TestAppInstancesHelper("app_process_instances");
274 }
204 275
205 CommandLine::ForCurrentProcess()->AppendSwitch( 276 // Test that hosted apps with the background permission but that set
206 switches::kDisablePopupBlocking); 277 // allow_js_access to false also use a process per app instance model.
207 278 // Separate instances should be in separate processes.
208 extensions::ProcessMap* process_map = 279 IN_PROC_BROWSER_TEST_F(AppApiTest, AppProcessBackgroundInstances) {
209 browser()->profile()->GetExtensionService()->process_map(); 280 TestAppInstancesHelper("app_process_background_instances");
210
211 host_resolver()->AddRule("*", "127.0.0.1");
212 ASSERT_TRUE(test_server()->Start());
213
214 ASSERT_TRUE(LoadExtension(
215 test_data_dir_.AppendASCII("app_process_instances")));
216
217 // Open two tabs in the app, one outside it.
218 GURL base_url = GetTestBaseURL("app_process_instances");
219
220 // Test both opening a URL in a new tab, and opening a tab and then navigating
221 // it. Either way, app tabs should be considered extension processes, but
222 // they have no elevated privileges and thus should not have WebUI bindings.
223 ui_test_utils::NavigateToURLWithDisposition(
224 browser(), base_url.Resolve("path1/empty.html"), NEW_FOREGROUND_TAB,
225 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
226 LOG(INFO) << "Nav 1.";
227 EXPECT_TRUE(process_map->Contains(
228 browser()->GetWebContentsAt(1)->GetRenderProcessHost()->GetID()));
229 EXPECT_FALSE(browser()->GetWebContentsAt(1)->GetWebUI());
230
231 ui_test_utils::WindowedNotificationObserver tab_added_observer(
232 content::NOTIFICATION_TAB_ADDED,
233 content::NotificationService::AllSources());
234 browser()->NewTab();
235 tab_added_observer.Wait();
236 LOG(INFO) << "New tab.";
237 ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path2/empty.html"));
238 LOG(INFO) << "Nav 2.";
239 EXPECT_TRUE(process_map->Contains(
240 browser()->GetWebContentsAt(2)->GetRenderProcessHost()->GetID()));
241 EXPECT_FALSE(browser()->GetWebContentsAt(2)->GetWebUI());
242
243 // We should have opened 2 new extension tabs. Including the original blank
244 // tab, we now have 3 tabs. The two app tabs should not be in the same
245 // process, since they do not have the background permission. (Thus, we want
246 // to separate them to improve responsiveness.)
247 ASSERT_EQ(3, browser()->tab_count());
248 RenderViewHost* host1 = browser()->GetWebContentsAt(1)->GetRenderViewHost();
249 RenderViewHost* host2 = browser()->GetWebContentsAt(2)->GetRenderViewHost();
250 EXPECT_NE(host1->process(), host2->process());
251
252 // Opening tabs with window.open should keep the page in the opener's process.
253 ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile()));
254 WindowOpenHelper(browser(), host1,
255 base_url.Resolve("path1/empty.html"), true);
256 LOG(INFO) << "WindowOpenHelper 1.";
257 WindowOpenHelper(browser(), host2,
258 base_url.Resolve("path2/empty.html"), true);
259 LOG(INFO) << "End of test.";
260 } 281 }
261 282
262 // Tests that bookmark apps do not use the app process model and are treated 283 // Tests that bookmark apps do not use the app process model and are treated
263 // like normal web pages instead. http://crbug.com/104636. 284 // like normal web pages instead. http://crbug.com/104636.
264 IN_PROC_BROWSER_TEST_F(AppApiTest, BookmarkAppGetsNormalProcess) { 285 IN_PROC_BROWSER_TEST_F(AppApiTest, BookmarkAppGetsNormalProcess) {
265 CommandLine::ForCurrentProcess()->AppendSwitch(
266 switches::kDisablePopupBlocking);
267
268 ExtensionService* service = browser()->profile()->GetExtensionService(); 286 ExtensionService* service = browser()->profile()->GetExtensionService();
269 extensions::ProcessMap* process_map = service->process_map(); 287 extensions::ProcessMap* process_map = service->process_map();
270 288
271 host_resolver()->AddRule("*", "127.0.0.1"); 289 host_resolver()->AddRule("*", "127.0.0.1");
272 ASSERT_TRUE(test_server()->Start()); 290 ASSERT_TRUE(test_server()->Start());
273 GURL base_url = GetTestBaseURL("app_process"); 291 GURL base_url = GetTestBaseURL("app_process");
274 292
275 // Load an app as a bookmark app. 293 // Load an app as a bookmark app.
276 std::string error; 294 std::string error;
277 scoped_refptr<const Extension> extension(extension_file_util::LoadExtension( 295 scoped_refptr<const Extension> extension(extension_file_util::LoadExtension(
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 // 3. page2 redirects back to a page in the app 356 // 3. page2 redirects back to a page in the app
339 // The final navigation should end up in the app process. 357 // The final navigation should end up in the app process.
340 // See http://crbug.com/61757 358 // See http://crbug.com/61757
341 // This test doesn't complete on WebKit Win (dbg). See crbug.com/108853. 359 // This test doesn't complete on WebKit Win (dbg). See crbug.com/108853.
342 #if defined(OS_WIN) && !defined(NDEBUG) 360 #if defined(OS_WIN) && !defined(NDEBUG)
343 #define MAYBE_AppProcessRedirectBack DISABLED_AppProcessRedirectBack 361 #define MAYBE_AppProcessRedirectBack DISABLED_AppProcessRedirectBack
344 #else 362 #else
345 #define MAYBE_AppProcessRedirectBack AppProcessRedirectBack 363 #define MAYBE_AppProcessRedirectBack AppProcessRedirectBack
346 #endif 364 #endif
347 IN_PROC_BROWSER_TEST_F(AppApiTest, MAYBE_AppProcessRedirectBack) { 365 IN_PROC_BROWSER_TEST_F(AppApiTest, MAYBE_AppProcessRedirectBack) {
348 CommandLine::ForCurrentProcess()->AppendSwitch(
349 switches::kDisablePopupBlocking);
350
351 host_resolver()->AddRule("*", "127.0.0.1"); 366 host_resolver()->AddRule("*", "127.0.0.1");
352 ASSERT_TRUE(test_server()->Start()); 367 ASSERT_TRUE(test_server()->Start());
353 368
354 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app_process"))); 369 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app_process")));
355 370
356 // Open two tabs in the app. 371 // Open two tabs in the app.
357 GURL base_url = GetTestBaseURL("app_process"); 372 GURL base_url = GetTestBaseURL("app_process");
358 373
359 browser()->NewTab(); 374 browser()->NewTab();
360 ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path1/empty.html")); 375 ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path1/empty.html"));
(...skipping 20 matching lines...) Expand all
381 EXPECT_EQ("/files/extensions/api_test/app_process/path1/empty.html", 396 EXPECT_EQ("/files/extensions/api_test/app_process/path1/empty.html",
382 browser()->GetWebContentsAt(2)->GetController(). 397 browser()->GetWebContentsAt(2)->GetController().
383 GetLastCommittedEntry()->GetURL().path()); 398 GetLastCommittedEntry()->GetURL().path());
384 EXPECT_EQ(browser()->GetWebContentsAt(1)->GetRenderProcessHost(), 399 EXPECT_EQ(browser()->GetWebContentsAt(1)->GetRenderProcessHost(),
385 browser()->GetWebContentsAt(2)->GetRenderProcessHost()); 400 browser()->GetWebContentsAt(2)->GetRenderProcessHost());
386 } 401 }
387 402
388 // Ensure that reloading a URL after installing or uninstalling it as an app 403 // Ensure that reloading a URL after installing or uninstalling it as an app
389 // correctly swaps the process. (http://crbug.com/80621) 404 // correctly swaps the process. (http://crbug.com/80621)
390 IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadIntoAppProcess) { 405 IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadIntoAppProcess) {
391 CommandLine::ForCurrentProcess()->AppendSwitch(
392 switches::kDisablePopupBlocking);
393
394 extensions::ProcessMap* process_map = 406 extensions::ProcessMap* process_map =
395 browser()->profile()->GetExtensionService()->process_map(); 407 browser()->profile()->GetExtensionService()->process_map();
396 408
397 host_resolver()->AddRule("*", "127.0.0.1"); 409 host_resolver()->AddRule("*", "127.0.0.1");
398 ASSERT_TRUE(test_server()->Start()); 410 ASSERT_TRUE(test_server()->Start());
399 411
400 // The app under test acts on URLs whose host is "localhost", 412 // The app under test acts on URLs whose host is "localhost",
401 // so the URLs we navigate to must have host "localhost". 413 // so the URLs we navigate to must have host "localhost".
402 GURL base_url = GetTestBaseURL("app_process"); 414 GURL base_url = GetTestBaseURL("app_process");
403 415
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 EXPECT_FALSE(process_map->Contains( 483 EXPECT_FALSE(process_map->Contains(
472 contents->GetRenderProcessHost()->GetID())); 484 contents->GetRenderProcessHost()->GetID()));
473 } 485 }
474 486
475 // Tests that if we have a non-app process (path3/container.html) that has an 487 // Tests that if we have a non-app process (path3/container.html) that has an
476 // iframe with a URL in the app's extent (path1/iframe.html), then opening a 488 // iframe with a URL in the app's extent (path1/iframe.html), then opening a
477 // link from that iframe to a new window to a URL in the app's extent (path1/ 489 // link from that iframe to a new window to a URL in the app's extent (path1/
478 // empty.html) results in the new window being in an app process. See 490 // empty.html) results in the new window being in an app process. See
479 // http://crbug.com/89272 for more details. 491 // http://crbug.com/89272 for more details.
480 IN_PROC_BROWSER_TEST_F(AppApiTest, OpenAppFromIframe) { 492 IN_PROC_BROWSER_TEST_F(AppApiTest, OpenAppFromIframe) {
481 CommandLine::ForCurrentProcess()->AppendSwitch(
482 switches::kDisablePopupBlocking);
483
484 extensions::ProcessMap* process_map = 493 extensions::ProcessMap* process_map =
485 browser()->profile()->GetExtensionService()->process_map(); 494 browser()->profile()->GetExtensionService()->process_map();
486 495
487 host_resolver()->AddRule("*", "127.0.0.1"); 496 host_resolver()->AddRule("*", "127.0.0.1");
488 ASSERT_TRUE(test_server()->Start()); 497 ASSERT_TRUE(test_server()->Start());
489 498
490 GURL base_url = GetTestBaseURL("app_process"); 499 GURL base_url = GetTestBaseURL("app_process");
491 500
492 // Load app and start URL (not in the app). 501 // Load app and start URL (not in the app).
493 const Extension* app = 502 const Extension* app =
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
569 } 578 }
570 579
571 // Tests that if we have an app process (path1/container.html) with a non-app 580 // Tests that if we have an app process (path1/container.html) with a non-app
572 // iframe (path3/iframe.html), then opening a link from that iframe to a new 581 // iframe (path3/iframe.html), then opening a link from that iframe to a new
573 // window to a same-origin non-app URL (path3/empty.html) should keep the window 582 // window to a same-origin non-app URL (path3/empty.html) should keep the window
574 // in the app process. 583 // in the app process.
575 // This is in contrast to OpenAppFromIframe, since here the popup will not be 584 // This is in contrast to OpenAppFromIframe, since here the popup will not be
576 // missing special permissions and should be scriptable from the iframe. 585 // missing special permissions and should be scriptable from the iframe.
577 // See http://crbug.com/92669 for more details. 586 // See http://crbug.com/92669 for more details.
578 IN_PROC_BROWSER_TEST_F(AppApiTest, OpenWebPopupFromWebIframe) { 587 IN_PROC_BROWSER_TEST_F(AppApiTest, OpenWebPopupFromWebIframe) {
579 CommandLine::ForCurrentProcess()->AppendSwitch(
580 switches::kDisablePopupBlocking);
581
582 extensions::ProcessMap* process_map = 588 extensions::ProcessMap* process_map =
583 browser()->profile()->GetExtensionService()->process_map(); 589 browser()->profile()->GetExtensionService()->process_map();
584 590
585 host_resolver()->AddRule("*", "127.0.0.1"); 591 host_resolver()->AddRule("*", "127.0.0.1");
586 ASSERT_TRUE(test_server()->Start()); 592 ASSERT_TRUE(test_server()->Start());
587 593
588 GURL base_url = GetTestBaseURL("app_process"); 594 GURL base_url = GetTestBaseURL("app_process");
589 595
590 // Load app and start URL (in the app). 596 // Load app and start URL (in the app).
591 const Extension* app = 597 const Extension* app =
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 &browser()->GetSelectedTabContentsWrapper()->web_contents()-> 664 &browser()->GetSelectedTabContentsWrapper()->web_contents()->
659 GetController())); 665 GetController()));
660 browser()->Reload(CURRENT_TAB); 666 browser()->Reload(CURRENT_TAB);
661 observer.Wait(); 667 observer.Wait();
662 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 668 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
663 contents->GetRenderViewHost(), L"", 669 contents->GetRenderViewHost(), L"",
664 L"window.domAutomationController.send(chrome.app.isInstalled)", 670 L"window.domAutomationController.send(chrome.app.isInstalled)",
665 &is_installed)); 671 &is_installed));
666 ASSERT_TRUE(is_installed); 672 ASSERT_TRUE(is_installed);
667 } 673 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/app_background_page_apitest.cc ('k') | chrome/common/extensions/extension.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698