Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(494)

Unified Diff: components/ui_devtools/views/ui_devtools_dom_agent.cc

Issue 2959263002: Show corresponding window/widget/view in UIElement tree when clicking on a UI element. (Closed)
Patch Set: set handled for cancelable event mouse click Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/ui_devtools/views/ui_devtools_dom_agent.cc
diff --git a/components/ui_devtools/views/ui_devtools_dom_agent.cc b/components/ui_devtools/views/ui_devtools_dom_agent.cc
index c4c3cbf59a8292ca6410d95cdfc23518f15237e9..503e4d0ec2d29f09199932bcfab9c9e2f07117ca 100644
--- a/components/ui_devtools/views/ui_devtools_dom_agent.cc
+++ b/components/ui_devtools/views/ui_devtools_dom_agent.cc
@@ -5,6 +5,7 @@
#include "components/ui_devtools/views/ui_devtools_dom_agent.h"
#include "components/ui_devtools/devtools_server.h"
+#include "components/ui_devtools/views/ui_devtools_overlay_agent.h"
#include "components/ui_devtools/views/ui_element.h"
#include "components/ui_devtools/views/view_element.h"
#include "components/ui_devtools/views/widget_element.h"
@@ -18,6 +19,7 @@
#include "ui/display/screen.h"
#include "ui/views/background.h"
#include "ui/views/border.h"
+#include "ui/views/pointer_watcher.h"
#include "ui/views/view.h"
#include "ui/views/widget/widget.h"
#include "ui/wm/core/window_util.h"
@@ -36,6 +38,7 @@ std::unique_ptr<DOM::Node> BuildNode(
constexpr int kDomElementNodeType = 1;
std::unique_ptr<DOM::Node> node = DOM::Node::create()
.setNodeId(node_ids)
+ .setBackendNodeId(node_ids)
.setNodeName(name)
.setNodeType(kDomElementNodeType)
.setAttributes(std::move(attributes))
@@ -105,6 +108,7 @@ std::unique_ptr<DOM::Node> BuildDomNodeFromUIElement(UIElement* root) {
constexpr int kDomElementNodeType = 1;
std::unique_ptr<DOM::Node> node = DOM::Node::create()
.setNodeId(root->node_id())
+ .setBackendNodeId(root->node_id())
.setNodeName(root->GetTypeName())
.setNodeType(kDomElementNodeType)
.setAttributes(GetAttributes(root))
@@ -114,6 +118,47 @@ std::unique_ptr<DOM::Node> BuildDomNodeFromUIElement(UIElement* root) {
return node;
}
+int FindUIElementIdForView(UIElement* root, views::View* element) {
+ if (root->type() == UIElementType::VIEW &&
+ UIElement::GetBackingElement<views::View, ViewElement>(root) == element)
+ return root->node_id();
+
+ for (auto* child : root->children()) {
+ int ui_element_id = FindUIElementIdForView(child, element);
+ if (ui_element_id)
+ return ui_element_id;
+ }
+ return 0;
+}
+
+int FindUIElementIdForWidget(UIElement* root, views::Widget* element) {
+ if (root->type() == UIElementType::WIDGET &&
+ UIElement::GetBackingElement<views::Widget, WidgetElement>(root) ==
+ element)
+ return root->node_id();
+
+ for (auto* child : root->children()) {
+ int ui_element_id = FindUIElementIdForWidget(child, element);
+ if (ui_element_id)
+ return ui_element_id;
+ }
+ return 0;
+}
+
+int FindUIElementIdForWindow(UIElement* root, aura::Window* element) {
+ if (root->type() == UIElementType::WINDOW &&
+ UIElement::GetBackingElement<aura::Window, WindowElement>(root) ==
+ element)
+ return root->node_id();
+
+ for (auto* child : root->children()) {
+ int ui_element_id = FindUIElementIdForWindow(child, element);
+ if (ui_element_id)
+ return ui_element_id;
+ }
+ return 0;
+}
+
} // namespace
UIDevToolsDOMAgent::UIDevToolsDOMAgent() : is_building_tree_(false) {
@@ -136,19 +181,27 @@ ui_devtools::protocol::Response UIDevToolsDOMAgent::getDocument(
return ui_devtools::protocol::Response::OK();
}
-ui_devtools::protocol::Response UIDevToolsDOMAgent::highlightNode(
- std::unique_ptr<ui_devtools::protocol::DOM::HighlightConfig>
- highlight_config,
- ui_devtools::protocol::Maybe<int> node_id) {
- return HighlightNode(std::move(highlight_config), node_id.fromJust());
-}
-
ui_devtools::protocol::Response UIDevToolsDOMAgent::hideHighlight() {
if (layer_for_highlighting_ && layer_for_highlighting_->visible())
layer_for_highlighting_->SetVisible(false);
return ui_devtools::protocol::Response::OK();
}
+ui_devtools::protocol::Response
+UIDevToolsDOMAgent::pushNodesByBackendIdsToFrontend(
+ std::unique_ptr<protocol::Array<int>> backend_node_ids,
+ std::unique_ptr<protocol::Array<int>>* result) {
+ *result = protocol::Array<int>::create();
+ for (size_t index = 0; index < backend_node_ids->length(); ++index)
+ (*result)->addItem(backend_node_ids->get(index));
+ return ui_devtools::protocol::Response::OK();
+}
+
+ui_devtools::protocol::Response UIDevToolsDOMAgent::setInspectedNode(
+ int node_id) {
+ return ui_devtools::protocol::Response::OK();
+}
+
void UIDevToolsDOMAgent::OnUIElementAdded(UIElement* parent, UIElement* child) {
// When parent is null, only need to update |node_id_to_ui_element_|.
if (!parent) {
@@ -205,6 +258,68 @@ UIElement* UIDevToolsDOMAgent::GetElementFromNodeId(int node_id) {
return node_id_to_ui_element_[node_id];
}
+ui_devtools::protocol::Response UIDevToolsDOMAgent::HighlightNode(
+ std::unique_ptr<ui_devtools::protocol::Overlay::HighlightConfig>
+ highlight_config,
+ int node_id) {
+ if (!layer_for_highlighting_) {
+ layer_for_highlighting_.reset(
+ new ui::Layer(ui::LayerType::LAYER_SOLID_COLOR));
+ layer_for_highlighting_->set_name("HighlightingLayer");
+ }
+
+ std::pair<aura::Window*, gfx::Rect> window_and_bounds =
+ node_id_to_ui_element_.count(node_id)
+ ? node_id_to_ui_element_[node_id]->GetNodeWindowAndBounds()
+ : std::make_pair<aura::Window*, gfx::Rect>(nullptr, gfx::Rect());
+
+ if (!window_and_bounds.first) {
+ return ui_devtools::protocol::Response::Error("No node found with that id");
+ }
+ SkColor content_color =
+ RGBAToSkColor(highlight_config->getContentColor(nullptr));
+ UpdateHighlight(window_and_bounds, content_color);
+
+ if (!layer_for_highlighting_->visible())
+ layer_for_highlighting_->SetVisible(true);
+
+ return ui_devtools::protocol::Response::OK();
+}
+
+void UIDevToolsDOMAgent::FindElementByEventHandler(const gfx::Point& p,
+ int* element_id) {
+ for (auto* element_window : window_element_root_->children()) {
+ aura::Window* window =
+ UIElement::GetBackingElement<aura::Window, WindowElement>(
+ element_window);
+ if (!window->bounds().Contains(p))
+ return;
+ aura::Window* point_window = window->GetEventHandlerForPoint(p);
+
+ if (point_window) {
+ views::Widget* widget =
+ views::Widget::GetWidgetForNativeWindow(point_window);
+
+ if (widget) {
+ views::View* view = widget->GetRootView();
+
+ if (view) {
+ gfx::Point p_inside(p);
+ aura::Window::ConvertPointToTarget(window, point_window, &p_inside);
+ views::View* point_view = view->GetEventHandlerForPoint(p_inside);
+
+ DCHECK(point_view);
+ *element_id = FindUIElementIdForView(element_window, point_view);
+ } else {
+ *element_id = FindUIElementIdForWidget(element_window, widget);
+ }
+ } else {
+ *element_id = FindUIElementIdForWindow(element_window, point_window);
+ }
+ }
+ }
+}
+
void UIDevToolsDOMAgent::OnHostInitialized(aura::WindowTreeHost* host) {
root_windows_.push_back(host->window());
}
@@ -353,32 +468,4 @@ void UIDevToolsDOMAgent::UpdateHighlight(
layer_for_highlighting_->SetBounds(bounds);
}
-ui_devtools::protocol::Response UIDevToolsDOMAgent::HighlightNode(
- std::unique_ptr<ui_devtools::protocol::DOM::HighlightConfig>
- highlight_config,
- int node_id) {
- if (!layer_for_highlighting_) {
- layer_for_highlighting_.reset(
- new ui::Layer(ui::LayerType::LAYER_SOLID_COLOR));
- layer_for_highlighting_->set_name("HighlightingLayer");
- }
-
- std::pair<aura::Window*, gfx::Rect> window_and_bounds =
- node_id_to_ui_element_.count(node_id)
- ? node_id_to_ui_element_[node_id]->GetNodeWindowAndBounds()
- : std::make_pair<aura::Window*, gfx::Rect>(nullptr, gfx::Rect());
-
- if (!window_and_bounds.first) {
- return ui_devtools::protocol::Response::Error("No node found with that id");
- }
- SkColor content_color =
- RGBAToSkColor(highlight_config->getContentColor(nullptr));
- UpdateHighlight(window_and_bounds, content_color);
-
- if (!layer_for_highlighting_->visible())
- layer_for_highlighting_->SetVisible(true);
-
- return ui_devtools::protocol::Response::OK();
-}
-
} // namespace ui_devtools
« no previous file with comments | « components/ui_devtools/views/ui_devtools_dom_agent.h ('k') | components/ui_devtools/views/ui_devtools_overlay_agent.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698