[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.

BUG: 8691809

Upstream trunk patch: http://crrev.com/24238007

(re-land, original Change-Id: I9315272f39e59978bb723458706c8ec56498dbf1)

Change-Id: I6086eb61eaaf8829fffdf56cc0d1e242ab4aa8af
diff --git a/android_webview/android_webview.gyp b/android_webview/android_webview.gyp
index 2cf8f3c..d201ac7 100644
--- a/android_webview/android_webview.gyp
+++ b/android_webview/android_webview.gyp
@@ -118,8 +118,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/android_webview_common.target.darwin-arm.mk b/android_webview/android_webview_common.target.darwin-arm.mk
index 6e13635..9623c54 100644
--- a/android_webview/android_webview_common.target.darwin-arm.mk
+++ b/android_webview/android_webview_common.target.darwin-arm.mk
@@ -32,7 +32,6 @@
 	android_webview/browser/aw_contents_client_bridge_base.cc \
 	android_webview/browser/aw_content_browser_client.cc \
 	android_webview/browser/aw_cookie_access_policy.cc \
-	android_webview/browser/aw_devtools_delegate.cc \
 	android_webview/browser/aw_download_manager_delegate.cc \
 	android_webview/browser/aw_form_database_service.cc \
 	android_webview/browser/aw_gl_surface.cc \
diff --git a/android_webview/android_webview_common.target.darwin-mips.mk b/android_webview/android_webview_common.target.darwin-mips.mk
index d93546d..1f17c7b 100644
--- a/android_webview/android_webview_common.target.darwin-mips.mk
+++ b/android_webview/android_webview_common.target.darwin-mips.mk
@@ -32,7 +32,6 @@
 	android_webview/browser/aw_contents_client_bridge_base.cc \
 	android_webview/browser/aw_content_browser_client.cc \
 	android_webview/browser/aw_cookie_access_policy.cc \
-	android_webview/browser/aw_devtools_delegate.cc \
 	android_webview/browser/aw_download_manager_delegate.cc \
 	android_webview/browser/aw_form_database_service.cc \
 	android_webview/browser/aw_gl_surface.cc \
diff --git a/android_webview/android_webview_common.target.darwin-x86.mk b/android_webview/android_webview_common.target.darwin-x86.mk
index 6e64d1d..1b89fb5 100644
--- a/android_webview/android_webview_common.target.darwin-x86.mk
+++ b/android_webview/android_webview_common.target.darwin-x86.mk
@@ -32,7 +32,6 @@
 	android_webview/browser/aw_contents_client_bridge_base.cc \
 	android_webview/browser/aw_content_browser_client.cc \
 	android_webview/browser/aw_cookie_access_policy.cc \
-	android_webview/browser/aw_devtools_delegate.cc \
 	android_webview/browser/aw_download_manager_delegate.cc \
 	android_webview/browser/aw_form_database_service.cc \
 	android_webview/browser/aw_gl_surface.cc \
diff --git a/android_webview/android_webview_common.target.linux-arm.mk b/android_webview/android_webview_common.target.linux-arm.mk
index 6e13635..9623c54 100644
--- a/android_webview/android_webview_common.target.linux-arm.mk
+++ b/android_webview/android_webview_common.target.linux-arm.mk
@@ -32,7 +32,6 @@
 	android_webview/browser/aw_contents_client_bridge_base.cc \
 	android_webview/browser/aw_content_browser_client.cc \
 	android_webview/browser/aw_cookie_access_policy.cc \
-	android_webview/browser/aw_devtools_delegate.cc \
 	android_webview/browser/aw_download_manager_delegate.cc \
 	android_webview/browser/aw_form_database_service.cc \
 	android_webview/browser/aw_gl_surface.cc \
diff --git a/android_webview/android_webview_common.target.linux-mips.mk b/android_webview/android_webview_common.target.linux-mips.mk
index d93546d..1f17c7b 100644
--- a/android_webview/android_webview_common.target.linux-mips.mk
+++ b/android_webview/android_webview_common.target.linux-mips.mk
@@ -32,7 +32,6 @@
 	android_webview/browser/aw_contents_client_bridge_base.cc \
 	android_webview/browser/aw_content_browser_client.cc \
 	android_webview/browser/aw_cookie_access_policy.cc \
-	android_webview/browser/aw_devtools_delegate.cc \
 	android_webview/browser/aw_download_manager_delegate.cc \
 	android_webview/browser/aw_form_database_service.cc \
 	android_webview/browser/aw_gl_surface.cc \
diff --git a/android_webview/android_webview_common.target.linux-x86.mk b/android_webview/android_webview_common.target.linux-x86.mk
index 6e64d1d..1b89fb5 100644
--- a/android_webview/android_webview_common.target.linux-x86.mk
+++ b/android_webview/android_webview_common.target.linux-x86.mk
@@ -32,7 +32,6 @@
 	android_webview/browser/aw_contents_client_bridge_base.cc \
 	android_webview/browser/aw_content_browser_client.cc \
 	android_webview/browser/aw_cookie_access_policy.cc \
-	android_webview/browser/aw_devtools_delegate.cc \
 	android_webview/browser/aw_download_manager_delegate.cc \
 	android_webview/browser/aw_form_database_service.cc \
 	android_webview/browser/aw_gl_surface.cc \
diff --git a/android_webview/browser/aw_browser_main_parts.cc b/android_webview/browser/aw_browser_main_parts.cc
index b54e65b..f19def9 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"
@@ -61,7 +60,6 @@
 
 void AwBrowserMainParts::PreMainMessageLoopRun() {
   browser_context_->PreMainMessageLoopRun();
-  devtools_delegate_ = new AwDevToolsDelegate(browser_context_);
 }
 
 bool AwBrowserMainParts::MainMessageLoopRun(int* result_code) {
@@ -70,9 +68,4 @@
   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 @@
 namespace android_webview {
 
 class AwBrowserContext;
-class AwDevToolsDelegate;
 
 class AwBrowserMainParts : public content::BrowserMainParts {
  public:
@@ -28,14 +27,12 @@
   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 25f2b7a..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_refptr<net::StreamListenSocket>
-AwDevToolsDelegate::CreateSocketForTethering(
-    net::StreamListenSocket::Delegate* delegate,
-    std::string* name) {
-  return NULL;
-}
-
-}  // 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 446e4aa..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_refptr<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..852655a
--- /dev/null
+++ b/android_webview/java/src/org/chromium/android_webview/AwDevToolsServer.java
@@ -0,0 +1,33 @@
+// Copyright (c) 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 62f25e8..bf29f18 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"
 // START: Printing fork b/10190508
 #include "android_webview/native/aw_pdf_exporter.h"
 // END: Printing fork b/10190508
@@ -36,6 +37,7 @@
   { "AwContents", RegisterAwContents },
   { "AwContentsClientBridge", RegisterAwContentsClientBridge },
   { "AwContentsIoThreadClientImpl", RegisterAwContentsIoThreadClientImpl },
+  { "AwDevToolsServer", RegisterAwDevToolsServer },
   { "AwFormDatabase", RegisterAwFormDatabase },
   { "AwPicture", RegisterAwPicture },
   { "AwSettings", RegisterAwSettings },
diff --git a/android_webview/native/android_webview_native_jni.target.darwin-arm.mk b/android_webview/native/android_webview_native_jni.target.darwin-arm.mk
index 798115c..6f607bb 100644
--- a/android_webview/native/android_webview_native_jni.target.darwin-arm.mk
+++ b/android_webview/native/android_webview_native_jni.target.darwin-arm.mk
@@ -17,7 +17,7 @@
 
 
 ### Generated for rule "android_webview_native_webview_native_gyp_android_webview_native_jni_target_generate_jni_headers":
-# "{'inputs': ['../../base/android/jni_generator/jni_generator.py', '../../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/android_webview/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['../java/src/org/chromium/android_webview/AndroidProtocolHandler.java', '../java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java', '../java/src/org/chromium/android_webview/AwContents.java', '../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/AwFormDatabase.java', '../java/src/org/chromium/android_webview/AwHttpAuthHandler.java', '../java/src/org/chromium/android_webview/AwPicture.java', '../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java', '../java/src/org/chromium/android_webview/AwResource.java', '../java/src/org/chromium/android_webview/AwSettings.java', '../java/src/org/chromium/android_webview/AwWebContentsDelegate.java', '../java/src/org/chromium/android_webview/InterceptedRequestData.java', '../java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java', '../java/src/org/chromium/android_webview/AwPdfExporter.java'], 'action': ['../../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/android_webview/jni', '--optimize_generation', '0', '--jarjar', '../../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../../base/android/jni_generator/jni_generator.py', '../../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/android_webview/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['../java/src/org/chromium/android_webview/AndroidProtocolHandler.java', '../java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java', '../java/src/org/chromium/android_webview/AwContents.java', '../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', '../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java', '../java/src/org/chromium/android_webview/AwResource.java', '../java/src/org/chromium/android_webview/AwSettings.java', '../java/src/org/chromium/android_webview/AwWebContentsDelegate.java', '../java/src/org/chromium/android_webview/InterceptedRequestData.java', '../java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java', '../java/src/org/chromium/android_webview/AwPdfExporter.java'], 'action': ['../../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/android_webview/jni', '--optimize_generation', '0', '--jarjar', '../../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -78,6 +78,16 @@
 .PHONY: android_webview_native_android_webview_native_jni_gyp_rule_trigger
 android_webview_native_android_webview_native_jni_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h
 
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: $(LOCAL_PATH)/android_webview/java/src/org/chromium/android_webview/AwDevToolsServer.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/android_webview/jni; cd $(gyp_local_path)/android_webview/native; ../../base/android/jni_generator/jni_generator.py --input_file ../java/src/org/chromium/android_webview/AwDevToolsServer.java --output_dir "$(gyp_shared_intermediate_dir)/android_webview/jni" --optimize_generation 0 --jarjar ../../android_webview/build/jarjar-rules.txt
+
+.PHONY: android_webview_native_android_webview_native_jni_gyp_rule_trigger
+android_webview_native_android_webview_native_jni_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h
+
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -187,6 +197,7 @@
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsClientBridge_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsIoThreadClient_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h \
+	$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwHttpAuthHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwPicture_jni.h \
@@ -208,6 +219,7 @@
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsClientBridge_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsIoThreadClient_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h \
+	$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwHttpAuthHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwPicture_jni.h \
diff --git a/android_webview/native/android_webview_native_jni.target.darwin-mips.mk b/android_webview/native/android_webview_native_jni.target.darwin-mips.mk
index 119c700..09c46e1 100644
--- a/android_webview/native/android_webview_native_jni.target.darwin-mips.mk
+++ b/android_webview/native/android_webview_native_jni.target.darwin-mips.mk
@@ -17,7 +17,7 @@
 
 
 ### Generated for rule "android_webview_native_webview_native_gyp_android_webview_native_jni_target_generate_jni_headers":
-# "{'inputs': ['../../base/android/jni_generator/jni_generator.py', '../../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/android_webview/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['../java/src/org/chromium/android_webview/AndroidProtocolHandler.java', '../java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java', '../java/src/org/chromium/android_webview/AwContents.java', '../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/AwFormDatabase.java', '../java/src/org/chromium/android_webview/AwHttpAuthHandler.java', '../java/src/org/chromium/android_webview/AwPicture.java', '../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java', '../java/src/org/chromium/android_webview/AwResource.java', '../java/src/org/chromium/android_webview/AwSettings.java', '../java/src/org/chromium/android_webview/AwWebContentsDelegate.java', '../java/src/org/chromium/android_webview/InterceptedRequestData.java', '../java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java', '../java/src/org/chromium/android_webview/AwPdfExporter.java'], 'action': ['../../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/android_webview/jni', '--optimize_generation', '0', '--jarjar', '../../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../../base/android/jni_generator/jni_generator.py', '../../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/android_webview/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['../java/src/org/chromium/android_webview/AndroidProtocolHandler.java', '../java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java', '../java/src/org/chromium/android_webview/AwContents.java', '../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', '../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java', '../java/src/org/chromium/android_webview/AwResource.java', '../java/src/org/chromium/android_webview/AwSettings.java', '../java/src/org/chromium/android_webview/AwWebContentsDelegate.java', '../java/src/org/chromium/android_webview/InterceptedRequestData.java', '../java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java', '../java/src/org/chromium/android_webview/AwPdfExporter.java'], 'action': ['../../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/android_webview/jni', '--optimize_generation', '0', '--jarjar', '../../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -78,6 +78,16 @@
 .PHONY: android_webview_native_android_webview_native_jni_gyp_rule_trigger
 android_webview_native_android_webview_native_jni_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h
 
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: $(LOCAL_PATH)/android_webview/java/src/org/chromium/android_webview/AwDevToolsServer.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/android_webview/jni; cd $(gyp_local_path)/android_webview/native; ../../base/android/jni_generator/jni_generator.py --input_file ../java/src/org/chromium/android_webview/AwDevToolsServer.java --output_dir "$(gyp_shared_intermediate_dir)/android_webview/jni" --optimize_generation 0 --jarjar ../../android_webview/build/jarjar-rules.txt
+
+.PHONY: android_webview_native_android_webview_native_jni_gyp_rule_trigger
+android_webview_native_android_webview_native_jni_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h
+
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -187,6 +197,7 @@
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsClientBridge_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsIoThreadClient_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h \
+	$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwHttpAuthHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwPicture_jni.h \
@@ -208,6 +219,7 @@
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsClientBridge_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsIoThreadClient_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h \
+	$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwHttpAuthHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwPicture_jni.h \
diff --git a/android_webview/native/android_webview_native_jni.target.darwin-x86.mk b/android_webview/native/android_webview_native_jni.target.darwin-x86.mk
index 0c090d0..7a59119 100644
--- a/android_webview/native/android_webview_native_jni.target.darwin-x86.mk
+++ b/android_webview/native/android_webview_native_jni.target.darwin-x86.mk
@@ -17,7 +17,7 @@
 
 
 ### Generated for rule "android_webview_native_webview_native_gyp_android_webview_native_jni_target_generate_jni_headers":
-# "{'inputs': ['../../base/android/jni_generator/jni_generator.py', '../../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/android_webview/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['../java/src/org/chromium/android_webview/AndroidProtocolHandler.java', '../java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java', '../java/src/org/chromium/android_webview/AwContents.java', '../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/AwFormDatabase.java', '../java/src/org/chromium/android_webview/AwHttpAuthHandler.java', '../java/src/org/chromium/android_webview/AwPicture.java', '../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java', '../java/src/org/chromium/android_webview/AwResource.java', '../java/src/org/chromium/android_webview/AwSettings.java', '../java/src/org/chromium/android_webview/AwWebContentsDelegate.java', '../java/src/org/chromium/android_webview/InterceptedRequestData.java', '../java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java', '../java/src/org/chromium/android_webview/AwPdfExporter.java'], 'action': ['../../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/android_webview/jni', '--optimize_generation', '0', '--jarjar', '../../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../../base/android/jni_generator/jni_generator.py', '../../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/android_webview/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['../java/src/org/chromium/android_webview/AndroidProtocolHandler.java', '../java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java', '../java/src/org/chromium/android_webview/AwContents.java', '../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', '../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java', '../java/src/org/chromium/android_webview/AwResource.java', '../java/src/org/chromium/android_webview/AwSettings.java', '../java/src/org/chromium/android_webview/AwWebContentsDelegate.java', '../java/src/org/chromium/android_webview/InterceptedRequestData.java', '../java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java', '../java/src/org/chromium/android_webview/AwPdfExporter.java'], 'action': ['../../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/android_webview/jni', '--optimize_generation', '0', '--jarjar', '../../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -78,6 +78,16 @@
 .PHONY: android_webview_native_android_webview_native_jni_gyp_rule_trigger
 android_webview_native_android_webview_native_jni_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h
 
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: $(LOCAL_PATH)/android_webview/java/src/org/chromium/android_webview/AwDevToolsServer.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/android_webview/jni; cd $(gyp_local_path)/android_webview/native; ../../base/android/jni_generator/jni_generator.py --input_file ../java/src/org/chromium/android_webview/AwDevToolsServer.java --output_dir "$(gyp_shared_intermediate_dir)/android_webview/jni" --optimize_generation 0 --jarjar ../../android_webview/build/jarjar-rules.txt
+
+.PHONY: android_webview_native_android_webview_native_jni_gyp_rule_trigger
+android_webview_native_android_webview_native_jni_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h
+
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -187,6 +197,7 @@
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsClientBridge_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsIoThreadClient_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h \
+	$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwHttpAuthHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwPicture_jni.h \
@@ -208,6 +219,7 @@
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsClientBridge_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsIoThreadClient_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h \
+	$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwHttpAuthHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwPicture_jni.h \
diff --git a/android_webview/native/android_webview_native_jni.target.linux-arm.mk b/android_webview/native/android_webview_native_jni.target.linux-arm.mk
index 798115c..6f607bb 100644
--- a/android_webview/native/android_webview_native_jni.target.linux-arm.mk
+++ b/android_webview/native/android_webview_native_jni.target.linux-arm.mk
@@ -17,7 +17,7 @@
 
 
 ### Generated for rule "android_webview_native_webview_native_gyp_android_webview_native_jni_target_generate_jni_headers":
-# "{'inputs': ['../../base/android/jni_generator/jni_generator.py', '../../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/android_webview/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['../java/src/org/chromium/android_webview/AndroidProtocolHandler.java', '../java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java', '../java/src/org/chromium/android_webview/AwContents.java', '../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/AwFormDatabase.java', '../java/src/org/chromium/android_webview/AwHttpAuthHandler.java', '../java/src/org/chromium/android_webview/AwPicture.java', '../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java', '../java/src/org/chromium/android_webview/AwResource.java', '../java/src/org/chromium/android_webview/AwSettings.java', '../java/src/org/chromium/android_webview/AwWebContentsDelegate.java', '../java/src/org/chromium/android_webview/InterceptedRequestData.java', '../java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java', '../java/src/org/chromium/android_webview/AwPdfExporter.java'], 'action': ['../../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/android_webview/jni', '--optimize_generation', '0', '--jarjar', '../../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../../base/android/jni_generator/jni_generator.py', '../../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/android_webview/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['../java/src/org/chromium/android_webview/AndroidProtocolHandler.java', '../java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java', '../java/src/org/chromium/android_webview/AwContents.java', '../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', '../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java', '../java/src/org/chromium/android_webview/AwResource.java', '../java/src/org/chromium/android_webview/AwSettings.java', '../java/src/org/chromium/android_webview/AwWebContentsDelegate.java', '../java/src/org/chromium/android_webview/InterceptedRequestData.java', '../java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java', '../java/src/org/chromium/android_webview/AwPdfExporter.java'], 'action': ['../../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/android_webview/jni', '--optimize_generation', '0', '--jarjar', '../../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -78,6 +78,16 @@
 .PHONY: android_webview_native_android_webview_native_jni_gyp_rule_trigger
 android_webview_native_android_webview_native_jni_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h
 
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: $(LOCAL_PATH)/android_webview/java/src/org/chromium/android_webview/AwDevToolsServer.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/android_webview/jni; cd $(gyp_local_path)/android_webview/native; ../../base/android/jni_generator/jni_generator.py --input_file ../java/src/org/chromium/android_webview/AwDevToolsServer.java --output_dir "$(gyp_shared_intermediate_dir)/android_webview/jni" --optimize_generation 0 --jarjar ../../android_webview/build/jarjar-rules.txt
+
+.PHONY: android_webview_native_android_webview_native_jni_gyp_rule_trigger
+android_webview_native_android_webview_native_jni_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h
+
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -187,6 +197,7 @@
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsClientBridge_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsIoThreadClient_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h \
+	$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwHttpAuthHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwPicture_jni.h \
@@ -208,6 +219,7 @@
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsClientBridge_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsIoThreadClient_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h \
+	$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwHttpAuthHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwPicture_jni.h \
diff --git a/android_webview/native/android_webview_native_jni.target.linux-mips.mk b/android_webview/native/android_webview_native_jni.target.linux-mips.mk
index 119c700..09c46e1 100644
--- a/android_webview/native/android_webview_native_jni.target.linux-mips.mk
+++ b/android_webview/native/android_webview_native_jni.target.linux-mips.mk
@@ -17,7 +17,7 @@
 
 
 ### Generated for rule "android_webview_native_webview_native_gyp_android_webview_native_jni_target_generate_jni_headers":
-# "{'inputs': ['../../base/android/jni_generator/jni_generator.py', '../../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/android_webview/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['../java/src/org/chromium/android_webview/AndroidProtocolHandler.java', '../java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java', '../java/src/org/chromium/android_webview/AwContents.java', '../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/AwFormDatabase.java', '../java/src/org/chromium/android_webview/AwHttpAuthHandler.java', '../java/src/org/chromium/android_webview/AwPicture.java', '../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java', '../java/src/org/chromium/android_webview/AwResource.java', '../java/src/org/chromium/android_webview/AwSettings.java', '../java/src/org/chromium/android_webview/AwWebContentsDelegate.java', '../java/src/org/chromium/android_webview/InterceptedRequestData.java', '../java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java', '../java/src/org/chromium/android_webview/AwPdfExporter.java'], 'action': ['../../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/android_webview/jni', '--optimize_generation', '0', '--jarjar', '../../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../../base/android/jni_generator/jni_generator.py', '../../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/android_webview/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['../java/src/org/chromium/android_webview/AndroidProtocolHandler.java', '../java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java', '../java/src/org/chromium/android_webview/AwContents.java', '../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', '../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java', '../java/src/org/chromium/android_webview/AwResource.java', '../java/src/org/chromium/android_webview/AwSettings.java', '../java/src/org/chromium/android_webview/AwWebContentsDelegate.java', '../java/src/org/chromium/android_webview/InterceptedRequestData.java', '../java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java', '../java/src/org/chromium/android_webview/AwPdfExporter.java'], 'action': ['../../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/android_webview/jni', '--optimize_generation', '0', '--jarjar', '../../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -78,6 +78,16 @@
 .PHONY: android_webview_native_android_webview_native_jni_gyp_rule_trigger
 android_webview_native_android_webview_native_jni_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h
 
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: $(LOCAL_PATH)/android_webview/java/src/org/chromium/android_webview/AwDevToolsServer.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/android_webview/jni; cd $(gyp_local_path)/android_webview/native; ../../base/android/jni_generator/jni_generator.py --input_file ../java/src/org/chromium/android_webview/AwDevToolsServer.java --output_dir "$(gyp_shared_intermediate_dir)/android_webview/jni" --optimize_generation 0 --jarjar ../../android_webview/build/jarjar-rules.txt
+
+.PHONY: android_webview_native_android_webview_native_jni_gyp_rule_trigger
+android_webview_native_android_webview_native_jni_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h
+
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -187,6 +197,7 @@
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsClientBridge_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsIoThreadClient_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h \
+	$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwHttpAuthHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwPicture_jni.h \
@@ -208,6 +219,7 @@
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsClientBridge_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsIoThreadClient_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h \
+	$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwHttpAuthHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwPicture_jni.h \
diff --git a/android_webview/native/android_webview_native_jni.target.linux-x86.mk b/android_webview/native/android_webview_native_jni.target.linux-x86.mk
index 0c090d0..7a59119 100644
--- a/android_webview/native/android_webview_native_jni.target.linux-x86.mk
+++ b/android_webview/native/android_webview_native_jni.target.linux-x86.mk
@@ -17,7 +17,7 @@
 
 
 ### Generated for rule "android_webview_native_webview_native_gyp_android_webview_native_jni_target_generate_jni_headers":
-# "{'inputs': ['../../base/android/jni_generator/jni_generator.py', '../../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/android_webview/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['../java/src/org/chromium/android_webview/AndroidProtocolHandler.java', '../java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java', '../java/src/org/chromium/android_webview/AwContents.java', '../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/AwFormDatabase.java', '../java/src/org/chromium/android_webview/AwHttpAuthHandler.java', '../java/src/org/chromium/android_webview/AwPicture.java', '../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java', '../java/src/org/chromium/android_webview/AwResource.java', '../java/src/org/chromium/android_webview/AwSettings.java', '../java/src/org/chromium/android_webview/AwWebContentsDelegate.java', '../java/src/org/chromium/android_webview/InterceptedRequestData.java', '../java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java', '../java/src/org/chromium/android_webview/AwPdfExporter.java'], 'action': ['../../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/android_webview/jni', '--optimize_generation', '0', '--jarjar', '../../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../../base/android/jni_generator/jni_generator.py', '../../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/android_webview/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['../java/src/org/chromium/android_webview/AndroidProtocolHandler.java', '../java/src/org/chromium/android_webview/AwAutofillManagerDelegate.java', '../java/src/org/chromium/android_webview/AwContents.java', '../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', '../java/src/org/chromium/android_webview/AwQuotaManagerBridge.java', '../java/src/org/chromium/android_webview/AwResource.java', '../java/src/org/chromium/android_webview/AwSettings.java', '../java/src/org/chromium/android_webview/AwWebContentsDelegate.java', '../java/src/org/chromium/android_webview/InterceptedRequestData.java', '../java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java', '../java/src/org/chromium/android_webview/AwPdfExporter.java'], 'action': ['../../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/android_webview/jni', '--optimize_generation', '0', '--jarjar', '../../android_webview/build/jarjar-rules.txt'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/android_webview/jni/AndroidProtocolHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -78,6 +78,16 @@
 .PHONY: android_webview_native_android_webview_native_jni_gyp_rule_trigger
 android_webview_native_android_webview_native_jni_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h
 
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h: $(LOCAL_PATH)/android_webview/java/src/org/chromium/android_webview/AwDevToolsServer.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/android_webview/jni; cd $(gyp_local_path)/android_webview/native; ../../base/android/jni_generator/jni_generator.py --input_file ../java/src/org/chromium/android_webview/AwDevToolsServer.java --output_dir "$(gyp_shared_intermediate_dir)/android_webview/jni" --optimize_generation 0 --jarjar ../../android_webview/build/jarjar-rules.txt
+
+.PHONY: android_webview_native_android_webview_native_jni_gyp_rule_trigger
+android_webview_native_android_webview_native_jni_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h
+
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
 $(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
@@ -187,6 +197,7 @@
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsClientBridge_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsIoThreadClient_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h \
+	$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwHttpAuthHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwPicture_jni.h \
@@ -208,6 +219,7 @@
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsClientBridge_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwContentsIoThreadClient_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwCookieManager_jni.h \
+	$(gyp_shared_intermediate_dir)/android_webview/jni/AwDevToolsServer_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwFormDatabase_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwHttpAuthHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/android_webview/jni/AwPicture_jni.h \
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..b6c4fba
--- /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_refptr<net::StreamListenSocket> CreateSocketForTethering(
+      net::StreamListenSocket::Delegate* delegate,
+      std::string* name) OVERRIDE {
+    return NULL;
+  }
+
+ 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 b89c3de..04144ef 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',
@@ -109,6 +111,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',
diff --git a/android_webview/native/webview_native.target.darwin-arm.mk b/android_webview/native/webview_native.target.darwin-arm.mk
index 7f08cab..3b9bf8b 100644
--- a/android_webview/native/webview_native.target.darwin-arm.mk
+++ b/android_webview/native/webview_native.target.darwin-arm.mk
@@ -33,6 +33,7 @@
 	android_webview/native/aw_contents.cc \
 	android_webview/native/aw_contents_client_bridge.cc \
 	android_webview/native/aw_contents_io_thread_client_impl.cc \
+	android_webview/native/aw_dev_tools_server.cc \
 	android_webview/native/aw_form_database.cc \
 	android_webview/native/aw_geolocation_permission_context.cc \
 	android_webview/native/aw_http_auth_handler.cc \
diff --git a/android_webview/native/webview_native.target.darwin-mips.mk b/android_webview/native/webview_native.target.darwin-mips.mk
index 393e5db..9d7b9f8 100644
--- a/android_webview/native/webview_native.target.darwin-mips.mk
+++ b/android_webview/native/webview_native.target.darwin-mips.mk
@@ -33,6 +33,7 @@
 	android_webview/native/aw_contents.cc \
 	android_webview/native/aw_contents_client_bridge.cc \
 	android_webview/native/aw_contents_io_thread_client_impl.cc \
+	android_webview/native/aw_dev_tools_server.cc \
 	android_webview/native/aw_form_database.cc \
 	android_webview/native/aw_geolocation_permission_context.cc \
 	android_webview/native/aw_http_auth_handler.cc \
diff --git a/android_webview/native/webview_native.target.darwin-x86.mk b/android_webview/native/webview_native.target.darwin-x86.mk
index 0ca18d1..132782b 100644
--- a/android_webview/native/webview_native.target.darwin-x86.mk
+++ b/android_webview/native/webview_native.target.darwin-x86.mk
@@ -33,6 +33,7 @@
 	android_webview/native/aw_contents.cc \
 	android_webview/native/aw_contents_client_bridge.cc \
 	android_webview/native/aw_contents_io_thread_client_impl.cc \
+	android_webview/native/aw_dev_tools_server.cc \
 	android_webview/native/aw_form_database.cc \
 	android_webview/native/aw_geolocation_permission_context.cc \
 	android_webview/native/aw_http_auth_handler.cc \
diff --git a/android_webview/native/webview_native.target.linux-arm.mk b/android_webview/native/webview_native.target.linux-arm.mk
index 7f08cab..3b9bf8b 100644
--- a/android_webview/native/webview_native.target.linux-arm.mk
+++ b/android_webview/native/webview_native.target.linux-arm.mk
@@ -33,6 +33,7 @@
 	android_webview/native/aw_contents.cc \
 	android_webview/native/aw_contents_client_bridge.cc \
 	android_webview/native/aw_contents_io_thread_client_impl.cc \
+	android_webview/native/aw_dev_tools_server.cc \
 	android_webview/native/aw_form_database.cc \
 	android_webview/native/aw_geolocation_permission_context.cc \
 	android_webview/native/aw_http_auth_handler.cc \
diff --git a/android_webview/native/webview_native.target.linux-mips.mk b/android_webview/native/webview_native.target.linux-mips.mk
index 393e5db..9d7b9f8 100644
--- a/android_webview/native/webview_native.target.linux-mips.mk
+++ b/android_webview/native/webview_native.target.linux-mips.mk
@@ -33,6 +33,7 @@
 	android_webview/native/aw_contents.cc \
 	android_webview/native/aw_contents_client_bridge.cc \
 	android_webview/native/aw_contents_io_thread_client_impl.cc \
+	android_webview/native/aw_dev_tools_server.cc \
 	android_webview/native/aw_form_database.cc \
 	android_webview/native/aw_geolocation_permission_context.cc \
 	android_webview/native/aw_http_auth_handler.cc \
diff --git a/android_webview/native/webview_native.target.linux-x86.mk b/android_webview/native/webview_native.target.linux-x86.mk
index 0ca18d1..132782b 100644
--- a/android_webview/native/webview_native.target.linux-x86.mk
+++ b/android_webview/native/webview_native.target.linux-x86.mk
@@ -33,6 +33,7 @@
 	android_webview/native/aw_contents.cc \
 	android_webview/native/aw_contents_client_bridge.cc \
 	android_webview/native/aw_contents_io_thread_client_impl.cc \
+	android_webview/native/aw_dev_tools_server.cc \
 	android_webview/native/aw_form_database.cc \
 	android_webview/native/aw_geolocation_permission_context.cc \
 	android_webview/native/aw_http_auth_handler.cc \