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
3 // found in the LICENSE file.
5 #include "apps/ui/native_app_window.h"
6 #include "base/path_service.h"
7 #include "base/strings/stringprintf.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "chrome/app/chrome_command_ids.h"
10 #include "chrome/browser/apps/app_browsertest_util.h"
11 #include "chrome/browser/chrome_content_browser_client.h"
12 #include "chrome/browser/extensions/extension_test_message_listener.h"
13 #include "chrome/browser/prerender/prerender_link_manager.h"
14 #include "chrome/browser/prerender/prerender_link_manager_factory.h"
15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
17 #include "chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h"
18 #include "chrome/browser/task_manager/task_manager_browsertest_util.h"
19 #include "chrome/browser/ui/browser.h"
20 #include "chrome/browser/ui/browser_dialogs.h"
21 #include "chrome/browser/ui/tabs/tab_strip_model.h"
22 #include "chrome/test/base/ui_test_utils.h"
23 #include "content/public/browser/gpu_data_manager.h"
24 #include "content/public/browser/interstitial_page.h"
25 #include "content/public/browser/interstitial_page_delegate.h"
26 #include "content/public/browser/notification_service.h"
27 #include "content/public/browser/render_process_host.h"
28 #include "content/public/browser/web_contents_delegate.h"
29 #include "content/public/common/content_switches.h"
30 #include "content/public/test/browser_test_utils.h"
31 #include "content/public/test/fake_speech_recognition_manager.h"
32 #include "extensions/common/extension.h"
33 #include "extensions/common/extensions_client.h"
34 #include "net/test/embedded_test_server/embedded_test_server.h"
35 #include "net/test/embedded_test_server/http_request.h"
36 #include "net/test/embedded_test_server/http_response.h"
37 #include "ui/gl/gl_switches.h"
39 #if defined(OS_CHROMEOS)
40 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
41 #include "chrome/browser/chromeos/accessibility/speech_monitor.h"
44 // For fine-grained suppression on flaky tests.
46 #include "base/win/windows_version.h"
49 using extensions::MenuItem;
50 using prerender::PrerenderLinkManager;
51 using prerender::PrerenderLinkManagerFactory;
52 using task_manager::browsertest_util::MatchAboutBlankTab;
53 using task_manager::browsertest_util::MatchAnyApp;
54 using task_manager::browsertest_util::MatchAnyBackground;
55 using task_manager::browsertest_util::MatchAnyTab;
56 using task_manager::browsertest_util::MatchAnyWebView;
57 using task_manager::browsertest_util::MatchApp;
58 using task_manager::browsertest_util::MatchBackground;
59 using task_manager::browsertest_util::MatchWebView;
60 using task_manager::browsertest_util::WaitForTaskManagerRows;
64 const char kEmptyResponsePath[] = "/close-socket";
65 const char kRedirectResponsePath[] = "/server-redirect";
66 const char kRedirectResponseFullPath[] =
67 "/extensions/platform_apps/web_view/shim/guest_redirect.html";
69 // Platform-specific filename relative to the chrome executable.
71 const wchar_t library_name[] = L"ppapi_tests.dll";
72 #elif defined(OS_MACOSX)
73 const char library_name[] = "ppapi_tests.plugin";
74 #elif defined(OS_POSIX)
75 const char library_name[] = "libppapi_tests.so";
78 class EmptyHttpResponse : public net::test_server::HttpResponse {
80 virtual std::string ToResponseString() const OVERRIDE {
85 class TestInterstitialPageDelegate : public content::InterstitialPageDelegate {
87 TestInterstitialPageDelegate() {
89 virtual ~TestInterstitialPageDelegate() {}
90 virtual std::string GetHTMLContents() OVERRIDE { return std::string(); }
93 // Used to get notified when a guest is created.
94 class GuestContentBrowserClient : public chrome::ChromeContentBrowserClient {
96 GuestContentBrowserClient() : web_contents_(NULL) {}
98 content::WebContents* WaitForGuestCreated() {
100 return web_contents_;
102 message_loop_runner_ = new content::MessageLoopRunner;
103 message_loop_runner_->Run();
104 return web_contents_;
108 // ChromeContentBrowserClient implementation:
109 virtual void GuestWebContentsAttached(
110 content::WebContents* guest_web_contents,
111 content::WebContents* embedder_web_contents,
112 const base::DictionaryValue& extra_params) OVERRIDE {
113 ChromeContentBrowserClient::GuestWebContentsAttached(
114 guest_web_contents, embedder_web_contents, extra_params);
115 web_contents_ = guest_web_contents;
117 if (message_loop_runner_)
118 message_loop_runner_->Quit();
121 content::WebContents* web_contents_;
122 scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
125 class WebContentsHiddenObserver : public content::WebContentsObserver {
127 WebContentsHiddenObserver(content::WebContents* web_contents,
128 const base::Closure& hidden_callback)
129 : WebContentsObserver(web_contents),
130 hidden_callback_(hidden_callback),
131 hidden_observed_(true) {
134 // WebContentsObserver.
135 virtual void WasHidden() OVERRIDE {
136 hidden_observed_ = true;
137 hidden_callback_.Run();
140 bool hidden_observed() { return hidden_observed_; }
143 base::Closure hidden_callback_;
144 bool hidden_observed_;
146 DISALLOW_COPY_AND_ASSIGN(WebContentsHiddenObserver);
149 class InterstitialObserver : public content::WebContentsObserver {
151 InterstitialObserver(content::WebContents* web_contents,
152 const base::Closure& attach_callback,
153 const base::Closure& detach_callback)
154 : WebContentsObserver(web_contents),
155 attach_callback_(attach_callback),
156 detach_callback_(detach_callback) {
159 virtual void DidAttachInterstitialPage() OVERRIDE {
160 attach_callback_.Run();
163 virtual void DidDetachInterstitialPage() OVERRIDE {
164 detach_callback_.Run();
168 base::Closure attach_callback_;
169 base::Closure detach_callback_;
171 DISALLOW_COPY_AND_ASSIGN(InterstitialObserver);
174 void ExecuteScriptWaitForTitle(content::WebContents* web_contents,
177 base::string16 expected_title(base::ASCIIToUTF16(title));
178 base::string16 error_title(base::ASCIIToUTF16("error"));
180 content::TitleWatcher title_watcher(web_contents, expected_title);
181 title_watcher.AlsoWaitForTitle(error_title);
182 EXPECT_TRUE(content::ExecuteScript(web_contents, script));
183 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
188 // This class intercepts media access request from the embedder. The request
189 // should be triggered only if the embedder API (from tests) allows the request
191 // We do not issue the actual media request; the fact that the request reached
192 // embedder's WebContents is good enough for our tests. This is also to make
193 // the test run successfully on trybots.
194 class MockWebContentsDelegate : public content::WebContentsDelegate {
196 MockWebContentsDelegate() : requested_(false) {}
197 virtual ~MockWebContentsDelegate() {}
199 virtual void RequestMediaAccessPermission(
200 content::WebContents* web_contents,
201 const content::MediaStreamRequest& request,
202 const content::MediaResponseCallback& callback) OVERRIDE {
204 if (message_loop_runner_.get())
205 message_loop_runner_->Quit();
208 void WaitForSetMediaPermission() {
211 message_loop_runner_ = new content::MessageLoopRunner;
212 message_loop_runner_->Run();
217 scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
219 DISALLOW_COPY_AND_ASSIGN(MockWebContentsDelegate);
222 // This class intercepts download request from the guest.
223 class MockDownloadWebContentsDelegate : public content::WebContentsDelegate {
225 explicit MockDownloadWebContentsDelegate(
226 content::WebContentsDelegate* orig_delegate)
227 : orig_delegate_(orig_delegate),
228 waiting_for_decision_(false),
229 expect_allow_(false),
230 decision_made_(false),
231 last_download_allowed_(false) {}
232 virtual ~MockDownloadWebContentsDelegate() {}
234 virtual void CanDownload(
235 content::RenderViewHost* render_view_host,
237 const std::string& request_method,
238 const base::Callback<void(bool)>& callback) OVERRIDE {
239 orig_delegate_->CanDownload(
240 render_view_host, request_id, request_method,
241 base::Bind(&MockDownloadWebContentsDelegate::DownloadDecided,
242 base::Unretained(this)));
245 void WaitForCanDownload(bool expect_allow) {
246 EXPECT_FALSE(waiting_for_decision_);
247 waiting_for_decision_ = true;
249 if (decision_made_) {
250 EXPECT_EQ(expect_allow, last_download_allowed_);
254 expect_allow_ = expect_allow;
255 message_loop_runner_ = new content::MessageLoopRunner;
256 message_loop_runner_->Run();
259 void DownloadDecided(bool allow) {
260 EXPECT_FALSE(decision_made_);
261 decision_made_ = true;
263 if (waiting_for_decision_) {
264 EXPECT_EQ(expect_allow_, allow);
265 if (message_loop_runner_.get())
266 message_loop_runner_->Quit();
269 last_download_allowed_ = allow;
273 waiting_for_decision_ = false;
274 decision_made_ = false;
278 content::WebContentsDelegate* orig_delegate_;
279 bool waiting_for_decision_;
282 bool last_download_allowed_;
283 scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
285 DISALLOW_COPY_AND_ASSIGN(MockDownloadWebContentsDelegate);
288 class WebViewTest : public extensions::PlatformAppBrowserTest {
290 virtual void SetUp() OVERRIDE {
291 if (UsesFakeSpeech()) {
292 // SpeechRecognition test specific SetUp.
293 fake_speech_recognition_manager_.reset(
294 new content::FakeSpeechRecognitionManager());
295 fake_speech_recognition_manager_->set_should_send_fake_response(true);
296 // Inject the fake manager factory so that the test result is returned to
298 content::SpeechRecognitionManager::SetManagerForTesting(
299 fake_speech_recognition_manager_.get());
301 extensions::PlatformAppBrowserTest::SetUp();
304 virtual void TearDown() OVERRIDE {
305 if (UsesFakeSpeech()) {
306 // SpeechRecognition test specific TearDown.
307 content::SpeechRecognitionManager::SetManagerForTesting(NULL);
310 extensions::PlatformAppBrowserTest::TearDown();
313 virtual void SetUpOnMainThread() OVERRIDE {
314 extensions::PlatformAppBrowserTest::SetUpOnMainThread();
315 const testing::TestInfo* const test_info =
316 testing::UnitTest::GetInstance()->current_test_info();
317 // Mock out geolocation for geolocation specific tests.
318 if (!strncmp(test_info->name(), "GeolocationAPI",
319 strlen("GeolocationAPI"))) {
320 ui_test_utils::OverrideGeolocation(10, 20);
324 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
325 command_line->AppendSwitch(switches::kUseFakeDeviceForMediaStream);
326 command_line->AppendSwitchASCII(switches::kJavaScriptFlags, "--expose-gc");
328 extensions::PlatformAppBrowserTest::SetUpCommandLine(command_line);
331 // This method is responsible for initializing a packaged app, which contains
332 // multiple webview tags. The tags have different partition identifiers and
333 // their WebContent objects are returned as output. The method also verifies
334 // the expected process allocation and storage partition assignment.
335 // The |navigate_to_url| parameter is used to navigate the main browser
338 // TODO(ajwong): This function is getting to be too large. Either refactor it
339 // so the test can specify a configuration of WebView tags that we will
340 // dynamically inject JS to generate, or move this test wholesale into
341 // something that RunPlatformAppTest() can execute purely in Javascript. This
342 // won't let us do a white-box examination of the StoragePartition equivalence
343 // directly, but we will be able to view the black box effects which is good
344 // enough. http://crbug.com/160361
345 void NavigateAndOpenAppForIsolation(
346 GURL navigate_to_url,
347 content::WebContents** default_tag_contents1,
348 content::WebContents** default_tag_contents2,
349 content::WebContents** named_partition_contents1,
350 content::WebContents** named_partition_contents2,
351 content::WebContents** persistent_partition_contents1,
352 content::WebContents** persistent_partition_contents2,
353 content::WebContents** persistent_partition_contents3) {
354 GURL::Replacements replace_host;
355 std::string host_str("localhost"); // Must stay in scope with replace_host.
356 replace_host.SetHostStr(host_str);
358 navigate_to_url = navigate_to_url.ReplaceComponents(replace_host);
360 GURL tag_url1 = embedded_test_server()->GetURL(
361 "/extensions/platform_apps/web_view/isolation/cookie.html");
362 tag_url1 = tag_url1.ReplaceComponents(replace_host);
363 GURL tag_url2 = embedded_test_server()->GetURL(
364 "/extensions/platform_apps/web_view/isolation/cookie2.html");
365 tag_url2 = tag_url2.ReplaceComponents(replace_host);
366 GURL tag_url3 = embedded_test_server()->GetURL(
367 "/extensions/platform_apps/web_view/isolation/storage1.html");
368 tag_url3 = tag_url3.ReplaceComponents(replace_host);
369 GURL tag_url4 = embedded_test_server()->GetURL(
370 "/extensions/platform_apps/web_view/isolation/storage2.html");
371 tag_url4 = tag_url4.ReplaceComponents(replace_host);
372 GURL tag_url5 = embedded_test_server()->GetURL(
373 "/extensions/platform_apps/web_view/isolation/storage1.html#p1");
374 tag_url5 = tag_url5.ReplaceComponents(replace_host);
375 GURL tag_url6 = embedded_test_server()->GetURL(
376 "/extensions/platform_apps/web_view/isolation/storage1.html#p2");
377 tag_url6 = tag_url6.ReplaceComponents(replace_host);
378 GURL tag_url7 = embedded_test_server()->GetURL(
379 "/extensions/platform_apps/web_view/isolation/storage1.html#p3");
380 tag_url7 = tag_url7.ReplaceComponents(replace_host);
382 ui_test_utils::NavigateToURLWithDisposition(
383 browser(), navigate_to_url, CURRENT_TAB,
384 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
386 ui_test_utils::UrlLoadObserver observer1(
387 tag_url1, content::NotificationService::AllSources());
388 ui_test_utils::UrlLoadObserver observer2(
389 tag_url2, content::NotificationService::AllSources());
390 ui_test_utils::UrlLoadObserver observer3(
391 tag_url3, content::NotificationService::AllSources());
392 ui_test_utils::UrlLoadObserver observer4(
393 tag_url4, content::NotificationService::AllSources());
394 ui_test_utils::UrlLoadObserver observer5(
395 tag_url5, content::NotificationService::AllSources());
396 ui_test_utils::UrlLoadObserver observer6(
397 tag_url6, content::NotificationService::AllSources());
398 ui_test_utils::UrlLoadObserver observer7(
399 tag_url7, content::NotificationService::AllSources());
400 LoadAndLaunchPlatformApp("web_view/isolation");
409 content::Source<content::NavigationController> source1 = observer1.source();
410 EXPECT_TRUE(source1->GetWebContents()->GetRenderProcessHost()->IsGuest());
411 content::Source<content::NavigationController> source2 = observer2.source();
412 EXPECT_TRUE(source2->GetWebContents()->GetRenderProcessHost()->IsGuest());
413 content::Source<content::NavigationController> source3 = observer3.source();
414 EXPECT_TRUE(source3->GetWebContents()->GetRenderProcessHost()->IsGuest());
415 content::Source<content::NavigationController> source4 = observer4.source();
416 EXPECT_TRUE(source4->GetWebContents()->GetRenderProcessHost()->IsGuest());
417 content::Source<content::NavigationController> source5 = observer5.source();
418 EXPECT_TRUE(source5->GetWebContents()->GetRenderProcessHost()->IsGuest());
419 content::Source<content::NavigationController> source6 = observer6.source();
420 EXPECT_TRUE(source6->GetWebContents()->GetRenderProcessHost()->IsGuest());
421 content::Source<content::NavigationController> source7 = observer7.source();
422 EXPECT_TRUE(source7->GetWebContents()->GetRenderProcessHost()->IsGuest());
424 // Check that the first two tags use the same process and it is different
425 // than the process used by the other two.
426 EXPECT_EQ(source1->GetWebContents()->GetRenderProcessHost()->GetID(),
427 source2->GetWebContents()->GetRenderProcessHost()->GetID());
428 EXPECT_EQ(source3->GetWebContents()->GetRenderProcessHost()->GetID(),
429 source4->GetWebContents()->GetRenderProcessHost()->GetID());
430 EXPECT_NE(source1->GetWebContents()->GetRenderProcessHost()->GetID(),
431 source3->GetWebContents()->GetRenderProcessHost()->GetID());
433 // The two sets of tags should also be isolated from the main browser.
434 EXPECT_NE(source1->GetWebContents()->GetRenderProcessHost()->GetID(),
435 browser()->tab_strip_model()->GetWebContentsAt(0)->
436 GetRenderProcessHost()->GetID());
437 EXPECT_NE(source3->GetWebContents()->GetRenderProcessHost()->GetID(),
438 browser()->tab_strip_model()->GetWebContentsAt(0)->
439 GetRenderProcessHost()->GetID());
441 // Check that the storage partitions of the first two tags match and are
442 // different than the other two.
444 source1->GetWebContents()->GetRenderProcessHost()->
445 GetStoragePartition(),
446 source2->GetWebContents()->GetRenderProcessHost()->
447 GetStoragePartition());
449 source3->GetWebContents()->GetRenderProcessHost()->
450 GetStoragePartition(),
451 source4->GetWebContents()->GetRenderProcessHost()->
452 GetStoragePartition());
454 source1->GetWebContents()->GetRenderProcessHost()->
455 GetStoragePartition(),
456 source3->GetWebContents()->GetRenderProcessHost()->
457 GetStoragePartition());
459 // Ensure the persistent storage partitions are different.
461 source5->GetWebContents()->GetRenderProcessHost()->
462 GetStoragePartition(),
463 source6->GetWebContents()->GetRenderProcessHost()->
464 GetStoragePartition());
466 source5->GetWebContents()->GetRenderProcessHost()->
467 GetStoragePartition(),
468 source7->GetWebContents()->GetRenderProcessHost()->
469 GetStoragePartition());
471 source1->GetWebContents()->GetRenderProcessHost()->
472 GetStoragePartition(),
473 source5->GetWebContents()->GetRenderProcessHost()->
474 GetStoragePartition());
476 source1->GetWebContents()->GetRenderProcessHost()->
477 GetStoragePartition(),
478 source7->GetWebContents()->GetRenderProcessHost()->
479 GetStoragePartition());
481 *default_tag_contents1 = source1->GetWebContents();
482 *default_tag_contents2 = source2->GetWebContents();
483 *named_partition_contents1 = source3->GetWebContents();
484 *named_partition_contents2 = source4->GetWebContents();
485 if (persistent_partition_contents1) {
486 *persistent_partition_contents1 = source5->GetWebContents();
488 if (persistent_partition_contents2) {
489 *persistent_partition_contents2 = source6->GetWebContents();
491 if (persistent_partition_contents3) {
492 *persistent_partition_contents3 = source7->GetWebContents();
496 // Handles |request| by serving a redirect response.
497 static scoped_ptr<net::test_server::HttpResponse> RedirectResponseHandler(
498 const std::string& path,
499 const GURL& redirect_target,
500 const net::test_server::HttpRequest& request) {
501 if (!StartsWithASCII(path, request.relative_url, true))
502 return scoped_ptr<net::test_server::HttpResponse>();
504 scoped_ptr<net::test_server::BasicHttpResponse> http_response(
505 new net::test_server::BasicHttpResponse);
506 http_response->set_code(net::HTTP_MOVED_PERMANENTLY);
507 http_response->AddCustomHeader("Location", redirect_target.spec());
508 return http_response.PassAs<net::test_server::HttpResponse>();
511 // Handles |request| by serving an empty response.
512 static scoped_ptr<net::test_server::HttpResponse> EmptyResponseHandler(
513 const std::string& path,
514 const net::test_server::HttpRequest& request) {
515 if (StartsWithASCII(path, request.relative_url, true)) {
516 return scoped_ptr<net::test_server::HttpResponse>(
517 new EmptyHttpResponse);
520 return scoped_ptr<net::test_server::HttpResponse>();
523 // Shortcut to return the current MenuManager.
524 extensions::MenuManager* menu_manager() {
525 return extensions::MenuManager::Get(browser()->profile());
528 // This gets all the items that any extension has registered for possible
529 // inclusion in context menus.
530 MenuItem::List GetItems() {
531 MenuItem::List result;
532 std::set<MenuItem::ExtensionKey> extension_ids =
533 menu_manager()->ExtensionIds();
534 std::set<MenuItem::ExtensionKey>::iterator i;
535 for (i = extension_ids.begin(); i != extension_ids.end(); ++i) {
536 const MenuItem::List* list = menu_manager()->MenuItems(*i);
537 result.insert(result.end(), list->begin(), list->end());
547 void TestHelper(const std::string& test_name,
548 const std::string& app_location,
549 TestServer test_server) {
550 // For serving guest pages.
551 if (test_server == NEEDS_TEST_SERVER) {
552 if (!StartEmbeddedTestServer()) {
553 LOG(ERROR) << "FAILED TO START TEST SERVER.";
556 embedded_test_server()->RegisterRequestHandler(
557 base::Bind(&WebViewTest::RedirectResponseHandler,
558 kRedirectResponsePath,
559 embedded_test_server()->GetURL(kRedirectResponseFullPath)));
561 embedded_test_server()->RegisterRequestHandler(
562 base::Bind(&WebViewTest::EmptyResponseHandler, kEmptyResponsePath));
565 ExtensionTestMessageListener launched_listener("Launched", false);
566 LoadAndLaunchPlatformApp(app_location.c_str());
567 if (!launched_listener.WaitUntilSatisfied()) {
568 LOG(ERROR) << "TEST DID NOT LAUNCH.";
572 // Flush any pending events to make sure we start with a clean slate.
573 content::RunAllPendingInMessageLoop();
575 content::WebContents* embedder_web_contents =
576 GetFirstAppWindowWebContents();
577 if (!embedder_web_contents) {
578 LOG(ERROR) << "UNABLE TO FIND EMBEDDER WEB CONTENTS.";
582 ExtensionTestMessageListener done_listener("TEST_PASSED", false);
583 done_listener.set_failure_message("TEST_FAILED");
584 if (!content::ExecuteScript(
585 embedder_web_contents,
586 base::StringPrintf("runTest('%s')", test_name.c_str()))) {
587 LOG(ERROR) << "UNABLE TO START TEST.";
590 ASSERT_TRUE(done_listener.WaitUntilSatisfied());
593 content::WebContents* LoadGuest(const std::string& guest_path,
594 const std::string& app_path) {
595 GURL::Replacements replace_host;
596 std::string host_str("localhost"); // Must stay in scope with replace_host.
597 replace_host.SetHostStr(host_str);
599 GURL guest_url = embedded_test_server()->GetURL(guest_path);
600 guest_url = guest_url.ReplaceComponents(replace_host);
602 ui_test_utils::UrlLoadObserver guest_observer(
603 guest_url, content::NotificationService::AllSources());
605 ExtensionTestMessageListener guest_loaded_listener("guest-loaded", false);
606 LoadAndLaunchPlatformApp(app_path.c_str());
607 guest_observer.Wait();
609 content::Source<content::NavigationController> source =
610 guest_observer.source();
611 EXPECT_TRUE(source->GetWebContents()->GetRenderProcessHost()->IsGuest());
613 bool satisfied = guest_loaded_listener.WaitUntilSatisfied();
617 content::WebContents* guest_web_contents = source->GetWebContents();
618 return guest_web_contents;
621 // Runs media_access/allow tests.
622 void MediaAccessAPIAllowTestHelper(const std::string& test_name);
624 // Runs media_access/deny tests, each of them are run separately otherwise
625 // they timeout (mostly on Windows).
626 void MediaAccessAPIDenyTestHelper(const std::string& test_name) {
627 ASSERT_TRUE(StartEmbeddedTestServer()); // For serving guest pages.
628 ExtensionTestMessageListener loaded_listener("loaded", false);
629 LoadAndLaunchPlatformApp("web_view/media_access/deny");
630 ASSERT_TRUE(loaded_listener.WaitUntilSatisfied());
632 content::WebContents* embedder_web_contents =
633 GetFirstAppWindowWebContents();
634 ASSERT_TRUE(embedder_web_contents);
636 ExtensionTestMessageListener test_run_listener("PASSED", false);
637 test_run_listener.set_failure_message("FAILED");
639 content::ExecuteScript(
640 embedder_web_contents,
641 base::StringPrintf("startDenyTest('%s')", test_name.c_str())));
642 ASSERT_TRUE(test_run_listener.WaitUntilSatisfied());
645 void WaitForInterstitial(content::WebContents* web_contents) {
646 scoped_refptr<content::MessageLoopRunner> loop_runner(
647 new content::MessageLoopRunner);
648 InterstitialObserver observer(web_contents,
649 loop_runner->QuitClosure(),
651 if (!content::InterstitialPage::GetInterstitialPage(web_contents))
655 void LoadAppWithGuest(const std::string& app_path) {
656 GuestContentBrowserClient new_client;
657 content::ContentBrowserClient* old_client =
658 SetBrowserClientForTesting(&new_client);
660 ExtensionTestMessageListener launched_listener("WebViewTest.LAUNCHED",
662 launched_listener.set_failure_message("WebViewTest.FAILURE");
663 LoadAndLaunchPlatformApp(app_path.c_str());
664 ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
666 guest_web_contents_ = new_client.WaitForGuestCreated();
667 SetBrowserClientForTesting(old_client);
670 void SendMessageToEmbedder(const std::string& message) {
672 content::ExecuteScript(
673 GetEmbedderWebContents(),
674 base::StringPrintf("onAppCommand('%s');", message.c_str())));
677 content::WebContents* GetGuestWebContents() {
678 return guest_web_contents_;
681 content::WebContents* GetEmbedderWebContents() {
682 if (!embedder_web_contents_) {
683 embedder_web_contents_ = GetFirstAppWindowWebContents();
685 return embedder_web_contents_;
688 WebViewTest() : guest_web_contents_(NULL),
689 embedder_web_contents_(NULL) {
693 bool UsesFakeSpeech() {
694 const testing::TestInfo* const test_info =
695 testing::UnitTest::GetInstance()->current_test_info();
697 // SpeechRecognition test specific SetUp.
698 return !strcmp(test_info->name(),
699 "SpeechRecognitionAPI_HasPermissionAllow");
702 scoped_ptr<content::FakeSpeechRecognitionManager>
703 fake_speech_recognition_manager_;
705 // Note that these are only set if you launch app using LoadAppWithGuest().
706 content::WebContents* guest_web_contents_;
707 content::WebContents* embedder_web_contents_;
710 // This test verifies that hiding the guest triggers WebContents::WasHidden().
711 IN_PROC_BROWSER_TEST_F(WebViewTest, GuestVisibilityChanged) {
712 LoadAppWithGuest("web_view/visibility_changed");
714 scoped_refptr<content::MessageLoopRunner> loop_runner(
715 new content::MessageLoopRunner);
716 WebContentsHiddenObserver observer(GetGuestWebContents(),
717 loop_runner->QuitClosure());
719 // Handled in platform_apps/web_view/visibility_changed/main.js
720 SendMessageToEmbedder("hide-guest");
721 if (!observer.hidden_observed())
725 // This test verifies that hiding the embedder also hides the guest.
726 IN_PROC_BROWSER_TEST_F(WebViewTest, EmbedderVisibilityChanged) {
727 LoadAppWithGuest("web_view/visibility_changed");
729 scoped_refptr<content::MessageLoopRunner> loop_runner(
730 new content::MessageLoopRunner);
731 WebContentsHiddenObserver observer(GetGuestWebContents(),
732 loop_runner->QuitClosure());
734 // Handled in platform_apps/web_view/visibility_changed/main.js
735 SendMessageToEmbedder("hide-embedder");
736 if (!observer.hidden_observed())
740 // This test ensures JavaScript errors ("Cannot redefine property") do not
741 // happen when a <webview> is removed from DOM and added back.
742 IN_PROC_BROWSER_TEST_F(WebViewTest,
743 AddRemoveWebView_AddRemoveWebView) {
744 ASSERT_TRUE(StartEmbeddedTestServer()); // For serving guest pages.
745 ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/addremove"))
749 IN_PROC_BROWSER_TEST_F(WebViewTest, AutoSize) {
751 // Flaky on XP bot http://crbug.com/299507
752 if (base::win::GetVersion() <= base::win::VERSION_XP)
756 ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/autosize"))
760 // http://crbug.com/326332
761 IN_PROC_BROWSER_TEST_F(WebViewTest, DISABLED_Shim_TestAutosizeAfterNavigation) {
762 TestHelper("testAutosizeAfterNavigation", "web_view/shim", NO_TEST_SERVER);
765 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestAutosizeBeforeNavigation) {
766 TestHelper("testAutosizeBeforeNavigation", "web_view/shim", NO_TEST_SERVER);
768 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestAutosizeRemoveAttributes) {
769 TestHelper("testAutosizeRemoveAttributes", "web_view/shim", NO_TEST_SERVER);
772 // This test is disabled due to being flaky. http://crbug.com/282116
774 #define MAYBE_Shim_TestAutosizeWithPartialAttributes \
775 DISABLED_Shim_TestAutosizeWithPartialAttributes
777 #define MAYBE_Shim_TestAutosizeWithPartialAttributes \
778 Shim_TestAutosizeWithPartialAttributes
780 IN_PROC_BROWSER_TEST_F(WebViewTest,
781 MAYBE_Shim_TestAutosizeWithPartialAttributes) {
782 TestHelper("testAutosizeWithPartialAttributes",
787 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestAPIMethodExistence) {
788 TestHelper("testAPIMethodExistence", "web_view/shim", NO_TEST_SERVER);
791 // Tests the existence of WebRequest API event objects on the request
792 // object, on the webview element, and hanging directly off webview.
793 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestWebRequestAPIExistence) {
794 TestHelper("testWebRequestAPIExistence", "web_view/shim", NO_TEST_SERVER);
797 // http://crbug.com/315920
798 #if defined(GOOGLE_CHROME_BUILD) && (defined(OS_WIN) || defined(OS_LINUX))
799 #define MAYBE_Shim_TestChromeExtensionURL DISABLED_Shim_TestChromeExtensionURL
801 #define MAYBE_Shim_TestChromeExtensionURL Shim_TestChromeExtensionURL
803 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_Shim_TestChromeExtensionURL) {
804 TestHelper("testChromeExtensionURL", "web_view/shim", NO_TEST_SERVER);
807 // http://crbug.com/315920
808 #if defined(GOOGLE_CHROME_BUILD) && (defined(OS_WIN) || defined(OS_LINUX))
809 #define MAYBE_Shim_TestChromeExtensionRelativePath \
810 DISABLED_Shim_TestChromeExtensionRelativePath
812 #define MAYBE_Shim_TestChromeExtensionRelativePath \
813 Shim_TestChromeExtensionRelativePath
815 IN_PROC_BROWSER_TEST_F(WebViewTest,
816 MAYBE_Shim_TestChromeExtensionRelativePath) {
817 TestHelper("testChromeExtensionRelativePath",
822 IN_PROC_BROWSER_TEST_F(WebViewTest,
823 Shim_TestInlineScriptFromAccessibleResources) {
824 TestHelper("testInlineScriptFromAccessibleResources",
829 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestInvalidChromeExtensionURL) {
830 TestHelper("testInvalidChromeExtensionURL", "web_view/shim", NO_TEST_SERVER);
833 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestEventName) {
834 TestHelper("testEventName", "web_view/shim", NO_TEST_SERVER);
837 // WebViewTest.Shim_TestOnEventProperty is flaky, so disable it.
838 // http://crbug.com/359832.
839 IN_PROC_BROWSER_TEST_F(WebViewTest, DISABLED_Shim_TestOnEventProperty) {
840 TestHelper("testOnEventProperties", "web_view/shim", NO_TEST_SERVER);
843 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestLoadProgressEvent) {
844 TestHelper("testLoadProgressEvent", "web_view/shim", NO_TEST_SERVER);
847 // WebViewTest.Shim_TestDestroyOnEventListener is flaky, so disable it.
848 // http://crbug.com/255106
849 IN_PROC_BROWSER_TEST_F(WebViewTest, DISABLED_Shim_TestDestroyOnEventListener) {
850 TestHelper("testDestroyOnEventListener", "web_view/shim", NO_TEST_SERVER);
853 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestCannotMutateEventName) {
854 TestHelper("testCannotMutateEventName", "web_view/shim", NO_TEST_SERVER);
857 // http://crbug.com/267304
859 #define MAYBE_Shim_TestPartitionRaisesException \
860 DISABLED_Shim_TestPartitionRaisesException
862 #define MAYBE_Shim_TestPartitionRaisesException \
863 Shim_TestPartitionRaisesException
866 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_Shim_TestPartitionRaisesException) {
867 TestHelper("testPartitionRaisesException",
872 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestExecuteScriptFail) {
874 // Flaky on XP bot http://crbug.com/266185
875 if (base::win::GetVersion() <= base::win::VERSION_XP)
879 TestHelper("testExecuteScriptFail", "web_view/shim", NEEDS_TEST_SERVER);
882 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestExecuteScript) {
883 TestHelper("testExecuteScript", "web_view/shim", NO_TEST_SERVER);
886 IN_PROC_BROWSER_TEST_F(
888 Shim_TestExecuteScriptIsAbortedWhenWebViewSourceIsChanged) {
889 TestHelper("testExecuteScriptIsAbortedWhenWebViewSourceIsChanged",
894 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestTerminateAfterExit) {
895 TestHelper("testTerminateAfterExit", "web_view/shim", NO_TEST_SERVER);
898 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestAssignSrcAfterCrash) {
899 TestHelper("testAssignSrcAfterCrash", "web_view/shim", NO_TEST_SERVER);
902 IN_PROC_BROWSER_TEST_F(WebViewTest,
903 Shim_TestNavOnConsecutiveSrcAttributeChanges) {
904 TestHelper("testNavOnConsecutiveSrcAttributeChanges",
909 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestNavOnSrcAttributeChange) {
910 TestHelper("testNavOnSrcAttributeChange", "web_view/shim", NO_TEST_SERVER);
913 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestRemoveSrcAttribute) {
914 TestHelper("testRemoveSrcAttribute", "web_view/shim", NO_TEST_SERVER);
917 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestReassignSrcAttribute) {
918 TestHelper("testReassignSrcAttribute", "web_view/shim", NO_TEST_SERVER);
921 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestBrowserPluginNotAllowed) {
923 // Flaky on XP bots. http://crbug.com/267300
924 if (base::win::GetVersion() <= base::win::VERSION_XP)
928 TestHelper("testBrowserPluginNotAllowed", "web_view/shim", NO_TEST_SERVER);
931 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestNewWindow) {
932 TestHelper("testNewWindow", "web_view/shim", NEEDS_TEST_SERVER);
935 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestNewWindowTwoListeners) {
936 TestHelper("testNewWindowTwoListeners", "web_view/shim", NEEDS_TEST_SERVER);
939 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestNewWindowNoPreventDefault) {
940 TestHelper("testNewWindowNoPreventDefault",
945 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestNewWindowNoReferrerLink) {
946 TestHelper("testNewWindowNoReferrerLink", "web_view/shim", NEEDS_TEST_SERVER);
949 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestContentLoadEvent) {
950 TestHelper("testContentLoadEvent", "web_view/shim", NO_TEST_SERVER);
953 // http://crbug.com/326330
954 IN_PROC_BROWSER_TEST_F(WebViewTest,
955 DISABLED_Shim_TestDeclarativeWebRequestAPI) {
956 TestHelper("testDeclarativeWebRequestAPI",
961 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestWebRequestAPI) {
962 TestHelper("testWebRequestAPI", "web_view/shim", NEEDS_TEST_SERVER);
965 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestWebRequestAPIGoogleProperty) {
966 TestHelper("testWebRequestAPIGoogleProperty",
971 // This test is disabled due to being flaky. http://crbug.com/309451
973 #define MAYBE_Shim_TestWebRequestListenerSurvivesReparenting \
974 DISABLED_Shim_TestWebRequestListenerSurvivesReparenting
976 #define MAYBE_Shim_TestWebRequestListenerSurvivesReparenting \
977 Shim_TestWebRequestListenerSurvivesReparenting
979 IN_PROC_BROWSER_TEST_F(
981 MAYBE_Shim_TestWebRequestListenerSurvivesReparenting) {
982 TestHelper("testWebRequestListenerSurvivesReparenting",
987 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestLoadStartLoadRedirect) {
988 TestHelper("testLoadStartLoadRedirect", "web_view/shim", NEEDS_TEST_SERVER);
991 IN_PROC_BROWSER_TEST_F(WebViewTest,
992 Shim_TestLoadAbortChromeExtensionURLWrongPartition) {
993 TestHelper("testLoadAbortChromeExtensionURLWrongPartition",
998 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestLoadAbortEmptyResponse) {
999 TestHelper("testLoadAbortEmptyResponse", "web_view/shim", NEEDS_TEST_SERVER);
1002 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestLoadAbortIllegalChromeURL) {
1003 TestHelper("testLoadAbortIllegalChromeURL",
1008 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestLoadAbortIllegalFileURL) {
1009 TestHelper("testLoadAbortIllegalFileURL", "web_view/shim", NO_TEST_SERVER);
1012 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestLoadAbortIllegalJavaScriptURL) {
1013 TestHelper("testLoadAbortIllegalJavaScriptURL",
1018 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestReload) {
1019 TestHelper("testReload", "web_view/shim", NEEDS_TEST_SERVER);
1022 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestGetProcessId) {
1023 TestHelper("testGetProcessId", "web_view/shim", NEEDS_TEST_SERVER);
1026 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestRemoveWebviewOnExit) {
1027 ASSERT_TRUE(StartEmbeddedTestServer()); // For serving guest pages.
1029 // Launch the app and wait until it's ready to load a test.
1030 ExtensionTestMessageListener launched_listener("Launched", false);
1031 LoadAndLaunchPlatformApp("web_view/shim");
1032 ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
1034 content::WebContents* embedder_web_contents = GetFirstAppWindowWebContents();
1035 ASSERT_TRUE(embedder_web_contents);
1037 GURL::Replacements replace_host;
1038 std::string host_str("localhost"); // Must stay in scope with replace_host.
1039 replace_host.SetHostStr(host_str);
1041 std::string guest_path(
1042 "/extensions/platform_apps/web_view/shim/empty_guest.html");
1043 GURL guest_url = embedded_test_server()->GetURL(guest_path);
1044 guest_url = guest_url.ReplaceComponents(replace_host);
1046 ui_test_utils::UrlLoadObserver guest_observer(
1047 guest_url, content::NotificationService::AllSources());
1049 // Run the test and wait until the guest WebContents is available and has
1050 // finished loading.
1051 ExtensionTestMessageListener guest_loaded_listener("guest-loaded", false);
1052 EXPECT_TRUE(content::ExecuteScript(
1053 embedder_web_contents,
1054 "runTest('testRemoveWebviewOnExit')"));
1055 guest_observer.Wait();
1057 content::Source<content::NavigationController> source =
1058 guest_observer.source();
1059 EXPECT_TRUE(source->GetWebContents()->GetRenderProcessHost()->IsGuest());
1061 ASSERT_TRUE(guest_loaded_listener.WaitUntilSatisfied());
1063 content::WebContentsDestroyedWatcher destroyed_watcher(
1064 source->GetWebContents());
1066 // Tell the embedder to kill the guest.
1067 EXPECT_TRUE(content::ExecuteScript(
1068 embedder_web_contents,
1069 "removeWebviewOnExitDoCrash();"));
1071 // Wait until the guest WebContents is destroyed.
1072 destroyed_watcher.Wait();
1075 // Remove <webview> immediately after navigating it.
1076 // This is a regression test for http://crbug.com/276023.
1077 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestRemoveWebviewAfterNavigation) {
1078 TestHelper("testRemoveWebviewAfterNavigation",
1083 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestNavigationToExternalProtocol) {
1084 TestHelper("testNavigationToExternalProtocol",
1089 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestResizeWebviewResizesContent) {
1090 TestHelper("testResizeWebviewResizesContent",
1095 // This test makes sure we do not crash if app is closed while interstitial
1096 // page is being shown in guest.
1097 // Disabled under LeakSanitizer due to memory leaks. http://crbug.com/321662
1098 #if defined(LEAK_SANITIZER)
1099 #define MAYBE_InterstitialTeardown DISABLED_InterstitialTeardown
1101 #define MAYBE_InterstitialTeardown InterstitialTeardown
1103 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_InterstitialTeardown) {
1105 // Flaky on XP bot http://crbug.com/297014
1106 if (base::win::GetVersion() <= base::win::VERSION_XP)
1110 // Start a HTTPS server so we can load an interstitial page inside guest.
1111 net::SpawnedTestServer::SSLOptions ssl_options;
1112 ssl_options.server_certificate =
1113 net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME;
1114 net::SpawnedTestServer https_server(
1115 net::SpawnedTestServer::TYPE_HTTPS, ssl_options,
1116 base::FilePath(FILE_PATH_LITERAL("chrome/test/data")));
1117 ASSERT_TRUE(https_server.Start());
1119 net::HostPortPair host_and_port = https_server.host_port_pair();
1121 ExtensionTestMessageListener embedder_loaded_listener("EmbedderLoaded",
1123 LoadAndLaunchPlatformApp("web_view/interstitial_teardown");
1124 ASSERT_TRUE(embedder_loaded_listener.WaitUntilSatisfied());
1126 GuestContentBrowserClient new_client;
1127 content::ContentBrowserClient* old_client =
1128 SetBrowserClientForTesting(&new_client);
1130 // Now load the guest.
1131 content::WebContents* embedder_web_contents = GetFirstAppWindowWebContents();
1132 ExtensionTestMessageListener second("GuestAddedToDom", false);
1133 EXPECT_TRUE(content::ExecuteScript(
1134 embedder_web_contents,
1135 base::StringPrintf("loadGuest(%d);\n", host_and_port.port())));
1136 ASSERT_TRUE(second.WaitUntilSatisfied());
1138 // Wait for interstitial page to be shown in guest.
1139 content::WebContents* guest_web_contents = new_client.WaitForGuestCreated();
1140 SetBrowserClientForTesting(old_client);
1141 ASSERT_TRUE(guest_web_contents->GetRenderProcessHost()->IsGuest());
1142 WaitForInterstitial(guest_web_contents);
1144 // Now close the app while interstitial page being shown in guest.
1145 apps::AppWindow* window = GetFirstAppWindow();
1146 window->GetBaseWindow()->Close();
1149 IN_PROC_BROWSER_TEST_F(WebViewTest, ShimSrcAttribute) {
1150 ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/src_attribute"))
1154 // This test verifies that prerendering has been disabled inside <webview>.
1155 // This test is here rather than in PrerenderBrowserTest for testing convenience
1156 // only. If it breaks then this is a bug in the prerenderer.
1157 IN_PROC_BROWSER_TEST_F(WebViewTest, NoPrerenderer) {
1158 ASSERT_TRUE(StartEmbeddedTestServer());
1159 content::WebContents* guest_web_contents =
1161 "/extensions/platform_apps/web_view/noprerenderer/guest.html",
1162 "web_view/noprerenderer");
1163 ASSERT_TRUE(guest_web_contents != NULL);
1165 PrerenderLinkManager* prerender_link_manager =
1166 PrerenderLinkManagerFactory::GetForProfile(
1167 Profile::FromBrowserContext(guest_web_contents->GetBrowserContext()));
1168 ASSERT_TRUE(prerender_link_manager != NULL);
1169 EXPECT_TRUE(prerender_link_manager->IsEmpty());
1172 // Verify that existing <webview>'s are detected when the task manager starts
1174 IN_PROC_BROWSER_TEST_F(WebViewTest, TaskManagerExistingWebView) {
1175 ASSERT_TRUE(StartEmbeddedTestServer());
1177 LoadGuest("/extensions/platform_apps/web_view/task_manager/guest.html",
1178 "web_view/task_manager");
1180 chrome::ShowTaskManager(browser()); // Show task manager AFTER guest loads.
1182 const char* guest_title = "WebViewed test content";
1183 const char* app_name = "<webview> task manager test";
1184 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchWebView(guest_title)));
1185 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAboutBlankTab()));
1186 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchApp(app_name)));
1187 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchBackground(app_name)));
1189 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAnyWebView()));
1190 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAnyTab()));
1191 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAnyApp()));
1192 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAnyBackground()));
1195 // Verify that the task manager notices the creation of new <webview>'s.
1196 IN_PROC_BROWSER_TEST_F(WebViewTest, TaskManagerNewWebView) {
1197 ASSERT_TRUE(StartEmbeddedTestServer());
1199 chrome::ShowTaskManager(browser()); // Show task manager BEFORE guest loads.
1201 LoadGuest("/extensions/platform_apps/web_view/task_manager/guest.html",
1202 "web_view/task_manager");
1204 const char* guest_title = "WebViewed test content";
1205 const char* app_name = "<webview> task manager test";
1206 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchWebView(guest_title)));
1207 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAboutBlankTab()));
1208 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchApp(app_name)));
1209 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchBackground(app_name)));
1211 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAnyWebView()));
1212 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAnyTab()));
1213 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAnyApp()));
1214 ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAnyBackground()));
1217 // This tests cookie isolation for packaged apps with webview tags. It navigates
1218 // the main browser window to a page that sets a cookie and loads an app with
1219 // multiple webview tags. Each tag sets a cookie and the test checks the proper
1220 // storage isolation is enforced.
1221 // This test is disabled due to being flaky. http://crbug.com/294196
1223 #define MAYBE_CookieIsolation DISABLED_CookieIsolation
1225 #define MAYBE_CookieIsolation CookieIsolation
1227 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_CookieIsolation) {
1228 ASSERT_TRUE(StartEmbeddedTestServer());
1229 const std::string kExpire =
1230 "var expire = new Date(Date.now() + 24 * 60 * 60 * 1000);";
1231 std::string cookie_script1(kExpire);
1232 cookie_script1.append(
1233 "document.cookie = 'guest1=true; path=/; expires=' + expire + ';';");
1234 std::string cookie_script2(kExpire);
1235 cookie_script2.append(
1236 "document.cookie = 'guest2=true; path=/; expires=' + expire + ';';");
1238 GURL::Replacements replace_host;
1239 std::string host_str("localhost"); // Must stay in scope with replace_host.
1240 replace_host.SetHostStr(host_str);
1242 GURL set_cookie_url = embedded_test_server()->GetURL(
1243 "/extensions/platform_apps/isolation/set_cookie.html");
1244 set_cookie_url = set_cookie_url.ReplaceComponents(replace_host);
1246 // The first two partitions will be used to set cookies and ensure they are
1247 // shared. The named partition is used to ensure that cookies are isolated
1248 // between partitions within the same app.
1249 content::WebContents* cookie_contents1;
1250 content::WebContents* cookie_contents2;
1251 content::WebContents* named_partition_contents1;
1252 content::WebContents* named_partition_contents2;
1254 NavigateAndOpenAppForIsolation(set_cookie_url, &cookie_contents1,
1255 &cookie_contents2, &named_partition_contents1,
1256 &named_partition_contents2, NULL, NULL, NULL);
1258 EXPECT_TRUE(content::ExecuteScript(cookie_contents1, cookie_script1));
1259 EXPECT_TRUE(content::ExecuteScript(cookie_contents2, cookie_script2));
1262 std::string cookie_value;
1264 // Test the regular browser context to ensure we have only one cookie.
1265 ui_test_utils::GetCookies(GURL("http://localhost"),
1266 browser()->tab_strip_model()->GetWebContentsAt(0),
1267 &cookie_size, &cookie_value);
1268 EXPECT_EQ("testCookie=1", cookie_value);
1270 // The default behavior is to combine webview tags with no explicit partition
1271 // declaration into the same in-memory partition. Test the webview tags to
1272 // ensure we have properly set the cookies and we have both cookies in both
1274 ui_test_utils::GetCookies(GURL("http://localhost"),
1276 &cookie_size, &cookie_value);
1277 EXPECT_EQ("guest1=true; guest2=true", cookie_value);
1279 ui_test_utils::GetCookies(GURL("http://localhost"),
1281 &cookie_size, &cookie_value);
1282 EXPECT_EQ("guest1=true; guest2=true", cookie_value);
1284 // The third tag should not have any cookies as it is in a separate partition.
1285 ui_test_utils::GetCookies(GURL("http://localhost"),
1286 named_partition_contents1,
1287 &cookie_size, &cookie_value);
1288 EXPECT_EQ("", cookie_value);
1291 // This tests that in-memory storage partitions are reset on browser restart,
1292 // but persistent ones maintain state for cookies and HTML5 storage.
1293 IN_PROC_BROWSER_TEST_F(WebViewTest, PRE_StoragePersistence) {
1294 ASSERT_TRUE(StartEmbeddedTestServer());
1295 const std::string kExpire =
1296 "var expire = new Date(Date.now() + 24 * 60 * 60 * 1000);";
1297 std::string cookie_script1(kExpire);
1298 cookie_script1.append(
1299 "document.cookie = 'inmemory=true; path=/; expires=' + expire + ';';");
1300 std::string cookie_script2(kExpire);
1301 cookie_script2.append(
1302 "document.cookie = 'persist1=true; path=/; expires=' + expire + ';';");
1303 std::string cookie_script3(kExpire);
1304 cookie_script3.append(
1305 "document.cookie = 'persist2=true; path=/; expires=' + expire + ';';");
1307 // We don't care where the main browser is on this test.
1308 GURL blank_url("about:blank");
1310 // The first two partitions will be used to set cookies and ensure they are
1311 // shared. The named partition is used to ensure that cookies are isolated
1312 // between partitions within the same app.
1313 content::WebContents* cookie_contents1;
1314 content::WebContents* cookie_contents2;
1315 content::WebContents* named_partition_contents1;
1316 content::WebContents* named_partition_contents2;
1317 content::WebContents* persistent_partition_contents1;
1318 content::WebContents* persistent_partition_contents2;
1319 content::WebContents* persistent_partition_contents3;
1320 NavigateAndOpenAppForIsolation(blank_url, &cookie_contents1,
1321 &cookie_contents2, &named_partition_contents1,
1322 &named_partition_contents2,
1323 &persistent_partition_contents1,
1324 &persistent_partition_contents2,
1325 &persistent_partition_contents3);
1327 // Set the inmemory=true cookie for tags with inmemory partitions.
1328 EXPECT_TRUE(content::ExecuteScript(cookie_contents1, cookie_script1));
1329 EXPECT_TRUE(content::ExecuteScript(named_partition_contents1,
1332 // For the two different persistent storage partitions, set the
1333 // two different cookies so we can check that they aren't comingled below.
1334 EXPECT_TRUE(content::ExecuteScript(persistent_partition_contents1,
1337 EXPECT_TRUE(content::ExecuteScript(persistent_partition_contents3,
1341 std::string cookie_value;
1343 // Check that all in-memory partitions have a cookie set.
1344 ui_test_utils::GetCookies(GURL("http://localhost"),
1346 &cookie_size, &cookie_value);
1347 EXPECT_EQ("inmemory=true", cookie_value);
1348 ui_test_utils::GetCookies(GURL("http://localhost"),
1350 &cookie_size, &cookie_value);
1351 EXPECT_EQ("inmemory=true", cookie_value);
1352 ui_test_utils::GetCookies(GURL("http://localhost"),
1353 named_partition_contents1,
1354 &cookie_size, &cookie_value);
1355 EXPECT_EQ("inmemory=true", cookie_value);
1356 ui_test_utils::GetCookies(GURL("http://localhost"),
1357 named_partition_contents2,
1358 &cookie_size, &cookie_value);
1359 EXPECT_EQ("inmemory=true", cookie_value);
1361 // Check that all persistent partitions kept their state.
1362 ui_test_utils::GetCookies(GURL("http://localhost"),
1363 persistent_partition_contents1,
1364 &cookie_size, &cookie_value);
1365 EXPECT_EQ("persist1=true", cookie_value);
1366 ui_test_utils::GetCookies(GURL("http://localhost"),
1367 persistent_partition_contents2,
1368 &cookie_size, &cookie_value);
1369 EXPECT_EQ("persist1=true", cookie_value);
1370 ui_test_utils::GetCookies(GURL("http://localhost"),
1371 persistent_partition_contents3,
1372 &cookie_size, &cookie_value);
1373 EXPECT_EQ("persist2=true", cookie_value);
1376 // This is the post-reset portion of the StoragePersistence test. See
1377 // PRE_StoragePersistence for main comment.
1378 IN_PROC_BROWSER_TEST_F(WebViewTest, DISABLED_StoragePersistence) {
1379 ASSERT_TRUE(StartEmbeddedTestServer());
1381 // We don't care where the main browser is on this test.
1382 GURL blank_url("about:blank");
1384 // The first two partitions will be used to set cookies and ensure they are
1385 // shared. The named partition is used to ensure that cookies are isolated
1386 // between partitions within the same app.
1387 content::WebContents* cookie_contents1;
1388 content::WebContents* cookie_contents2;
1389 content::WebContents* named_partition_contents1;
1390 content::WebContents* named_partition_contents2;
1391 content::WebContents* persistent_partition_contents1;
1392 content::WebContents* persistent_partition_contents2;
1393 content::WebContents* persistent_partition_contents3;
1394 NavigateAndOpenAppForIsolation(blank_url, &cookie_contents1,
1395 &cookie_contents2, &named_partition_contents1,
1396 &named_partition_contents2,
1397 &persistent_partition_contents1,
1398 &persistent_partition_contents2,
1399 &persistent_partition_contents3);
1402 std::string cookie_value;
1404 // Check that all in-memory partitions lost their state.
1405 ui_test_utils::GetCookies(GURL("http://localhost"),
1407 &cookie_size, &cookie_value);
1408 EXPECT_EQ("", cookie_value);
1409 ui_test_utils::GetCookies(GURL("http://localhost"),
1411 &cookie_size, &cookie_value);
1412 EXPECT_EQ("", cookie_value);
1413 ui_test_utils::GetCookies(GURL("http://localhost"),
1414 named_partition_contents1,
1415 &cookie_size, &cookie_value);
1416 EXPECT_EQ("", cookie_value);
1417 ui_test_utils::GetCookies(GURL("http://localhost"),
1418 named_partition_contents2,
1419 &cookie_size, &cookie_value);
1420 EXPECT_EQ("", cookie_value);
1422 // Check that all persistent partitions kept their state.
1423 ui_test_utils::GetCookies(GURL("http://localhost"),
1424 persistent_partition_contents1,
1425 &cookie_size, &cookie_value);
1426 EXPECT_EQ("persist1=true", cookie_value);
1427 ui_test_utils::GetCookies(GURL("http://localhost"),
1428 persistent_partition_contents2,
1429 &cookie_size, &cookie_value);
1430 EXPECT_EQ("persist1=true", cookie_value);
1431 ui_test_utils::GetCookies(GURL("http://localhost"),
1432 persistent_partition_contents3,
1433 &cookie_size, &cookie_value);
1434 EXPECT_EQ("persist2=true", cookie_value);
1438 // This test is very flaky on Win Aura, Win XP, Win 7. http://crbug.com/248873
1439 #define MAYBE_DOMStorageIsolation DISABLED_DOMStorageIsolation
1441 #define MAYBE_DOMStorageIsolation DOMStorageIsolation
1444 // This tests DOM storage isolation for packaged apps with webview tags. It
1445 // loads an app with multiple webview tags and each tag sets DOM storage
1446 // entries, which the test checks to ensure proper storage isolation is
1448 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_DOMStorageIsolation) {
1449 ASSERT_TRUE(StartEmbeddedTestServer());
1450 GURL regular_url = embedded_test_server()->GetURL("/title1.html");
1453 std::string get_local_storage("window.domAutomationController.send("
1454 "window.localStorage.getItem('foo') || 'badval')");
1455 std::string get_session_storage("window.domAutomationController.send("
1456 "window.sessionStorage.getItem('bar') || 'badval')");
1458 content::WebContents* default_tag_contents1;
1459 content::WebContents* default_tag_contents2;
1460 content::WebContents* storage_contents1;
1461 content::WebContents* storage_contents2;
1463 NavigateAndOpenAppForIsolation(regular_url, &default_tag_contents1,
1464 &default_tag_contents2, &storage_contents1,
1465 &storage_contents2, NULL, NULL, NULL);
1467 // Initialize the storage for the first of the two tags that share a storage
1469 EXPECT_TRUE(content::ExecuteScript(storage_contents1,
1470 "initDomStorage('page1')"));
1472 // Let's test that the expected values are present in the first tag, as they
1473 // will be overwritten once we call the initDomStorage on the second tag.
1474 EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents1,
1475 get_local_storage.c_str(),
1477 EXPECT_STREQ("local-page1", output.c_str());
1478 EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents1,
1479 get_session_storage.c_str(),
1481 EXPECT_STREQ("session-page1", output.c_str());
1483 // Now, init the storage in the second tag in the same storage partition,
1484 // which will overwrite the shared localStorage.
1485 EXPECT_TRUE(content::ExecuteScript(storage_contents2,
1486 "initDomStorage('page2')"));
1488 // The localStorage value now should reflect the one written through the
1490 EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents1,
1491 get_local_storage.c_str(),
1493 EXPECT_STREQ("local-page2", output.c_str());
1494 EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents2,
1495 get_local_storage.c_str(),
1497 EXPECT_STREQ("local-page2", output.c_str());
1499 // Session storage is not shared though, as each webview tag has separate
1500 // instance, even if they are in the same storage partition.
1501 EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents1,
1502 get_session_storage.c_str(),
1504 EXPECT_STREQ("session-page1", output.c_str());
1505 EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents2,
1506 get_session_storage.c_str(),
1508 EXPECT_STREQ("session-page2", output.c_str());
1510 // Also, let's check that the main browser and another tag that doesn't share
1511 // the same partition don't have those values stored.
1512 EXPECT_TRUE(ExecuteScriptAndExtractString(
1513 browser()->tab_strip_model()->GetWebContentsAt(0),
1514 get_local_storage.c_str(),
1516 EXPECT_STREQ("badval", output.c_str());
1517 EXPECT_TRUE(ExecuteScriptAndExtractString(
1518 browser()->tab_strip_model()->GetWebContentsAt(0),
1519 get_session_storage.c_str(),
1521 EXPECT_STREQ("badval", output.c_str());
1522 EXPECT_TRUE(ExecuteScriptAndExtractString(default_tag_contents1,
1523 get_local_storage.c_str(),
1525 EXPECT_STREQ("badval", output.c_str());
1526 EXPECT_TRUE(ExecuteScriptAndExtractString(default_tag_contents1,
1527 get_session_storage.c_str(),
1529 EXPECT_STREQ("badval", output.c_str());
1532 // See crbug.com/248500
1534 #define MAYBE_IndexedDBIsolation DISABLED_IndexedDBIsolation
1536 #define MAYBE_IndexedDBIsolation IndexedDBIsolation
1539 // This tests IndexedDB isolation for packaged apps with webview tags. It loads
1540 // an app with multiple webview tags and each tag creates an IndexedDB record,
1541 // which the test checks to ensure proper storage isolation is enforced.
1542 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_IndexedDBIsolation) {
1543 ASSERT_TRUE(StartEmbeddedTestServer());
1544 GURL regular_url = embedded_test_server()->GetURL("/title1.html");
1546 content::WebContents* default_tag_contents1;
1547 content::WebContents* default_tag_contents2;
1548 content::WebContents* storage_contents1;
1549 content::WebContents* storage_contents2;
1551 NavigateAndOpenAppForIsolation(regular_url, &default_tag_contents1,
1552 &default_tag_contents2, &storage_contents1,
1553 &storage_contents2, NULL, NULL, NULL);
1555 // Initialize the storage for the first of the two tags that share a storage
1557 ExecuteScriptWaitForTitle(storage_contents1, "initIDB()", "idb created");
1558 ExecuteScriptWaitForTitle(storage_contents1, "addItemIDB(7, 'page1')",
1559 "addItemIDB complete");
1560 ExecuteScriptWaitForTitle(storage_contents1, "readItemIDB(7)",
1561 "readItemIDB complete");
1564 std::string get_value(
1565 "window.domAutomationController.send(getValueIDB() || 'badval')");
1567 EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents1,
1568 get_value.c_str(), &output));
1569 EXPECT_STREQ("page1", output.c_str());
1571 // Initialize the db in the second tag.
1572 ExecuteScriptWaitForTitle(storage_contents2, "initIDB()", "idb open");
1574 // Since we share a partition, reading the value should return the existing
1576 ExecuteScriptWaitForTitle(storage_contents2, "readItemIDB(7)",
1577 "readItemIDB complete");
1578 EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents2,
1579 get_value.c_str(), &output));
1580 EXPECT_STREQ("page1", output.c_str());
1582 // Now write through the second tag and read it back.
1583 ExecuteScriptWaitForTitle(storage_contents2, "addItemIDB(7, 'page2')",
1584 "addItemIDB complete");
1585 ExecuteScriptWaitForTitle(storage_contents2, "readItemIDB(7)",
1586 "readItemIDB complete");
1587 EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents2,
1588 get_value.c_str(), &output));
1589 EXPECT_STREQ("page2", output.c_str());
1591 // Reset the document title, otherwise the next call will not see a change and
1592 // will hang waiting for it.
1593 EXPECT_TRUE(content::ExecuteScript(storage_contents1,
1594 "document.title = 'foo'"));
1596 // Read through the first tag to ensure we have the second value.
1597 ExecuteScriptWaitForTitle(storage_contents1, "readItemIDB(7)",
1598 "readItemIDB complete");
1599 EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents1,
1600 get_value.c_str(), &output));
1601 EXPECT_STREQ("page2", output.c_str());
1603 // Now, let's confirm there is no database in the main browser and another
1604 // tag that doesn't share the same partition. Due to the IndexedDB API design,
1605 // open will succeed, but the version will be 1, since it creates the database
1606 // if it is not found. The two tags use database version 3, so we avoid
1608 const char* script =
1609 "indexedDB.open('isolation').onsuccess = function(e) {"
1610 " if (e.target.result.version == 1)"
1611 " document.title = 'db not found';"
1613 " document.title = 'error';"
1615 ExecuteScriptWaitForTitle(browser()->tab_strip_model()->GetWebContentsAt(0),
1616 script, "db not found");
1617 ExecuteScriptWaitForTitle(default_tag_contents1, script, "db not found");
1620 // This test ensures that closing app window on 'loadcommit' does not crash.
1621 // The test launches an app with guest and closes the window on loadcommit. It
1622 // then launches the app window again. The process is repeated 3 times.
1623 // http://crbug.com/291278
1625 #define MAYBE_CloseOnLoadcommit DISABLED_CloseOnLoadcommit
1627 #define MAYBE_CloseOnLoadcommit CloseOnLoadcommit
1629 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_CloseOnLoadcommit) {
1630 ExtensionTestMessageListener done_test_listener(
1631 "done-close-on-loadcommit", false);
1632 LoadAndLaunchPlatformApp("web_view/close_on_loadcommit");
1633 ASSERT_TRUE(done_test_listener.WaitUntilSatisfied());
1636 IN_PROC_BROWSER_TEST_F(WebViewTest, MediaAccessAPIDeny_TestDeny) {
1637 MediaAccessAPIDenyTestHelper("testDeny");
1640 IN_PROC_BROWSER_TEST_F(WebViewTest,
1641 MediaAccessAPIDeny_TestDenyThenAllowThrows) {
1642 MediaAccessAPIDenyTestHelper("testDenyThenAllowThrows");
1646 IN_PROC_BROWSER_TEST_F(WebViewTest,
1647 MediaAccessAPIDeny_TestDenyWithPreventDefault) {
1648 MediaAccessAPIDenyTestHelper("testDenyWithPreventDefault");
1651 IN_PROC_BROWSER_TEST_F(WebViewTest,
1652 MediaAccessAPIDeny_TestNoListenersImplyDeny) {
1653 MediaAccessAPIDenyTestHelper("testNoListenersImplyDeny");
1656 IN_PROC_BROWSER_TEST_F(WebViewTest,
1657 MediaAccessAPIDeny_TestNoPreventDefaultImpliesDeny) {
1658 MediaAccessAPIDenyTestHelper("testNoPreventDefaultImpliesDeny");
1661 void WebViewTest::MediaAccessAPIAllowTestHelper(const std::string& test_name) {
1662 ASSERT_TRUE(StartEmbeddedTestServer()); // For serving guest pages.
1663 ExtensionTestMessageListener launched_listener("Launched", false);
1664 LoadAndLaunchPlatformApp("web_view/media_access/allow");
1665 ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
1667 content::WebContents* embedder_web_contents = GetFirstAppWindowWebContents();
1668 ASSERT_TRUE(embedder_web_contents);
1669 scoped_ptr<MockWebContentsDelegate> mock(new MockWebContentsDelegate());
1670 embedder_web_contents->SetDelegate(mock.get());
1672 ExtensionTestMessageListener done_listener("TEST_PASSED", false);
1673 done_listener.set_failure_message("TEST_FAILED");
1675 content::ExecuteScript(
1676 embedder_web_contents,
1677 base::StringPrintf("startAllowTest('%s')",
1678 test_name.c_str())));
1679 ASSERT_TRUE(done_listener.WaitUntilSatisfied());
1681 mock->WaitForSetMediaPermission();
1684 IN_PROC_BROWSER_TEST_F(WebViewTest, ContextMenusAPI_Basic) {
1685 LoadAppWithGuest("web_view/context_menus/basic");
1687 content::WebContents* guest_web_contents = GetGuestWebContents();
1688 content::WebContents* embedder = GetEmbedderWebContents();
1689 ASSERT_TRUE(embedder);
1691 // 1. Basic property test.
1692 ExecuteScriptWaitForTitle(embedder, "checkProperties()", "ITEM_CHECKED");
1694 // 2. Create a menu item and wait for created callback to be called.
1695 ExecuteScriptWaitForTitle(embedder, "createMenuItem()", "ITEM_CREATED");
1697 // 3. Click the created item, wait for the click handlers to fire from JS.
1698 ExtensionTestMessageListener click_listener("ITEM_CLICKED", false);
1699 GURL page_url("http://www.google.com");
1700 // Create and build our test context menu.
1701 scoped_ptr<TestRenderViewContextMenu> menu(TestRenderViewContextMenu::Create(
1702 guest_web_contents, page_url, GURL(), GURL()));
1704 // Look for the extension item in the menu, and execute it.
1705 int command_id = IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST;
1706 ASSERT_TRUE(menu->IsCommandIdEnabled(command_id));
1707 menu->ExecuteCommand(command_id, 0);
1709 // Wait for embedder's script to tell us its onclick fired, it does
1710 // chrome.test.sendMessage('ITEM_CLICKED')
1711 ASSERT_TRUE(click_listener.WaitUntilSatisfied());
1713 // 4. Update the item's title and verify.
1714 ExecuteScriptWaitForTitle(embedder, "updateMenuItem()", "ITEM_UPDATED");
1715 MenuItem::List items = GetItems();
1716 ASSERT_EQ(1u, items.size());
1717 MenuItem* item = items.at(0);
1718 EXPECT_EQ("new_title", item->title());
1720 // 5. Remove the item.
1721 ExecuteScriptWaitForTitle(embedder, "removeItem()", "ITEM_REMOVED");
1722 MenuItem::List items_after_removal = GetItems();
1723 ASSERT_EQ(0u, items_after_removal.size());
1725 // 6. Add some more items.
1726 ExecuteScriptWaitForTitle(
1727 embedder, "createThreeMenuItems()", "ITEM_MULTIPLE_CREATED");
1728 MenuItem::List items_after_insertion = GetItems();
1729 ASSERT_EQ(3u, items_after_insertion.size());
1731 // 7. Test removeAll().
1732 ExecuteScriptWaitForTitle(embedder, "removeAllItems()", "ITEM_ALL_REMOVED");
1733 MenuItem::List items_after_all_removal = GetItems();
1734 ASSERT_EQ(0u, items_after_all_removal.size());
1737 IN_PROC_BROWSER_TEST_F(WebViewTest, MediaAccessAPIAllow_TestAllow) {
1738 MediaAccessAPIAllowTestHelper("testAllow");
1741 IN_PROC_BROWSER_TEST_F(WebViewTest, MediaAccessAPIAllow_TestAllowAndThenDeny) {
1742 MediaAccessAPIAllowTestHelper("testAllowAndThenDeny");
1745 IN_PROC_BROWSER_TEST_F(WebViewTest, MediaAccessAPIAllow_TestAllowTwice) {
1746 MediaAccessAPIAllowTestHelper("testAllowTwice");
1749 IN_PROC_BROWSER_TEST_F(WebViewTest, MediaAccessAPIAllow_TestAllowAsync) {
1750 MediaAccessAPIAllowTestHelper("testAllowAsync");
1753 // Checks that window.screenX/screenY/screenLeft/screenTop works correctly for
1755 IN_PROC_BROWSER_TEST_F(WebViewTest, ScreenCoordinates) {
1756 ASSERT_TRUE(RunPlatformAppTestWithArg(
1757 "platform_apps/web_view/common", "screen_coordinates"))
1761 #if defined(OS_CHROMEOS)
1762 IN_PROC_BROWSER_TEST_F(WebViewTest, ChromeVoxInjection) {
1764 chromeos::AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
1766 ASSERT_TRUE(StartEmbeddedTestServer());
1767 content::WebContents* guest_web_contents = LoadGuest(
1768 "/extensions/platform_apps/web_view/chromevox_injection/guest.html",
1769 "web_view/chromevox_injection");
1770 ASSERT_TRUE(guest_web_contents);
1772 chromeos::SpeechMonitor monitor;
1773 chromeos::AccessibilityManager::Get()->EnableSpokenFeedback(
1774 true, ash::A11Y_NOTIFICATION_NONE);
1775 EXPECT_TRUE(monitor.SkipChromeVoxEnabledMessage());
1777 EXPECT_EQ("chrome vox test title", monitor.GetNextUtterance());
1781 // Flaky on Windows. http://crbug.com/303966
1783 #define MAYBE_TearDownTest DISABLED_TearDownTest
1785 #define MAYBE_TearDownTest TearDownTest
1787 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_TearDownTest) {
1788 ExtensionTestMessageListener first_loaded_listener("guest-loaded", false);
1789 const extensions::Extension* extension =
1790 LoadAndLaunchPlatformApp("web_view/teardown");
1791 ASSERT_TRUE(first_loaded_listener.WaitUntilSatisfied());
1792 apps::AppWindow* window = NULL;
1793 if (!GetAppWindowCount())
1794 window = CreateAppWindow(extension);
1796 window = GetFirstAppWindow();
1797 CloseAppWindow(window);
1799 // Load the app again.
1800 ExtensionTestMessageListener second_loaded_listener("guest-loaded", false);
1801 LoadAndLaunchPlatformApp("web_view/teardown");
1802 ASSERT_TRUE(second_loaded_listener.WaitUntilSatisfied());
1805 // In following GeolocationAPIEmbedderHasNoAccess* tests, embedder (i.e. the
1806 // platform app) does not have geolocation permission for this test.
1807 // No matter what the API does, geolocation permission would be denied.
1808 // Note that the test name prefix must be "GeolocationAPI".
1809 IN_PROC_BROWSER_TEST_F(WebViewTest, GeolocationAPIEmbedderHasNoAccessAllow) {
1810 TestHelper("testDenyDenies",
1811 "web_view/geolocation/embedder_has_no_permission",
1815 IN_PROC_BROWSER_TEST_F(WebViewTest, GeolocationAPIEmbedderHasNoAccessDeny) {
1816 TestHelper("testDenyDenies",
1817 "web_view/geolocation/embedder_has_no_permission",
1821 // In following GeolocationAPIEmbedderHasAccess* tests, embedder (i.e. the
1822 // platform app) has geolocation permission
1824 // Note that these test names must be "GeolocationAPI" prefixed (b/c we mock out
1825 // geolocation in this case).
1827 // Also note that these are run separately because OverrideGeolocation() doesn't
1828 // mock out geolocation for multiple navigator.geolocation calls properly and
1829 // the tests become flaky.
1830 // GeolocationAPI* test 1 of 3.
1831 IN_PROC_BROWSER_TEST_F(WebViewTest, GeolocationAPIEmbedderHasAccessAllow) {
1832 TestHelper("testAllow",
1833 "web_view/geolocation/embedder_has_permission",
1837 // GeolocationAPI* test 2 of 3.
1838 IN_PROC_BROWSER_TEST_F(WebViewTest, GeolocationAPIEmbedderHasAccessDeny) {
1839 TestHelper("testDeny",
1840 "web_view/geolocation/embedder_has_permission",
1844 // GeolocationAPI* test 3 of 3.
1845 IN_PROC_BROWSER_TEST_F(WebViewTest,
1846 GeolocationAPIEmbedderHasAccessMultipleBridgeIdAllow) {
1847 TestHelper("testMultipleBridgeIdAllow",
1848 "web_view/geolocation/embedder_has_permission",
1853 // BrowserPluginGeolocationPermissionContext::CancelGeolocationPermissionRequest
1854 // is handled correctly (and does not crash).
1855 IN_PROC_BROWSER_TEST_F(WebViewTest, GeolocationAPICancelGeolocation) {
1856 ASSERT_TRUE(StartEmbeddedTestServer()); // For serving guest pages.
1857 ASSERT_TRUE(RunPlatformAppTest(
1858 "platform_apps/web_view/geolocation/cancel_request")) << message_;
1861 IN_PROC_BROWSER_TEST_F(WebViewTest, DISABLED_GeolocationRequestGone) {
1862 ASSERT_TRUE(StartEmbeddedTestServer()); // For serving guest pages.
1863 ASSERT_TRUE(RunPlatformAppTest(
1864 "platform_apps/web_view/geolocation/geolocation_request_gone"))
1868 IN_PROC_BROWSER_TEST_F(WebViewTest, ClearData) {
1870 // Flaky on XP bot http://crbug.com/282674
1871 if (base::win::GetVersion() <= base::win::VERSION_XP)
1875 ASSERT_TRUE(StartEmbeddedTestServer()); // For serving guest pages.
1876 ASSERT_TRUE(RunPlatformAppTestWithArg(
1877 "platform_apps/web_view/common", "cleardata"))
1881 // This test is disabled on Win due to being flaky. http://crbug.com/294592
1883 #define MAYBE_ConsoleMessage DISABLED_ConsoleMessage
1885 #define MAYBE_ConsoleMessage ConsoleMessage
1887 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_ConsoleMessage) {
1888 ASSERT_TRUE(RunPlatformAppTestWithArg(
1889 "platform_apps/web_view/common", "console_messages"))
1893 IN_PROC_BROWSER_TEST_F(WebViewTest, DownloadPermission) {
1894 ASSERT_TRUE(StartEmbeddedTestServer()); // For serving guest pages.
1895 content::WebContents* guest_web_contents =
1896 LoadGuest("/extensions/platform_apps/web_view/download/guest.html",
1897 "web_view/download");
1898 ASSERT_TRUE(guest_web_contents);
1900 // Replace WebContentsDelegate with mock version so we can intercept download
1902 content::WebContentsDelegate* delegate = guest_web_contents->GetDelegate();
1903 scoped_ptr<MockDownloadWebContentsDelegate>
1904 mock_delegate(new MockDownloadWebContentsDelegate(delegate));
1905 guest_web_contents->SetDelegate(mock_delegate.get());
1908 // 1. Guest requests a download that its embedder denies.
1909 EXPECT_TRUE(content::ExecuteScript(guest_web_contents,
1910 "startDownload('download-link-1')"));
1911 mock_delegate->WaitForCanDownload(false); // Expect to not allow.
1912 mock_delegate->Reset();
1914 // 2. Guest requests a download that its embedder allows.
1915 EXPECT_TRUE(content::ExecuteScript(guest_web_contents,
1916 "startDownload('download-link-2')"));
1917 mock_delegate->WaitForCanDownload(true); // Expect to allow.
1918 mock_delegate->Reset();
1920 // 3. Guest requests a download that its embedder ignores, this implies deny.
1921 EXPECT_TRUE(content::ExecuteScript(guest_web_contents,
1922 "startDownload('download-link-3')"));
1923 mock_delegate->WaitForCanDownload(false); // Expect to not allow.
1926 // This test makes sure loading <webview> does not crash when there is an
1927 // extension which has content script whitelisted/forced.
1928 IN_PROC_BROWSER_TEST_F(WebViewTest, WhitelistedContentScript) {
1929 // Whitelist the extension for running content script we are going to load.
1930 extensions::ExtensionsClient::ScriptingWhitelist whitelist;
1931 const std::string extension_id = "imeongpbjoodlnmlakaldhlcmijmhpbb";
1932 whitelist.push_back(extension_id);
1933 extensions::ExtensionsClient::Get()->SetScriptingWhitelist(whitelist);
1935 // Load the extension.
1936 const extensions::Extension* content_script_whitelisted_extension =
1937 LoadExtension(test_data_dir_.AppendASCII(
1938 "platform_apps/web_view/extension_api/content_script"));
1939 ASSERT_TRUE(content_script_whitelisted_extension);
1940 ASSERT_EQ(extension_id, content_script_whitelisted_extension->id());
1942 // Now load an app with <webview>.
1943 ExtensionTestMessageListener done_listener("TEST_PASSED", false);
1944 LoadAndLaunchPlatformApp("web_view/content_script_whitelisted");
1945 ASSERT_TRUE(done_listener.WaitUntilSatisfied());
1948 IN_PROC_BROWSER_TEST_F(WebViewTest, SetPropertyOnDocumentReady) {
1949 ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/document_ready"))
1953 IN_PROC_BROWSER_TEST_F(WebViewTest, SetPropertyOnDocumentInteractive) {
1954 ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/document_interactive"))
1958 IN_PROC_BROWSER_TEST_F(WebViewTest, SpeechRecognitionAPI_HasPermissionAllow) {
1960 RunPlatformAppTestWithArg("platform_apps/web_view/speech_recognition_api",
1965 IN_PROC_BROWSER_TEST_F(WebViewTest, SpeechRecognitionAPI_HasPermissionDeny) {
1967 RunPlatformAppTestWithArg("platform_apps/web_view/speech_recognition_api",
1972 IN_PROC_BROWSER_TEST_F(WebViewTest, SpeechRecognitionAPI_NoPermission) {
1974 RunPlatformAppTestWithArg("platform_apps/web_view/common",
1975 "speech_recognition_api_no_permission"))
1979 // Tests overriding user agent.
1980 IN_PROC_BROWSER_TEST_F(WebViewTest, UserAgent) {
1981 ASSERT_TRUE(RunPlatformAppTestWithArg(
1982 "platform_apps/web_view/common", "useragent")) << message_;
1985 IN_PROC_BROWSER_TEST_F(WebViewTest, UserAgent_NewWindow) {
1986 ASSERT_TRUE(RunPlatformAppTestWithArg(
1987 "platform_apps/web_view/common",
1988 "useragent_newwindow")) << message_;
1991 IN_PROC_BROWSER_TEST_F(WebViewTest, NoPermission) {
1992 ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/nopermission"))
1996 IN_PROC_BROWSER_TEST_F(WebViewTest, Dialog_TestAlertDialog) {
1997 TestHelper("testAlertDialog", "web_view/dialog", NO_TEST_SERVER);
2000 IN_PROC_BROWSER_TEST_F(WebViewTest, TestConfirmDialog) {
2001 TestHelper("testConfirmDialog", "web_view/dialog", NO_TEST_SERVER);
2004 IN_PROC_BROWSER_TEST_F(WebViewTest, Dialog_TestConfirmDialogCancel) {
2005 TestHelper("testConfirmDialogCancel", "web_view/dialog", NO_TEST_SERVER);
2008 IN_PROC_BROWSER_TEST_F(WebViewTest, Dialog_TestConfirmDialogDefaultCancel) {
2009 TestHelper("testConfirmDialogDefaultCancel",
2014 IN_PROC_BROWSER_TEST_F(WebViewTest, Dialog_TestConfirmDialogDefaultGCCancel) {
2015 TestHelper("testConfirmDialogDefaultGCCancel",
2020 IN_PROC_BROWSER_TEST_F(WebViewTest, Dialog_TestPromptDialog) {
2021 TestHelper("testPromptDialog", "web_view/dialog", NO_TEST_SERVER);
2024 IN_PROC_BROWSER_TEST_F(WebViewTest, NoContentSettingsAPI) {
2025 // Load the extension.
2026 const extensions::Extension* content_settings_extension =
2028 test_data_dir_.AppendASCII(
2029 "platform_apps/web_view/extension_api/content_settings"));
2030 ASSERT_TRUE(content_settings_extension);
2031 TestHelper("testPostMessageCommChannel", "web_view/shim", NO_TEST_SERVER);
2034 #if defined(ENABLE_PLUGINS)
2035 class WebViewPluginTest : public WebViewTest {
2037 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
2038 WebViewTest::SetUpCommandLine(command_line);
2040 // Append the switch to register the pepper plugin.
2041 // library name = <out dir>/<test_name>.<library_extension>
2042 // MIME type = application/x-ppapi-<test_name>
2043 base::FilePath plugin_dir;
2044 EXPECT_TRUE(PathService::Get(base::DIR_MODULE, &plugin_dir));
2046 base::FilePath plugin_lib = plugin_dir.Append(library_name);
2047 EXPECT_TRUE(base::PathExists(plugin_lib));
2048 base::FilePath::StringType pepper_plugin = plugin_lib.value();
2049 pepper_plugin.append(FILE_PATH_LITERAL(";application/x-ppapi-tests"));
2050 command_line->AppendSwitchNative(switches::kRegisterPepperPlugins,
2055 IN_PROC_BROWSER_TEST_F(WebViewPluginTest, TestLoadPluginEvent) {
2056 TestHelper("testPluginLoadPermission", "web_view/shim", NO_TEST_SERVER);
2058 #endif // defined(ENABLE_PLUGINS)
2060 class WebViewCaptureTest : public WebViewTest {
2062 WebViewCaptureTest() {}
2063 virtual ~WebViewCaptureTest() {}
2064 virtual void SetUp() OVERRIDE {
2065 EnablePixelOutput();
2066 WebViewTest::SetUp();
2070 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestZoomAPI) {
2071 TestHelper("testZoomAPI", "web_view/shim", NO_TEST_SERVER);
2074 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestFindAPI) {
2075 TestHelper("testFindAPI", "web_view/shim", NO_TEST_SERVER);
2078 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestFindAPI_findupdate) {
2079 TestHelper("testFindAPI_findupdate", "web_view/shim", NO_TEST_SERVER);
2082 // <webview> screenshot capture fails with ubercomp.
2083 // See http://crbug.com/327035.
2084 IN_PROC_BROWSER_TEST_F(WebViewCaptureTest,
2085 DISABLED_Shim_ScreenshotCapture) {
2086 TestHelper("testScreenshotCapture", "web_view/shim", NO_TEST_SERVER);