summaryrefslogtreecommitdiffstats
path: root/android_webview/browser
diff options
context:
space:
mode:
authormnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-12 13:23:53 +0000
committermnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-12 13:23:53 +0000
commitc93f8fdc946ce1e29d719f17d0489ec039cf64e8 (patch)
tree58156897238041bf6c5a6691619456250b3a98ce /android_webview/browser
parent9628e0d1b18acb3ef20752bfa19737338d26346c (diff)
downloadchromium_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.cc114
-rw-r--r--android_webview/browser/browser_view_renderer.h11
-rw-r--r--android_webview/browser/browser_view_renderer_impl.cc15
-rw-r--r--android_webview/browser/browser_view_renderer_impl.h4
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_;