Commit 52083d87 authored by Johannes Henkel's avatar Johannes Henkel Committed by Commit Bot

Migrate more agents to the new InspectorSessionState.

- InspectorWorkerAgent
- InspectorTracingAgent
- InspectorAnimationAgent
- InspectorPageAgent (started earlier)

For reference the PR that introduced the new
InspectorSessionState / InspectorAgentState / Fields
was https://chromium-review.googlesource.com/c/chromium/src/+/1149201.

Change-Id: Id0e94a9c944341fa2c08dcb3d7bfb00c4b437614
Reviewed-on: https://chromium-review.googlesource.com/1152695Reviewed-by: default avatarAndrey Kosyakov <caseq@chromium.org>
Commit-Queue: Johannes Henkel <johannes@chromium.org>
Cr-Commit-Position: refs/heads/master@{#578877}
parent d8d5fff4
...@@ -33,11 +33,6 @@ ...@@ -33,11 +33,6 @@
#include "third_party/blink/renderer/platform/animation/timing_function.h" #include "third_party/blink/renderer/platform/animation/timing_function.h"
#include "third_party/blink/renderer/platform/wtf/text/base64.h" #include "third_party/blink/renderer/platform/wtf/text/base64.h"
namespace AnimationAgentState {
static const char animationAgentEnabled[] = "animationAgentEnabled";
static const char animationAgentPlaybackRate[] = "animationAgentPlaybackRate";
} // namespace AnimationAgentState
namespace blink { namespace blink {
using protocol::Response; using protocol::Response;
...@@ -49,30 +44,26 @@ InspectorAnimationAgent::InspectorAnimationAgent( ...@@ -49,30 +44,26 @@ InspectorAnimationAgent::InspectorAnimationAgent(
: inspected_frames_(inspected_frames), : inspected_frames_(inspected_frames),
css_agent_(css_agent), css_agent_(css_agent),
v8_session_(v8_session), v8_session_(v8_session),
is_cloning_(false) {} is_cloning_(false),
enabled_(&agent_state_, /*default_value=*/false),
playback_rate_(&agent_state_, /*default_value=*/1.0) {}
void InspectorAnimationAgent::Restore() { void InspectorAnimationAgent::Restore() {
if (state_->booleanProperty(AnimationAgentState::animationAgentEnabled, if (enabled_.Get())
false)) { setPlaybackRate(playback_rate_.Get());
enable();
double playback_rate = 1;
state_->getDouble(AnimationAgentState::animationAgentPlaybackRate,
&playback_rate);
setPlaybackRate(playback_rate);
}
} }
Response InspectorAnimationAgent::enable() { Response InspectorAnimationAgent::enable() {
state_->setBoolean(AnimationAgentState::animationAgentEnabled, true); enabled_.Set(true);
instrumenting_agents_->addInspectorAnimationAgent(this); instrumenting_agents_->addInspectorAnimationAgent(this);
return Response::OK(); return Response::OK();
} }
Response InspectorAnimationAgent::disable() { Response InspectorAnimationAgent::disable() {
setPlaybackRate(1); setPlaybackRate(1.0);
for (const auto& clone : id_to_animation_clone_.Values()) for (const auto& clone : id_to_animation_clone_.Values())
clone->cancel(); clone->cancel();
state_->setBoolean(AnimationAgentState::animationAgentEnabled, false); enabled_.Clear();
instrumenting_agents_->removeInspectorAnimationAgent(this); instrumenting_agents_->removeInspectorAnimationAgent(this);
id_to_animation_.clear(); id_to_animation_.clear();
id_to_animation_type_.clear(); id_to_animation_type_.clear();
...@@ -88,10 +79,7 @@ void InspectorAnimationAgent::DidCommitLoadForLocalFrame(LocalFrame* frame) { ...@@ -88,10 +79,7 @@ void InspectorAnimationAgent::DidCommitLoadForLocalFrame(LocalFrame* frame) {
id_to_animation_clone_.clear(); id_to_animation_clone_.clear();
cleared_animations_.clear(); cleared_animations_.clear();
} }
double playback_rate = 1; setPlaybackRate(playback_rate_.Get());
state_->getDouble(AnimationAgentState::animationAgentPlaybackRate,
&playback_rate);
setPlaybackRate(playback_rate);
} }
static std::unique_ptr<protocol::Animation::AnimationEffect> static std::unique_ptr<protocol::Animation::AnimationEffect>
...@@ -234,8 +222,7 @@ Response InspectorAnimationAgent::getPlaybackRate(double* playback_rate) { ...@@ -234,8 +222,7 @@ Response InspectorAnimationAgent::getPlaybackRate(double* playback_rate) {
Response InspectorAnimationAgent::setPlaybackRate(double playback_rate) { Response InspectorAnimationAgent::setPlaybackRate(double playback_rate) {
for (LocalFrame* frame : *inspected_frames_) for (LocalFrame* frame : *inspected_frames_)
frame->GetDocument()->Timeline().SetPlaybackRate(playback_rate); frame->GetDocument()->Timeline().SetPlaybackRate(playback_rate);
state_->setDouble(AnimationAgentState::animationAgentPlaybackRate, playback_rate_.Set(playback_rate);
playback_rate);
return Response::OK(); return Response::OK();
} }
...@@ -525,8 +512,7 @@ void InspectorAnimationAgent::AnimationPlayStateChanged( ...@@ -525,8 +512,7 @@ void InspectorAnimationAgent::AnimationPlayStateChanged(
void InspectorAnimationAgent::DidClearDocumentOfWindowObject( void InspectorAnimationAgent::DidClearDocumentOfWindowObject(
LocalFrame* frame) { LocalFrame* frame) {
if (!state_->booleanProperty(AnimationAgentState::animationAgentEnabled, if (!enabled_.Get())
false))
return; return;
DCHECK(frame->GetDocument()); DCHECK(frame->GetDocument());
frame->GetDocument()->Timeline().SetPlaybackRate( frame->GetDocument()->Timeline().SetPlaybackRate(
......
...@@ -90,6 +90,8 @@ class CORE_EXPORT InspectorAnimationAgent final ...@@ -90,6 +90,8 @@ class CORE_EXPORT InspectorAnimationAgent final
HashMap<String, String> id_to_animation_type_; HashMap<String, String> id_to_animation_type_;
bool is_cloning_; bool is_cloning_;
HashSet<String> cleared_animations_; HashSet<String> cleared_animations_;
InspectorAgentState::Boolean enabled_;
InspectorAgentState::Double playback_rate_;
DISALLOW_COPY_AND_ASSIGN(InspectorAnimationAgent); DISALLOW_COPY_AND_ASSIGN(InspectorAnimationAgent);
}; };
......
...@@ -239,11 +239,24 @@ class CORE_EXPORT InspectorPageAgent final ...@@ -239,11 +239,24 @@ class CORE_EXPORT InspectorPageAgent final
long last_script_identifier_; long last_script_identifier_;
String pending_script_to_evaluate_on_load_once_; String pending_script_to_evaluate_on_load_once_;
String script_to_evaluate_on_load_once_; String script_to_evaluate_on_load_once_;
bool enabled_;
bool reloading_; bool reloading_;
Member<InspectorResourceContentLoader> inspector_resource_content_loader_; Member<InspectorResourceContentLoader> inspector_resource_content_loader_;
int resource_content_loader_client_id_; int resource_content_loader_client_id_;
InspectorAgentState::Boolean enabled_;
InspectorAgentState::Boolean screencast_enabled_;
InspectorAgentState::Boolean lifecycle_events_enabled_;
InspectorAgentState::Boolean bypass_csp_enabled_;
InspectorAgentState::StringMap scripts_to_evaluate_on_load_; InspectorAgentState::StringMap scripts_to_evaluate_on_load_;
InspectorAgentState::String standard_font_family_;
InspectorAgentState::String fixed_font_family_;
InspectorAgentState::String serif_font_family_;
InspectorAgentState::String sans_serif_font_family_;
InspectorAgentState::String cursive_font_family_;
InspectorAgentState::String fantasy_font_family_;
InspectorAgentState::String pictograph_font_family_;
InspectorAgentState::Integer standard_font_size_;
InspectorAgentState::Integer fixed_font_size_;
InspectorAgentState::Boolean produce_compilation_cache_;
DISALLOW_COPY_AND_ASSIGN(InspectorPageAgent); DISALLOW_COPY_AND_ASSIGN(InspectorPageAgent);
}; };
......
...@@ -15,17 +15,14 @@ namespace blink { ...@@ -15,17 +15,14 @@ namespace blink {
using protocol::Maybe; using protocol::Maybe;
using protocol::Response; using protocol::Response;
namespace TracingAgentState {
const char kSessionId[] = "sessionId";
}
namespace { namespace {
const char kDevtoolsMetadataEventCategory[] = const char kDevtoolsMetadataEventCategory[] =
TRACE_DISABLED_BY_DEFAULT("devtools.timeline"); TRACE_DISABLED_BY_DEFAULT("devtools.timeline");
} }
InspectorTracingAgent::InspectorTracingAgent(InspectedFrames* inspected_frames) InspectorTracingAgent::InspectorTracingAgent(InspectedFrames* inspected_frames)
: inspected_frames_(inspected_frames) {} : session_id_(&agent_state_, /*default_value=*/ WTF::String()),
inspected_frames_(inspected_frames) {}
InspectorTracingAgent::~InspectorTracingAgent() {} InspectorTracingAgent::~InspectorTracingAgent() {}
...@@ -35,7 +32,6 @@ void InspectorTracingAgent::Trace(blink::Visitor* visitor) { ...@@ -35,7 +32,6 @@ void InspectorTracingAgent::Trace(blink::Visitor* visitor) {
} }
void InspectorTracingAgent::Restore() { void InspectorTracingAgent::Restore() {
state_->getString(TracingAgentState::kSessionId, &session_id_);
if (IsStarted()) if (IsStarted())
EmitMetadataEvents(); EmitMetadataEvents();
} }
...@@ -54,8 +50,7 @@ void InspectorTracingAgent::start(Maybe<String> categories, ...@@ -54,8 +50,7 @@ void InspectorTracingAgent::start(Maybe<String> categories,
return; return;
} }
session_id_ = IdentifiersFactory::CreateIdentifier(); session_id_.Set(IdentifiersFactory::CreateIdentifier());
state_->setString(TracingAgentState::kSessionId, session_id_);
// Tracing is already started by DevTools TracingHandler::Start for the // Tracing is already started by DevTools TracingHandler::Start for the
// renderer target in the browser process. It will eventually start tracing // renderer target in the browser process. It will eventually start tracing
...@@ -75,14 +70,14 @@ void InspectorTracingAgent::end(std::unique_ptr<EndCallback> callback) { ...@@ -75,14 +70,14 @@ void InspectorTracingAgent::end(std::unique_ptr<EndCallback> callback) {
} }
bool InspectorTracingAgent::IsStarted() const { bool InspectorTracingAgent::IsStarted() const {
return !session_id_.IsEmpty(); return !session_id_.Get().IsEmpty();
} }
void InspectorTracingAgent::EmitMetadataEvents() { void InspectorTracingAgent::EmitMetadataEvents() {
TRACE_EVENT_INSTANT1(kDevtoolsMetadataEventCategory, "TracingStartedInPage", TRACE_EVENT_INSTANT1(kDevtoolsMetadataEventCategory, "TracingStartedInPage",
TRACE_EVENT_SCOPE_THREAD, "data", TRACE_EVENT_SCOPE_THREAD, "data",
InspectorTracingStartedInFrame::Data( InspectorTracingStartedInFrame::Data(
session_id_, inspected_frames_->Root())); session_id_.Get(), inspected_frames_->Root()));
} }
Response InspectorTracingAgent::disable() { Response InspectorTracingAgent::disable() {
...@@ -91,8 +86,7 @@ Response InspectorTracingAgent::disable() { ...@@ -91,8 +86,7 @@ Response InspectorTracingAgent::disable() {
} }
void InspectorTracingAgent::InnerDisable() { void InspectorTracingAgent::InnerDisable() {
state_->remove(TracingAgentState::kSessionId); session_id_.Clear();
session_id_ = String();
} }
} // namespace blink } // namespace blink
...@@ -44,7 +44,7 @@ class CORE_EXPORT InspectorTracingAgent final ...@@ -44,7 +44,7 @@ class CORE_EXPORT InspectorTracingAgent final
void InnerDisable(); void InnerDisable();
bool IsStarted() const; bool IsStarted() const;
String session_id_; InspectorAgentState::String session_id_;
Member<InspectedFrames> inspected_frames_; Member<InspectedFrames> inspected_frames_;
DISALLOW_COPY_AND_ASSIGN(InspectorTracingAgent); DISALLOW_COPY_AND_ASSIGN(InspectorTracingAgent);
......
...@@ -44,52 +44,47 @@ namespace blink { ...@@ -44,52 +44,47 @@ namespace blink {
using protocol::Maybe; using protocol::Maybe;
using protocol::Response; using protocol::Response;
namespace WorkerAgentState {
static const char kAutoAttach[] = "autoAttach";
static const char kWaitForDebuggerOnStart[] = "waitForDebuggerOnStart";
static const char kAttachedSessionIds[] = "attachedSessionIds";
}; // namespace WorkerAgentState
int InspectorWorkerAgent::s_last_connection_ = 0; int InspectorWorkerAgent::s_last_connection_ = 0;
InspectorWorkerAgent::InspectorWorkerAgent( InspectorWorkerAgent::InspectorWorkerAgent(
InspectedFrames* inspected_frames, InspectedFrames* inspected_frames,
WorkerGlobalScope* worker_global_scope) WorkerGlobalScope* worker_global_scope)
: inspected_frames_(inspected_frames), : inspected_frames_(inspected_frames),
worker_global_scope_(worker_global_scope) {} worker_global_scope_(worker_global_scope),
auto_attach_(&agent_state_, /*default_value=*/ false),
wait_for_debugger_on_start_(&agent_state_, /*default_value=*/ false),
attached_session_ids_(&agent_state_, /*default_value*/ false) {}
InspectorWorkerAgent::~InspectorWorkerAgent() = default; InspectorWorkerAgent::~InspectorWorkerAgent() = default;
void InspectorWorkerAgent::Restore() { void InspectorWorkerAgent::Restore() {
if (!AutoAttachEnabled()) if (!auto_attach_.Get())
return; return;
instrumenting_agents_->addInspectorWorkerAgent(this); instrumenting_agents_->addInspectorWorkerAgent(this);
protocol::DictionaryValue* attached = AttachedSessionIds(); for (const WTF::String& session_id : attached_session_ids_.Keys())
for (size_t i = 0; i < attached->size(); ++i) GetFrontend()->detachedFromTarget(session_id);
GetFrontend()->detachedFromTarget(attached->at(i).first); attached_session_ids_.ClearAll();
state_->remove(WorkerAgentState::kAttachedSessionIds);
ConnectToAllProxies(); ConnectToAllProxies();
} }
Response InspectorWorkerAgent::disable() { Response InspectorWorkerAgent::disable() {
if (AutoAttachEnabled()) { if (auto_attach_.Get()) {
DisconnectFromAllProxies(false); DisconnectFromAllProxies(false);
instrumenting_agents_->removeInspectorWorkerAgent(this); instrumenting_agents_->removeInspectorWorkerAgent(this);
} }
state_->setBoolean(WorkerAgentState::kAutoAttach, false); auto_attach_.Clear();
state_->setBoolean(WorkerAgentState::kWaitForDebuggerOnStart, false); wait_for_debugger_on_start_.Clear();
state_->remove(WorkerAgentState::kAttachedSessionIds); attached_session_ids_.ClearAll();
return Response::OK(); return Response::OK();
} }
Response InspectorWorkerAgent::setAutoAttach(bool auto_attach, Response InspectorWorkerAgent::setAutoAttach(bool auto_attach,
bool wait_for_debugger_on_start) { bool wait_for_debugger_on_start) {
state_->setBoolean(WorkerAgentState::kWaitForDebuggerOnStart, wait_for_debugger_on_start_.Set(wait_for_debugger_on_start);
wait_for_debugger_on_start);
if (auto_attach == AutoAttachEnabled()) if (auto_attach == auto_attach_.Get())
return Response::OK(); return Response::OK();
state_->setBoolean(WorkerAgentState::kAutoAttach, auto_attach); auto_attach_.Set(auto_attach);
if (auto_attach) { if (auto_attach) {
instrumenting_agents_->addInspectorWorkerAgent(this); instrumenting_agents_->addInspectorWorkerAgent(this);
ConnectToAllProxies(); ConnectToAllProxies();
...@@ -100,10 +95,6 @@ Response InspectorWorkerAgent::setAutoAttach(bool auto_attach, ...@@ -100,10 +95,6 @@ Response InspectorWorkerAgent::setAutoAttach(bool auto_attach,
return Response::OK(); return Response::OK();
} }
bool InspectorWorkerAgent::AutoAttachEnabled() {
return state_->booleanProperty(WorkerAgentState::kAutoAttach, false);
}
Response InspectorWorkerAgent::sendMessageToTarget(const String& message, Response InspectorWorkerAgent::sendMessageToTarget(const String& message,
Maybe<String> session_id, Maybe<String> session_id,
Maybe<String> target_id) { Maybe<String> target_id) {
...@@ -134,26 +125,25 @@ Response InspectorWorkerAgent::sendMessageToTarget(const String& message, ...@@ -134,26 +125,25 @@ Response InspectorWorkerAgent::sendMessageToTarget(const String& message,
} }
void InspectorWorkerAgent::ShouldWaitForDebuggerOnWorkerStart(bool* result) { void InspectorWorkerAgent::ShouldWaitForDebuggerOnWorkerStart(bool* result) {
if (AutoAttachEnabled() && if (auto_attach_.Get() && wait_for_debugger_on_start_.Get())
state_->booleanProperty(WorkerAgentState::kWaitForDebuggerOnStart, false))
*result = true; *result = true;
} }
void InspectorWorkerAgent::DidStartWorker(WorkerInspectorProxy* proxy, void InspectorWorkerAgent::DidStartWorker(WorkerInspectorProxy* proxy,
bool waiting_for_debugger) { bool waiting_for_debugger) {
DCHECK(GetFrontend() && AutoAttachEnabled()); DCHECK(GetFrontend() && auto_attach_.Get());
ConnectToProxy(proxy, waiting_for_debugger); ConnectToProxy(proxy, waiting_for_debugger);
} }
void InspectorWorkerAgent::WorkerTerminated(WorkerInspectorProxy* proxy) { void InspectorWorkerAgent::WorkerTerminated(WorkerInspectorProxy* proxy) {
DCHECK(GetFrontend() && AutoAttachEnabled()); DCHECK(GetFrontend() && auto_attach_.Get());
Vector<String> session_ids; Vector<String> session_ids;
for (auto& it : session_id_to_connection_) { for (auto& it : session_id_to_connection_) {
if (connected_proxies_.at(it.value) == proxy) if (connected_proxies_.at(it.value) == proxy)
session_ids.push_back(it.key); session_ids.push_back(it.key);
} }
for (const String& session_id : session_ids) { for (const String& session_id : session_ids) {
AttachedSessionIds()->remove(session_id); attached_session_ids_.Clear(session_id);
GetFrontend()->detachedFromTarget(session_id, proxy->InspectorId()); GetFrontend()->detachedFromTarget(session_id, proxy->InspectorId());
int connection = session_id_to_connection_.at(session_id); int connection = session_id_to_connection_.at(session_id);
proxy->DisconnectFromInspector(connection, this); proxy->DisconnectFromInspector(connection, this);
...@@ -186,7 +176,7 @@ void InspectorWorkerAgent::DisconnectFromAllProxies(bool report_to_frontend) { ...@@ -186,7 +176,7 @@ void InspectorWorkerAgent::DisconnectFromAllProxies(bool report_to_frontend) {
for (auto& it : session_id_to_connection_) { for (auto& it : session_id_to_connection_) {
WorkerInspectorProxy* proxy = connected_proxies_.at(it.value); WorkerInspectorProxy* proxy = connected_proxies_.at(it.value);
if (report_to_frontend) { if (report_to_frontend) {
AttachedSessionIds()->remove(it.key); attached_session_ids_.Clear(it.key);
GetFrontend()->detachedFromTarget(it.key, proxy->InspectorId()); GetFrontend()->detachedFromTarget(it.key, proxy->InspectorId());
} }
proxy->DisconnectFromInspector(it.value, this); proxy->DisconnectFromInspector(it.value, this);
...@@ -197,7 +187,7 @@ void InspectorWorkerAgent::DisconnectFromAllProxies(bool report_to_frontend) { ...@@ -197,7 +187,7 @@ void InspectorWorkerAgent::DisconnectFromAllProxies(bool report_to_frontend) {
} }
void InspectorWorkerAgent::DidCommitLoadForLocalFrame(LocalFrame* frame) { void InspectorWorkerAgent::DidCommitLoadForLocalFrame(LocalFrame* frame) {
if (!AutoAttachEnabled() || frame != inspected_frames_->Root()) if (!auto_attach_.Get() || frame != inspected_frames_->Root())
return; return;
// During navigation workers from old page may die after a while. // During navigation workers from old page may die after a while.
...@@ -206,19 +196,6 @@ void InspectorWorkerAgent::DidCommitLoadForLocalFrame(LocalFrame* frame) { ...@@ -206,19 +196,6 @@ void InspectorWorkerAgent::DidCommitLoadForLocalFrame(LocalFrame* frame) {
DisconnectFromAllProxies(true); DisconnectFromAllProxies(true);
} }
protocol::DictionaryValue* InspectorWorkerAgent::AttachedSessionIds() {
protocol::DictionaryValue* ids =
state_->getObject(WorkerAgentState::kAttachedSessionIds);
if (!ids) {
std::unique_ptr<protocol::DictionaryValue> new_ids =
protocol::DictionaryValue::create();
ids = new_ids.get();
state_->setObject(WorkerAgentState::kAttachedSessionIds,
std::move(new_ids));
}
return ids;
}
void InspectorWorkerAgent::ConnectToProxy(WorkerInspectorProxy* proxy, void InspectorWorkerAgent::ConnectToProxy(WorkerInspectorProxy* proxy,
bool waiting_for_debugger) { bool waiting_for_debugger) {
int connection = ++s_last_connection_; int connection = ++s_last_connection_;
...@@ -230,7 +207,7 @@ void InspectorWorkerAgent::ConnectToProxy(WorkerInspectorProxy* proxy, ...@@ -230,7 +207,7 @@ void InspectorWorkerAgent::ConnectToProxy(WorkerInspectorProxy* proxy,
proxy->ConnectToInspector(connection, this); proxy->ConnectToInspector(connection, this);
DCHECK(GetFrontend()); DCHECK(GetFrontend());
AttachedSessionIds()->setBoolean(session_id, true); attached_session_ids_.Set(session_id, true);
GetFrontend()->attachedToTarget(session_id, GetFrontend()->attachedToTarget(session_id,
protocol::Target::TargetInfo::create() protocol::Target::TargetInfo::create()
.setTargetId(proxy->InspectorId()) .setTargetId(proxy->InspectorId())
......
...@@ -70,11 +70,9 @@ class CORE_EXPORT InspectorWorkerAgent final ...@@ -70,11 +70,9 @@ class CORE_EXPORT InspectorWorkerAgent final
protocol::Maybe<String> target_id) override; protocol::Maybe<String> target_id) override;
private: private:
bool AutoAttachEnabled();
void ConnectToAllProxies(); void ConnectToAllProxies();
void DisconnectFromAllProxies(bool report_to_frontend); void DisconnectFromAllProxies(bool report_to_frontend);
void ConnectToProxy(WorkerInspectorProxy*, bool waiting_for_debugger); void ConnectToProxy(WorkerInspectorProxy*, bool waiting_for_debugger);
protocol::DictionaryValue* AttachedSessionIds();
// WorkerInspectorProxy::PageInspector implementation. // WorkerInspectorProxy::PageInspector implementation.
void DispatchMessageFromWorker(WorkerInspectorProxy*, void DispatchMessageFromWorker(WorkerInspectorProxy*,
...@@ -88,6 +86,9 @@ class CORE_EXPORT InspectorWorkerAgent final ...@@ -88,6 +86,9 @@ class CORE_EXPORT InspectorWorkerAgent final
HeapHashMap<int, Member<WorkerInspectorProxy>> connected_proxies_; HeapHashMap<int, Member<WorkerInspectorProxy>> connected_proxies_;
HashMap<int, String> connection_to_session_id_; HashMap<int, String> connection_to_session_id_;
HashMap<String, int> session_id_to_connection_; HashMap<String, int> session_id_to_connection_;
InspectorAgentState::Boolean auto_attach_;
InspectorAgentState::Boolean wait_for_debugger_on_start_;
InspectorAgentState::BooleanMap attached_session_ids_;
static int s_last_connection_; static int s_last_connection_;
DISALLOW_COPY_AND_ASSIGN(InspectorWorkerAgent); DISALLOW_COPY_AND_ASSIGN(InspectorWorkerAgent);
}; };
......
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