15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/bind.h" 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file_path.h" 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/logging.h" 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/path_service.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/strings/string_util.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/strings/stringprintf.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/sys_info.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/test/test_timeouts.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/common/content_paths.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/test/browser_test_utils.h" 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/test/content_browser_test.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/test/content_browser_test_utils.h" 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/test/test_utils.h" 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/shell/browser/shell.h" 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/shell/browser/shell_content_browser_client.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/shell/browser/shell_resource_dispatcher_host_delegate.h" 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/base/test_data_directory.h" 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h" 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "url/gurl.h" 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace content { 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class WorkerTest : public ContentBrowserTest { 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WorkerTest() {} 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL GetTestURL(const std::string& test_case, const std::string& query) { 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath test_file_path = GetTestFilePath( 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "workers", test_case.c_str()); 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return GetFileUrlWithQuery(test_file_path, query); 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RunTest(Shell* window, 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& test_case, 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& query) { 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL url = GetTestURL(test_case, query); 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::string16 expected_title = base::ASCIIToUTF16("OK"); 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TitleWatcher title_watcher(window->web_contents(), expected_title); 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NavigateToURL(window, url); 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::string16 final_title = title_watcher.WaitAndGetTitle(); 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(expected_title, final_title); 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RunTest(const std::string& test_case, const std::string& query) { 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunTest(shell(), test_case, query); 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static void QuitUIMessageLoop(base::Callback<void()> callback) { 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback); 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void NavigateAndWaitForAuth(const GURL& url) { 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ShellContentBrowserClient* browser_client = 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ShellContentBrowserClient::Get(); 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<MessageLoopRunner> runner = new MessageLoopRunner(); 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) browser_client->resource_dispatcher_host_delegate()-> 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) set_login_request_callback( 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&QuitUIMessageLoop, runner->QuitClosure())); 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) shell()->LoadURL(url); 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) runner->Run(); 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerTest, SingleWorker) { 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunTest("single_worker.html", std::string()); 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerTest, MultipleWorkers) { 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunTest("multi_worker.html", std::string()); 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerTest, SingleSharedWorker) { 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunTest("single_worker.html", "shared=true"); 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/96435 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerTest, MultipleSharedWorkers) { 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunTest("multi_worker.html", "shared=true"); 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Incognito windows should not share workers with non-incognito windows 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/30021 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerTest, IncognitoSharedWorkers) { 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Load a non-incognito tab and have it create a shared worker 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunTest("incognito_worker.html", std::string()); 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Incognito worker should not share with non-incognito 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunTest(CreateOffTheRecordBrowser(), "incognito_worker.html", std::string()); 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Make sure that auth dialog is displayed from worker context. 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/33344 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerTest, WorkerHttpAuth) { 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL url = test_server()->GetURL("files/workers/worker_auth.html"); 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NavigateAndWaitForAuth(url); 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Make sure that auth dialog is displayed from shared worker context. 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/33344 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerTest, SharedWorkerHttpAuth) { 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL url = test_server()->GetURL("files/workers/shared_worker_auth.html"); 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NavigateAndWaitForAuth(url); 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerTest, WebSocketSharedWorker) { 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Launch WebSocket server. 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::SpawnedTestServer ws_server(net::SpawnedTestServer::TYPE_WS, 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) net::GetWebSocketTestDataDirectory()); 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(ws_server.Start()); 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Generate test URL. 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string scheme("http"); 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL::Replacements replacements; 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) replacements.SetSchemeStr(scheme); 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL url = ws_server.GetURL( 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "websocket_shared_worker.html").ReplaceComponents(replacements); 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Run test. 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Shell* window = shell(); 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::string16 expected_title = base::ASCIIToUTF16("OK"); 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TitleWatcher title_watcher(window->web_contents(), expected_title); 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NavigateToURL(window, url); 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::string16 final_title = title_watcher.WaitAndGetTitle(); 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(expected_title, final_title); 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerTest, PassMessagePortToSharedWorker) { 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunTest("pass_messageport_to_sharedworker.html", ""); 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerTest, 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PassMessagePortToSharedWorkerDontWaitForConnect) { 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RunTest("pass_messageport_to_sharedworker_dont_wait_for_connect.html", ""); 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace content 147