Home | History | Annotate | Download | only in shared_worker
      1 // Copyright 2014 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 "base/bind.h"
      6 #include "base/files/file_path.h"
      7 #include "base/logging.h"
      8 #include "base/path_service.h"
      9 #include "base/strings/string_util.h"
     10 #include "base/strings/stringprintf.h"
     11 #include "base/strings/utf_string_conversions.h"
     12 #include "base/sys_info.h"
     13 #include "base/test/test_timeouts.h"
     14 #include "content/public/browser/browser_thread.h"
     15 #include "content/public/common/content_paths.h"
     16 #include "content/public/test/browser_test_utils.h"
     17 #include "content/public/test/content_browser_test.h"
     18 #include "content/public/test/content_browser_test_utils.h"
     19 #include "content/public/test/test_utils.h"
     20 #include "content/shell/browser/shell.h"
     21 #include "content/shell/browser/shell_content_browser_client.h"
     22 #include "content/shell/browser/shell_resource_dispatcher_host_delegate.h"
     23 #include "net/base/test_data_directory.h"
     24 #include "net/test/spawned_test_server/spawned_test_server.h"
     25 #include "url/gurl.h"
     26 
     27 namespace content {
     28 
     29 class WorkerTest : public ContentBrowserTest {
     30  public:
     31   WorkerTest() {}
     32 
     33   GURL GetTestURL(const std::string& test_case, const std::string& query) {
     34     base::FilePath test_file_path = GetTestFilePath(
     35         "workers", test_case.c_str());
     36     return GetFileUrlWithQuery(test_file_path, query);
     37   }
     38 
     39   void RunTest(Shell* window,
     40                const std::string& test_case,
     41                const std::string& query) {
     42     GURL url = GetTestURL(test_case, query);
     43     const base::string16 expected_title = base::ASCIIToUTF16("OK");
     44     TitleWatcher title_watcher(window->web_contents(), expected_title);
     45     NavigateToURL(window, url);
     46     base::string16 final_title = title_watcher.WaitAndGetTitle();
     47     EXPECT_EQ(expected_title, final_title);
     48   }
     49 
     50   void RunTest(const std::string& test_case, const std::string& query) {
     51     RunTest(shell(), test_case, query);
     52   }
     53 
     54   static void QuitUIMessageLoop(base::Callback<void()> callback) {
     55     BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback);
     56   }
     57 
     58   void NavigateAndWaitForAuth(const GURL& url) {
     59     ShellContentBrowserClient* browser_client =
     60         ShellContentBrowserClient::Get();
     61     scoped_refptr<MessageLoopRunner> runner = new MessageLoopRunner();
     62     browser_client->resource_dispatcher_host_delegate()->
     63         set_login_request_callback(
     64             base::Bind(&QuitUIMessageLoop, runner->QuitClosure()));
     65     shell()->LoadURL(url);
     66     runner->Run();
     67   }
     68 };
     69 
     70 IN_PROC_BROWSER_TEST_F(WorkerTest, SingleWorker) {
     71   RunTest("single_worker.html", std::string());
     72 }
     73 
     74 IN_PROC_BROWSER_TEST_F(WorkerTest, MultipleWorkers) {
     75   RunTest("multi_worker.html", std::string());
     76 }
     77 
     78 IN_PROC_BROWSER_TEST_F(WorkerTest, SingleSharedWorker) {
     79   RunTest("single_worker.html", "shared=true");
     80 }
     81 
     82 // http://crbug.com/96435
     83 IN_PROC_BROWSER_TEST_F(WorkerTest, MultipleSharedWorkers) {
     84   RunTest("multi_worker.html", "shared=true");
     85 }
     86 
     87 // Incognito windows should not share workers with non-incognito windows
     88 // http://crbug.com/30021
     89 IN_PROC_BROWSER_TEST_F(WorkerTest, IncognitoSharedWorkers) {
     90   // Load a non-incognito tab and have it create a shared worker
     91   RunTest("incognito_worker.html", std::string());
     92 
     93   // Incognito worker should not share with non-incognito
     94   RunTest(CreateOffTheRecordBrowser(), "incognito_worker.html", std::string());
     95 }
     96 
     97 // Make sure that auth dialog is displayed from worker context.
     98 // http://crbug.com/33344
     99 IN_PROC_BROWSER_TEST_F(WorkerTest, WorkerHttpAuth) {
    100   ASSERT_TRUE(test_server()->Start());
    101   GURL url = test_server()->GetURL("files/workers/worker_auth.html");
    102 
    103   NavigateAndWaitForAuth(url);
    104 }
    105 
    106 // Make sure that auth dialog is displayed from shared worker context.
    107 // http://crbug.com/33344
    108 IN_PROC_BROWSER_TEST_F(WorkerTest, SharedWorkerHttpAuth) {
    109   ASSERT_TRUE(test_server()->Start());
    110   GURL url = test_server()->GetURL("files/workers/shared_worker_auth.html");
    111   NavigateAndWaitForAuth(url);
    112 }
    113 
    114 IN_PROC_BROWSER_TEST_F(WorkerTest, WebSocketSharedWorker) {
    115   // Launch WebSocket server.
    116   net::SpawnedTestServer ws_server(net::SpawnedTestServer::TYPE_WS,
    117                                    net::SpawnedTestServer::kLocalhost,
    118                                    net::GetWebSocketTestDataDirectory());
    119   ASSERT_TRUE(ws_server.Start());
    120 
    121   // Generate test URL.
    122   std::string scheme("http");
    123   GURL::Replacements replacements;
    124   replacements.SetSchemeStr(scheme);
    125   GURL url = ws_server.GetURL(
    126       "websocket_shared_worker.html").ReplaceComponents(replacements);
    127 
    128   // Run test.
    129   Shell* window = shell();
    130   const base::string16 expected_title = base::ASCIIToUTF16("OK");
    131   TitleWatcher title_watcher(window->web_contents(), expected_title);
    132   NavigateToURL(window, url);
    133   base::string16 final_title = title_watcher.WaitAndGetTitle();
    134   EXPECT_EQ(expected_title, final_title);
    135 }
    136 
    137 IN_PROC_BROWSER_TEST_F(WorkerTest, PassMessagePortToSharedWorker) {
    138   RunTest("pass_messageport_to_sharedworker.html", "");
    139 }
    140 
    141 IN_PROC_BROWSER_TEST_F(WorkerTest,
    142                        PassMessagePortToSharedWorkerDontWaitForConnect) {
    143   RunTest("pass_messageport_to_sharedworker_dont_wait_for_connect.html", "");
    144 }
    145 
    146 }  // namespace content
    147