Commit dc7f3672 authored by Dmitry Gozman's avatar Dmitry Gozman Committed by Commit Bot

[DevTools] Remove some usages of route_id for shared workers

This is a preparation step to migrate DevTools for shared workers to Mojo.
Drive-by: rewrite the test to use new DevToolsAgentHostObserver.

Bug: 776009
Change-Id: Ia1f3f4952e8d8ac834a36f94c680cb81e7c50e0e
Reviewed-on: https://chromium-review.googlesource.com/777740
Commit-Queue: Dmitry Gozman <dgozman@chromium.org>
Reviewed-by: default avatarAlexei Filippov <alph@chromium.org>
Reviewed-by: default avatarTsuyoshi Horo <horo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#517832}
parent d19bdb4b
...@@ -96,6 +96,7 @@ using app_modal::JavaScriptAppModalDialog; ...@@ -96,6 +96,7 @@ using app_modal::JavaScriptAppModalDialog;
using app_modal::NativeAppModalDialog; using app_modal::NativeAppModalDialog;
using content::BrowserThread; using content::BrowserThread;
using content::DevToolsAgentHost; using content::DevToolsAgentHost;
using content::DevToolsAgentHostObserver;
using content::NavigationController; using content::NavigationController;
using content::RenderFrameHost; using content::RenderFrameHost;
using content::RenderViewHost; using content::RenderViewHost;
...@@ -659,116 +660,53 @@ class WorkerDevToolsSanityTest : public InProcessBrowserTest { ...@@ -659,116 +660,53 @@ class WorkerDevToolsSanityTest : public InProcessBrowserTest {
WorkerDevToolsSanityTest() : window_(NULL) {} WorkerDevToolsSanityTest() : window_(NULL) {}
protected: protected:
class WorkerData : public base::RefCountedThreadSafe<WorkerData> { class WorkerCreationObserver : public DevToolsAgentHostObserver {
public: public:
WorkerData() : worker_process_id(0), worker_route_id(0) {} WorkerCreationObserver(const std::string& path,
int worker_process_id; scoped_refptr<DevToolsAgentHost>* out_host,
int worker_route_id; base::Closure quit)
: path_(path), out_host_(out_host), quit_(quit) {
private: DevToolsAgentHost::AddObserver(this);
friend class base::RefCountedThreadSafe<WorkerData>; }
~WorkerData() {}
};
class WorkerCreationObserver : public WorkerServiceObserver {
public:
explicit WorkerCreationObserver(const std::string& path,
WorkerData* worker_data)
: path_(path), worker_data_(worker_data) {}
private: private:
~WorkerCreationObserver() override {} ~WorkerCreationObserver() override {
DevToolsAgentHost::RemoveObserver(this);
void WorkerCreated(const GURL& url,
const std::string& name,
int process_id,
int route_id) override {
if (url.path().rfind(path_) == std::string::npos)
return;
worker_data_->worker_process_id = process_id;
worker_data_->worker_route_id = route_id;
WorkerService::GetInstance()->RemoveObserver(this);
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
base::MessageLoop::QuitWhenIdleClosure());
delete this;
} }
std::string path_;
scoped_refptr<WorkerData> worker_data_;
};
class WorkerTerminationObserver : public WorkerServiceObserver { void DevToolsAgentHostCreated(DevToolsAgentHost* host) override {
public: if (host->GetType() == DevToolsAgentHost::kTypeSharedWorker &&
explicit WorkerTerminationObserver(WorkerData* worker_data) host->GetURL().path().rfind(path_) != std::string::npos) {
: worker_data_(worker_data) { *out_host_ = host;
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_);
delete this;
}
} }
private: std::string path_;
~WorkerTerminationObserver() override {} scoped_refptr<DevToolsAgentHost>* out_host_;
base::Closure quit_;
void WorkerDestroyed(int process_id, int route_id) override {
ASSERT_EQ(worker_data_->worker_process_id, process_id);
ASSERT_EQ(worker_data_->worker_route_id, route_id);
WorkerService::GetInstance()->RemoveObserver(this);
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
base::MessageLoop::QuitWhenIdleClosure());
delete this;
}
scoped_refptr<WorkerData> worker_data_;
}; };
void RunTest(const char* test_name, static scoped_refptr<DevToolsAgentHost> WaitForFirstSharedWorker(
const char* test_page, const char* path) {
const char* worker_path) { for (auto& host : DevToolsAgentHost::GetOrCreateAll()) {
ASSERT_TRUE(spawned_test_server()->Start()); if (host->GetType() == DevToolsAgentHost::kTypeSharedWorker &&
GURL url = spawned_test_server()->GetURL(test_page); host->GetURL().path().rfind(path) != std::string::npos) {
ui_test_utils::NavigateToURL(browser(), url); return host;
}
scoped_refptr<WorkerData> worker_data =
WaitForFirstSharedWorker(worker_path);
OpenDevToolsWindowForSharedWorker(worker_data.get());
RunTestFunction(window_, test_name);
CloseDevToolsWindow();
}
static void TerminateWorker(scoped_refptr<WorkerData> worker_data) {
if (!WorkerService::GetInstance()->TerminateWorker(
worker_data->worker_process_id, worker_data->worker_route_id))
FAIL() << "Failed to terminate worker.\n";
WorkerService::GetInstance()->AddObserver(
new WorkerTerminationObserver(worker_data.get()));
content::RunMessageLoop();
}
static scoped_refptr<WorkerData> WaitForFirstSharedWorker(const char* path) {
scoped_refptr<WorkerData> worker_data(new WorkerData());
std::vector<WorkerService::WorkerInfo> worker_info =
WorkerService::GetInstance()->GetWorkers();
for (size_t i = 0; i < worker_info.size(); i++) {
if (worker_info[i].url.path().rfind(path) == std::string::npos)
continue;
worker_data->worker_process_id = worker_info[0].process_id;
worker_data->worker_route_id = worker_info[0].route_id;
return worker_data;
} }
scoped_refptr<DevToolsAgentHost> host;
WorkerService::GetInstance()->AddObserver( base::RunLoop run_loop;
new WorkerCreationObserver(path, worker_data.get())); new WorkerCreationObserver(path, &host, run_loop.QuitWhenIdleClosure());
content::RunThisRunLoop(&run_loop);
content::RunMessageLoop(); return host;
return worker_data;
} }
void OpenDevToolsWindowForSharedWorker(WorkerData* worker_data) { void OpenDevToolsWindow(scoped_refptr<DevToolsAgentHost> agent_host) {
Profile* profile = browser()->profile(); Profile* profile = browser()->profile();
scoped_refptr<DevToolsAgentHost> agent_host( window_ =
DevToolsAgentHost::GetForWorker( DevToolsWindowTesting::OpenDevToolsWindowSync(profile, agent_host);
worker_data->worker_process_id,
worker_data->worker_route_id));
window_ = DevToolsWindowTesting::OpenDevToolsWindowForWorkerSync(
profile, agent_host.get());
} }
void CloseDevToolsWindow() { void CloseDevToolsWindow() {
...@@ -1893,7 +1831,15 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, SecondTabAfterDevTools) { ...@@ -1893,7 +1831,15 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, SecondTabAfterDevTools) {
} }
IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest, InspectSharedWorker) { IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest, InspectSharedWorker) {
RunTest("testSharedWorker", kSharedWorkerTestPage, kSharedWorkerTestWorker); ASSERT_TRUE(spawned_test_server()->Start());
GURL url = spawned_test_server()->GetURL(kSharedWorkerTestPage);
ui_test_utils::NavigateToURL(browser(), url);
scoped_refptr<DevToolsAgentHost> host =
WaitForFirstSharedWorker(kSharedWorkerTestWorker);
OpenDevToolsWindow(host);
RunTestFunction(window_, "testSharedWorker");
CloseDevToolsWindow();
} }
// Flaky on multiple platforms. See http://crbug.com/432444 // Flaky on multiple platforms. See http://crbug.com/432444
...@@ -1903,15 +1849,15 @@ IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest, ...@@ -1903,15 +1849,15 @@ IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest,
GURL url = spawned_test_server()->GetURL(kReloadSharedWorkerTestPage); GURL url = spawned_test_server()->GetURL(kReloadSharedWorkerTestPage);
ui_test_utils::NavigateToURL(browser(), url); ui_test_utils::NavigateToURL(browser(), url);
scoped_refptr<WorkerData> worker_data = scoped_refptr<DevToolsAgentHost> host =
WaitForFirstSharedWorker(kReloadSharedWorkerTestWorker); WaitForFirstSharedWorker(kReloadSharedWorkerTestWorker);
OpenDevToolsWindowForSharedWorker(worker_data.get()); OpenDevToolsWindow(host);
// We should make sure that the worker inspector has loaded before // We should make sure that the worker inspector has loaded before
// terminating worker. // terminating worker.
RunTestFunction(window_, "testPauseInSharedWorkerInitialization1"); RunTestFunction(window_, "testPauseInSharedWorkerInitialization1");
TerminateWorker(worker_data); host->Close();
// Reload page to restart the worker. // Reload page to restart the worker.
ui_test_utils::NavigateToURL(browser(), url); ui_test_utils::NavigateToURL(browser(), url);
......
...@@ -102,11 +102,6 @@ class DevToolsWindow : public DevToolsUIBindings::Delegate, ...@@ -102,11 +102,6 @@ class DevToolsWindow : public DevToolsUIBindings::Delegate,
// Node frontend is always undocked. // Node frontend is always undocked.
static void OpenNodeFrontendWindow(Profile* profile); static void OpenNodeFrontendWindow(Profile* profile);
// Worker frontend is always undocked.
static void OpenDevToolsWindowForWorker(
Profile* profile,
const scoped_refptr<content::DevToolsAgentHost>& worker_agent);
static void InspectElement(content::RenderFrameHost* inspected_frame_host, static void InspectElement(content::RenderFrameHost* inspected_frame_host,
int x, int x,
int y); int y);
...@@ -214,6 +209,9 @@ class DevToolsWindow : public DevToolsUIBindings::Delegate, ...@@ -214,6 +209,9 @@ class DevToolsWindow : public DevToolsUIBindings::Delegate,
static void OpenDevToolsWindowForFrame( static void OpenDevToolsWindowForFrame(
Profile* profile, Profile* profile,
const scoped_refptr<content::DevToolsAgentHost>& agent_host); const scoped_refptr<content::DevToolsAgentHost>& agent_host);
static void OpenDevToolsWindowForWorker(
Profile* profile,
const scoped_refptr<content::DevToolsAgentHost>& worker_agent);
// DevTools lifecycle typically follows this way: // DevTools lifecycle typically follows this way:
// - Toggle/Open: client call; // - Toggle/Open: client call;
......
...@@ -132,11 +132,11 @@ DevToolsWindow* DevToolsWindowTesting::OpenDevToolsWindowSync( ...@@ -132,11 +132,11 @@ DevToolsWindow* DevToolsWindowTesting::OpenDevToolsWindowSync(
} }
// static // static
DevToolsWindow* DevToolsWindowTesting::OpenDevToolsWindowForWorkerSync( DevToolsWindow* DevToolsWindowTesting::OpenDevToolsWindowSync(
Profile* profile, content::DevToolsAgentHost* worker_agent) { Profile* profile,
DevToolsWindow::OpenDevToolsWindowForWorker( scoped_refptr<content::DevToolsAgentHost> agent_host) {
profile, worker_agent); DevToolsWindow::OpenDevToolsWindow(agent_host, profile);
DevToolsWindow* window = DevToolsWindow::FindDevToolsWindow(worker_agent); DevToolsWindow* window = DevToolsWindow::FindDevToolsWindow(agent_host.get());
WaitForDevToolsWindowLoad(window); WaitForDevToolsWindowLoad(window);
return window; return window;
} }
......
...@@ -29,8 +29,9 @@ class DevToolsWindowTesting { ...@@ -29,8 +29,9 @@ class DevToolsWindowTesting {
bool is_docked); bool is_docked);
static DevToolsWindow* OpenDevToolsWindowSync( static DevToolsWindow* OpenDevToolsWindowSync(
Browser* browser, bool is_docked); Browser* browser, bool is_docked);
static DevToolsWindow* OpenDevToolsWindowForWorkerSync( static DevToolsWindow* OpenDevToolsWindowSync(
Profile* profile, content::DevToolsAgentHost* worker_agent); Profile* profile,
scoped_refptr<content::DevToolsAgentHost> agent_host);
// Closes the window like it was user-initiated. // Closes the window like it was user-initiated.
static void CloseDevToolsWindow(DevToolsWindow* window); static void CloseDevToolsWindow(DevToolsWindow* window);
......
...@@ -86,21 +86,6 @@ DevToolsAgentHost::List DevToolsAgentHost::GetOrCreateAll() { ...@@ -86,21 +86,6 @@ DevToolsAgentHost::List DevToolsAgentHost::GetOrCreateAll() {
return result; return result;
} }
// Called on the UI thread.
// static
scoped_refptr<DevToolsAgentHost> DevToolsAgentHost::GetForWorker(
int worker_process_id,
int worker_route_id) {
if (scoped_refptr<DevToolsAgentHost> host =
SharedWorkerDevToolsManager::GetInstance()
->GetDevToolsAgentHostForWorker(worker_process_id,
worker_route_id)) {
return host;
}
return ServiceWorkerDevToolsManager::GetInstance()
->GetDevToolsAgentHostForWorker(worker_process_id, worker_route_id);
}
DevToolsAgentHostImpl::DevToolsAgentHostImpl(const std::string& id) : id_(id) { DevToolsAgentHostImpl::DevToolsAgentHostImpl(const std::string& id) : id_(id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
} }
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "content/browser/background_sync/background_sync_manager.h" #include "content/browser/background_sync/background_sync_manager.h"
#include "content/browser/devtools/service_worker_devtools_agent_host.h" #include "content/browser/devtools/service_worker_devtools_agent_host.h"
#include "content/browser/devtools/service_worker_devtools_manager.h" #include "content/browser/devtools/service_worker_devtools_manager.h"
#include "content/browser/devtools/shared_worker_devtools_manager.h"
#include "content/browser/frame_host/frame_tree.h" #include "content/browser/frame_host/frame_tree.h"
#include "content/browser/frame_host/frame_tree_node.h" #include "content/browser/frame_host/frame_tree_node.h"
#include "content/browser/service_worker/embedded_worker_status.h" #include "content/browser/service_worker/embedded_worker_status.h"
...@@ -399,8 +400,9 @@ void ServiceWorkerHandler::OnWorkerVersionUpdated( ...@@ -399,8 +400,9 @@ void ServiceWorkerHandler::OnWorkerVersionUpdated(
} else if (client.second.type == } else if (client.second.type ==
SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER) { SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER) {
scoped_refptr<DevToolsAgentHost> agent_host( scoped_refptr<DevToolsAgentHost> agent_host(
DevToolsAgentHost::GetForWorker(client.second.process_id, SharedWorkerDevToolsManager::GetInstance()
client.second.route_id)); ->GetDevToolsAgentHostForWorker(client.second.process_id,
client.second.route_id));
if (agent_host) if (agent_host)
client_set.insert(agent_host->GetId()); client_set.insert(agent_host->GetId());
} }
......
...@@ -11,16 +11,6 @@ ...@@ -11,16 +11,6 @@
namespace content { namespace content {
namespace {
void TerminateSharedWorkerOnIO(
WorkerDevToolsAgentHost::WorkerId worker_id) {
SharedWorkerServiceImpl::GetInstance()->TerminateWorker(
worker_id.first, worker_id.second);
}
} // namespace
SharedWorkerDevToolsAgentHost::SharedWorkerDevToolsAgentHost( SharedWorkerDevToolsAgentHost::SharedWorkerDevToolsAgentHost(
WorkerId worker_id, WorkerId worker_id,
const SharedWorkerInstance& shared_worker) const SharedWorkerInstance& shared_worker)
...@@ -49,9 +39,8 @@ void SharedWorkerDevToolsAgentHost::Reload() { ...@@ -49,9 +39,8 @@ void SharedWorkerDevToolsAgentHost::Reload() {
} }
bool SharedWorkerDevToolsAgentHost::Close() { bool SharedWorkerDevToolsAgentHost::Close() {
BrowserThread::PostTask( SharedWorkerServiceImpl::GetInstance()->TerminateWorker(worker_id().first,
BrowserThread::IO, FROM_HERE, worker_id().second);
base::BindOnce(&TerminateSharedWorkerOnIO, worker_id()));
return true; return true;
} }
......
...@@ -41,8 +41,10 @@ class CONTENT_EXPORT SharedWorkerServiceImpl : public WorkerService { ...@@ -41,8 +41,10 @@ class CONTENT_EXPORT SharedWorkerServiceImpl : public WorkerService {
// Returns the SharedWorkerServiceImpl singleton. // Returns the SharedWorkerServiceImpl singleton.
static SharedWorkerServiceImpl* GetInstance(); static SharedWorkerServiceImpl* GetInstance();
// Terminates the given worker. Returns true if the process was found.
bool TerminateWorker(int process_id, int route_id);
// WorkerService implementation: // WorkerService implementation:
bool TerminateWorker(int process_id, int route_id) override;
void TerminateAllWorkersForTesting(base::OnceClosure callback) override; void TerminateAllWorkersForTesting(base::OnceClosure callback) override;
std::vector<WorkerInfo> GetWorkers() override; std::vector<WorkerInfo> GetWorkers() override;
void AddObserver(WorkerServiceObserver* observer) override; void AddObserver(WorkerServiceObserver* observer) override;
......
...@@ -63,11 +63,6 @@ class CONTENT_EXPORT DevToolsAgentHost ...@@ -63,11 +63,6 @@ class CONTENT_EXPORT DevToolsAgentHost
// does exist. // does exist.
static bool HasFor(WebContents* web_contents); static bool HasFor(WebContents* web_contents);
// Returns DevToolsAgentHost that can be used for inspecting shared worker
// with given worker process host id and routing id.
static scoped_refptr<DevToolsAgentHost> GetForWorker(int worker_process_id,
int worker_route_id);
// Creates DevToolsAgentHost that communicates to the target by means of // Creates DevToolsAgentHost that communicates to the target by means of
// provided |delegate|. |delegate| ownership is passed to the created agent // provided |delegate|. |delegate| ownership is passed to the created agent
// host. // host.
......
...@@ -26,9 +26,6 @@ class CONTENT_EXPORT WorkerService { ...@@ -26,9 +26,6 @@ class CONTENT_EXPORT WorkerService {
// Returns the WorkerService singleton. // Returns the WorkerService singleton.
static WorkerService* GetInstance(); static WorkerService* GetInstance();
// Terminates the given worker. Returns true if the process was found.
virtual bool TerminateWorker(int process_id, int route_id) = 0;
// Terminates all workers and notifies when complete. This is used for // Terminates all workers and notifies when complete. This is used for
// testing when it is important to make sure that all shared worker activity // testing when it is important to make sure that all shared worker activity
// has stopped. // has stopped.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment