diff options
author | kinuko <kinuko@chromium.org> | 2014-12-18 00:15:53 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-12-18 08:16:27 +0000 |
commit | c97aaa143edd02f4e87f0197315fb60c2388c50c (patch) | |
tree | 55e0f146e8bd7dd9b216b79a2b4ef1bb0a14fb09 | |
parent | 7c8f8b2079fa20196cec4bbb284c6a727f1ecc41 (diff) | |
download | chromium_src-c97aaa143edd02f4e87f0197315fb60c2388c50c.zip chromium_src-c97aaa143edd02f4e87f0197315fb60c2388c50c.tar.gz chromium_src-c97aaa143edd02f4e87f0197315fb60c2388c50c.tar.bz2 |
Split EmbeddedWorkerDevToolsAgentHost into two for Shared- and ServiceWorker
Refactoring only, no changes in the code logic.
The code around Matches() is a bit awkward for now, I'm
going to clean up them too in a followup CL.
BUG=443470
Review URL: https://codereview.chromium.org/814513003
Cr-Commit-Position: refs/heads/master@{#308970}
8 files changed, 281 insertions, 145 deletions
diff --git a/content/browser/devtools/embedded_worker_devtools_agent_host.cc b/content/browser/devtools/embedded_worker_devtools_agent_host.cc index 955f04f..27b60fb 100644 --- a/content/browser/devtools/embedded_worker_devtools_agent_host.cc +++ b/content/browser/devtools/embedded_worker_devtools_agent_host.cc @@ -4,114 +4,20 @@ #include "content/browser/devtools/embedded_worker_devtools_agent_host.h" -#include "base/strings/utf_string_conversions.h" #include "content/browser/devtools/protocol/devtools_protocol_handler.h" -#include "content/browser/service_worker/service_worker_context_core.h" -#include "content/browser/service_worker/service_worker_version.h" -#include "content/browser/shared_worker/shared_worker_service_impl.h" #include "content/common/devtools_messages.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_process_host.h" namespace content { -namespace { - -void TerminateSharedWorkerOnIO( - EmbeddedWorkerDevToolsAgentHost::WorkerId worker_id) { - SharedWorkerServiceImpl::GetInstance()->TerminateWorker( - worker_id.first, worker_id.second); -} - -void StatusNoOp(ServiceWorkerStatusCode status) { -} - -void TerminateServiceWorkerOnIO( - base::WeakPtr<ServiceWorkerContextCore> context_weak, - int64 version_id) { - if (ServiceWorkerContextCore* context = context_weak.get()) { - if (ServiceWorkerVersion* version = context->GetLiveVersion(version_id)) - version->StopWorker(base::Bind(&StatusNoOp)); - } -} - -void SetDevToolsAttachedOnIO( - base::WeakPtr<ServiceWorkerContextCore> context_weak, - int64 version_id, - bool attached) { - if (ServiceWorkerContextCore* context = context_weak.get()) { - if (ServiceWorkerVersion* version = context->GetLiveVersion(version_id)) - version->SetDevToolsAttached(attached); - } -} - -} // namespace - -EmbeddedWorkerDevToolsAgentHost::EmbeddedWorkerDevToolsAgentHost( - WorkerId worker_id, - const SharedWorkerInstance& shared_worker) - : shared_worker_(new SharedWorkerInstance(shared_worker)), - state_(WORKER_UNINSPECTED), - worker_id_(worker_id) { - WorkerCreated(); -} - -EmbeddedWorkerDevToolsAgentHost::EmbeddedWorkerDevToolsAgentHost( - WorkerId worker_id, - const ServiceWorkerIdentifier& service_worker, - bool debug_service_worker_on_start) - : service_worker_(new ServiceWorkerIdentifier(service_worker)), - state_(WORKER_UNINSPECTED), - worker_id_(worker_id) { - if (debug_service_worker_on_start) - state_ = WORKER_PAUSED_FOR_DEBUG_ON_START; - WorkerCreated(); -} - bool EmbeddedWorkerDevToolsAgentHost::IsWorker() const { return true; } -DevToolsAgentHost::Type EmbeddedWorkerDevToolsAgentHost::GetType() { - return shared_worker_ ? TYPE_SHARED_WORKER : TYPE_SERVICE_WORKER; -} - -std::string EmbeddedWorkerDevToolsAgentHost::GetTitle() { - if (shared_worker_ && shared_worker_->name().length()) - return base::UTF16ToUTF8(shared_worker_->name()); - if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) { - return base::StringPrintf("Worker pid:%d", - base::GetProcId(host->GetHandle())); - } - return ""; -} - -GURL EmbeddedWorkerDevToolsAgentHost::GetURL() { - if (shared_worker_) - return shared_worker_->url(); - if (service_worker_) - return service_worker_->url(); - return GURL(); -} - -bool EmbeddedWorkerDevToolsAgentHost::Activate() { - return false; -} - -bool EmbeddedWorkerDevToolsAgentHost::Close() { - if (shared_worker_) { - BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, - base::Bind(&TerminateSharedWorkerOnIO, worker_id_)); - return true; - } - if (service_worker_) { - BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, - base::Bind(&TerminateServiceWorkerOnIO, - service_worker_->context_weak(), - service_worker_->version_id())); - return true; - } - return false; +BrowserContext* EmbeddedWorkerDevToolsAgentHost::GetBrowserContext() { + RenderProcessHost* rph = RenderProcessHost::FromID(worker_id_.first); + return rph ? rph->GetBrowserContext() : nullptr; } void EmbeddedWorkerDevToolsAgentHost::SendMessageToAgent( @@ -135,13 +41,6 @@ void EmbeddedWorkerDevToolsAgentHost::Attach() { void EmbeddedWorkerDevToolsAgentHost::OnClientAttached() { DevToolsAgentHostImpl::NotifyCallbacks(this, true); - if (service_worker_) { - BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, - base::Bind(&SetDevToolsAttachedOnIO, - service_worker_->context_weak(), - service_worker_->version_id(), - true)); - } } void EmbeddedWorkerDevToolsAgentHost::OnClientDetached() { @@ -152,13 +51,6 @@ void EmbeddedWorkerDevToolsAgentHost::OnClientDetached() { state_ = WORKER_UNINSPECTED; } DevToolsAgentHostImpl::NotifyCallbacks(this, false); - if (service_worker_) { - BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, - base::Bind(&SetDevToolsAttachedOnIO, - service_worker_->context_weak(), - service_worker_->version_id(), - false)); - } } bool EmbeddedWorkerDevToolsAgentHost::OnMessageReceived( @@ -208,21 +100,28 @@ void EmbeddedWorkerDevToolsAgentHost::WorkerDestroyed() { DetachFromWorker(); } state_ = WORKER_TERMINATED; - Release(); // Balanced in WorkerCreated() + Release(); // Balanced in WorkerCreated(). +} + +bool EmbeddedWorkerDevToolsAgentHost::IsTerminated() { + return state_ == WORKER_TERMINATED; } bool EmbeddedWorkerDevToolsAgentHost::Matches( const SharedWorkerInstance& other) { - return shared_worker_ && shared_worker_->Matches(other); + return false; } bool EmbeddedWorkerDevToolsAgentHost::Matches( const ServiceWorkerIdentifier& other) { - return service_worker_ && service_worker_->Matches(other); + return false; } -bool EmbeddedWorkerDevToolsAgentHost::IsTerminated() { - return state_ == WORKER_TERMINATED; +EmbeddedWorkerDevToolsAgentHost::EmbeddedWorkerDevToolsAgentHost( + WorkerId worker_id) + : state_(WORKER_UNINSPECTED), + worker_id_(worker_id) { + WorkerCreated(); } EmbeddedWorkerDevToolsAgentHost::~EmbeddedWorkerDevToolsAgentHost() { @@ -254,11 +153,6 @@ void EmbeddedWorkerDevToolsAgentHost::OnDispatchOnInspectorFrontend( ProcessChunkedMessageFromAgent(message, total_size); } -BrowserContext* EmbeddedWorkerDevToolsAgentHost::GetBrowserContext() { - RenderProcessHost* rph = RenderProcessHost::FromID(worker_id_.first); - return rph ? rph->GetBrowserContext() : nullptr; -} - void EmbeddedWorkerDevToolsAgentHost::OnSaveAgentRuntimeState( const std::string& state) { saved_agent_state_ = state; diff --git a/content/browser/devtools/embedded_worker_devtools_agent_host.h b/content/browser/devtools/embedded_worker_devtools_agent_host.h index 34adc7f..45dccdb 100644 --- a/content/browser/devtools/embedded_worker_devtools_agent_host.h +++ b/content/browser/devtools/embedded_worker_devtools_agent_host.h @@ -21,20 +21,8 @@ class EmbeddedWorkerDevToolsAgentHost : public IPCDevToolsAgentHost, typedef EmbeddedWorkerDevToolsManager::ServiceWorkerIdentifier ServiceWorkerIdentifier; - EmbeddedWorkerDevToolsAgentHost(WorkerId worker_id, - const SharedWorkerInstance& shared_worker); - - EmbeddedWorkerDevToolsAgentHost(WorkerId worker_id, - const ServiceWorkerIdentifier& service_worker, - bool debug_service_worker_on_start); - // DevToolsAgentHost override. bool IsWorker() const override; - Type GetType() override; - std::string GetTitle() override; - GURL GetURL() override; - bool Activate() override; - bool Close() override; BrowserContext* GetBrowserContext() override; // IPCDevToolsAgentHost implementation. @@ -49,13 +37,16 @@ class EmbeddedWorkerDevToolsAgentHost : public IPCDevToolsAgentHost, void WorkerReadyForInspection(); void WorkerRestarted(WorkerId worker_id); void WorkerDestroyed(); - bool Matches(const SharedWorkerInstance& other); - bool Matches(const ServiceWorkerIdentifier& other); bool IsTerminated(); - private: + // TODO(kinuko): Remove these virtual methods after we split devtools manager. + virtual bool Matches(const SharedWorkerInstance& other); + virtual bool Matches(const ServiceWorkerIdentifier& other); + + protected: friend class EmbeddedWorkerDevToolsManagerTest; + EmbeddedWorkerDevToolsAgentHost(WorkerId worker_id); ~EmbeddedWorkerDevToolsAgentHost() override; enum WorkerState { @@ -73,8 +64,10 @@ class EmbeddedWorkerDevToolsAgentHost : public IPCDevToolsAgentHost, uint32 total_size); void OnSaveAgentRuntimeState(const std::string& state); - scoped_ptr<SharedWorkerInstance> shared_worker_; - scoped_ptr<ServiceWorkerIdentifier> service_worker_; + void set_state(WorkerState state) { state_ = state; } + const WorkerId& worker_id() const { return worker_id_; } + + private: WorkerState state_; WorkerId worker_id_; std::string saved_agent_state_; diff --git a/content/browser/devtools/embedded_worker_devtools_manager.cc b/content/browser/devtools/embedded_worker_devtools_manager.cc index aad356c..f51cd2b 100644 --- a/content/browser/devtools/embedded_worker_devtools_manager.cc +++ b/content/browser/devtools/embedded_worker_devtools_manager.cc @@ -5,8 +5,9 @@ #include "content/browser/devtools/embedded_worker_devtools_manager.h" #include "content/browser/devtools/devtools_manager.h" -#include "content/browser/devtools/embedded_worker_devtools_agent_host.h" #include "content/browser/devtools/ipc_devtools_agent_host.h" +#include "content/browser/devtools/service_worker_devtools_agent_host.h" +#include "content/browser/devtools/shared_worker_devtools_agent_host.h" #include "content/browser/shared_worker/shared_worker_instance.h" #include "content/common/devtools_messages.h" #include "content/public/browser/browser_thread.h" @@ -102,7 +103,7 @@ bool EmbeddedWorkerDevToolsManager::SharedWorkerCreated( const WorkerId id(worker_process_id, worker_route_id); AgentHostMap::iterator it = FindExistingSharedWorkerAgentHost(instance); if (it == workers_.end()) { - workers_[id] = new EmbeddedWorkerDevToolsAgentHost(id, instance); + workers_[id] = new SharedWorkerDevToolsAgentHost(id, instance); DevToolsManager::GetInstance()->AgentHostChanged(workers_[id]); return false; } @@ -119,7 +120,7 @@ bool EmbeddedWorkerDevToolsManager::ServiceWorkerCreated( AgentHostMap::iterator it = FindExistingServiceWorkerAgentHost(service_worker_id); if (it == workers_.end()) { - workers_[id] = new EmbeddedWorkerDevToolsAgentHost( + workers_[id] = new ServiceWorkerDevToolsAgentHost( id, service_worker_id, debug_service_worker_on_start_); DevToolsManager::GetInstance()->AgentHostChanged(workers_[id]); return debug_service_worker_on_start_; diff --git a/content/browser/devtools/service_worker_devtools_agent_host.cc b/content/browser/devtools/service_worker_devtools_agent_host.cc new file mode 100644 index 0000000..26ed56c --- /dev/null +++ b/content/browser/devtools/service_worker_devtools_agent_host.cc @@ -0,0 +1,104 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/devtools/service_worker_devtools_agent_host.h" + +#include "base/strings/stringprintf.h" +#include "content/browser/service_worker/service_worker_context_core.h" +#include "content/browser/service_worker/service_worker_version.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/render_process_host.h" + +namespace content { + +namespace { + +void StatusNoOp(ServiceWorkerStatusCode status) {} + +void TerminateServiceWorkerOnIO( + base::WeakPtr<ServiceWorkerContextCore> context_weak, + int64 version_id) { + if (ServiceWorkerContextCore* context = context_weak.get()) { + if (ServiceWorkerVersion* version = context->GetLiveVersion(version_id)) + version->StopWorker(base::Bind(&StatusNoOp)); + } +} + +void SetDevToolsAttachedOnIO( + base::WeakPtr<ServiceWorkerContextCore> context_weak, + int64 version_id, + bool attached) { + if (ServiceWorkerContextCore* context = context_weak.get()) { + if (ServiceWorkerVersion* version = context->GetLiveVersion(version_id)) + version->SetDevToolsAttached(attached); + } +} + +} // namespace + +ServiceWorkerDevToolsAgentHost::ServiceWorkerDevToolsAgentHost( + WorkerId worker_id, + const ServiceWorkerIdentifier& service_worker, + bool debug_service_worker_on_start) + : EmbeddedWorkerDevToolsAgentHost(worker_id), + service_worker_(new ServiceWorkerIdentifier(service_worker)) { + if (debug_service_worker_on_start) + set_state(WORKER_PAUSED_FOR_DEBUG_ON_START); +} + +DevToolsAgentHost::Type ServiceWorkerDevToolsAgentHost::GetType() { + return TYPE_SERVICE_WORKER; +} + +std::string ServiceWorkerDevToolsAgentHost::GetTitle() { + if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id().first)) { + return base::StringPrintf("Worker pid:%d", + base::GetProcId(host->GetHandle())); + } + return ""; +} + +GURL ServiceWorkerDevToolsAgentHost::GetURL() { + return service_worker_->url(); +} + +bool ServiceWorkerDevToolsAgentHost::Activate() { + return false; +} + +bool ServiceWorkerDevToolsAgentHost::Close() { + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, + base::Bind(&TerminateServiceWorkerOnIO, + service_worker_->context_weak(), + service_worker_->version_id())); + return true; +} + +void ServiceWorkerDevToolsAgentHost::OnClientAttached() { + EmbeddedWorkerDevToolsAgentHost::OnClientAttached(); + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, + base::Bind(&SetDevToolsAttachedOnIO, + service_worker_->context_weak(), + service_worker_->version_id(), + true)); +} + +void ServiceWorkerDevToolsAgentHost::OnClientDetached() { + EmbeddedWorkerDevToolsAgentHost::OnClientDetached(); + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, + base::Bind(&SetDevToolsAttachedOnIO, + service_worker_->context_weak(), + service_worker_->version_id(), + false)); +} + +bool ServiceWorkerDevToolsAgentHost::Matches( + const ServiceWorkerIdentifier& other) { + return service_worker_->Matches(other); +} + +ServiceWorkerDevToolsAgentHost::~ServiceWorkerDevToolsAgentHost() { +} + +} // namespace content diff --git a/content/browser/devtools/service_worker_devtools_agent_host.h b/content/browser/devtools/service_worker_devtools_agent_host.h new file mode 100644 index 0000000..b11cb4f --- /dev/null +++ b/content/browser/devtools/service_worker_devtools_agent_host.h @@ -0,0 +1,41 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_DEVTOOLS_SERVICE_WORKER_DEVTOOLS_AGENT_HOST_H_ +#define CONTENT_BROWSER_DEVTOOLS_SERVICE_WORKER_DEVTOOLS_AGENT_HOST_H_ + +#include "content/browser/devtools/embedded_worker_devtools_agent_host.h" + +namespace content { + +class ServiceWorkerDevToolsAgentHost : public EmbeddedWorkerDevToolsAgentHost { + public: + ServiceWorkerDevToolsAgentHost(WorkerId worker_id, + const ServiceWorkerIdentifier& service_worker, + bool debug_service_worker_on_start); + + // DevToolsAgentHost override. + Type GetType() override; + std::string GetTitle() override; + GURL GetURL() override; + bool Activate() override; + bool Close() override; + + // IPCDevToolsAgentHost override. + void OnClientAttached() override; + void OnClientDetached() override; + + // EmbeddedWorkerDevToolsAgentHost override. + bool Matches(const ServiceWorkerIdentifier& other) override; + + private: + ~ServiceWorkerDevToolsAgentHost() override; + scoped_ptr<ServiceWorkerIdentifier> service_worker_; + + DISALLOW_COPY_AND_ASSIGN(ServiceWorkerDevToolsAgentHost); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_DEVTOOLS_SERVICE_WORKER_DEVTOOLS_AGENT_HOST_H_ diff --git a/content/browser/devtools/shared_worker_devtools_agent_host.cc b/content/browser/devtools/shared_worker_devtools_agent_host.cc new file mode 100644 index 0000000..61133a5 --- /dev/null +++ b/content/browser/devtools/shared_worker_devtools_agent_host.cc @@ -0,0 +1,61 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/devtools/shared_worker_devtools_agent_host.h" + +#include "base/strings/utf_string_conversions.h" +#include "content/browser/shared_worker/shared_worker_service_impl.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/render_process_host.h" + +namespace content { + +namespace { + +void TerminateSharedWorkerOnIO( + EmbeddedWorkerDevToolsAgentHost::WorkerId worker_id) { + SharedWorkerServiceImpl::GetInstance()->TerminateWorker( + worker_id.first, worker_id.second); +} + +} // namespace + +SharedWorkerDevToolsAgentHost::SharedWorkerDevToolsAgentHost( + WorkerId worker_id, + const SharedWorkerInstance& shared_worker) + : EmbeddedWorkerDevToolsAgentHost(worker_id), + shared_worker_(new SharedWorkerInstance(shared_worker)) { +} + +DevToolsAgentHost::Type SharedWorkerDevToolsAgentHost::GetType() { + return TYPE_SHARED_WORKER; +} + +std::string SharedWorkerDevToolsAgentHost::GetTitle() { + return base::UTF16ToUTF8(shared_worker_->name()); +} + +GURL SharedWorkerDevToolsAgentHost::GetURL() { + return shared_worker_->url(); +} + +bool SharedWorkerDevToolsAgentHost::Activate() { + return false; +} + +bool SharedWorkerDevToolsAgentHost::Close() { + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, + base::Bind(&TerminateSharedWorkerOnIO, worker_id())); + return true; +} + +bool SharedWorkerDevToolsAgentHost::Matches( + const SharedWorkerInstance& other) { + return shared_worker_->Matches(other); +} + +SharedWorkerDevToolsAgentHost::~SharedWorkerDevToolsAgentHost() { +} + +} // namespace content diff --git a/content/browser/devtools/shared_worker_devtools_agent_host.h b/content/browser/devtools/shared_worker_devtools_agent_host.h new file mode 100644 index 0000000..aadb209 --- /dev/null +++ b/content/browser/devtools/shared_worker_devtools_agent_host.h @@ -0,0 +1,38 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_DEVTOOLS_SHARED_WORKER_DEVTOOLS_AGENT_HOST_H_ +#define CONTENT_BROWSER_DEVTOOLS_SHARED_WORKER_DEVTOOLS_AGENT_HOST_H_ + +#include "content/browser/devtools/embedded_worker_devtools_agent_host.h" + +namespace content { + +class SharedWorkerInstance; + +class SharedWorkerDevToolsAgentHost : public EmbeddedWorkerDevToolsAgentHost { + public: + SharedWorkerDevToolsAgentHost(WorkerId worker_id, + const SharedWorkerInstance& shared_worker); + + // DevToolsAgentHost override. + Type GetType() override; + std::string GetTitle() override; + GURL GetURL() override; + bool Activate() override; + bool Close() override; + + // EmbeddedWorkerDevToolsAgentHost override. + bool Matches(const SharedWorkerInstance& other) override; + + private: + ~SharedWorkerDevToolsAgentHost() override; + scoped_ptr<SharedWorkerInstance> shared_worker_; + + DISALLOW_COPY_AND_ASSIGN(SharedWorkerDevToolsAgentHost); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_DEVTOOLS_SHARED_WORKER_DEVTOOLS_AGENT_HOST_H_ diff --git a/content/content_browser.gypi b/content/content_browser.gypi index 4e2ea09..f45d2ec 100644 --- a/content/content_browser.gypi +++ b/content/content_browser.gypi @@ -450,14 +450,14 @@ 'browser/devtools/devtools_manager.h', 'browser/devtools/devtools_netlog_observer.cc', 'browser/devtools/devtools_netlog_observer.h', - 'browser/devtools/forwarding_agent_host.cc', - 'browser/devtools/forwarding_agent_host.h', - 'browser/devtools/ipc_devtools_agent_host.cc', - 'browser/devtools/ipc_devtools_agent_host.h', 'browser/devtools/embedded_worker_devtools_agent_host.cc', 'browser/devtools/embedded_worker_devtools_agent_host.h', 'browser/devtools/embedded_worker_devtools_manager.cc', 'browser/devtools/embedded_worker_devtools_manager.h', + 'browser/devtools/forwarding_agent_host.cc', + 'browser/devtools/forwarding_agent_host.h', + 'browser/devtools/ipc_devtools_agent_host.cc', + 'browser/devtools/ipc_devtools_agent_host.h', 'browser/devtools/protocol/color_picker.cc', 'browser/devtools/protocol/color_picker.h', 'browser/devtools/protocol/devtools_protocol_client.cc', @@ -490,6 +490,10 @@ 'browser/devtools/protocol/worker_handler.h', 'browser/devtools/render_view_devtools_agent_host.cc', 'browser/devtools/render_view_devtools_agent_host.h', + 'browser/devtools/service_worker_devtools_agent_host.cc', + 'browser/devtools/service_worker_devtools_agent_host.h', + 'browser/devtools/shared_worker_devtools_agent_host.cc', + 'browser/devtools/shared_worker_devtools_agent_host.h', 'browser/device_monitor_mac.h', 'browser/device_monitor_mac.mm', 'browser/device_monitor_udev.cc', |