diff options
author | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-12 13:23:53 +0000 |
---|---|---|
committer | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-12 13:23:53 +0000 |
commit | c93f8fdc946ce1e29d719f17d0489ec039cf64e8 (patch) | |
tree | 58156897238041bf6c5a6691619456250b3a98ce /android_webview/browser | |
parent | 9628e0d1b18acb3ef20752bfa19737338d26346c (diff) | |
download | chromium_src-c93f8fdc946ce1e29d719f17d0489ec039cf64e8.zip chromium_src-c93f8fdc946ce1e29d719f17d0489ec039cf64e8.tar.gz chromium_src-c93f8fdc946ce1e29d719f17d0489ec039cf64e8.tar.bz2 |
[Android WebView] Provide more information about WebView for web debugging
Using only page title is not enough for identifying a WebView.
This change adds to the remote web debugging landing page more
information about debuggable WebViews.
Review URL: https://codereview.chromium.org/12697002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@187573 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview/browser')
-rw-r--r-- | android_webview/browser/aw_devtools_delegate.cc | 114 | ||||
-rw-r--r-- | android_webview/browser/browser_view_renderer.h | 11 | ||||
-rw-r--r-- | android_webview/browser/browser_view_renderer_impl.cc | 15 | ||||
-rw-r--r-- | android_webview/browser/browser_view_renderer_impl.h | 4 |
4 files changed, 120 insertions, 24 deletions
diff --git a/android_webview/browser/aw_devtools_delegate.cc b/android_webview/browser/aw_devtools_delegate.cc index 7232dd8..1138f88 100644 --- a/android_webview/browser/aw_devtools_delegate.cc +++ b/android_webview/browser/aw_devtools_delegate.cc @@ -4,8 +4,11 @@ #include "android_webview/browser/aw_devtools_delegate.h" +#include "android_webview/browser/browser_view_renderer_impl.h" #include "base/bind.h" +#include "base/json/json_writer.h" #include "base/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" @@ -33,8 +36,8 @@ AwDevToolsDelegate::~AwDevToolsDelegate() { } void AwDevToolsDelegate::Stop() { - // The HTTP handler will delete our instance. devtools_http_handler_->Stop(); + // WARNING: |this| has now been deleted by the method above. } std::string AwDevToolsDelegate::GetDiscoveryPageHTML() { @@ -51,46 +54,89 @@ std::string AwDevToolsDelegate::GetDiscoveryPageHTML() { "function onLoad() {" " var tabs_list_request = new XMLHttpRequest();" " tabs_list_request.open(" - "\"GET\", \"/json/list?t=\" + new Date().getTime(), true);" + " 'GET', '/json/list?t=' + new Date().getTime(), true);" " tabs_list_request.onreadystatechange = onReady;" " tabs_list_request.send();" "}" + "function viewsComparator(v1, v2) {" + " if (v1.attached != v2.attached) {" + " return v1.attached ? -1 : 1;" + " } else if (v1.visible != v2.visible) {" + " return v1.visible ? -1 : 1;" + " } else if (v1.empty != v2.empty) {" + " return v1.empty ? 1 : -1;" + " } else if (v1.screenX != v2.screenX) {" + " return v1.screenX - v2.screenX;" + " } else if (v1.screenY != v2.screenY) {" + " return v1.screenY - v2.screenY;" + " }" + " return 0;" + "}" + "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)" - " appendItem(responseJSON[i]);" + " items.push(processItem(responseJSON[i]));" + " items.sort(viewsComparator);" + " for (var i = 0; i < items.length; ++i)" + " displayView(items[i]);" " }" "}" - "function appendItem(item_object) {" + "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_object.devtoolsFrontendUrl) {" - " frontend_ref = document.createElement(\"a\");" - " frontend_ref.href = item_object.devtoolsFrontendUrl;" - " frontend_ref.title = item_object.title;" + " if (item.debuggable) {" + " frontend_ref = document.createElement('a');" + " frontend_ref.href = item.debugUrl;" + " frontend_ref.title = item.title;" + " column.appendChild(frontend_ref);" + " } else {" + " frontend_ref = column;" + " }" + " var text = document.createElement('span');" + " if (item.title) {" + " text.innerText = cutTextIfNeeded(item.title, 64);" " } else {" - " frontend_ref = document.createElement(\"div\");" - " frontend_ref.title = " - "\"The view already has active debugging session\";" + " text.innerText = '(untitled)';" " }" - " var text = document.createElement(\"div\");" - " if (item_object.title)" - " text.innerText = item_object.title;" - " else" - " text.innerText = \"(untitled tab)\";" - " text.style.cssText = " - "\"background-image:url(\" + item_object.faviconUrl + \")\";" " frontend_ref.appendChild(text);" - " var item = document.createElement(\"p\");" - " item.appendChild(frontend_ref);" - " document.getElementById(\"items\").appendChild(item);" + " row.appendChild(column);" + " addColumn(row, item.attached ? 'Y' : 'N');" + " addColumn(row, item.visible ? 'Y' : 'N');" + " addColumn(row, item.empty ? 'Y' : 'N');" + " addColumn(row, item.screenX + ', ' + item.screenY);" + " addColumn(row," + " !item.empty ? (item.width + '\u00d7' + item.height) : '');" + " document.getElementById('items').appendChild(row);" "}" "</script>" "</head>" "<body onload='onLoad()'>" " <div id='caption'>Inspectable WebViews</div>" - " <div id='items'></div>" + " <table>" + " <tr><th>Title</th><th>Attached</th><th>Visible</th><th>Empty</th>" + "<th>Position</th><th>Size</th></tr>" + " <tbody id='items'></tbody>" + " </table>" "</body>" "</html>"; return html; @@ -117,8 +163,28 @@ AwDevToolsDelegate::GetTargetType(content::RenderViewHost*) { return kTargetTypeTab; } -std::string AwDevToolsDelegate::GetViewDescription(content::RenderViewHost*) { - return ""; +std::string AwDevToolsDelegate::GetViewDescription( + content::RenderViewHost* rvh) { + content::WebContents* web_contents = + content::WebContents::FromRenderViewHost(rvh); + if (!web_contents) return ""; + BrowserViewRenderer* bvr = + BrowserViewRendererImpl::FromWebContents(web_contents); + if (!bvr) return ""; + base::DictionaryValue description; + description.SetBoolean("attached", bvr->IsAttachedToWindow()); + description.SetBoolean("visible", bvr->IsViewVisible()); + 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 android_webview diff --git a/android_webview/browser/browser_view_renderer.h b/android_webview/browser/browser_view_renderer.h index 02f47bc..6c246bf 100644 --- a/android_webview/browser/browser_view_renderer.h +++ b/android_webview/browser/browser_view_renderer.h @@ -6,11 +6,14 @@ #define ANDROID_WEBVIEW_BROWSER_BROWSER_VIEW_RENDERER_H_ #include "base/android/scoped_java_ref.h" +#include "ui/gfx/point.h" +#include "ui/gfx/rect.h" struct AwDrawGLInfo; namespace content { class ContentViewCore; +class WebContents; } namespace gfx { @@ -33,6 +36,9 @@ class BrowserViewRenderer { virtual void OnNewPicture( const base::android::JavaRef<jobject>& picture) = 0; + // Called to get view's absolute location on the screen. + virtual gfx::Point GetLocationOnScreen() = 0; + protected: virtual ~Client() {} }; @@ -87,6 +93,11 @@ class BrowserViewRenderer { virtual void OnAttachedToWindow(int width, int height) = 0; virtual void OnDetachedFromWindow() = 0; + // Android views hierarchy gluing. + virtual bool IsAttachedToWindow() = 0; + virtual bool IsViewVisible() = 0; + virtual gfx::Rect GetScreenRect() = 0; + virtual ~BrowserViewRenderer() {} }; diff --git a/android_webview/browser/browser_view_renderer_impl.cc b/android_webview/browser/browser_view_renderer_impl.cc index 1c3f27f..188d28a 100644 --- a/android_webview/browser/browser_view_renderer_impl.cc +++ b/android_webview/browser/browser_view_renderer_impl.cc @@ -136,6 +136,7 @@ BrowserViewRendererImpl::BrowserViewRendererImpl( view_clip_layer_(cc::Layer::Create()), transform_layer_(cc::Layer::Create()), scissor_clip_layer_(cc::Layer::Create()), + view_attached_(false), view_visible_(false), compositor_visible_(false), is_composite_pending_(false), @@ -409,15 +410,29 @@ void BrowserViewRendererImpl::OnSizeChanged(int width, int height) { } void BrowserViewRendererImpl::OnAttachedToWindow(int width, int height) { + view_attached_ = true; view_size_ = gfx::Size(width, height); view_clip_layer_->SetBounds(view_size_); } void BrowserViewRendererImpl::OnDetachedFromWindow() { + view_attached_ = false; view_visible_ = false; SetCompositorVisibility(false); } +bool BrowserViewRendererImpl::IsAttachedToWindow() { + return view_attached_; +} + +bool BrowserViewRendererImpl::IsViewVisible() { + return view_visible_; +} + +gfx::Rect BrowserViewRendererImpl::GetScreenRect() { + return gfx::Rect(client_->GetLocationOnScreen(), view_size_); +} + void BrowserViewRendererImpl::ScheduleComposite() { TRACE_EVENT0("android_webview", "BrowserViewRendererImpl::ScheduleComposite"); diff --git a/android_webview/browser/browser_view_renderer_impl.h b/android_webview/browser/browser_view_renderer_impl.h index 3ba2909..3a5170e 100644 --- a/android_webview/browser/browser_view_renderer_impl.h +++ b/android_webview/browser/browser_view_renderer_impl.h @@ -57,6 +57,9 @@ class BrowserViewRendererImpl virtual void OnSizeChanged(int width, int height) OVERRIDE; virtual void OnAttachedToWindow(int width, int height) OVERRIDE; virtual void OnDetachedFromWindow() OVERRIDE; + virtual bool IsAttachedToWindow() OVERRIDE; + virtual bool IsViewVisible() OVERRIDE; + virtual gfx::Rect GetScreenRect() OVERRIDE; // content::Compositor::Client implementation. virtual void ScheduleComposite() OVERRIDE; @@ -110,6 +113,7 @@ class BrowserViewRendererImpl // Last View scroll before hardware rendering is triggered. gfx::Point hw_rendering_scroll_; + bool view_attached_; bool view_visible_; bool compositor_visible_; bool is_composite_pending_; |