// Copyright (c) 2012 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 "webkit/tools/test_shell/test_shell_devtools_agent.h" #include "base/bind.h" #include "base/message_loop.h" #include "grit/webkit_chromium_resources.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebDevToolsAgent.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" #include "webkit/tools/test_shell/test_shell_devtools_callargs.h" #include "webkit/tools/test_shell/test_shell_devtools_client.h" #include "webkit/glue/webkit_glue.h" using WebKit::WebCString; using WebKit::WebDevToolsAgent; using WebKit::WebDevToolsMessageData; using WebKit::WebString; using WebKit::WebView; namespace { class WebKitClientMessageLoopImpl : public WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop { public: WebKitClientMessageLoopImpl() : message_loop_(MessageLoop::current()) { } virtual ~WebKitClientMessageLoopImpl() { message_loop_ = NULL; } virtual void run() { MessageLoop::ScopedNestableTaskAllower allow(message_loop_); message_loop_->Run(); } virtual void quitNow() { message_loop_->QuitNow(); } private: MessageLoop* message_loop_; }; } // namespace TestShellDevToolsAgent::TestShellDevToolsAgent() : ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), dev_tools_client_(NULL) { static int dev_tools_agent_counter; routing_id_ = ++dev_tools_agent_counter; } TestShellDevToolsAgent::~TestShellDevToolsAgent() { } void TestShellDevToolsAgent::SetWebView(WebKit::WebView* web_view) { web_view_ = web_view; } void TestShellDevToolsAgent::sendMessageToInspectorFrontend( const WebString& data) { if (dev_tools_client_) dev_tools_client_->AsyncCall(TestShellDevToolsCallArgs(data)); } int TestShellDevToolsAgent::hostIdentifier() { return routing_id_; } void TestShellDevToolsAgent::runtimePropertyChanged( const WebKit::WebString& name, const WebKit::WebString& value) { // TODO: Implement. } WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop* TestShellDevToolsAgent::createClientMessageLoop() { return new WebKitClientMessageLoopImpl(); } void TestShellDevToolsAgent::AsyncCall(const TestShellDevToolsCallArgs &args) { MessageLoop::current()->PostTask( FROM_HERE, base::Bind(&TestShellDevToolsAgent::Call, weak_factory_.GetWeakPtr(), args)); } void TestShellDevToolsAgent::Call(const TestShellDevToolsCallArgs &args) { WebDevToolsAgent* web_agent = GetWebAgent(); if (web_agent) web_agent->dispatchOnInspectorBackend(args.data_); if (TestShellDevToolsCallArgs::calls_count() == 1 && dev_tools_client_) dev_tools_client_->all_messages_processed(); } WebDevToolsAgent* TestShellDevToolsAgent::GetWebAgent() { if (!web_view_) return NULL; return web_view_->devToolsAgent(); } void TestShellDevToolsAgent::attach(TestShellDevToolsClient* client) { DCHECK(!dev_tools_client_); dev_tools_client_ = client; WebDevToolsAgent *web_agent = GetWebAgent(); if (web_agent) web_agent->attach(); } void TestShellDevToolsAgent::detach() { DCHECK(dev_tools_client_); WebDevToolsAgent* web_agent = GetWebAgent(); if (web_agent) web_agent->detach(); dev_tools_client_ = NULL; } bool TestShellDevToolsAgent::evaluateInWebInspector( long call_id, const std::string& script) { WebDevToolsAgent* agent = GetWebAgent(); if (!agent) return false; agent->evaluateInWebInspector(call_id, WebString::fromUTF8(script)); return true; }