Index: components/html_viewer/devtools_agent_impl.cc |
diff --git a/components/html_viewer/devtools_agent_impl.cc b/components/html_viewer/devtools_agent_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..82542c33a59d394e2bbc10120bcba42d0680d65d |
--- /dev/null |
+++ b/components/html_viewer/devtools_agent_impl.cc |
@@ -0,0 +1,103 @@ |
+// Copyright 2015 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 "components/html_viewer/devtools_agent_impl.h" |
+ |
+#include <string> |
+ |
+#include "base/json/json_reader.h" |
+#include "base/logging.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/values.h" |
+#include "mojo/application/public/cpp/connect.h" |
+#include "mojo/application/public/interfaces/shell.mojom.h" |
+#include "third_party/WebKit/public/platform/WebString.h" |
+#include "third_party/WebKit/public/platform/WebURLRequest.h" |
+#include "third_party/WebKit/public/web/WebDevToolsAgent.h" |
+#include "third_party/WebKit/public/web/WebLocalFrame.h" |
+ |
+namespace html_viewer { |
+ |
+DevToolsAgentImpl::DevToolsAgentImpl(blink::WebLocalFrame* frame, |
+ mojo::Shell* shell) |
+ : frame_(frame), binding_(this) { |
+ DCHECK(frame); |
+ DCHECK(shell); |
+ |
+ mojo::ServiceProviderPtr devtools_service_provider; |
+ mojo::URLRequestPtr request(mojo::URLRequest::New()); |
+ request->url = "mojo:devtools_service"; |
+ shell->ConnectToApplication( |
+ request.Pass(), mojo::GetProxy(&devtools_service_provider), nullptr); |
+ devtools_service::DevToolsRegistryPtr devtools_registry; |
+ mojo::ConnectToService(devtools_service_provider.get(), &devtools_registry); |
+ |
+ devtools_service::DevToolsAgentPtr agent; |
+ binding_.Bind(&agent); |
+ devtools_registry->RegisterAgent(agent.Pass()); |
+ |
+ frame_->setDevToolsAgentClient(this); |
+} |
+ |
+DevToolsAgentImpl::~DevToolsAgentImpl() { |
+ if (client_) |
+ frame_->devToolsAgent()->detach(); |
+} |
+ |
+void DevToolsAgentImpl::SetClient( |
+ devtools_service::DevToolsAgentClientPtr client, |
+ const mojo::String& client_id) { |
+ if (client_) |
+ frame_->devToolsAgent()->detach(); |
+ |
+ client_ = client.Pass(); |
+ client_.set_error_handler(this); |
+ |
+ frame_->devToolsAgent()->attach(blink::WebString::fromUTF8(client_id)); |
+} |
+ |
+void DevToolsAgentImpl::DispatchProtocolMessage(const mojo::String& message) { |
+ // TODO(yzshen): (1) Eventually the handling code for Page.navigate (and some |
sky
2015/06/02 23:28:32
We have that class now. browser is the one that ha
yzshen1
2015/06/05 17:29:29
I think currently we don't have the ability to do
sky
2015/06/05 19:13:29
Fair enough.
|
+ // other commands) should live with the code managing tabs and navigation. |
+ // We will need a DevToolsAgent implementation there as well, which handles |
+ // some of the commands and relays messages between the DevTools service and |
+ // the HTML viewer. |
+ // (2) Consider refactoring and reusing the existing DevTools protocol parsing |
+ // code. |
+ scoped_ptr<base::Value> value = base::JSONReader::Read(message.get()); |
+ if (!value || !value->IsType(base::Value::TYPE_DICTIONARY)) |
+ return; |
+ |
+ scoped_ptr<base::DictionaryValue> command = |
+ make_scoped_ptr(static_cast<base::DictionaryValue*>(value.release())); |
dgozman
2015/06/03 09:55:55
There is |Value::GetAsDictionary| for this purpose
yzshen1
2015/06/05 17:29:29
Done. That is much better.
|
+ std::string method; |
+ command->GetString("method", &method); |
+ if (method == "Page.navigate") { |
+ std::string url; |
+ if (!command->GetString("params.url", &url)) |
+ return; |
+ |
+ blink::WebURLRequest request{GURL(url)}; |
sky
2015/06/02 23:28:32
Should you validate url?
yzshen1
2015/06/05 17:29:29
Done.
|
+ frame_->loadRequest(request); |
+ |
+ // The command should fall through to be handled by frame_->devToolsAgent(). |
+ } |
+ |
+ frame_->devToolsAgent()->dispatchOnInspectorBackend( |
+ blink::WebString::fromUTF8(message)); |
+} |
+ |
+void DevToolsAgentImpl::sendProtocolMessage(int call_id, |
+ const blink::WebString& response, |
+ const blink::WebString& state) { |
+ if (client_) |
+ client_->DispatchProtocolMessage(response.utf8()); |
+} |
+ |
+void DevToolsAgentImpl::OnConnectionError() { |
+ client_.reset(); |
+ frame_->devToolsAgent()->detach(); |
+} |
+ |
+} // namespace html_viewer |