Home | History | Annotate | Download | only in apps
      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.
      4 
      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/browser/apps/app_browsertest_util.h"
     10 #include "chrome/browser/automation/automation_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/ui/browser.h"
     17 #include "chrome/browser/ui/tabs/tab_strip_model.h"
     18 #include "chrome/test/base/ui_test_utils.h"
     19 #include "content/public/browser/gpu_data_manager.h"
     20 #include "content/public/browser/interstitial_page.h"
     21 #include "content/public/browser/interstitial_page_delegate.h"
     22 #include "content/public/browser/notification_service.h"
     23 #include "content/public/browser/render_process_host.h"
     24 #include "content/public/browser/web_contents_delegate.h"
     25 #include "content/public/common/content_switches.h"
     26 #include "content/public/test/browser_test_utils.h"
     27 #include "content/public/test/fake_speech_recognition_manager.h"
     28 #include "extensions/common/extension.h"
     29 #include "extensions/common/extensions_client.h"
     30 #include "net/test/embedded_test_server/embedded_test_server.h"
     31 #include "net/test/embedded_test_server/http_request.h"
     32 #include "net/test/embedded_test_server/http_response.h"
     33 #include "ui/gl/gl_switches.h"
     34 
     35 // For fine-grained suppression on flaky tests.
     36 #if defined(OS_WIN)
     37 #include "base/win/windows_version.h"
     38 #endif
     39 
     40 using prerender::PrerenderLinkManager;
     41 using prerender::PrerenderLinkManagerFactory;
     42 
     43 namespace {
     44 const char kEmptyResponsePath[] = "/close-socket";
     45 const char kRedirectResponsePath[] = "/server-redirect";
     46 const char kRedirectResponseFullPath[] =
     47     "/extensions/platform_apps/web_view/shim/guest_redirect.html";
     48 
     49 // Platform-specific filename relative to the chrome executable.
     50 #if defined(OS_WIN)
     51 const wchar_t library_name[] = L"ppapi_tests.dll";
     52 #elif defined(OS_MACOSX)
     53 const char library_name[] = "ppapi_tests.plugin";
     54 #elif defined(OS_POSIX)
     55 const char library_name[] = "libppapi_tests.so";
     56 #endif
     57 
     58 class EmptyHttpResponse : public net::test_server::HttpResponse {
     59  public:
     60   virtual std::string ToResponseString() const OVERRIDE {
     61     return std::string();
     62   }
     63 };
     64 
     65 class TestInterstitialPageDelegate : public content::InterstitialPageDelegate {
     66  public:
     67   TestInterstitialPageDelegate() {
     68   }
     69   virtual ~TestInterstitialPageDelegate() {}
     70   virtual std::string GetHTMLContents() OVERRIDE { return std::string(); }
     71 };
     72 
     73 // Used to get notified when a guest is created.
     74 class GuestContentBrowserClient : public chrome::ChromeContentBrowserClient {
     75  public:
     76   GuestContentBrowserClient() : web_contents_(NULL) {}
     77 
     78   content::WebContents* WaitForGuestCreated() {
     79     if (web_contents_)
     80       return web_contents_;
     81 
     82     message_loop_runner_ = new content::MessageLoopRunner;
     83     message_loop_runner_->Run();
     84     return web_contents_;
     85   }
     86 
     87  private:
     88   // ChromeContentBrowserClient implementation:
     89   virtual void GuestWebContentsAttached(
     90       content::WebContents* guest_web_contents,
     91       content::WebContents* embedder_web_contents,
     92       const base::DictionaryValue& extra_params) OVERRIDE {
     93     ChromeContentBrowserClient::GuestWebContentsAttached(
     94         guest_web_contents, embedder_web_contents, extra_params);
     95     web_contents_ = guest_web_contents;
     96 
     97     if (message_loop_runner_)
     98       message_loop_runner_->Quit();
     99   }
    100 
    101   content::WebContents* web_contents_;
    102   scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
    103 };
    104 
    105 class InterstitialObserver : public content::WebContentsObserver {
    106  public:
    107   InterstitialObserver(content::WebContents* web_contents,
    108                        const base::Closure& attach_callback,
    109                        const base::Closure& detach_callback)
    110       : WebContentsObserver(web_contents),
    111         attach_callback_(attach_callback),
    112         detach_callback_(detach_callback) {
    113   }
    114 
    115   virtual void DidAttachInterstitialPage() OVERRIDE {
    116     attach_callback_.Run();
    117   }
    118 
    119   virtual void DidDetachInterstitialPage() OVERRIDE {
    120     detach_callback_.Run();
    121   }
    122 
    123  private:
    124   base::Closure attach_callback_;
    125   base::Closure detach_callback_;
    126 
    127   DISALLOW_COPY_AND_ASSIGN(InterstitialObserver);
    128 };
    129 
    130 }  // namespace
    131 
    132 // This class intercepts media access request from the embedder. The request
    133 // should be triggered only if the embedder API (from tests) allows the request
    134 // in Javascript.
    135 // We do not issue the actual media request; the fact that the request reached
    136 // embedder's WebContents is good enough for our tests. This is also to make
    137 // the test run successfully on trybots.
    138 class MockWebContentsDelegate : public content::WebContentsDelegate {
    139  public:
    140   MockWebContentsDelegate() : requested_(false) {}
    141   virtual ~MockWebContentsDelegate() {}
    142 
    143   virtual void RequestMediaAccessPermission(
    144       content::WebContents* web_contents,
    145       const content::MediaStreamRequest& request,
    146       const content::MediaResponseCallback& callback) OVERRIDE {
    147     requested_ = true;
    148     if (message_loop_runner_.get())
    149       message_loop_runner_->Quit();
    150   }
    151 
    152   void WaitForSetMediaPermission() {
    153     if (requested_)
    154       return;
    155     message_loop_runner_ = new content::MessageLoopRunner;
    156     message_loop_runner_->Run();
    157   }
    158 
    159  private:
    160   bool requested_;
    161   scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
    162 
    163   DISALLOW_COPY_AND_ASSIGN(MockWebContentsDelegate);
    164 };
    165 
    166 // This class intercepts download request from the guest.
    167 class MockDownloadWebContentsDelegate : public content::WebContentsDelegate {
    168  public:
    169   explicit MockDownloadWebContentsDelegate(
    170       content::WebContentsDelegate* orig_delegate)
    171       : orig_delegate_(orig_delegate),
    172         waiting_for_decision_(false),
    173         expect_allow_(false),
    174         decision_made_(false),
    175         last_download_allowed_(false) {}
    176   virtual ~MockDownloadWebContentsDelegate() {}
    177 
    178   virtual void CanDownload(
    179       content::RenderViewHost* render_view_host,
    180       int request_id,
    181       const std::string& request_method,
    182       const base::Callback<void(bool)>& callback) OVERRIDE {
    183     orig_delegate_->CanDownload(
    184         render_view_host, request_id, request_method,
    185         base::Bind(&MockDownloadWebContentsDelegate::DownloadDecided,
    186                    base::Unretained(this)));
    187   }
    188 
    189   void WaitForCanDownload(bool expect_allow) {
    190     EXPECT_FALSE(waiting_for_decision_);
    191     waiting_for_decision_ = true;
    192 
    193     if (decision_made_) {
    194       EXPECT_EQ(expect_allow, last_download_allowed_);
    195       return;
    196     }
    197 
    198     expect_allow_ = expect_allow;
    199     message_loop_runner_ = new content::MessageLoopRunner;
    200     message_loop_runner_->Run();
    201   }
    202 
    203   void DownloadDecided(bool allow) {
    204     EXPECT_FALSE(decision_made_);
    205     decision_made_ = true;
    206 
    207     if (waiting_for_decision_) {
    208       EXPECT_EQ(expect_allow_, allow);
    209       if (message_loop_runner_.get())
    210         message_loop_runner_->Quit();
    211       return;
    212     }
    213     last_download_allowed_ = allow;
    214   }
    215 
    216   void Reset() {
    217     waiting_for_decision_ = false;
    218     decision_made_ = false;
    219   }
    220 
    221  private:
    222   content::WebContentsDelegate* orig_delegate_;
    223   bool waiting_for_decision_;
    224   bool expect_allow_;
    225   bool decision_made_;
    226   bool last_download_allowed_;
    227   scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
    228 
    229   DISALLOW_COPY_AND_ASSIGN(MockDownloadWebContentsDelegate);
    230 };
    231 
    232 class WebViewTest : public extensions::PlatformAppBrowserTest {
    233  protected:
    234   virtual void SetUp() OVERRIDE {
    235     if (UsesFakeSpeech()) {
    236       // SpeechRecognition test specific SetUp.
    237       fake_speech_recognition_manager_.reset(
    238           new content::FakeSpeechRecognitionManager());
    239       fake_speech_recognition_manager_->set_should_send_fake_response(true);
    240       // Inject the fake manager factory so that the test result is returned to
    241       // the web page.
    242       content::SpeechRecognitionManager::SetManagerForTesting(
    243           fake_speech_recognition_manager_.get());
    244     }
    245 
    246     // We need real contexts, otherwise the embedder doesn't composite, but the
    247     // guest does, and that isn't an expected configuration.
    248     UseRealGLContexts();
    249     extensions::PlatformAppBrowserTest::SetUp();
    250   }
    251 
    252   virtual void TearDown() OVERRIDE {
    253     if (UsesFakeSpeech()) {
    254       // SpeechRecognition test specific TearDown.
    255       content::SpeechRecognitionManager::SetManagerForTesting(NULL);
    256     }
    257 
    258     extensions::PlatformAppBrowserTest::TearDown();
    259   }
    260 
    261   virtual void SetUpOnMainThread() OVERRIDE {
    262     const testing::TestInfo* const test_info =
    263         testing::UnitTest::GetInstance()->current_test_info();
    264     // Mock out geolocation for geolocation specific tests.
    265     if (!strncmp(test_info->name(), "GeolocationAPI",
    266             strlen("GeolocationAPI"))) {
    267       ui_test_utils::OverrideGeolocation(10, 20);
    268     }
    269   }
    270 
    271   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
    272     const testing::TestInfo* const test_info =
    273         testing::UnitTest::GetInstance()->current_test_info();
    274 
    275     command_line->AppendSwitchASCII(switches::kJavaScriptFlags, "--expose-gc");
    276 
    277     // Force SW rendering to check autosize bug.
    278     if (!strncmp(test_info->name(), "AutoSizeSW", strlen("AutosizeSW")))
    279       command_line->AppendSwitch(switches::kDisableForceCompositingMode);
    280 
    281     extensions::PlatformAppBrowserTest::SetUpCommandLine(command_line);
    282   }
    283 
    284   // This method is responsible for initializing a packaged app, which contains
    285   // multiple webview tags. The tags have different partition identifiers and
    286   // their WebContent objects are returned as output. The method also verifies
    287   // the expected process allocation and storage partition assignment.
    288   // The |navigate_to_url| parameter is used to navigate the main browser
    289   // window.
    290   //
    291   // TODO(ajwong): This function is getting to be too large. Either refactor it
    292   // so the test can specify a configuration of WebView tags that we will
    293   // dynamically inject JS to generate, or move this test wholesale into
    294   // something that RunPlatformAppTest() can execute purely in Javascript. This
    295   // won't let us do a white-box examination of the StoragePartition equivalence
    296   // directly, but we will be able to view the black box effects which is good
    297   // enough.  http://crbug.com/160361
    298   void NavigateAndOpenAppForIsolation(
    299       GURL navigate_to_url,
    300       content::WebContents** default_tag_contents1,
    301       content::WebContents** default_tag_contents2,
    302       content::WebContents** named_partition_contents1,
    303       content::WebContents** named_partition_contents2,
    304       content::WebContents** persistent_partition_contents1,
    305       content::WebContents** persistent_partition_contents2,
    306       content::WebContents** persistent_partition_contents3) {
    307     GURL::Replacements replace_host;
    308     std::string host_str("localhost");  // Must stay in scope with replace_host.
    309     replace_host.SetHostStr(host_str);
    310 
    311     navigate_to_url = navigate_to_url.ReplaceComponents(replace_host);
    312 
    313     GURL tag_url1 = embedded_test_server()->GetURL(
    314         "/extensions/platform_apps/web_view/isolation/cookie.html");
    315     tag_url1 = tag_url1.ReplaceComponents(replace_host);
    316     GURL tag_url2 = embedded_test_server()->GetURL(
    317         "/extensions/platform_apps/web_view/isolation/cookie2.html");
    318     tag_url2 = tag_url2.ReplaceComponents(replace_host);
    319     GURL tag_url3 = embedded_test_server()->GetURL(
    320         "/extensions/platform_apps/web_view/isolation/storage1.html");
    321     tag_url3 = tag_url3.ReplaceComponents(replace_host);
    322     GURL tag_url4 = embedded_test_server()->GetURL(
    323         "/extensions/platform_apps/web_view/isolation/storage2.html");
    324     tag_url4 = tag_url4.ReplaceComponents(replace_host);
    325     GURL tag_url5 = embedded_test_server()->GetURL(
    326         "/extensions/platform_apps/web_view/isolation/storage1.html#p1");
    327     tag_url5 = tag_url5.ReplaceComponents(replace_host);
    328     GURL tag_url6 = embedded_test_server()->GetURL(
    329         "/extensions/platform_apps/web_view/isolation/storage1.html#p2");
    330     tag_url6 = tag_url6.ReplaceComponents(replace_host);
    331     GURL tag_url7 = embedded_test_server()->GetURL(
    332         "/extensions/platform_apps/web_view/isolation/storage1.html#p3");
    333     tag_url7 = tag_url7.ReplaceComponents(replace_host);
    334 
    335     ui_test_utils::NavigateToURLWithDisposition(
    336         browser(), navigate_to_url, CURRENT_TAB,
    337         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
    338 
    339     ui_test_utils::UrlLoadObserver observer1(
    340         tag_url1, content::NotificationService::AllSources());
    341     ui_test_utils::UrlLoadObserver observer2(
    342         tag_url2, content::NotificationService::AllSources());
    343     ui_test_utils::UrlLoadObserver observer3(
    344         tag_url3, content::NotificationService::AllSources());
    345     ui_test_utils::UrlLoadObserver observer4(
    346         tag_url4, content::NotificationService::AllSources());
    347     ui_test_utils::UrlLoadObserver observer5(
    348         tag_url5, content::NotificationService::AllSources());
    349     ui_test_utils::UrlLoadObserver observer6(
    350         tag_url6, content::NotificationService::AllSources());
    351     ui_test_utils::UrlLoadObserver observer7(
    352         tag_url7, content::NotificationService::AllSources());
    353     LoadAndLaunchPlatformApp("web_view/isolation");
    354     observer1.Wait();
    355     observer2.Wait();
    356     observer3.Wait();
    357     observer4.Wait();
    358     observer5.Wait();
    359     observer6.Wait();
    360     observer7.Wait();
    361 
    362     content::Source<content::NavigationController> source1 = observer1.source();
    363     EXPECT_TRUE(source1->GetWebContents()->GetRenderProcessHost()->IsGuest());
    364     content::Source<content::NavigationController> source2 = observer2.source();
    365     EXPECT_TRUE(source2->GetWebContents()->GetRenderProcessHost()->IsGuest());
    366     content::Source<content::NavigationController> source3 = observer3.source();
    367     EXPECT_TRUE(source3->GetWebContents()->GetRenderProcessHost()->IsGuest());
    368     content::Source<content::NavigationController> source4 = observer4.source();
    369     EXPECT_TRUE(source4->GetWebContents()->GetRenderProcessHost()->IsGuest());
    370     content::Source<content::NavigationController> source5 = observer5.source();
    371     EXPECT_TRUE(source5->GetWebContents()->GetRenderProcessHost()->IsGuest());
    372     content::Source<content::NavigationController> source6 = observer6.source();
    373     EXPECT_TRUE(source6->GetWebContents()->GetRenderProcessHost()->IsGuest());
    374     content::Source<content::NavigationController> source7 = observer7.source();
    375     EXPECT_TRUE(source7->GetWebContents()->GetRenderProcessHost()->IsGuest());
    376 
    377     // Check that the first two tags use the same process and it is different
    378     // than the process used by the other two.
    379     EXPECT_EQ(source1->GetWebContents()->GetRenderProcessHost()->GetID(),
    380               source2->GetWebContents()->GetRenderProcessHost()->GetID());
    381     EXPECT_EQ(source3->GetWebContents()->GetRenderProcessHost()->GetID(),
    382               source4->GetWebContents()->GetRenderProcessHost()->GetID());
    383     EXPECT_NE(source1->GetWebContents()->GetRenderProcessHost()->GetID(),
    384               source3->GetWebContents()->GetRenderProcessHost()->GetID());
    385 
    386     // The two sets of tags should also be isolated from the main browser.
    387     EXPECT_NE(source1->GetWebContents()->GetRenderProcessHost()->GetID(),
    388               browser()->tab_strip_model()->GetWebContentsAt(0)->
    389                   GetRenderProcessHost()->GetID());
    390     EXPECT_NE(source3->GetWebContents()->GetRenderProcessHost()->GetID(),
    391               browser()->tab_strip_model()->GetWebContentsAt(0)->
    392                   GetRenderProcessHost()->GetID());
    393 
    394     // Check that the storage partitions of the first two tags match and are
    395     // different than the other two.
    396     EXPECT_EQ(
    397         source1->GetWebContents()->GetRenderProcessHost()->
    398             GetStoragePartition(),
    399         source2->GetWebContents()->GetRenderProcessHost()->
    400             GetStoragePartition());
    401     EXPECT_EQ(
    402         source3->GetWebContents()->GetRenderProcessHost()->
    403             GetStoragePartition(),
    404         source4->GetWebContents()->GetRenderProcessHost()->
    405             GetStoragePartition());
    406     EXPECT_NE(
    407         source1->GetWebContents()->GetRenderProcessHost()->
    408             GetStoragePartition(),
    409         source3->GetWebContents()->GetRenderProcessHost()->
    410             GetStoragePartition());
    411 
    412     // Ensure the persistent storage partitions are different.
    413     EXPECT_EQ(
    414         source5->GetWebContents()->GetRenderProcessHost()->
    415             GetStoragePartition(),
    416         source6->GetWebContents()->GetRenderProcessHost()->
    417             GetStoragePartition());
    418     EXPECT_NE(
    419         source5->GetWebContents()->GetRenderProcessHost()->
    420             GetStoragePartition(),
    421         source7->GetWebContents()->GetRenderProcessHost()->
    422             GetStoragePartition());
    423     EXPECT_NE(
    424         source1->GetWebContents()->GetRenderProcessHost()->
    425             GetStoragePartition(),
    426         source5->GetWebContents()->GetRenderProcessHost()->
    427             GetStoragePartition());
    428     EXPECT_NE(
    429         source1->GetWebContents()->GetRenderProcessHost()->
    430             GetStoragePartition(),
    431         source7->GetWebContents()->GetRenderProcessHost()->
    432             GetStoragePartition());
    433 
    434     *default_tag_contents1 = source1->GetWebContents();
    435     *default_tag_contents2 = source2->GetWebContents();
    436     *named_partition_contents1 = source3->GetWebContents();
    437     *named_partition_contents2 = source4->GetWebContents();
    438     if (persistent_partition_contents1) {
    439       *persistent_partition_contents1 = source5->GetWebContents();
    440     }
    441     if (persistent_partition_contents2) {
    442       *persistent_partition_contents2 = source6->GetWebContents();
    443     }
    444     if (persistent_partition_contents3) {
    445       *persistent_partition_contents3 = source7->GetWebContents();
    446     }
    447   }
    448 
    449   void ExecuteScriptWaitForTitle(content::WebContents* web_contents,
    450                                  const char* script,
    451                                  const char* title) {
    452     base::string16 expected_title(ASCIIToUTF16(title));
    453     base::string16 error_title(ASCIIToUTF16("error"));
    454 
    455     content::TitleWatcher title_watcher(web_contents, expected_title);
    456     title_watcher.AlsoWaitForTitle(error_title);
    457     EXPECT_TRUE(content::ExecuteScript(web_contents, script));
    458     EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
    459   }
    460 
    461   // Handles |request| by serving a redirect response.
    462   static scoped_ptr<net::test_server::HttpResponse> RedirectResponseHandler(
    463       const std::string& path,
    464       const GURL& redirect_target,
    465       const net::test_server::HttpRequest& request) {
    466     if (!StartsWithASCII(path, request.relative_url, true))
    467       return scoped_ptr<net::test_server::HttpResponse>();
    468 
    469     scoped_ptr<net::test_server::BasicHttpResponse> http_response(
    470         new net::test_server::BasicHttpResponse);
    471     http_response->set_code(net::HTTP_MOVED_PERMANENTLY);
    472     http_response->AddCustomHeader("Location", redirect_target.spec());
    473     return http_response.PassAs<net::test_server::HttpResponse>();
    474   }
    475 
    476   // Handles |request| by serving an empty response.
    477   static scoped_ptr<net::test_server::HttpResponse> EmptyResponseHandler(
    478       const std::string& path,
    479       const net::test_server::HttpRequest& request) {
    480     if (StartsWithASCII(path, request.relative_url, true)) {
    481       return scoped_ptr<net::test_server::HttpResponse>(
    482           new EmptyHttpResponse);
    483     }
    484 
    485     return scoped_ptr<net::test_server::HttpResponse>();
    486   }
    487 
    488   enum TestServer {
    489     NEEDS_TEST_SERVER,
    490     NO_TEST_SERVER
    491   };
    492 
    493   void TestHelper(const std::string& test_name,
    494                   const std::string& app_location,
    495                   TestServer test_server) {
    496     // For serving guest pages.
    497     if (test_server == NEEDS_TEST_SERVER) {
    498       if (!StartEmbeddedTestServer()) {
    499         LOG(ERROR) << "FAILED TO START TEST SERVER.";
    500         return;
    501       }
    502       embedded_test_server()->RegisterRequestHandler(
    503           base::Bind(&WebViewTest::RedirectResponseHandler,
    504                     kRedirectResponsePath,
    505                     embedded_test_server()->GetURL(kRedirectResponseFullPath)));
    506 
    507       embedded_test_server()->RegisterRequestHandler(
    508           base::Bind(&WebViewTest::EmptyResponseHandler, kEmptyResponsePath));
    509     }
    510 
    511     ExtensionTestMessageListener launched_listener("Launched", false);
    512     LoadAndLaunchPlatformApp(app_location.c_str());
    513     if (!launched_listener.WaitUntilSatisfied()) {
    514       LOG(ERROR) << "TEST DID NOT LAUNCH.";
    515       return;
    516     }
    517 
    518     // Flush any pending events to make sure we start with a clean slate.
    519     content::RunAllPendingInMessageLoop();
    520 
    521     content::WebContents* embedder_web_contents =
    522         GetFirstShellWindowWebContents();
    523     if (!embedder_web_contents) {
    524       LOG(ERROR) << "UNABLE TO FIND EMBEDDER WEB CONTENTS.";
    525       return;
    526     }
    527 
    528     ExtensionTestMessageListener done_listener("TEST_PASSED", false);
    529     done_listener.AlsoListenForFailureMessage("TEST_FAILED");
    530     if (!content::ExecuteScript(
    531             embedder_web_contents,
    532             base::StringPrintf("runTest('%s')", test_name.c_str()))) {
    533       LOG(ERROR) << "UNABLE TO START TEST.";
    534       return;
    535     }
    536     ASSERT_TRUE(done_listener.WaitUntilSatisfied());
    537   }
    538 
    539   content::WebContents* LoadGuest(const std::string& guest_path,
    540                                   const std::string& app_path) {
    541     GURL::Replacements replace_host;
    542     std::string host_str("localhost");  // Must stay in scope with replace_host.
    543     replace_host.SetHostStr(host_str);
    544 
    545     GURL guest_url = embedded_test_server()->GetURL(guest_path);
    546     guest_url = guest_url.ReplaceComponents(replace_host);
    547 
    548     ui_test_utils::UrlLoadObserver guest_observer(
    549         guest_url, content::NotificationService::AllSources());
    550 
    551     ExtensionTestMessageListener guest_loaded_listener("guest-loaded", false);
    552     LoadAndLaunchPlatformApp(app_path.c_str());
    553     guest_observer.Wait();
    554 
    555     content::Source<content::NavigationController> source =
    556         guest_observer.source();
    557     EXPECT_TRUE(source->GetWebContents()->GetRenderProcessHost()->IsGuest());
    558 
    559     bool satisfied = guest_loaded_listener.WaitUntilSatisfied();
    560     if (!satisfied)
    561       return NULL;
    562 
    563     content::WebContents* guest_web_contents = source->GetWebContents();
    564     return guest_web_contents;
    565   }
    566 
    567   // Runs media_access/allow tests.
    568   void MediaAccessAPIAllowTestHelper(const std::string& test_name);
    569 
    570   // Runs media_access/deny tests, each of them are run separately otherwise
    571   // they timeout (mostly on Windows).
    572   void MediaAccessAPIDenyTestHelper(const std::string& test_name) {
    573     ASSERT_TRUE(StartEmbeddedTestServer());  // For serving guest pages.
    574     ExtensionTestMessageListener loaded_listener("loaded", false);
    575     LoadAndLaunchPlatformApp("web_view/media_access/deny");
    576     ASSERT_TRUE(loaded_listener.WaitUntilSatisfied());
    577 
    578     content::WebContents* embedder_web_contents =
    579         GetFirstShellWindowWebContents();
    580     ASSERT_TRUE(embedder_web_contents);
    581 
    582     ExtensionTestMessageListener test_run_listener("PASSED", false);
    583     test_run_listener.AlsoListenForFailureMessage("FAILED");
    584     EXPECT_TRUE(
    585         content::ExecuteScript(
    586             embedder_web_contents,
    587             base::StringPrintf("startDenyTest('%s')", test_name.c_str())));
    588     ASSERT_TRUE(test_run_listener.WaitUntilSatisfied());
    589   }
    590 
    591   void WaitForInterstitial(content::WebContents* web_contents) {
    592     scoped_refptr<content::MessageLoopRunner> loop_runner(
    593         new content::MessageLoopRunner);
    594     InterstitialObserver observer(web_contents,
    595                                   loop_runner->QuitClosure(),
    596                                   base::Closure());
    597     if (!content::InterstitialPage::GetInterstitialPage(web_contents))
    598       loop_runner->Run();
    599   }
    600 
    601  private:
    602   bool UsesFakeSpeech() {
    603     const testing::TestInfo* const test_info =
    604         testing::UnitTest::GetInstance()->current_test_info();
    605 
    606     // SpeechRecognition test specific SetUp.
    607     return !strcmp(test_info->name(), "SpeechRecognition") ||
    608            !strcmp(test_info->name(),
    609                    "SpeechRecognitionAPI_HasPermissionAllow");
    610   }
    611 
    612   scoped_ptr<content::FakeSpeechRecognitionManager>
    613       fake_speech_recognition_manager_;
    614 };
    615 
    616 // This test ensures JavaScript errors ("Cannot redefine property") do not
    617 // happen when a <webview> is removed from DOM and added back.
    618 IN_PROC_BROWSER_TEST_F(WebViewTest,
    619                        AddRemoveWebView_AddRemoveWebView) {
    620   ASSERT_TRUE(StartEmbeddedTestServer());  // For serving guest pages.
    621   ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/addremove"))
    622       << message_;
    623 }
    624 
    625 IN_PROC_BROWSER_TEST_F(WebViewTest, AutoSize) {
    626 #if defined(OS_WIN)
    627   // Flaky on XP bot http://crbug.com/299507
    628   if (base::win::GetVersion() <= base::win::VERSION_XP)
    629     return;
    630 #endif
    631 
    632   ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/autosize"))
    633       << message_;
    634 }
    635 
    636 #if !defined(OS_CHROMEOS)
    637 // This test ensures <webview> doesn't crash in SW rendering when autosize is
    638 // turned on.
    639 // Flaky on Windows http://crbug.com/299507
    640 #if defined(OS_WIN)
    641 #define MAYBE_AutoSizeSW DISABLED_AutoSizeSW
    642 #else
    643 #define MAYBE_AutoSizeSW AutoSizeSW
    644 #endif
    645 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_AutoSizeSW) {
    646   ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/autosize"))
    647       << message_;
    648 }
    649 #endif
    650 
    651 // http://crbug.com/326332
    652 IN_PROC_BROWSER_TEST_F(WebViewTest, DISABLED_Shim_TestAutosizeAfterNavigation) {
    653   TestHelper("testAutosizeAfterNavigation", "web_view/shim", NO_TEST_SERVER);
    654 }
    655 
    656 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestAutosizeBeforeNavigation) {
    657   TestHelper("testAutosizeBeforeNavigation", "web_view/shim", NO_TEST_SERVER);
    658 }
    659 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestAutosizeRemoveAttributes) {
    660   TestHelper("testAutosizeRemoveAttributes", "web_view/shim", NO_TEST_SERVER);
    661 }
    662 
    663 // This test is disabled due to being flaky. http://crbug.com/282116
    664 #if defined(OS_WIN)
    665 #define MAYBE_Shim_TestAutosizeWithPartialAttributes \
    666     DISABLED_Shim_TestAutosizeWithPartialAttributes
    667 #else
    668 #define MAYBE_Shim_TestAutosizeWithPartialAttributes \
    669     Shim_TestAutosizeWithPartialAttributes
    670 #endif
    671 IN_PROC_BROWSER_TEST_F(WebViewTest,
    672                        MAYBE_Shim_TestAutosizeWithPartialAttributes) {
    673   TestHelper("testAutosizeWithPartialAttributes",
    674              "web_view/shim",
    675              NO_TEST_SERVER);
    676 }
    677 
    678 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestAPIMethodExistence) {
    679   TestHelper("testAPIMethodExistence", "web_view/shim", NO_TEST_SERVER);
    680 }
    681 
    682 // Tests the existence of WebRequest API event objects on the request
    683 // object, on the webview element, and hanging directly off webview.
    684 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestWebRequestAPIExistence) {
    685   TestHelper("testWebRequestAPIExistence", "web_view/shim", NO_TEST_SERVER);
    686 }
    687 
    688 // http://crbug.com/315920
    689 #if defined(GOOGLE_CHROME_BUILD) && (defined(OS_WIN) || defined(OS_LINUX))
    690 #define MAYBE_Shim_TestChromeExtensionURL DISABLED_Shim_TestChromeExtensionURL
    691 #else
    692 #define MAYBE_Shim_TestChromeExtensionURL Shim_TestChromeExtensionURL
    693 #endif
    694 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_Shim_TestChromeExtensionURL) {
    695   TestHelper("testChromeExtensionURL", "web_view/shim", NO_TEST_SERVER);
    696 }
    697 
    698 // http://crbug.com/315920
    699 #if defined(GOOGLE_CHROME_BUILD) && (defined(OS_WIN) || defined(OS_LINUX))
    700 #define MAYBE_Shim_TestChromeExtensionRelativePath \
    701     DISABLED_Shim_TestChromeExtensionRelativePath
    702 #else
    703 #define MAYBE_Shim_TestChromeExtensionRelativePath \
    704     Shim_TestChromeExtensionRelativePath
    705 #endif
    706 IN_PROC_BROWSER_TEST_F(WebViewTest,
    707                        MAYBE_Shim_TestChromeExtensionRelativePath) {
    708   TestHelper("testChromeExtensionRelativePath",
    709              "web_view/shim",
    710              NO_TEST_SERVER);
    711 }
    712 
    713 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestInvalidChromeExtensionURL) {
    714   TestHelper("testInvalidChromeExtensionURL", "web_view/shim", NO_TEST_SERVER);
    715 }
    716 
    717 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestEventName) {
    718   TestHelper("testEventName", "web_view/shim", NO_TEST_SERVER);
    719 }
    720 
    721 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestOnEventProperty) {
    722   TestHelper("testOnEventProperties", "web_view/shim", NO_TEST_SERVER);
    723 }
    724 
    725 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestLoadProgressEvent) {
    726   TestHelper("testLoadProgressEvent", "web_view/shim", NO_TEST_SERVER);
    727 }
    728 
    729 // WebViewTest.Shim_TestDestroyOnEventListener is flaky, so disable it.
    730 // http://crbug.com/255106
    731 IN_PROC_BROWSER_TEST_F(WebViewTest, DISABLED_Shim_TestDestroyOnEventListener) {
    732   TestHelper("testDestroyOnEventListener", "web_view/shim", NO_TEST_SERVER);
    733 }
    734 
    735 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestCannotMutateEventName) {
    736   TestHelper("testCannotMutateEventName", "web_view/shim", NO_TEST_SERVER);
    737 }
    738 
    739 // http://crbug.com/267304
    740 #if defined(OS_WIN)
    741 #define MAYBE_Shim_TestPartitionRaisesException \
    742   DISABLED_Shim_TestPartitionRaisesException
    743 #else
    744 #define MAYBE_Shim_TestPartitionRaisesException \
    745   Shim_TestPartitionRaisesException
    746 #endif
    747 
    748 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_Shim_TestPartitionRaisesException) {
    749   TestHelper("testPartitionRaisesException",
    750              "web_view/shim",
    751              NO_TEST_SERVER);
    752 }
    753 
    754 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestExecuteScriptFail) {
    755 #if defined(OS_WIN)
    756   // Flaky on XP bot http://crbug.com/266185
    757   if (base::win::GetVersion() <= base::win::VERSION_XP)
    758     return;
    759 #endif
    760 
    761   TestHelper("testExecuteScriptFail", "web_view/shim", NEEDS_TEST_SERVER);
    762 }
    763 
    764 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestExecuteScript) {
    765   TestHelper("testExecuteScript", "web_view/shim", NO_TEST_SERVER);
    766 }
    767 
    768 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestTerminateAfterExit) {
    769   TestHelper("testTerminateAfterExit", "web_view/shim", NO_TEST_SERVER);
    770 }
    771 
    772 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestAssignSrcAfterCrash) {
    773   TestHelper("testAssignSrcAfterCrash", "web_view/shim", NO_TEST_SERVER);
    774 }
    775 
    776 IN_PROC_BROWSER_TEST_F(WebViewTest,
    777                        Shim_TestNavOnConsecutiveSrcAttributeChanges) {
    778   TestHelper("testNavOnConsecutiveSrcAttributeChanges",
    779              "web_view/shim",
    780              NO_TEST_SERVER);
    781 }
    782 
    783 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestNavOnSrcAttributeChange) {
    784   TestHelper("testNavOnSrcAttributeChange", "web_view/shim", NO_TEST_SERVER);
    785 }
    786 
    787 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestRemoveSrcAttribute) {
    788   TestHelper("testRemoveSrcAttribute", "web_view/shim", NO_TEST_SERVER);
    789 }
    790 
    791 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestReassignSrcAttribute) {
    792   TestHelper("testReassignSrcAttribute", "web_view/shim", NO_TEST_SERVER);
    793 }
    794 
    795 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestBrowserPluginNotAllowed) {
    796 #if defined(OS_WIN)
    797   // Flaky on XP bots. http://crbug.com/267300
    798   if (base::win::GetVersion() <= base::win::VERSION_XP)
    799     return;
    800 #endif
    801 
    802   TestHelper("testBrowserPluginNotAllowed", "web_view/shim", NO_TEST_SERVER);
    803 }
    804 
    805 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestNewWindow) {
    806   TestHelper("testNewWindow", "web_view/shim", NEEDS_TEST_SERVER);
    807 }
    808 
    809 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestNewWindowTwoListeners) {
    810   TestHelper("testNewWindowTwoListeners", "web_view/shim", NEEDS_TEST_SERVER);
    811 }
    812 
    813 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestNewWindowNoPreventDefault) {
    814   TestHelper("testNewWindowNoPreventDefault",
    815              "web_view/shim",
    816              NEEDS_TEST_SERVER);
    817 }
    818 
    819 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestNewWindowNoReferrerLink) {
    820   TestHelper("testNewWindowNoReferrerLink", "web_view/shim", NEEDS_TEST_SERVER);
    821 }
    822 
    823 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestContentLoadEvent) {
    824   TestHelper("testContentLoadEvent", "web_view/shim", NO_TEST_SERVER);
    825 }
    826 
    827 // http://crbug.com/326330
    828 IN_PROC_BROWSER_TEST_F(WebViewTest,
    829                        DISABLED_Shim_TestDeclarativeWebRequestAPI) {
    830   TestHelper("testDeclarativeWebRequestAPI",
    831              "web_view/shim",
    832              NEEDS_TEST_SERVER);
    833 }
    834 
    835 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestWebRequestAPI) {
    836   TestHelper("testWebRequestAPI", "web_view/shim", NEEDS_TEST_SERVER);
    837 }
    838 
    839 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestWebRequestAPIGoogleProperty) {
    840   TestHelper("testWebRequestAPIGoogleProperty",
    841              "web_view/shim",
    842              NO_TEST_SERVER);
    843 }
    844 
    845 // This test is disabled due to being flaky. http://crbug.com/309451
    846 #if defined(OS_WIN)
    847 #define MAYBE_Shim_TestWebRequestListenerSurvivesReparenting \
    848     DISABLED_Shim_TestWebRequestListenerSurvivesReparenting
    849 #else
    850 #define MAYBE_Shim_TestWebRequestListenerSurvivesReparenting \
    851     Shim_TestWebRequestListenerSurvivesReparenting
    852 #endif
    853 IN_PROC_BROWSER_TEST_F(
    854     WebViewTest,
    855     MAYBE_Shim_TestWebRequestListenerSurvivesReparenting) {
    856   TestHelper("testWebRequestListenerSurvivesReparenting",
    857              "web_view/shim",
    858              NEEDS_TEST_SERVER);
    859 }
    860 
    861 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestLoadStartLoadRedirect) {
    862   TestHelper("testLoadStartLoadRedirect", "web_view/shim", NEEDS_TEST_SERVER);
    863 }
    864 
    865 IN_PROC_BROWSER_TEST_F(WebViewTest,
    866                        Shim_TestLoadAbortChromeExtensionURLWrongPartition) {
    867   TestHelper("testLoadAbortChromeExtensionURLWrongPartition",
    868              "web_view/shim",
    869              NO_TEST_SERVER);
    870 }
    871 
    872 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestLoadAbortEmptyResponse) {
    873   TestHelper("testLoadAbortEmptyResponse", "web_view/shim", NEEDS_TEST_SERVER);
    874 }
    875 
    876 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestLoadAbortIllegalChromeURL) {
    877   TestHelper("testLoadAbortIllegalChromeURL",
    878              "web_view/shim",
    879              NO_TEST_SERVER);
    880 }
    881 
    882 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestLoadAbortIllegalFileURL) {
    883   TestHelper("testLoadAbortIllegalFileURL", "web_view/shim", NO_TEST_SERVER);
    884 }
    885 
    886 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestLoadAbortIllegalJavaScriptURL) {
    887   TestHelper("testLoadAbortIllegalJavaScriptURL",
    888              "web_view/shim",
    889              NO_TEST_SERVER);
    890 }
    891 
    892 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestReload) {
    893   TestHelper("testReload", "web_view/shim", NEEDS_TEST_SERVER);
    894 }
    895 
    896 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestGetProcessId) {
    897   TestHelper("testGetProcessId", "web_view/shim", NEEDS_TEST_SERVER);
    898 }
    899 
    900 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestRemoveWebviewOnExit) {
    901   ASSERT_TRUE(StartEmbeddedTestServer());  // For serving guest pages.
    902 
    903   // Launch the app and wait until it's ready to load a test.
    904   ExtensionTestMessageListener launched_listener("Launched", false);
    905   LoadAndLaunchPlatformApp("web_view/shim");
    906   ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
    907 
    908   content::WebContents* embedder_web_contents =
    909       GetFirstShellWindowWebContents();
    910   ASSERT_TRUE(embedder_web_contents);
    911 
    912   GURL::Replacements replace_host;
    913   std::string host_str("localhost");  // Must stay in scope with replace_host.
    914   replace_host.SetHostStr(host_str);
    915 
    916   std::string guest_path(
    917       "/extensions/platform_apps/web_view/shim/empty_guest.html");
    918   GURL guest_url = embedded_test_server()->GetURL(guest_path);
    919   guest_url = guest_url.ReplaceComponents(replace_host);
    920 
    921   ui_test_utils::UrlLoadObserver guest_observer(
    922       guest_url, content::NotificationService::AllSources());
    923 
    924   // Run the test and wait until the guest WebContents is available and has
    925   // finished loading.
    926   ExtensionTestMessageListener guest_loaded_listener("guest-loaded", false);
    927   EXPECT_TRUE(content::ExecuteScript(
    928                   embedder_web_contents,
    929                   "runTest('testRemoveWebviewOnExit')"));
    930   guest_observer.Wait();
    931 
    932   content::Source<content::NavigationController> source =
    933       guest_observer.source();
    934   EXPECT_TRUE(source->GetWebContents()->GetRenderProcessHost()->IsGuest());
    935 
    936   ASSERT_TRUE(guest_loaded_listener.WaitUntilSatisfied());
    937 
    938   content::WebContentsDestroyedWatcher destroyed_watcher(
    939       source->GetWebContents());
    940 
    941   // Tell the embedder to kill the guest.
    942   EXPECT_TRUE(content::ExecuteScript(
    943                   embedder_web_contents,
    944                   "removeWebviewOnExitDoCrash();"));
    945 
    946   // Wait until the guest WebContents is destroyed.
    947   destroyed_watcher.Wait();
    948 }
    949 
    950 // Remove <webview> immediately after navigating it.
    951 // This is a regression test for http://crbug.com/276023.
    952 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestRemoveWebviewAfterNavigation) {
    953   TestHelper("testRemoveWebviewAfterNavigation",
    954              "web_view/shim",
    955              NO_TEST_SERVER);
    956 }
    957 
    958 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestNavigationToExternalProtocol) {
    959   TestHelper("testNavigationToExternalProtocol",
    960              "web_view/shim",
    961              NO_TEST_SERVER);
    962 }
    963 
    964 IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestResizeWebviewResizesContent) {
    965   TestHelper("testResizeWebviewResizesContent",
    966              "web_view/shim",
    967              NO_TEST_SERVER);
    968 }
    969 
    970 // This test makes sure we do not crash if app is closed while interstitial
    971 // page is being shown in guest.
    972 IN_PROC_BROWSER_TEST_F(WebViewTest, InterstitialTeardown) {
    973 #if defined(OS_WIN)
    974   // Flaky on XP bot http://crbug.com/297014
    975   if (base::win::GetVersion() <= base::win::VERSION_XP)
    976     return;
    977 #endif
    978 
    979   // Start a HTTPS server so we can load an interstitial page inside guest.
    980   net::SpawnedTestServer::SSLOptions ssl_options;
    981   ssl_options.server_certificate =
    982       net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME;
    983   net::SpawnedTestServer https_server(
    984       net::SpawnedTestServer::TYPE_HTTPS, ssl_options,
    985       base::FilePath(FILE_PATH_LITERAL("chrome/test/data")));
    986   ASSERT_TRUE(https_server.Start());
    987 
    988   net::HostPortPair host_and_port = https_server.host_port_pair();
    989 
    990   ExtensionTestMessageListener embedder_loaded_listener("EmbedderLoaded",
    991                                                         false);
    992   LoadAndLaunchPlatformApp("web_view/interstitial_teardown");
    993   ASSERT_TRUE(embedder_loaded_listener.WaitUntilSatisfied());
    994 
    995   GuestContentBrowserClient new_client;
    996   content::ContentBrowserClient* old_client =
    997       SetBrowserClientForTesting(&new_client);
    998 
    999   // Now load the guest.
   1000   content::WebContents* embedder_web_contents =
   1001       GetFirstShellWindowWebContents();
   1002   ExtensionTestMessageListener second("GuestAddedToDom", false);
   1003   EXPECT_TRUE(content::ExecuteScript(
   1004       embedder_web_contents,
   1005       base::StringPrintf("loadGuest(%d);\n", host_and_port.port())));
   1006   ASSERT_TRUE(second.WaitUntilSatisfied());
   1007 
   1008   // Wait for interstitial page to be shown in guest.
   1009   content::WebContents* guest_web_contents = new_client.WaitForGuestCreated();
   1010   SetBrowserClientForTesting(old_client);
   1011   ASSERT_TRUE(guest_web_contents->GetRenderProcessHost()->IsGuest());
   1012   WaitForInterstitial(guest_web_contents);
   1013 
   1014   // Now close the app while interstitial page being shown in guest.
   1015   apps::ShellWindow* window = GetFirstShellWindow();
   1016   window->GetBaseWindow()->Close();
   1017 }
   1018 
   1019 IN_PROC_BROWSER_TEST_F(WebViewTest, ShimSrcAttribute) {
   1020   ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/src_attribute"))
   1021       << message_;
   1022 }
   1023 
   1024 // Disabled on Windows for flaky failures: crbug.com/329032
   1025 #if defined(OS_WIN)
   1026 #define MAYBE_Size DISABLED_Size
   1027 #else
   1028 #define MAYBE_Size Size
   1029 #endif
   1030 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_Size) {
   1031   ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/size")) << message_;
   1032 }
   1033 
   1034 // This test verifies that prerendering has been disabled inside <webview>.
   1035 // This test is here rather than in PrerenderBrowserTest for testing convenience
   1036 // only. If it breaks then this is a bug in the prerenderer.
   1037 IN_PROC_BROWSER_TEST_F(WebViewTest, NoPrerenderer) {
   1038   ASSERT_TRUE(StartEmbeddedTestServer());
   1039   content::WebContents* guest_web_contents =
   1040       LoadGuest(
   1041           "/extensions/platform_apps/web_view/noprerenderer/guest.html",
   1042           "web_view/noprerenderer");
   1043   ASSERT_TRUE(guest_web_contents != NULL);
   1044 
   1045   PrerenderLinkManager* prerender_link_manager =
   1046       PrerenderLinkManagerFactory::GetForProfile(
   1047           Profile::FromBrowserContext(guest_web_contents->GetBrowserContext()));
   1048   ASSERT_TRUE(prerender_link_manager != NULL);
   1049   EXPECT_TRUE(prerender_link_manager->IsEmpty());
   1050 }
   1051 
   1052 // This tests cookie isolation for packaged apps with webview tags. It navigates
   1053 // the main browser window to a page that sets a cookie and loads an app with
   1054 // multiple webview tags. Each tag sets a cookie and the test checks the proper
   1055 // storage isolation is enforced.
   1056 // This test is disabled due to being flaky. http://crbug.com/294196
   1057 #if defined(OS_WIN)
   1058 #define MAYBE_CookieIsolation DISABLED_CookieIsolation
   1059 #else
   1060 #define MAYBE_CookieIsolation CookieIsolation
   1061 #endif
   1062 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_CookieIsolation) {
   1063   ASSERT_TRUE(StartEmbeddedTestServer());
   1064   const std::string kExpire =
   1065       "var expire = new Date(Date.now() + 24 * 60 * 60 * 1000);";
   1066   std::string cookie_script1(kExpire);
   1067   cookie_script1.append(
   1068       "document.cookie = 'guest1=true; path=/; expires=' + expire + ';';");
   1069   std::string cookie_script2(kExpire);
   1070   cookie_script2.append(
   1071       "document.cookie = 'guest2=true; path=/; expires=' + expire + ';';");
   1072 
   1073   GURL::Replacements replace_host;
   1074   std::string host_str("localhost");  // Must stay in scope with replace_host.
   1075   replace_host.SetHostStr(host_str);
   1076 
   1077   GURL set_cookie_url = embedded_test_server()->GetURL(
   1078       "/extensions/platform_apps/isolation/set_cookie.html");
   1079   set_cookie_url = set_cookie_url.ReplaceComponents(replace_host);
   1080 
   1081   // The first two partitions will be used to set cookies and ensure they are
   1082   // shared. The named partition is used to ensure that cookies are isolated
   1083   // between partitions within the same app.
   1084   content::WebContents* cookie_contents1;
   1085   content::WebContents* cookie_contents2;
   1086   content::WebContents* named_partition_contents1;
   1087   content::WebContents* named_partition_contents2;
   1088 
   1089   NavigateAndOpenAppForIsolation(set_cookie_url, &cookie_contents1,
   1090                                  &cookie_contents2, &named_partition_contents1,
   1091                                  &named_partition_contents2, NULL, NULL, NULL);
   1092 
   1093   EXPECT_TRUE(content::ExecuteScript(cookie_contents1, cookie_script1));
   1094   EXPECT_TRUE(content::ExecuteScript(cookie_contents2, cookie_script2));
   1095 
   1096   int cookie_size;
   1097   std::string cookie_value;
   1098 
   1099   // Test the regular browser context to ensure we have only one cookie.
   1100   automation_util::GetCookies(GURL("http://localhost"),
   1101                               browser()->tab_strip_model()->GetWebContentsAt(0),
   1102                               &cookie_size, &cookie_value);
   1103   EXPECT_EQ("testCookie=1", cookie_value);
   1104 
   1105   // The default behavior is to combine webview tags with no explicit partition
   1106   // declaration into the same in-memory partition. Test the webview tags to
   1107   // ensure we have properly set the cookies and we have both cookies in both
   1108   // tags.
   1109   automation_util::GetCookies(GURL("http://localhost"),
   1110                               cookie_contents1,
   1111                               &cookie_size, &cookie_value);
   1112   EXPECT_EQ("guest1=true; guest2=true", cookie_value);
   1113 
   1114   automation_util::GetCookies(GURL("http://localhost"),
   1115                               cookie_contents2,
   1116                               &cookie_size, &cookie_value);
   1117   EXPECT_EQ("guest1=true; guest2=true", cookie_value);
   1118 
   1119   // The third tag should not have any cookies as it is in a separate partition.
   1120   automation_util::GetCookies(GURL("http://localhost"),
   1121                               named_partition_contents1,
   1122                               &cookie_size, &cookie_value);
   1123   EXPECT_EQ("", cookie_value);
   1124 }
   1125 
   1126 // This tests that in-memory storage partitions are reset on browser restart,
   1127 // but persistent ones maintain state for cookies and HTML5 storage.
   1128 IN_PROC_BROWSER_TEST_F(WebViewTest, PRE_StoragePersistence) {
   1129   ASSERT_TRUE(StartEmbeddedTestServer());
   1130   const std::string kExpire =
   1131       "var expire = new Date(Date.now() + 24 * 60 * 60 * 1000);";
   1132   std::string cookie_script1(kExpire);
   1133   cookie_script1.append(
   1134       "document.cookie = 'inmemory=true; path=/; expires=' + expire + ';';");
   1135   std::string cookie_script2(kExpire);
   1136   cookie_script2.append(
   1137       "document.cookie = 'persist1=true; path=/; expires=' + expire + ';';");
   1138   std::string cookie_script3(kExpire);
   1139   cookie_script3.append(
   1140       "document.cookie = 'persist2=true; path=/; expires=' + expire + ';';");
   1141 
   1142   // We don't care where the main browser is on this test.
   1143   GURL blank_url("about:blank");
   1144 
   1145   // The first two partitions will be used to set cookies and ensure they are
   1146   // shared. The named partition is used to ensure that cookies are isolated
   1147   // between partitions within the same app.
   1148   content::WebContents* cookie_contents1;
   1149   content::WebContents* cookie_contents2;
   1150   content::WebContents* named_partition_contents1;
   1151   content::WebContents* named_partition_contents2;
   1152   content::WebContents* persistent_partition_contents1;
   1153   content::WebContents* persistent_partition_contents2;
   1154   content::WebContents* persistent_partition_contents3;
   1155   NavigateAndOpenAppForIsolation(blank_url, &cookie_contents1,
   1156                                  &cookie_contents2, &named_partition_contents1,
   1157                                  &named_partition_contents2,
   1158                                  &persistent_partition_contents1,
   1159                                  &persistent_partition_contents2,
   1160                                  &persistent_partition_contents3);
   1161 
   1162   // Set the inmemory=true cookie for tags with inmemory partitions.
   1163   EXPECT_TRUE(content::ExecuteScript(cookie_contents1, cookie_script1));
   1164   EXPECT_TRUE(content::ExecuteScript(named_partition_contents1,
   1165                                      cookie_script1));
   1166 
   1167   // For the two different persistent storage partitions, set the
   1168   // two different cookies so we can check that they aren't comingled below.
   1169   EXPECT_TRUE(content::ExecuteScript(persistent_partition_contents1,
   1170                                      cookie_script2));
   1171 
   1172   EXPECT_TRUE(content::ExecuteScript(persistent_partition_contents3,
   1173                                      cookie_script3));
   1174 
   1175   int cookie_size;
   1176   std::string cookie_value;
   1177 
   1178   // Check that all in-memory partitions have a cookie set.
   1179   automation_util::GetCookies(GURL("http://localhost"),
   1180                               cookie_contents1,
   1181                               &cookie_size, &cookie_value);
   1182   EXPECT_EQ("inmemory=true", cookie_value);
   1183   automation_util::GetCookies(GURL("http://localhost"),
   1184                               cookie_contents2,
   1185                               &cookie_size, &cookie_value);
   1186   EXPECT_EQ("inmemory=true", cookie_value);
   1187   automation_util::GetCookies(GURL("http://localhost"),
   1188                               named_partition_contents1,
   1189                               &cookie_size, &cookie_value);
   1190   EXPECT_EQ("inmemory=true", cookie_value);
   1191   automation_util::GetCookies(GURL("http://localhost"),
   1192                               named_partition_contents2,
   1193                               &cookie_size, &cookie_value);
   1194   EXPECT_EQ("inmemory=true", cookie_value);
   1195 
   1196   // Check that all persistent partitions kept their state.
   1197   automation_util::GetCookies(GURL("http://localhost"),
   1198                               persistent_partition_contents1,
   1199                               &cookie_size, &cookie_value);
   1200   EXPECT_EQ("persist1=true", cookie_value);
   1201   automation_util::GetCookies(GURL("http://localhost"),
   1202                               persistent_partition_contents2,
   1203                               &cookie_size, &cookie_value);
   1204   EXPECT_EQ("persist1=true", cookie_value);
   1205   automation_util::GetCookies(GURL("http://localhost"),
   1206                               persistent_partition_contents3,
   1207                               &cookie_size, &cookie_value);
   1208   EXPECT_EQ("persist2=true", cookie_value);
   1209 }
   1210 
   1211 // This is the post-reset portion of the StoragePersistence test.  See
   1212 // PRE_StoragePersistence for main comment.
   1213 IN_PROC_BROWSER_TEST_F(WebViewTest, DISABLED_StoragePersistence) {
   1214   ASSERT_TRUE(StartEmbeddedTestServer());
   1215 
   1216   // We don't care where the main browser is on this test.
   1217   GURL blank_url("about:blank");
   1218 
   1219   // The first two partitions will be used to set cookies and ensure they are
   1220   // shared. The named partition is used to ensure that cookies are isolated
   1221   // between partitions within the same app.
   1222   content::WebContents* cookie_contents1;
   1223   content::WebContents* cookie_contents2;
   1224   content::WebContents* named_partition_contents1;
   1225   content::WebContents* named_partition_contents2;
   1226   content::WebContents* persistent_partition_contents1;
   1227   content::WebContents* persistent_partition_contents2;
   1228   content::WebContents* persistent_partition_contents3;
   1229   NavigateAndOpenAppForIsolation(blank_url, &cookie_contents1,
   1230                                  &cookie_contents2, &named_partition_contents1,
   1231                                  &named_partition_contents2,
   1232                                  &persistent_partition_contents1,
   1233                                  &persistent_partition_contents2,
   1234                                  &persistent_partition_contents3);
   1235 
   1236   int cookie_size;
   1237   std::string cookie_value;
   1238 
   1239   // Check that all in-memory partitions lost their state.
   1240   automation_util::GetCookies(GURL("http://localhost"),
   1241                               cookie_contents1,
   1242                               &cookie_size, &cookie_value);
   1243   EXPECT_EQ("", cookie_value);
   1244   automation_util::GetCookies(GURL("http://localhost"),
   1245                               cookie_contents2,
   1246                               &cookie_size, &cookie_value);
   1247   EXPECT_EQ("", cookie_value);
   1248   automation_util::GetCookies(GURL("http://localhost"),
   1249                               named_partition_contents1,
   1250                               &cookie_size, &cookie_value);
   1251   EXPECT_EQ("", cookie_value);
   1252   automation_util::GetCookies(GURL("http://localhost"),
   1253                               named_partition_contents2,
   1254                               &cookie_size, &cookie_value);
   1255   EXPECT_EQ("", cookie_value);
   1256 
   1257   // Check that all persistent partitions kept their state.
   1258   automation_util::GetCookies(GURL("http://localhost"),
   1259                               persistent_partition_contents1,
   1260                               &cookie_size, &cookie_value);
   1261   EXPECT_EQ("persist1=true", cookie_value);
   1262   automation_util::GetCookies(GURL("http://localhost"),
   1263                               persistent_partition_contents2,
   1264                               &cookie_size, &cookie_value);
   1265   EXPECT_EQ("persist1=true", cookie_value);
   1266   automation_util::GetCookies(GURL("http://localhost"),
   1267                               persistent_partition_contents3,
   1268                               &cookie_size, &cookie_value);
   1269   EXPECT_EQ("persist2=true", cookie_value);
   1270 }
   1271 
   1272 #if defined(OS_WIN)
   1273 // This test is very flaky on Win Aura, Win XP, Win 7. http://crbug.com/248873
   1274 #define MAYBE_DOMStorageIsolation DISABLED_DOMStorageIsolation
   1275 #else
   1276 #define MAYBE_DOMStorageIsolation DOMStorageIsolation
   1277 #endif
   1278 
   1279 // This tests DOM storage isolation for packaged apps with webview tags. It
   1280 // loads an app with multiple webview tags and each tag sets DOM storage
   1281 // entries, which the test checks to ensure proper storage isolation is
   1282 // enforced.
   1283 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_DOMStorageIsolation) {
   1284   ASSERT_TRUE(StartEmbeddedTestServer());
   1285   GURL regular_url = embedded_test_server()->GetURL("/title1.html");
   1286 
   1287   std::string output;
   1288   std::string get_local_storage("window.domAutomationController.send("
   1289       "window.localStorage.getItem('foo') || 'badval')");
   1290   std::string get_session_storage("window.domAutomationController.send("
   1291       "window.sessionStorage.getItem('bar') || 'badval')");
   1292 
   1293   content::WebContents* default_tag_contents1;
   1294   content::WebContents* default_tag_contents2;
   1295   content::WebContents* storage_contents1;
   1296   content::WebContents* storage_contents2;
   1297 
   1298   NavigateAndOpenAppForIsolation(regular_url, &default_tag_contents1,
   1299                                  &default_tag_contents2, &storage_contents1,
   1300                                  &storage_contents2, NULL, NULL, NULL);
   1301 
   1302   // Initialize the storage for the first of the two tags that share a storage
   1303   // partition.
   1304   EXPECT_TRUE(content::ExecuteScript(storage_contents1,
   1305                                      "initDomStorage('page1')"));
   1306 
   1307   // Let's test that the expected values are present in the first tag, as they
   1308   // will be overwritten once we call the initDomStorage on the second tag.
   1309   EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents1,
   1310                                             get_local_storage.c_str(),
   1311                                             &output));
   1312   EXPECT_STREQ("local-page1", output.c_str());
   1313   EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents1,
   1314                                             get_session_storage.c_str(),
   1315                                             &output));
   1316   EXPECT_STREQ("session-page1", output.c_str());
   1317 
   1318   // Now, init the storage in the second tag in the same storage partition,
   1319   // which will overwrite the shared localStorage.
   1320   EXPECT_TRUE(content::ExecuteScript(storage_contents2,
   1321                                      "initDomStorage('page2')"));
   1322 
   1323   // The localStorage value now should reflect the one written through the
   1324   // second tag.
   1325   EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents1,
   1326                                             get_local_storage.c_str(),
   1327                                             &output));
   1328   EXPECT_STREQ("local-page2", output.c_str());
   1329   EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents2,
   1330                                             get_local_storage.c_str(),
   1331                                             &output));
   1332   EXPECT_STREQ("local-page2", output.c_str());
   1333 
   1334   // Session storage is not shared though, as each webview tag has separate
   1335   // instance, even if they are in the same storage partition.
   1336   EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents1,
   1337                                             get_session_storage.c_str(),
   1338                                             &output));
   1339   EXPECT_STREQ("session-page1", output.c_str());
   1340   EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents2,
   1341                                             get_session_storage.c_str(),
   1342                                             &output));
   1343   EXPECT_STREQ("session-page2", output.c_str());
   1344 
   1345   // Also, let's check that the main browser and another tag that doesn't share
   1346   // the same partition don't have those values stored.
   1347   EXPECT_TRUE(ExecuteScriptAndExtractString(
   1348       browser()->tab_strip_model()->GetWebContentsAt(0),
   1349       get_local_storage.c_str(),
   1350       &output));
   1351   EXPECT_STREQ("badval", output.c_str());
   1352   EXPECT_TRUE(ExecuteScriptAndExtractString(
   1353       browser()->tab_strip_model()->GetWebContentsAt(0),
   1354       get_session_storage.c_str(),
   1355       &output));
   1356   EXPECT_STREQ("badval", output.c_str());
   1357   EXPECT_TRUE(ExecuteScriptAndExtractString(default_tag_contents1,
   1358                                             get_local_storage.c_str(),
   1359                                             &output));
   1360   EXPECT_STREQ("badval", output.c_str());
   1361   EXPECT_TRUE(ExecuteScriptAndExtractString(default_tag_contents1,
   1362                                             get_session_storage.c_str(),
   1363                                             &output));
   1364   EXPECT_STREQ("badval", output.c_str());
   1365 }
   1366 
   1367 // See crbug.com/248500
   1368 #if defined(OS_WIN)
   1369 #define MAYBE_IndexedDBIsolation DISABLED_IndexedDBIsolation
   1370 #else
   1371 #define MAYBE_IndexedDBIsolation IndexedDBIsolation
   1372 #endif
   1373 
   1374 // This tests IndexedDB isolation for packaged apps with webview tags. It loads
   1375 // an app with multiple webview tags and each tag creates an IndexedDB record,
   1376 // which the test checks to ensure proper storage isolation is enforced.
   1377 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_IndexedDBIsolation) {
   1378   ASSERT_TRUE(StartEmbeddedTestServer());
   1379   GURL regular_url = embedded_test_server()->GetURL("/title1.html");
   1380 
   1381   content::WebContents* default_tag_contents1;
   1382   content::WebContents* default_tag_contents2;
   1383   content::WebContents* storage_contents1;
   1384   content::WebContents* storage_contents2;
   1385 
   1386   NavigateAndOpenAppForIsolation(regular_url, &default_tag_contents1,
   1387                                  &default_tag_contents2, &storage_contents1,
   1388                                  &storage_contents2, NULL, NULL, NULL);
   1389 
   1390   // Initialize the storage for the first of the two tags that share a storage
   1391   // partition.
   1392   ExecuteScriptWaitForTitle(storage_contents1, "initIDB()", "idb created");
   1393   ExecuteScriptWaitForTitle(storage_contents1, "addItemIDB(7, 'page1')",
   1394                             "addItemIDB complete");
   1395   ExecuteScriptWaitForTitle(storage_contents1, "readItemIDB(7)",
   1396                             "readItemIDB complete");
   1397 
   1398   std::string output;
   1399   std::string get_value(
   1400       "window.domAutomationController.send(getValueIDB() || 'badval')");
   1401 
   1402   EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents1,
   1403                                             get_value.c_str(), &output));
   1404   EXPECT_STREQ("page1", output.c_str());
   1405 
   1406   // Initialize the db in the second tag.
   1407   ExecuteScriptWaitForTitle(storage_contents2, "initIDB()", "idb open");
   1408 
   1409   // Since we share a partition, reading the value should return the existing
   1410   // one.
   1411   ExecuteScriptWaitForTitle(storage_contents2, "readItemIDB(7)",
   1412                             "readItemIDB complete");
   1413   EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents2,
   1414                                             get_value.c_str(), &output));
   1415   EXPECT_STREQ("page1", output.c_str());
   1416 
   1417   // Now write through the second tag and read it back.
   1418   ExecuteScriptWaitForTitle(storage_contents2, "addItemIDB(7, 'page2')",
   1419                             "addItemIDB complete");
   1420   ExecuteScriptWaitForTitle(storage_contents2, "readItemIDB(7)",
   1421                             "readItemIDB complete");
   1422   EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents2,
   1423                                             get_value.c_str(), &output));
   1424   EXPECT_STREQ("page2", output.c_str());
   1425 
   1426   // Reset the document title, otherwise the next call will not see a change and
   1427   // will hang waiting for it.
   1428   EXPECT_TRUE(content::ExecuteScript(storage_contents1,
   1429                                      "document.title = 'foo'"));
   1430 
   1431   // Read through the first tag to ensure we have the second value.
   1432   ExecuteScriptWaitForTitle(storage_contents1, "readItemIDB(7)",
   1433                             "readItemIDB complete");
   1434   EXPECT_TRUE(ExecuteScriptAndExtractString(storage_contents1,
   1435                                             get_value.c_str(), &output));
   1436   EXPECT_STREQ("page2", output.c_str());
   1437 
   1438   // Now, let's confirm there is no database in the main browser and another
   1439   // tag that doesn't share the same partition. Due to the IndexedDB API design,
   1440   // open will succeed, but the version will be 1, since it creates the database
   1441   // if it is not found. The two tags use database version 3, so we avoid
   1442   // ambiguity.
   1443   const char* script =
   1444       "indexedDB.open('isolation').onsuccess = function(e) {"
   1445       "  if (e.target.result.version == 1)"
   1446       "    document.title = 'db not found';"
   1447       "  else "
   1448       "    document.title = 'error';"
   1449       "}";
   1450   ExecuteScriptWaitForTitle(browser()->tab_strip_model()->GetWebContentsAt(0),
   1451                             script, "db not found");
   1452   ExecuteScriptWaitForTitle(default_tag_contents1, script, "db not found");
   1453 }
   1454 
   1455 // This test ensures that closing app window on 'loadcommit' does not crash.
   1456 // The test launches an app with guest and closes the window on loadcommit. It
   1457 // then launches the app window again. The process is repeated 3 times.
   1458 // http://crbug.com/291278
   1459 #if defined(OS_WIN)
   1460 #define MAYBE_CloseOnLoadcommit DISABLED_CloseOnLoadcommit
   1461 #else
   1462 #define MAYBE_CloseOnLoadcommit CloseOnLoadcommit
   1463 #endif
   1464 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_CloseOnLoadcommit) {
   1465   ExtensionTestMessageListener done_test_listener(
   1466       "done-close-on-loadcommit", false);
   1467   LoadAndLaunchPlatformApp("web_view/close_on_loadcommit");
   1468   ASSERT_TRUE(done_test_listener.WaitUntilSatisfied());
   1469 }
   1470 
   1471 IN_PROC_BROWSER_TEST_F(WebViewTest, MediaAccessAPIDeny_TestDeny) {
   1472   MediaAccessAPIDenyTestHelper("testDeny");
   1473 }
   1474 
   1475 IN_PROC_BROWSER_TEST_F(WebViewTest,
   1476                        MediaAccessAPIDeny_TestDenyThenAllowThrows) {
   1477   MediaAccessAPIDenyTestHelper("testDenyThenAllowThrows");
   1478 
   1479 }
   1480 
   1481 IN_PROC_BROWSER_TEST_F(WebViewTest,
   1482                        MediaAccessAPIDeny_TestDenyWithPreventDefault) {
   1483   MediaAccessAPIDenyTestHelper("testDenyWithPreventDefault");
   1484 }
   1485 
   1486 IN_PROC_BROWSER_TEST_F(WebViewTest,
   1487                        MediaAccessAPIDeny_TestNoListenersImplyDeny) {
   1488   MediaAccessAPIDenyTestHelper("testNoListenersImplyDeny");
   1489 }
   1490 
   1491 IN_PROC_BROWSER_TEST_F(WebViewTest,
   1492                        MediaAccessAPIDeny_TestNoPreventDefaultImpliesDeny) {
   1493   MediaAccessAPIDenyTestHelper("testNoPreventDefaultImpliesDeny");
   1494 }
   1495 
   1496 void WebViewTest::MediaAccessAPIAllowTestHelper(const std::string& test_name) {
   1497   ASSERT_TRUE(StartEmbeddedTestServer());  // For serving guest pages.
   1498   ExtensionTestMessageListener launched_listener("Launched", false);
   1499   LoadAndLaunchPlatformApp("web_view/media_access/allow");
   1500   ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
   1501 
   1502   content::WebContents* embedder_web_contents =
   1503       GetFirstShellWindowWebContents();
   1504   ASSERT_TRUE(embedder_web_contents);
   1505   MockWebContentsDelegate* mock = new MockWebContentsDelegate;
   1506   embedder_web_contents->SetDelegate(mock);
   1507 
   1508   ExtensionTestMessageListener done_listener("TEST_PASSED", false);
   1509   done_listener.AlsoListenForFailureMessage("TEST_FAILED");
   1510   EXPECT_TRUE(
   1511       content::ExecuteScript(
   1512           embedder_web_contents,
   1513           base::StringPrintf("startAllowTest('%s')",
   1514                              test_name.c_str())));
   1515   ASSERT_TRUE(done_listener.WaitUntilSatisfied());
   1516 
   1517   mock->WaitForSetMediaPermission();
   1518 }
   1519 
   1520 IN_PROC_BROWSER_TEST_F(WebViewTest, MediaAccessAPIAllow_TestAllow) {
   1521   MediaAccessAPIAllowTestHelper("testAllow");
   1522 }
   1523 
   1524 IN_PROC_BROWSER_TEST_F(WebViewTest, MediaAccessAPIAllow_TestAllowAndThenDeny) {
   1525   MediaAccessAPIAllowTestHelper("testAllowAndThenDeny");
   1526 }
   1527 
   1528 IN_PROC_BROWSER_TEST_F(WebViewTest, MediaAccessAPIAllow_TestAllowTwice) {
   1529   MediaAccessAPIAllowTestHelper("testAllowTwice");
   1530 }
   1531 
   1532 IN_PROC_BROWSER_TEST_F(WebViewTest, MediaAccessAPIAllow_TestAllowAsync) {
   1533   MediaAccessAPIAllowTestHelper("testAllowAsync");
   1534 }
   1535 
   1536 // Checks that window.screenX/screenY/screenLeft/screenTop works correctly for
   1537 // guests.
   1538 IN_PROC_BROWSER_TEST_F(WebViewTest, ScreenCoordinates) {
   1539   ASSERT_TRUE(RunPlatformAppTestWithArg(
   1540       "platform_apps/web_view/common", "screen_coordinates"))
   1541           << message_;
   1542 }
   1543 
   1544 IN_PROC_BROWSER_TEST_F(WebViewTest, SpeechRecognition) {
   1545   ASSERT_TRUE(StartEmbeddedTestServer());
   1546   content::WebContents* guest_web_contents = LoadGuest(
   1547       "/extensions/platform_apps/web_view/speech/guest.html",
   1548       "web_view/speech");
   1549   ASSERT_TRUE(guest_web_contents);
   1550 
   1551   // Click on the guest (center of the WebContents), the guest is rendered in a
   1552   // way that this will trigger clicking on speech recognition input mic.
   1553   SimulateMouseClick(guest_web_contents, 0, blink::WebMouseEvent::ButtonLeft);
   1554 
   1555   base::string16 expected_title(ASCIIToUTF16("PASSED"));
   1556   base::string16 error_title(ASCIIToUTF16("FAILED"));
   1557   content::TitleWatcher title_watcher(guest_web_contents, expected_title);
   1558   title_watcher.AlsoWaitForTitle(error_title);
   1559   EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
   1560 }
   1561 
   1562 // Flaky on Windows. http://crbug.com/303966
   1563 #if defined(OS_WIN)
   1564 #define MAYBE_TearDownTest DISABLED_TearDownTest
   1565 #else
   1566 #define MAYBE_TearDownTest TearDownTest
   1567 #endif
   1568 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_TearDownTest) {
   1569   ExtensionTestMessageListener first_loaded_listener("guest-loaded", false);
   1570   const extensions::Extension* extension =
   1571       LoadAndLaunchPlatformApp("web_view/teardown");
   1572   ASSERT_TRUE(first_loaded_listener.WaitUntilSatisfied());
   1573   apps::ShellWindow* window = NULL;
   1574   if (!GetShellWindowCount())
   1575     window = CreateShellWindow(extension);
   1576   else
   1577     window = GetFirstShellWindow();
   1578   CloseShellWindow(window);
   1579 
   1580   // Load the app again.
   1581   ExtensionTestMessageListener second_loaded_listener("guest-loaded", false);
   1582   LoadAndLaunchPlatformApp("web_view/teardown");
   1583   ASSERT_TRUE(second_loaded_listener.WaitUntilSatisfied());
   1584 }
   1585 
   1586 // In following GeolocationAPIEmbedderHasNoAccess* tests, embedder (i.e. the
   1587 // platform app) does not have geolocation permission for this test.
   1588 // No matter what the API does, geolocation permission would be denied.
   1589 // Note that the test name prefix must be "GeolocationAPI".
   1590 IN_PROC_BROWSER_TEST_F(WebViewTest, GeolocationAPIEmbedderHasNoAccessAllow) {
   1591   TestHelper("testDenyDenies",
   1592              "web_view/geolocation/embedder_has_no_permission",
   1593              NEEDS_TEST_SERVER);
   1594 }
   1595 
   1596 IN_PROC_BROWSER_TEST_F(WebViewTest, GeolocationAPIEmbedderHasNoAccessDeny) {
   1597   TestHelper("testDenyDenies",
   1598              "web_view/geolocation/embedder_has_no_permission",
   1599              NEEDS_TEST_SERVER);
   1600 }
   1601 
   1602 // In following GeolocationAPIEmbedderHasAccess* tests, embedder (i.e. the
   1603 // platform app) has geolocation permission
   1604 //
   1605 // Note that these test names must be "GeolocationAPI" prefixed (b/c we mock out
   1606 // geolocation in this case).
   1607 //
   1608 // Also note that these are run separately because OverrideGeolocation() doesn't
   1609 // mock out geolocation for multiple navigator.geolocation calls properly and
   1610 // the tests become flaky.
   1611 // GeolocationAPI* test 1 of 3.
   1612 IN_PROC_BROWSER_TEST_F(WebViewTest, GeolocationAPIEmbedderHasAccessAllow) {
   1613   TestHelper("testAllow",
   1614              "web_view/geolocation/embedder_has_permission",
   1615              NEEDS_TEST_SERVER);
   1616 }
   1617 
   1618 // GeolocationAPI* test 2 of 3.
   1619 IN_PROC_BROWSER_TEST_F(WebViewTest, GeolocationAPIEmbedderHasAccessDeny) {
   1620   TestHelper("testDeny",
   1621              "web_view/geolocation/embedder_has_permission",
   1622              NEEDS_TEST_SERVER);
   1623 }
   1624 
   1625 // GeolocationAPI* test 3 of 3.
   1626 IN_PROC_BROWSER_TEST_F(WebViewTest,
   1627                        GeolocationAPIEmbedderHasAccessMultipleBridgeIdAllow) {
   1628   TestHelper("testMultipleBridgeIdAllow",
   1629              "web_view/geolocation/embedder_has_permission",
   1630              NEEDS_TEST_SERVER);
   1631 }
   1632 
   1633 // Tests that
   1634 // BrowserPluginGeolocationPermissionContext::CancelGeolocationPermissionRequest
   1635 // is handled correctly (and does not crash).
   1636 IN_PROC_BROWSER_TEST_F(WebViewTest, GeolocationAPICancelGeolocation) {
   1637   ASSERT_TRUE(StartEmbeddedTestServer());  // For serving guest pages.
   1638   ASSERT_TRUE(RunPlatformAppTest(
   1639         "platform_apps/web_view/geolocation/cancel_request")) << message_;
   1640 }
   1641 
   1642 IN_PROC_BROWSER_TEST_F(WebViewTest, DISABLED_GeolocationRequestGone) {
   1643   ASSERT_TRUE(StartEmbeddedTestServer());  // For serving guest pages.
   1644   ASSERT_TRUE(RunPlatformAppTest(
   1645         "platform_apps/web_view/geolocation/geolocation_request_gone"))
   1646             << message_;
   1647 }
   1648 
   1649 IN_PROC_BROWSER_TEST_F(WebViewTest, ClearData) {
   1650 #if defined(OS_WIN)
   1651   // Flaky on XP bot http://crbug.com/282674
   1652   if (base::win::GetVersion() <= base::win::VERSION_XP)
   1653     return;
   1654 #endif
   1655 
   1656   ASSERT_TRUE(StartEmbeddedTestServer());  // For serving guest pages.
   1657   ASSERT_TRUE(RunPlatformAppTestWithArg(
   1658       "platform_apps/web_view/common", "cleardata"))
   1659           << message_;
   1660 }
   1661 
   1662 // This test is disabled on Win due to being flaky. http://crbug.com/294592
   1663 #if defined(OS_WIN)
   1664 #define MAYBE_ConsoleMessage DISABLED_ConsoleMessage
   1665 #else
   1666 #define MAYBE_ConsoleMessage ConsoleMessage
   1667 #endif
   1668 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_ConsoleMessage) {
   1669   ASSERT_TRUE(RunPlatformAppTestWithArg(
   1670       "platform_apps/web_view/common", "console_messages"))
   1671           << message_;
   1672 }
   1673 
   1674 IN_PROC_BROWSER_TEST_F(WebViewTest, DownloadPermission) {
   1675   ASSERT_TRUE(StartEmbeddedTestServer());  // For serving guest pages.
   1676   content::WebContents* guest_web_contents =
   1677       LoadGuest("/extensions/platform_apps/web_view/download/guest.html",
   1678                 "web_view/download");
   1679   ASSERT_TRUE(guest_web_contents);
   1680 
   1681   // Replace WebContentsDelegate with mock version so we can intercept download
   1682   // requests.
   1683   content::WebContentsDelegate* delegate = guest_web_contents->GetDelegate();
   1684   MockDownloadWebContentsDelegate* mock_delegate =
   1685       new MockDownloadWebContentsDelegate(delegate);
   1686   guest_web_contents->SetDelegate(mock_delegate);
   1687 
   1688   // Start test.
   1689   // 1. Guest requests a download that its embedder denies.
   1690   EXPECT_TRUE(content::ExecuteScript(guest_web_contents,
   1691                                      "startDownload('download-link-1')"));
   1692   mock_delegate->WaitForCanDownload(false); // Expect to not allow.
   1693   mock_delegate->Reset();
   1694 
   1695   // 2. Guest requests a download that its embedder allows.
   1696   EXPECT_TRUE(content::ExecuteScript(guest_web_contents,
   1697                                      "startDownload('download-link-2')"));
   1698   mock_delegate->WaitForCanDownload(true); // Expect to allow.
   1699   mock_delegate->Reset();
   1700 
   1701   // 3. Guest requests a download that its embedder ignores, this implies deny.
   1702   EXPECT_TRUE(content::ExecuteScript(guest_web_contents,
   1703                                      "startDownload('download-link-3')"));
   1704   mock_delegate->WaitForCanDownload(false); // Expect to not allow.
   1705 }
   1706 
   1707 // This test makes sure loading <webview> does not crash when there is an
   1708 // extension which has content script whitelisted/forced.
   1709 IN_PROC_BROWSER_TEST_F(WebViewTest, WhitelistedContentScript) {
   1710   // Whitelist the extension for running content script we are going to load.
   1711   extensions::ExtensionsClient::ScriptingWhitelist whitelist;
   1712   const std::string extension_id = "imeongpbjoodlnmlakaldhlcmijmhpbb";
   1713   whitelist.push_back(extension_id);
   1714   extensions::ExtensionsClient::Get()->SetScriptingWhitelist(whitelist);
   1715 
   1716   // Load the extension.
   1717   const extensions::Extension* content_script_whitelisted_extension =
   1718       LoadExtension(test_data_dir_.AppendASCII(
   1719                         "platform_apps/web_view/extension_api/content_script"));
   1720   ASSERT_TRUE(content_script_whitelisted_extension);
   1721   ASSERT_EQ(extension_id, content_script_whitelisted_extension->id());
   1722 
   1723   // Now load an app with <webview>.
   1724   ExtensionTestMessageListener done_listener("TEST_PASSED", false);
   1725   LoadAndLaunchPlatformApp("web_view/content_script_whitelisted");
   1726   ASSERT_TRUE(done_listener.WaitUntilSatisfied());
   1727 }
   1728 
   1729 IN_PROC_BROWSER_TEST_F(WebViewTest, SetPropertyOnDocumentReady) {
   1730   ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/document_ready"))
   1731                   << message_;
   1732 }
   1733 
   1734 IN_PROC_BROWSER_TEST_F(WebViewTest, SetPropertyOnDocumentInteractive) {
   1735   ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/document_interactive"))
   1736                   << message_;
   1737 }
   1738 
   1739 IN_PROC_BROWSER_TEST_F(WebViewTest, SpeechRecognitionAPI_HasPermissionAllow) {
   1740   ASSERT_TRUE(
   1741       RunPlatformAppTestWithArg("platform_apps/web_view/speech_recognition_api",
   1742                                 "allowTest"))
   1743           << message_;
   1744 }
   1745 
   1746 IN_PROC_BROWSER_TEST_F(WebViewTest, SpeechRecognitionAPI_HasPermissionDeny) {
   1747   ASSERT_TRUE(
   1748       RunPlatformAppTestWithArg("platform_apps/web_view/speech_recognition_api",
   1749                                 "denyTest"))
   1750           << message_;
   1751 }
   1752 
   1753 IN_PROC_BROWSER_TEST_F(WebViewTest, SpeechRecognitionAPI_NoPermission) {
   1754   ASSERT_TRUE(
   1755       RunPlatformAppTestWithArg("platform_apps/web_view/common",
   1756                                 "speech_recognition_api_no_permission"))
   1757           << message_;
   1758 }
   1759 
   1760 // Tests overriding user agent.
   1761 IN_PROC_BROWSER_TEST_F(WebViewTest, UserAgent) {
   1762   ASSERT_TRUE(RunPlatformAppTestWithArg(
   1763               "platform_apps/web_view/common", "useragent")) << message_;
   1764 }
   1765 
   1766 IN_PROC_BROWSER_TEST_F(WebViewTest, UserAgent_NewWindow) {
   1767   ASSERT_TRUE(RunPlatformAppTestWithArg(
   1768               "platform_apps/web_view/common",
   1769               "useragent_newwindow")) << message_;
   1770 }
   1771 
   1772 IN_PROC_BROWSER_TEST_F(WebViewTest, NoPermission) {
   1773   ASSERT_TRUE(RunPlatformAppTest("platform_apps/web_view/nopermission"))
   1774                   << message_;
   1775 }
   1776 
   1777 IN_PROC_BROWSER_TEST_F(WebViewTest, Dialog_TestAlertDialog) {
   1778   TestHelper("testAlertDialog", "web_view/dialog", NO_TEST_SERVER);
   1779 }
   1780 
   1781 // Fails on official Windows and Linux builds. See http://crbug.com/313868
   1782 #if defined(GOOGLE_CHROME_BUILD) && (defined(OS_WIN) || defined(OS_LINUX))
   1783 #define MAYBE_Dialog_TestConfirmDialog DISABLED_Dialog_TestConfirmDialog
   1784 #else
   1785 #define MAYBE_Dialog_TestConfirmDialog Dialog_TestConfirmDialog
   1786 #endif
   1787 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_Dialog_TestConfirmDialog) {
   1788   TestHelper("testConfirmDialog", "web_view/dialog", NO_TEST_SERVER);
   1789 }
   1790 
   1791 IN_PROC_BROWSER_TEST_F(WebViewTest, Dialog_TestConfirmDialogCancel) {
   1792   TestHelper("testConfirmDialogCancel", "web_view/dialog", NO_TEST_SERVER);
   1793 }
   1794 
   1795 IN_PROC_BROWSER_TEST_F(WebViewTest, Dialog_TestConfirmDialogDefaultCancel) {
   1796   TestHelper("testConfirmDialogDefaultCancel",
   1797              "web_view/dialog",
   1798              NO_TEST_SERVER);
   1799 }
   1800 
   1801 IN_PROC_BROWSER_TEST_F(WebViewTest, Dialog_TestConfirmDialogDefaultGCCancel) {
   1802   TestHelper("testConfirmDialogDefaultGCCancel",
   1803              "web_view/dialog",
   1804              NO_TEST_SERVER);
   1805 }
   1806 
   1807 // Fails on official Windows and Linux builds. See http://crbug.com/313868
   1808 #if defined(GOOGLE_CHROME_BUILD) && (defined(OS_WIN) || defined(OS_LINUX))
   1809 #define MAYBE_Dialog_TestPromptDialog DISABLED_Dialog_TestPromptDialog
   1810 #else
   1811 #define MAYBE_Dialog_TestPromptDialog Dialog_TestPromptDialog
   1812 #endif
   1813 IN_PROC_BROWSER_TEST_F(WebViewTest, MAYBE_Dialog_TestPromptDialog) {
   1814   TestHelper("testPromptDialog", "web_view/dialog", NO_TEST_SERVER);
   1815 }
   1816 
   1817 IN_PROC_BROWSER_TEST_F(WebViewTest, NoContentSettingsAPI) {
   1818   // Load the extension.
   1819   const extensions::Extension* content_settings_extension =
   1820       LoadExtension(
   1821           test_data_dir_.AppendASCII(
   1822               "platform_apps/web_view/extension_api/content_settings"));
   1823   ASSERT_TRUE(content_settings_extension);
   1824   TestHelper("testPostMessageCommChannel", "web_view/shim", NO_TEST_SERVER);
   1825 }
   1826 
   1827 #if defined(ENABLE_PLUGINS)
   1828 class WebViewPluginTest : public WebViewTest {
   1829  protected:
   1830   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
   1831     WebViewTest::SetUpCommandLine(command_line);
   1832 
   1833     // Append the switch to register the pepper plugin.
   1834     // library name = <out dir>/<test_name>.<library_extension>
   1835     // MIME type = application/x-ppapi-<test_name>
   1836     base::FilePath plugin_dir;
   1837     EXPECT_TRUE(PathService::Get(base::DIR_MODULE, &plugin_dir));
   1838 
   1839     base::FilePath plugin_lib = plugin_dir.Append(library_name);
   1840     EXPECT_TRUE(base::PathExists(plugin_lib));
   1841     base::FilePath::StringType pepper_plugin = plugin_lib.value();
   1842     pepper_plugin.append(FILE_PATH_LITERAL(";application/x-ppapi-tests"));
   1843     command_line->AppendSwitchNative(switches::kRegisterPepperPlugins,
   1844                                      pepper_plugin);
   1845   }
   1846 };
   1847 
   1848 IN_PROC_BROWSER_TEST_F(WebViewPluginTest, TestLoadPluginEvent) {
   1849   TestHelper("testPluginLoadPermission", "web_view/shim", NO_TEST_SERVER);
   1850 }
   1851 #endif  // defined(ENABLE_PLUGINS)
   1852 
   1853 // Taking a screenshot does not work with threaded compositing, so disable
   1854 // threaded compositing for this test (http://crbug.com/326756).
   1855 class WebViewCaptureTest : public WebViewTest,
   1856   public testing::WithParamInterface<std::string> {
   1857  public:
   1858   WebViewCaptureTest() {}
   1859   virtual ~WebViewCaptureTest() {}
   1860   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
   1861     command_line->AppendSwitch(GetParam());
   1862     // http://crbug.com/327035
   1863     command_line->AppendSwitch(switches::kDisableDelegatedRenderer);
   1864     WebViewTest::SetUpCommandLine(command_line);
   1865   }
   1866 };
   1867 
   1868 IN_PROC_BROWSER_TEST_P(WebViewCaptureTest,
   1869                        Shim_ScreenshotCapture) {
   1870   TestHelper("testScreenshotCapture", "web_view/shim", NO_TEST_SERVER);
   1871 }
   1872 
   1873 INSTANTIATE_TEST_CASE_P(WithoutThreadedCompositor,
   1874     WebViewCaptureTest,
   1875     ::testing::Values(std::string(switches::kDisableThreadedCompositing)));
   1876 
   1877 // http://crbug.com/171744
   1878 #if !defined(OS_MACOSX)
   1879 INSTANTIATE_TEST_CASE_P(WithThreadedCompositor,
   1880     WebViewCaptureTest,
   1881     ::testing::Values(std::string(switches::kEnableThreadedCompositing)));
   1882 #endif
   1883