DevTools: Add parent id to target descriptor in remote debugging.

Webviews and OOP iframes now have non-empty parentId property pointing to the target they are nested into. Also added 'webview' and 'iframe' target types.

TBR=bulach,mnaganov (for dev_tools_server.cc aw_dev_tools_server.cc)
BUG=378457

Review URL: https://codereview.chromium.org/305903004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@274178 0039d316-1c4b-4281-b951-d872f2087c98
parent 8d21392d
...@@ -39,6 +39,7 @@ class Target : public content::DevToolsTarget { ...@@ -39,6 +39,7 @@ class Target : public content::DevToolsTarget {
explicit Target(WebContents* web_contents); explicit Target(WebContents* web_contents);
virtual std::string GetId() const OVERRIDE { return id_; } virtual std::string GetId() const OVERRIDE { return id_; }
virtual std::string GetParentId() const OVERRIDE { return std::string(); }
virtual std::string GetType() const OVERRIDE { return kTargetTypePage; } virtual std::string GetType() const OVERRIDE { return kTargetTypePage; }
virtual std::string GetTitle() const OVERRIDE { return title_; } virtual std::string GetTitle() const OVERRIDE { return title_; }
virtual std::string GetDescription() const OVERRIDE { return description_; } virtual std::string GetDescription() const OVERRIDE { return description_; }
......
...@@ -79,6 +79,8 @@ static GURL GetFaviconURLForContents(WebContents* web_contents) { ...@@ -79,6 +79,8 @@ static GURL GetFaviconURLForContents(WebContents* web_contents) {
class TargetBase : public content::DevToolsTarget { class TargetBase : public content::DevToolsTarget {
public: public:
// content::DevToolsTarget implementation: // content::DevToolsTarget implementation:
virtual std::string GetParentId() const OVERRIDE { return std::string(); }
virtual std::string GetTitle() const OVERRIDE { return title_; } virtual std::string GetTitle() const OVERRIDE { return title_; }
virtual std::string GetDescription() const OVERRIDE { return std::string(); } virtual std::string GetDescription() const OVERRIDE { return std::string(); }
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "chrome/browser/devtools/devtools_window.h" #include "chrome/browser/devtools/devtools_window.h"
#include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/guest_view/guest_view_base.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/tab_contents/tab_contents_iterator.h" #include "chrome/browser/ui/tab_contents/tab_contents_iterator.h"
#include "chrome/browser/ui/webui/extensions/extension_icon_source.h" #include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
...@@ -35,6 +36,8 @@ const char kTargetTypeApp[] = "app"; ...@@ -35,6 +36,8 @@ const char kTargetTypeApp[] = "app";
const char kTargetTypeBackgroundPage[] = "background_page"; const char kTargetTypeBackgroundPage[] = "background_page";
const char kTargetTypePage[] = "page"; const char kTargetTypePage[] = "page";
const char kTargetTypeWorker[] = "worker"; const char kTargetTypeWorker[] = "worker";
const char kTargetTypeWebView[] = "webview";
const char kTargetTypeIFrame[] = "iframe";
const char kTargetTypeOther[] = "other"; const char kTargetTypeOther[] = "other";
// RenderViewHostTarget -------------------------------------------------------- // RenderViewHostTarget --------------------------------------------------------
...@@ -67,9 +70,11 @@ RenderViewHostTarget::RenderViewHostTarget(RenderViewHost* rvh, bool is_tab) ...@@ -67,9 +70,11 @@ RenderViewHostTarget::RenderViewHostTarget(RenderViewHost* rvh, bool is_tab)
content::RenderFrameHost* rfh = rvh->GetMainFrame(); content::RenderFrameHost* rfh = rvh->GetMainFrame();
if (rfh->IsCrossProcessSubframe()) { if (rfh->IsCrossProcessSubframe()) {
set_url(rfh->GetLastCommittedURL()); set_url(rfh->GetLastCommittedURL());
set_type(kTargetTypeOther); set_type(kTargetTypeIFrame);
// TODO(kaznacheev) Try setting the title when the frame navigation // TODO(kaznacheev) Try setting the title when the frame navigation
// refactoring is done. // refactoring is done.
RenderViewHost* parent_rvh = rfh->GetParent()->GetRenderViewHost();
set_parent_id(DevToolsAgentHost::GetOrCreateFor(parent_rvh)->GetId());
return; return;
} }
...@@ -81,6 +86,15 @@ RenderViewHostTarget::RenderViewHostTarget(RenderViewHost* rvh, bool is_tab) ...@@ -81,6 +86,15 @@ RenderViewHostTarget::RenderViewHostTarget(RenderViewHost* rvh, bool is_tab)
set_favicon_url(entry->GetFavicon().url); set_favicon_url(entry->GetFavicon().url);
set_last_activity_time(web_contents->GetLastActiveTime()); set_last_activity_time(web_contents->GetLastActiveTime());
GuestViewBase* guest = GuestViewBase::FromWebContents(web_contents);
if (guest) {
set_type(kTargetTypeWebView);
RenderViewHost* parent_rvh =
guest->embedder_web_contents()->GetRenderViewHost();
set_parent_id(DevToolsAgentHost::GetOrCreateFor(parent_rvh)->GetId());
return;
}
if (is_tab) { if (is_tab) {
set_type(kTargetTypePage); set_type(kTargetTypePage);
tab_id_ = extensions::ExtensionTabUtil::GetTabId(web_contents); tab_id_ = extensions::ExtensionTabUtil::GetTabId(web_contents);
...@@ -207,6 +221,10 @@ DevToolsTargetImpl::DevToolsTargetImpl( ...@@ -207,6 +221,10 @@ DevToolsTargetImpl::DevToolsTargetImpl(
: agent_host_(agent_host) { : agent_host_(agent_host) {
} }
std::string DevToolsTargetImpl::GetParentId() const {
return parent_id_;
}
std::string DevToolsTargetImpl::GetId() const { std::string DevToolsTargetImpl::GetId() const {
return agent_host_->GetId(); return agent_host_->GetId();
} }
......
...@@ -26,6 +26,7 @@ class DevToolsTargetImpl : public content::DevToolsTarget { ...@@ -26,6 +26,7 @@ class DevToolsTargetImpl : public content::DevToolsTarget {
// content::DevToolsTarget overrides: // content::DevToolsTarget overrides:
virtual std::string GetId() const OVERRIDE; virtual std::string GetId() const OVERRIDE;
virtual std::string GetParentId() const OVERRIDE;
virtual std::string GetType() const OVERRIDE; virtual std::string GetType() const OVERRIDE;
virtual std::string GetTitle() const OVERRIDE; virtual std::string GetTitle() const OVERRIDE;
virtual std::string GetDescription() const OVERRIDE; virtual std::string GetDescription() const OVERRIDE;
...@@ -59,6 +60,7 @@ class DevToolsTargetImpl : public content::DevToolsTarget { ...@@ -59,6 +60,7 @@ class DevToolsTargetImpl : public content::DevToolsTarget {
static scoped_ptr<DevToolsTargetImpl> CreateForRenderViewHost( static scoped_ptr<DevToolsTargetImpl> CreateForRenderViewHost(
content::RenderViewHost*, bool is_tab); content::RenderViewHost*, bool is_tab);
void set_parent_id(const std::string& parent_id) { parent_id_ = parent_id; }
void set_type(const std::string& type) { type_ = type; } void set_type(const std::string& type) { type_ = type; }
void set_title(const std::string& title) { title_ = title; } void set_title(const std::string& title) { title_ = title; }
void set_description(const std::string& desc) { description_ = desc; } void set_description(const std::string& desc) { description_ = desc; }
...@@ -77,7 +79,7 @@ class DevToolsTargetImpl : public content::DevToolsTarget { ...@@ -77,7 +79,7 @@ class DevToolsTargetImpl : public content::DevToolsTarget {
private: private:
scoped_refptr<content::DevToolsAgentHost> agent_host_; scoped_refptr<content::DevToolsAgentHost> agent_host_;
std::string id_; std::string parent_id_;
std::string type_; std::string type_;
std::string title_; std::string title_;
std::string description_; std::string description_;
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
#include "base/version.h" #include "base/version.h"
#include "chrome/browser/devtools/device/devtools_android_bridge.h" #include "chrome/browser/devtools/device/devtools_android_bridge.h"
#include "chrome/browser/devtools/devtools_target_impl.h" #include "chrome/browser/devtools/devtools_target_impl.h"
#include "chrome/browser/guest_view/guest_view_base.h"
#include "chrome/common/chrome_version_info.h" #include "chrome/common/chrome_version_info.h"
#include "content/public/browser/browser_child_process_observer.h" #include "content/public/browser/browser_child_process_observer.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
...@@ -21,18 +20,12 @@ ...@@ -21,18 +20,12 @@
#include "content/public/browser/notification_service.h" #include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h" #include "content/public/browser/notification_source.h"
#include "content/public/browser/notification_types.h" #include "content/public/browser/notification_types.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/worker_service.h" #include "content/public/browser/worker_service.h"
#include "content/public/browser/worker_service_observer.h" #include "content/public/browser/worker_service_observer.h"
#include "content/public/common/process_type.h" #include "content/public/common/process_type.h"
#include "net/base/escape.h" #include "net/base/escape.h"
using content::BrowserThread; using content::BrowserThread;
using content::RenderFrameHost;
using content::WebContents;
namespace { namespace {
...@@ -141,8 +134,7 @@ void RenderViewHostTargetsUIHandler::Observe( ...@@ -141,8 +134,7 @@ void RenderViewHostTargetsUIHandler::Observe(
void RenderViewHostTargetsUIHandler::UpdateTargets() { void RenderViewHostTargetsUIHandler::UpdateTargets() {
scoped_ptr<base::ListValue> list_value(new base::ListValue()); scoped_ptr<base::ListValue> list_value(new base::ListValue());
std::map<RenderFrameHost*, base::DictionaryValue*> rfh_to_descriptor; std::map<std::string, base::DictionaryValue*> id_to_descriptor;
std::vector<RenderFrameHost*> nested_frames;
DevToolsTargetImpl::List targets = DevToolsTargetImpl::List targets =
DevToolsTargetImpl::EnumerateRenderViewHostTargets(); DevToolsTargetImpl::EnumerateRenderViewHostTargets();
...@@ -150,51 +142,26 @@ void RenderViewHostTargetsUIHandler::UpdateTargets() { ...@@ -150,51 +142,26 @@ void RenderViewHostTargetsUIHandler::UpdateTargets() {
STLDeleteValues(&targets_); STLDeleteValues(&targets_);
for (DevToolsTargetImpl::List::iterator it = targets.begin(); for (DevToolsTargetImpl::List::iterator it = targets.begin();
it != targets.end(); ++it) { it != targets.end(); ++it) {
scoped_ptr<DevToolsTargetImpl> target(*it); DevToolsTargetImpl* target = *it;
content::RenderViewHost* rvh = target->GetRenderViewHost(); targets_[target->GetId()] = target;
if (!rvh) id_to_descriptor[target->GetId()] = Serialize(*target);
continue;
DevToolsTargetImpl* target_ptr = target.get();
targets_[target_ptr->GetId()] = target.release();
base::DictionaryValue* descriptor = Serialize(*target_ptr);
// TODO (kaznacheev): GetMainFrame() call is a temporary hack.
// Revisit this when multiple OOP frames are supported.
RenderFrameHost* rfh = rvh->GetMainFrame();
rfh_to_descriptor[rfh] = descriptor;
content::WebContents* web_contents =
content::WebContents::FromRenderViewHost(rvh);
if (GuestViewBase::IsGuest(web_contents) || rfh->IsCrossProcessSubframe()) {
nested_frames.push_back(rfh);
} else {
list_value->Append(descriptor);
}
} }
// Add the list of nested targets to each of its owners. for (TargetMap::iterator it(targets_.begin()); it != targets_.end(); ++it) {
for (std::vector<RenderFrameHost*>::iterator it(nested_frames.begin()); DevToolsTargetImpl* target = it->second;
it != nested_frames.end(); ++it) { base::DictionaryValue* descriptor = id_to_descriptor[target->GetId()];
RenderFrameHost* rfh = (*it);
RenderFrameHost* parent_rfh = NULL; std::string parent_id = target->GetParentId();
content::RenderViewHost* rvh = rfh->GetRenderViewHost(); if (parent_id.empty() || id_to_descriptor.count(parent_id) == 0) {
WebContents* nested_web_contents = WebContents::FromRenderViewHost(rvh); list_value->Append(descriptor);
GuestViewBase* guest = GuestViewBase::FromWebContents(nested_web_contents);
if (guest) {
WebContents* embedder = guest->embedder_web_contents();
parent_rfh = embedder->GetRenderViewHost()->GetMainFrame();
} else { } else {
parent_rfh = rfh->GetParent(); base::DictionaryValue* parent = id_to_descriptor[parent_id];
DCHECK(parent_rfh);
}
if (parent_rfh && rfh_to_descriptor.count(parent_rfh) > 0) {
base::DictionaryValue* parent = rfh_to_descriptor[parent_rfh];
base::ListValue* guests = NULL; base::ListValue* guests = NULL;
if (!parent->GetList(kGuestList, &guests)) { if (!parent->GetList(kGuestList, &guests)) {
guests = new base::ListValue(); guests = new base::ListValue();
parent->Set(kGuestList, guests); parent->Set(kGuestList, guests);
} }
guests->Append(rfh_to_descriptor[rfh]); guests->Append(descriptor);
} }
} }
......
...@@ -54,6 +54,7 @@ const char kThumbUrlPrefix[] = "/thumb/"; ...@@ -54,6 +54,7 @@ const char kThumbUrlPrefix[] = "/thumb/";
const char kPageUrlPrefix[] = "/devtools/page/"; const char kPageUrlPrefix[] = "/devtools/page/";
const char kTargetIdField[] = "id"; const char kTargetIdField[] = "id";
const char kTargetParentIdField[] = "parentId";
const char kTargetTypeField[] = "type"; const char kTargetTypeField[] = "type";
const char kTargetTitleField[] = "title"; const char kTargetTitleField[] = "title";
const char kTargetDescriptionField[] = "description"; const char kTargetDescriptionField[] = "description";
...@@ -753,6 +754,9 @@ base::DictionaryValue* DevToolsHttpHandlerImpl::SerializeTarget( ...@@ -753,6 +754,9 @@ base::DictionaryValue* DevToolsHttpHandlerImpl::SerializeTarget(
std::string id = target.GetId(); std::string id = target.GetId();
dictionary->SetString(kTargetIdField, id); dictionary->SetString(kTargetIdField, id);
std::string parent_id = target.GetParentId();
if (!parent_id.empty())
dictionary->SetString(kTargetParentIdField, parent_id);
dictionary->SetString(kTargetTypeField, target.GetType()); dictionary->SetString(kTargetTypeField, target.GetType());
dictionary->SetString(kTargetTitleField, dictionary->SetString(kTargetTitleField,
net::EscapeForHTML(target.GetTitle())); net::EscapeForHTML(target.GetTitle()));
......
...@@ -28,6 +28,9 @@ class DevToolsTarget { ...@@ -28,6 +28,9 @@ class DevToolsTarget {
// Returns the unique target id. // Returns the unique target id.
virtual std::string GetId() const = 0; virtual std::string GetId() const = 0;
// Returns the id of the parent target, or empty string if no parent.
virtual std::string GetParentId() const = 0;
// Returns the target type. // Returns the target type.
virtual std::string GetType() const = 0; virtual std::string GetType() const = 0;
......
...@@ -77,6 +77,7 @@ class Target : public content::DevToolsTarget { ...@@ -77,6 +77,7 @@ class Target : public content::DevToolsTarget {
explicit Target(WebContents* web_contents); explicit Target(WebContents* web_contents);
virtual std::string GetId() const OVERRIDE { return id_; } virtual std::string GetId() const OVERRIDE { return id_; }
virtual std::string GetParentId() const OVERRIDE { return std::string(); }
virtual std::string GetType() const OVERRIDE { return kTargetTypePage; } virtual std::string GetType() const OVERRIDE { return kTargetTypePage; }
virtual std::string GetTitle() const OVERRIDE { return title_; } virtual std::string GetTitle() const OVERRIDE { return title_; }
virtual std::string GetDescription() const OVERRIDE { return std::string(); } virtual std::string GetDescription() const OVERRIDE { return std::string(); }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment