diff options
author | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-21 17:53:03 +0000 |
---|---|---|
committer | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-21 17:53:03 +0000 |
commit | ad89136774e39213501103483ddb75c3575e7a3e (patch) | |
tree | 620911c5925d3f459b31514a083829b0d40e82fe /android_webview | |
parent | 46b3425a2dbc95907f13656765e1c28729d88258 (diff) | |
download | chromium_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.gyp | 2 | ||||
-rw-r--r-- | android_webview/browser/aw_browser_main_parts.cc | 7 | ||||
-rw-r--r-- | android_webview/browser/aw_browser_main_parts.h | 3 | ||||
-rw-r--r-- | android_webview/browser/aw_devtools_delegate.cc | 248 | ||||
-rw-r--r-- | android_webview/browser/aw_devtools_delegate.h | 54 | ||||
-rw-r--r-- | android_webview/java/src/org/chromium/android_webview/AwDevToolsServer.java | 33 | ||||
-rw-r--r-- | android_webview/native/android_webview_jni_registrar.cc | 2 | ||||
-rw-r--r-- | android_webview/native/aw_dev_tools_server.cc | 170 | ||||
-rw-r--r-- | android_webview/native/aw_dev_tools_server.h | 43 | ||||
-rw-r--r-- | android_webview/native/webview_native.gyp | 3 |
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', |