summaryrefslogtreecommitdiffstats
path: root/android_webview
diff options
context:
space:
mode:
authormnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-21 17:53:03 +0000
committermnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-21 17:53:03 +0000
commitad89136774e39213501103483ddb75c3575e7a3e (patch)
tree620911c5925d3f459b31514a083829b0d40e82fe /android_webview
parent46b3425a2dbc95907f13656765e1c28729d88258 (diff)
downloadchromium_src-ad89136774e39213501103483ddb75c3575e7a3e.zip
chromium_src-ad89136774e39213501103483ddb75c3575e7a3e.tar.gz
chromium_src-ad89136774e39213501103483ddb75c3575e7a3e.tar.bz2
[Android WebView] Make web contents debugging controllable
This change introduces a controller Java class AwDevToolsServer for dynamically controlling the state of web debugging. This change also removes the temporary remote debugging landing page, as chrome://inspect now fully supports WebView. NOTRY=true Review URL: https://chromiumcodereview.appspot.com/24238007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@224607 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview')
-rw-r--r--android_webview/android_webview.gyp2
-rw-r--r--android_webview/browser/aw_browser_main_parts.cc7
-rw-r--r--android_webview/browser/aw_browser_main_parts.h3
-rw-r--r--android_webview/browser/aw_devtools_delegate.cc248
-rw-r--r--android_webview/browser/aw_devtools_delegate.h54
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwDevToolsServer.java33
-rw-r--r--android_webview/native/android_webview_jni_registrar.cc2
-rw-r--r--android_webview/native/aw_dev_tools_server.cc170
-rw-r--r--android_webview/native/aw_dev_tools_server.h43
-rw-r--r--android_webview/native/webview_native.gyp3
10 files changed, 251 insertions, 314 deletions
diff --git a/android_webview/android_webview.gyp b/android_webview/android_webview.gyp
index d687e71..eea495e 100644
--- a/android_webview/android_webview.gyp
+++ b/android_webview/android_webview.gyp
@@ -113,8 +113,6 @@
'browser/aw_contents_io_thread_client.h',
'browser/aw_cookie_access_policy.cc',
'browser/aw_cookie_access_policy.h',
- 'browser/aw_devtools_delegate.cc',
- 'browser/aw_devtools_delegate.h',
'browser/aw_download_manager_delegate.cc',
'browser/aw_download_manager_delegate.h',
'browser/aw_form_database_service.cc',
diff --git a/android_webview/browser/aw_browser_main_parts.cc b/android_webview/browser/aw_browser_main_parts.cc
index 8cd57c3..da44066 100644
--- a/android_webview/browser/aw_browser_main_parts.cc
+++ b/android_webview/browser/aw_browser_main_parts.cc
@@ -5,7 +5,6 @@
#include "android_webview/browser/aw_browser_main_parts.h"
#include "android_webview/browser/aw_browser_context.h"
-#include "android_webview/browser/aw_devtools_delegate.h"
#include "android_webview/browser/aw_result_codes.h"
#include "base/android/build_info.h"
#include "base/files/file_path.h"
@@ -59,7 +58,6 @@ int AwBrowserMainParts::PreCreateThreads() {
void AwBrowserMainParts::PreMainMessageLoopRun() {
browser_context_->PreMainMessageLoopRun();
- devtools_delegate_ = new AwDevToolsDelegate(browser_context_);
}
bool AwBrowserMainParts::MainMessageLoopRun(int* result_code) {
@@ -68,9 +66,4 @@ bool AwBrowserMainParts::MainMessageLoopRun(int* result_code) {
return true;
}
-void AwBrowserMainParts::PostMainMessageLoopRun() {
- if (devtools_delegate_)
- devtools_delegate_->Stop();
-}
-
} // namespace android_webview
diff --git a/android_webview/browser/aw_browser_main_parts.h b/android_webview/browser/aw_browser_main_parts.h
index 903e19b..8beec92 100644
--- a/android_webview/browser/aw_browser_main_parts.h
+++ b/android_webview/browser/aw_browser_main_parts.h
@@ -16,7 +16,6 @@ class MessageLoop;
namespace android_webview {
class AwBrowserContext;
-class AwDevToolsDelegate;
class AwBrowserMainParts : public content::BrowserMainParts {
public:
@@ -28,14 +27,12 @@ class AwBrowserMainParts : public content::BrowserMainParts {
virtual int PreCreateThreads() OVERRIDE;
virtual void PreMainMessageLoopRun() OVERRIDE;
virtual bool MainMessageLoopRun(int* result_code) OVERRIDE;
- virtual void PostMainMessageLoopRun() OVERRIDE;
private:
// Android specific UI MessageLoop.
scoped_ptr<base::MessageLoop> main_message_loop_;
AwBrowserContext* browser_context_; // weak
- AwDevToolsDelegate* devtools_delegate_;
DISALLOW_COPY_AND_ASSIGN(AwBrowserMainParts);
};
diff --git a/android_webview/browser/aw_devtools_delegate.cc b/android_webview/browser/aw_devtools_delegate.cc
deleted file mode 100644
index 028e525..0000000
--- a/android_webview/browser/aw_devtools_delegate.cc
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright 2013 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 "android_webview/browser/aw_devtools_delegate.h"
-
-#include "android_webview/browser/in_process_view_renderer.h"
-#include "base/bind.h"
-#include "base/json/json_writer.h"
-#include "base/strings/stringprintf.h"
-#include "base/values.h"
-#include "content/public/browser/android/devtools_auth.h"
-#include "content/public/browser/devtools_http_handler.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/common/url_constants.h"
-#include "net/socket/unix_domain_socket_posix.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "webkit/common/user_agent/user_agent_util.h"
-
-namespace {
-const char kFrontEndURL[] =
- "http://chrome-devtools-frontend.appspot.com/serve_rev/%s/devtools.html";
-const char kSocketNameFormat[] = "webview_devtools_remote_%d";
-}
-
-namespace android_webview {
-
-AwDevToolsDelegate::AwDevToolsDelegate(content::BrowserContext* browser_context)
- : browser_context_(browser_context) {
- devtools_http_handler_ = content::DevToolsHttpHandler::Start(
- new net::UnixDomainSocketWithAbstractNamespaceFactory(
- base::StringPrintf(kSocketNameFormat, getpid()),
- "",
- base::Bind(&content::CanUserConnectToDevTools)),
- base::StringPrintf(kFrontEndURL,
- webkit_glue::GetWebKitRevision().c_str()),
- this);
-}
-
-AwDevToolsDelegate::~AwDevToolsDelegate() {
-}
-
-void AwDevToolsDelegate::Stop() {
- devtools_http_handler_->Stop();
- // WARNING: |this| has now been deleted by the method above.
-}
-
-std::string AwDevToolsDelegate::GetDiscoveryPageHTML() {
- // This is a temporary way of providing the list of inspectable WebViews.
- // Since WebView doesn't have its own resources now, it doesn't seem
- // reasonable to create a dedicated .pak file just for this temporary page.
- const char html[] =
- "<html>"
- "<head>"
- "<title>WebView remote debugging</title>"
- "<style>"
- "</style>"
- "<script>"
- "function onLoad() {"
- " var tabs_list_request = new XMLHttpRequest();"
- " tabs_list_request.open("
- " 'GET', '/json/list?t=' + new Date().getTime(), true);"
- " tabs_list_request.onreadystatechange = onReady;"
- " tabs_list_request.send();"
- "}"
- "function processItem(item) {"
- " var result = JSON.parse(item.description);"
- " result.debuggable = !!item.devtoolsFrontendUrl;"
- " result.debugUrl = item.devtoolsFrontendUrl;"
- " result.title = item.title;"
- " return result;"
- "}"
- "function onReady() {"
- " if(this.readyState == 4 && this.status == 200) {"
- " if(this.response != null)"
- " var responseJSON = JSON.parse(this.response);"
- " var items = [];"
- " for (var i = 0; i < responseJSON.length; ++i)"
- " items.push(processItem(responseJSON[i]));"
- " clear();"
- " for (var i = 0; i < items.length; ++i)"
- " displayView(items[i]);"
- " filter();"
- " }"
- "}"
- "function addColumn(row, text) {"
- " var column = document.createElement('td');"
- " column.innerText = text;"
- " row.appendChild(column);"
- "}"
- "function cutTextIfNeeded(text, maxLen) {"
- " return text.length <= maxLen ?"
- " text : text.substr(0, maxLen) + '\u2026';"
- "}"
- "function displayView(item) {"
- " var row = document.createElement('tr');"
- " var column = document.createElement('td');"
- " var frontend_ref;"
- " if (item.debuggable) {"
- " frontend_ref = document.createElement('a');"
- " frontend_ref.href = item.debugUrl;"
- " frontend_ref.title = item.title;"
- " frontend_ref.target = '_blank';"
- " column.appendChild(frontend_ref);"
- " } else {"
- " frontend_ref = column;"
- " }"
- " var text = document.createElement('span');"
- " if (item.title) {"
- " text.innerText = cutTextIfNeeded(item.title, 64);"
- " } else {"
- " text.innerText = '(untitled)';"
- " }"
- " frontend_ref.appendChild(text);"
- " var bits = 0;"
- " var attached = item.attached ? (bits |= 1, 'Y') : 'N';"
- " var visible = item.visible ? (bits |= 2, 'Y') : 'N';"
- " var empty = item.empty ? 'Y' : (bits |= 4, 'N');"
- " row.setAttribute('class', bits);"
- " row.appendChild(column);"
- " addColumn(row, attached);"
- " addColumn(row, visible);"
- " addColumn(row, empty);"
- " addColumn(row, item.screenX + ', ' + item.screenY);"
- " addColumn(row,"
- " !item.empty ? (item.width + '\u00d7' + item.height) : '');"
- " document.getElementById('items').appendChild(row);"
- "}"
- "function filter() {"
- " var show_attached = document.getElementById('show_attached').checked;"
- " var show_visible = document.getElementById('show_visible').checked;"
- " var show_nonempty = document.getElementById('show_nonempty').checked;"
- " var items = document.getElementById('items').childNodes;"
- " for (var i = 0; i < items.length; i++) {"
- " if (items[i].nodeName == 'TR') {"
- " var mask = parseInt(items[i].getAttribute('class'));"
- " var show = true;"
- " if (show_attached) show &= ((mask & 1) != 0);"
- " if (show_visible) show &= ((mask & 2) != 0);"
- " if (show_nonempty) show &= ((mask & 4) != 0);"
- " if (show) {"
- " items[i].style.display = 'table-row';"
- " } else {"
- " items[i].style.display = 'none';"
- " }"
- " }"
- " }"
- "}"
- "var refreshInterval = 0;"
- "function toggleRefresh() {"
- " clearInterval(refreshInterval);"
- " var enabled = document.getElementById('refresh').checked;"
- " if (enabled) {"
- " var time = document.getElementById('refresh_time').value * 1000;"
- " refreshInterval = setInterval(onLoad, time);"
- " }"
- "}"
- "function clear() {"
- " var items = document.getElementById('items');"
- " for (var i = 0; i < items.childNodes.length; i++) {"
- " items.removeChild(items.childNodes[i]);"
- " }"
- "}"
- "</script>"
- "</head>"
- "<body onload='onLoad()'>"
- " <div id='caption'>Inspectable WebViews</div>"
- " <div><p>Only show:</p>"
- " <form>"
- " <input type='checkbox' id='show_attached' onclick='filter()'>"
- " Attached<br/>"
- " <input type='checkbox' id='show_visible' onclick='filter()'>"
- " Visible<br/>"
- " <input type='checkbox' id='show_nonempty' onclick='filter()'>"
- " Non-empty<br/>"
- " <input type='checkbox' id='refresh' onclick='toggleRefresh()'>"
- " Auto refresh every "
- " <input type='number' id='refresh_time' value='2' min='1' max='99'"
- " onchange='toggleRefresh();' /> seconds<br/>"
- " </form>"
- " </div>"
- " <table>"
- " <tr><th style='width:200px; text-align:left;'>Title</th>"
- " <th>Attached</th><th>Visible</th><th>Empty</th>"
- " <th style='width:100px; text-align:left;'>Position</th>"
- " <th style='width:100px; text-align:left;'>Size</th>"
- " </tr>"
- " <tbody id='items'></tbody>"
- " </table>"
- "</body>"
- "</html>";
- return html;
-}
-
-bool AwDevToolsDelegate::BundlesFrontendResources() {
- return false;
-}
-
-base::FilePath AwDevToolsDelegate::GetDebugFrontendDir() {
- return base::FilePath();
-}
-
-std::string AwDevToolsDelegate::GetPageThumbnailData(const GURL& url) {
- return "";
-}
-
-content::RenderViewHost* AwDevToolsDelegate::CreateNewTarget() {
- return NULL;
-}
-
-content::DevToolsHttpHandlerDelegate::TargetType
-AwDevToolsDelegate::GetTargetType(content::RenderViewHost*) {
- return kTargetTypeTab;
-}
-
-std::string AwDevToolsDelegate::GetViewDescription(
- content::RenderViewHost* rvh) {
- content::WebContents* web_contents =
- content::WebContents::FromRenderViewHost(rvh);
- if (!web_contents) return "";
-
- BrowserViewRenderer* bvr
- = InProcessViewRenderer::FromWebContents(web_contents);
- if (!bvr) return "";
- base::DictionaryValue description;
- description.SetBoolean("attached", bvr->IsAttachedToWindow());
- description.SetBoolean("visible", bvr->IsVisible());
- gfx::Rect screen_rect = bvr->GetScreenRect();
- description.SetInteger("screenX", screen_rect.x());
- description.SetInteger("screenY", screen_rect.y());
- description.SetBoolean("empty", screen_rect.size().IsEmpty());
- if (!screen_rect.size().IsEmpty()) {
- description.SetInteger("width", screen_rect.width());
- description.SetInteger("height", screen_rect.height());
- }
- std::string json;
- base::JSONWriter::Write(&description, &json);
- return json;
-}
-
-scoped_ptr<net::StreamListenSocket>
-AwDevToolsDelegate::CreateSocketForTethering(
- net::StreamListenSocket::Delegate* delegate,
- std::string* name) {
- return scoped_ptr<net::StreamListenSocket>();
-}
-
-} // namespace android_webview
diff --git a/android_webview/browser/aw_devtools_delegate.h b/android_webview/browser/aw_devtools_delegate.h
deleted file mode 100644
index eb844c2..0000000
--- a/android_webview/browser/aw_devtools_delegate.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2013 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 ANDROID_WEBVIEW_BROWSER_AW_DEV_TOOLS_DELEGATE_H_
-#define ANDROID_WEBVIEW_BROWSER_AW_DEV_TOOLS_DELEGATE_H_
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "content/public/browser/devtools_http_handler_delegate.h"
-
-namespace content {
-class BrowserContext;
-class DevToolsHttpHandler;
-}
-
-namespace android_webview {
-
-class AwDevToolsDelegate : public content::DevToolsHttpHandlerDelegate {
- public:
- AwDevToolsDelegate(content::BrowserContext* browser_context);
- virtual ~AwDevToolsDelegate();
-
- // Stops http server.
- void Stop();
-
- // DevToolsHttpProtocolHandler::Delegate overrides.
- virtual std::string GetDiscoveryPageHTML() OVERRIDE;
- virtual bool BundlesFrontendResources() OVERRIDE;
- virtual base::FilePath GetDebugFrontendDir() OVERRIDE;
- virtual std::string GetPageThumbnailData(const GURL& url) OVERRIDE;
- virtual content::RenderViewHost* CreateNewTarget() OVERRIDE;
- virtual TargetType GetTargetType(content::RenderViewHost*) OVERRIDE;
- virtual std::string GetViewDescription(content::RenderViewHost*) OVERRIDE;
- virtual scoped_ptr<net::StreamListenSocket> CreateSocketForTethering(
- net::StreamListenSocket::Delegate* delegate,
- std::string* name) OVERRIDE;
-
- content::DevToolsHttpHandler* devtools_http_handler() {
- return devtools_http_handler_;
- }
-
- private:
- content::BrowserContext* browser_context_;
- content::DevToolsHttpHandler* devtools_http_handler_;
-
- DISALLOW_COPY_AND_ASSIGN(AwDevToolsDelegate);
-};
-
-} // namespace android_webview
-
-#endif // ANDROID_WEBVIEW_BROWSER_AW_DEV_TOOLS_DELEGATE_H_
diff --git a/android_webview/java/src/org/chromium/android_webview/AwDevToolsServer.java b/android_webview/java/src/org/chromium/android_webview/AwDevToolsServer.java
new file mode 100644
index 0000000..915f2c6
--- /dev/null
+++ b/android_webview/java/src/org/chromium/android_webview/AwDevToolsServer.java
@@ -0,0 +1,33 @@
+// Copyright 2013 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.
+
+package org.chromium.android_webview;
+
+import org.chromium.base.JNINamespace;
+
+/**
+ * Controller for Remote Web Debugging (Developer Tools).
+ */
+@JNINamespace("android_webview")
+public class AwDevToolsServer {
+
+ private int mNativeDevToolsServer = 0;
+
+ public AwDevToolsServer() {
+ mNativeDevToolsServer = nativeInitRemoteDebugging();
+ }
+
+ public void destroy() {
+ nativeDestroyRemoteDebugging(mNativeDevToolsServer);
+ mNativeDevToolsServer = 0;
+ }
+
+ public void setRemoteDebuggingEnabled(boolean enabled) {
+ nativeSetRemoteDebuggingEnabled(mNativeDevToolsServer, enabled);
+ }
+
+ private native int nativeInitRemoteDebugging();
+ private native void nativeDestroyRemoteDebugging(int devToolsServer);
+ private native void nativeSetRemoteDebuggingEnabled(int devToolsServer, boolean enabled);
+}
diff --git a/android_webview/native/android_webview_jni_registrar.cc b/android_webview/native/android_webview_jni_registrar.cc
index 4ee5a3b..86223e5 100644
--- a/android_webview/native/android_webview_jni_registrar.cc
+++ b/android_webview/native/android_webview_jni_registrar.cc
@@ -9,6 +9,7 @@
#include "android_webview/native/aw_contents.h"
#include "android_webview/native/aw_contents_client_bridge.h"
#include "android_webview/native/aw_contents_io_thread_client_impl.h"
+#include "android_webview/native/aw_dev_tools_server.h"
#include "android_webview/native/aw_form_database.h"
#include "android_webview/native/aw_http_auth_handler.h"
#include "android_webview/native/aw_picture.h"
@@ -33,6 +34,7 @@ static base::android::RegistrationMethod kWebViewRegisteredMethods[] = {
{ "AwContents", RegisterAwContents },
{ "AwContentsClientBridge", RegisterAwContentsClientBridge },
{ "AwContentsIoThreadClientImpl", RegisterAwContentsIoThreadClientImpl },
+ { "AwDevToolsServer", RegisterAwDevToolsServer },
{ "AwFormDatabase", RegisterAwFormDatabase },
{ "AwPicture", RegisterAwPicture },
{ "AwSettings", RegisterAwSettings },
diff --git a/android_webview/native/aw_dev_tools_server.cc b/android_webview/native/aw_dev_tools_server.cc
new file mode 100644
index 0000000..01fc288
--- /dev/null
+++ b/android_webview/native/aw_dev_tools_server.cc
@@ -0,0 +1,170 @@
+// Copyright 2013 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 "android_webview/native/aw_dev_tools_server.h"
+
+#include "android_webview/browser/in_process_view_renderer.h"
+#include "base/bind.h"
+#include "base/json/json_writer.h"
+#include "base/strings/stringprintf.h"
+#include "base/values.h"
+#include "content/public/browser/android/devtools_auth.h"
+#include "content/public/browser/devtools_http_handler.h"
+#include "content/public/browser/devtools_http_handler_delegate.h"
+#include "content/public/browser/web_contents.h"
+#include "jni/AwDevToolsServer_jni.h"
+#include "net/socket/unix_domain_socket_posix.h"
+#include "webkit/common/user_agent/user_agent_util.h"
+
+namespace {
+
+const char kFrontEndURL[] =
+ "http://chrome-devtools-frontend.appspot.com/serve_rev/%s/devtools.html";
+const char kSocketNameFormat[] = "webview_devtools_remote_%d";
+
+// Delegate implementation for the devtools http handler for WebView. A new
+// instance of this gets created each time web debugging is enabled.
+class AwDevToolsServerDelegate : public content::DevToolsHttpHandlerDelegate {
+ public:
+ AwDevToolsServerDelegate() {}
+ virtual ~AwDevToolsServerDelegate() {}
+
+ // DevToolsHttpProtocolHandler::Delegate overrides.
+ virtual std::string GetDiscoveryPageHTML() OVERRIDE;
+
+ virtual bool BundlesFrontendResources() OVERRIDE {
+ return false;
+ }
+
+ virtual base::FilePath GetDebugFrontendDir() OVERRIDE {
+ return base::FilePath();
+ }
+
+ virtual std::string GetPageThumbnailData(const GURL&) OVERRIDE {
+ return "";
+ }
+
+ virtual content::RenderViewHost* CreateNewTarget() OVERRIDE {
+ return NULL;
+ }
+
+ virtual TargetType GetTargetType(content::RenderViewHost*) OVERRIDE {
+ return kTargetTypeTab;
+ }
+
+ virtual std::string GetViewDescription(content::RenderViewHost*) OVERRIDE;
+
+ virtual scoped_ptr<net::StreamListenSocket> CreateSocketForTethering(
+ net::StreamListenSocket::Delegate* delegate,
+ std::string* name) OVERRIDE {
+ return scoped_ptr<net::StreamListenSocket>();
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(AwDevToolsServerDelegate);
+};
+
+
+std::string AwDevToolsServerDelegate::GetDiscoveryPageHTML() {
+ const char html[] =
+ "<html>"
+ "<head><title>WebView remote debugging</title></head>"
+ "<body>Please use <a href=\'chrome://inspect\'>chrome://inspect</a>"
+ "</body>"
+ "</html>";
+ return html;
+}
+
+std::string AwDevToolsServerDelegate::GetViewDescription(
+ content::RenderViewHost* rvh) {
+ content::WebContents* web_contents =
+ content::WebContents::FromRenderViewHost(rvh);
+ if (!web_contents) return "";
+
+ android_webview::BrowserViewRenderer* bvr
+ = android_webview::InProcessViewRenderer::FromWebContents(web_contents);
+ if (!bvr) return "";
+ base::DictionaryValue description;
+ description.SetBoolean("attached", bvr->IsAttachedToWindow());
+ description.SetBoolean("visible", bvr->IsVisible());
+ gfx::Rect screen_rect = bvr->GetScreenRect();
+ description.SetInteger("screenX", screen_rect.x());
+ description.SetInteger("screenY", screen_rect.y());
+ description.SetBoolean("empty", screen_rect.size().IsEmpty());
+ if (!screen_rect.size().IsEmpty()) {
+ description.SetInteger("width", screen_rect.width());
+ description.SetInteger("height", screen_rect.height());
+ }
+ std::string json;
+ base::JSONWriter::Write(&description, &json);
+ return json;
+}
+
+} // namespace
+
+namespace android_webview {
+
+AwDevToolsServer::AwDevToolsServer()
+ : protocol_handler_(NULL) {
+}
+
+AwDevToolsServer::~AwDevToolsServer() {
+ Stop();
+}
+
+void AwDevToolsServer::Start() {
+ if (protocol_handler_)
+ return;
+
+ protocol_handler_ = content::DevToolsHttpHandler::Start(
+ new net::UnixDomainSocketWithAbstractNamespaceFactory(
+ base::StringPrintf(kSocketNameFormat, getpid()),
+ "",
+ base::Bind(&content::CanUserConnectToDevTools)),
+ base::StringPrintf(kFrontEndURL,
+ webkit_glue::GetWebKitRevision().c_str()),
+ new AwDevToolsServerDelegate());
+}
+
+void AwDevToolsServer::Stop() {
+ if (!protocol_handler_)
+ return;
+ // Note that the call to Stop() below takes care of |protocol_handler_|
+ // deletion.
+ protocol_handler_->Stop();
+ protocol_handler_ = NULL;
+}
+
+bool AwDevToolsServer::IsStarted() const {
+ return protocol_handler_;
+}
+
+bool RegisterAwDevToolsServer(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+static jint InitRemoteDebugging(JNIEnv* env,
+ jobject obj) {
+ AwDevToolsServer* server = new AwDevToolsServer();
+ return reinterpret_cast<jint>(server);
+}
+
+static void DestroyRemoteDebugging(JNIEnv* env, jobject obj, jint server) {
+ delete reinterpret_cast<AwDevToolsServer*>(server);
+}
+
+static void SetRemoteDebuggingEnabled(JNIEnv* env,
+ jobject obj,
+ jint server,
+ jboolean enabled) {
+ AwDevToolsServer* devtools_server =
+ reinterpret_cast<AwDevToolsServer*>(server);
+ if (enabled) {
+ devtools_server->Start();
+ } else {
+ devtools_server->Stop();
+ }
+}
+
+} // namespace android_webview
diff --git a/android_webview/native/aw_dev_tools_server.h b/android_webview/native/aw_dev_tools_server.h
new file mode 100644
index 0000000..1a46ad8
--- /dev/null
+++ b/android_webview/native/aw_dev_tools_server.h
@@ -0,0 +1,43 @@
+// Copyright 2013 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 ANDROID_WEBVIEW_NATIVE_AW_DEV_TOOLS_SERVER_H_
+#define ANDROID_WEBVIEW_NATIVE_AW_DEV_TOOLS_SERVER_H_
+
+#include <jni.h>
+#include <vector>
+
+#include "base/basictypes.h"
+
+namespace content {
+class DevToolsHttpHandler;
+}
+
+namespace android_webview {
+
+// This class controls WebView-specific Developer Tools remote debugging server.
+class AwDevToolsServer {
+ public:
+ AwDevToolsServer();
+ ~AwDevToolsServer();
+
+ // Opens linux abstract socket to be ready for remote debugging.
+ void Start();
+
+ // Closes debugging socket, stops debugging.
+ void Stop();
+
+ bool IsStarted() const;
+
+ private:
+ content::DevToolsHttpHandler* protocol_handler_;
+
+ DISALLOW_COPY_AND_ASSIGN(AwDevToolsServer);
+};
+
+bool RegisterAwDevToolsServer(JNIEnv* env);
+
+} // namespace android_webview
+
+#endif // ANDROID_WEBVIEW_NATIVE_AW_DEV_TOOLS_SERVER_H_
diff --git a/android_webview/native/webview_native.gyp b/android_webview/native/webview_native.gyp
index b1d7082..1e1d5f8 100644
--- a/android_webview/native/webview_native.gyp
+++ b/android_webview/native/webview_native.gyp
@@ -44,6 +44,8 @@
'aw_contents_client_bridge.h',
'aw_contents_io_thread_client_impl.cc',
'aw_contents_io_thread_client_impl.h',
+ 'aw_dev_tools_server.cc',
+ 'aw_dev_tools_server.h',
'aw_form_database.cc',
'aw_form_database.h',
'aw_geolocation_permission_context.cc',
@@ -94,6 +96,7 @@
'../java/src/org/chromium/android_webview/AwContentsClientBridge.java',
'../java/src/org/chromium/android_webview/AwContentsIoThreadClient.java',
'../java/src/org/chromium/android_webview/AwCookieManager.java',
+ '../java/src/org/chromium/android_webview/AwDevToolsServer.java',
'../java/src/org/chromium/android_webview/AwFormDatabase.java',
'../java/src/org/chromium/android_webview/AwHttpAuthHandler.java',
'../java/src/org/chromium/android_webview/AwPicture.java',