OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/ui_devtools/views/ui_devtools_dom_agent.h" | 5 #include "components/ui_devtools/views/ui_devtools_dom_agent.h" |
6 | 6 |
7 #include "components/ui_devtools/devtools_server.h" | 7 #include "components/ui_devtools/devtools_server.h" |
8 #include "components/ui_devtools/views/ui_devtools_overlay_agent.h" | |
8 #include "components/ui_devtools/views/ui_element.h" | 9 #include "components/ui_devtools/views/ui_element.h" |
9 #include "components/ui_devtools/views/view_element.h" | 10 #include "components/ui_devtools/views/view_element.h" |
10 #include "components/ui_devtools/views/widget_element.h" | 11 #include "components/ui_devtools/views/widget_element.h" |
11 #include "components/ui_devtools/views/window_element.h" | 12 #include "components/ui_devtools/views/window_element.h" |
12 #include "third_party/skia/include/core/SkColor.h" | 13 #include "third_party/skia/include/core/SkColor.h" |
13 #include "ui/aura/client/screen_position_client.h" | 14 #include "ui/aura/client/screen_position_client.h" |
14 #include "ui/aura/env.h" | 15 #include "ui/aura/env.h" |
15 #include "ui/aura/window.h" | 16 #include "ui/aura/window.h" |
16 #include "ui/aura/window_tree_host.h" | 17 #include "ui/aura/window_tree_host.h" |
17 #include "ui/display/display.h" | 18 #include "ui/display/display.h" |
18 #include "ui/display/screen.h" | 19 #include "ui/display/screen.h" |
19 #include "ui/views/background.h" | 20 #include "ui/views/background.h" |
20 #include "ui/views/border.h" | 21 #include "ui/views/border.h" |
22 #include "ui/views/pointer_watcher.h" | |
21 #include "ui/views/view.h" | 23 #include "ui/views/view.h" |
22 #include "ui/views/widget/widget.h" | 24 #include "ui/views/widget/widget.h" |
23 #include "ui/wm/core/window_util.h" | 25 #include "ui/wm/core/window_util.h" |
24 | 26 |
25 namespace ui_devtools { | 27 namespace ui_devtools { |
26 namespace { | 28 namespace { |
27 | 29 |
28 using namespace ui_devtools::protocol; | 30 using namespace ui_devtools::protocol; |
29 // TODO(mhashmi): Make ids reusable | 31 // TODO(mhashmi): Make ids reusable |
30 | 32 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
107 .setNodeId(root->node_id()) | 109 .setNodeId(root->node_id()) |
108 .setNodeName(root->GetTypeName()) | 110 .setNodeName(root->GetTypeName()) |
109 .setNodeType(kDomElementNodeType) | 111 .setNodeType(kDomElementNodeType) |
110 .setAttributes(GetAttributes(root)) | 112 .setAttributes(GetAttributes(root)) |
111 .build(); | 113 .build(); |
112 node->setChildNodeCount(static_cast<int>(children->length())); | 114 node->setChildNodeCount(static_cast<int>(children->length())); |
113 node->setChildren(std::move(children)); | 115 node->setChildren(std::move(children)); |
114 return node; | 116 return node; |
115 } | 117 } |
116 | 118 |
119 void FindElement(UIElement* root, | |
120 const int x, | |
121 const int y, | |
sadrul
2017/07/13 20:17:20
Take a const gfx::Point& as the location input.
thanhph
2017/07/14 16:59:46
Done.
| |
122 int* min_bounds, | |
123 int* element_id) { | |
124 LOG(ERROR) << "FindElement root->node_id(): " << root->node_id(); | |
125 gfx::Rect bounds; | |
126 for (auto* child : root->children()) { | |
127 child->GetBounds(&bounds); | |
128 if (bounds.x() <= x && bounds.y() <= y && bounds.right() >= x && | |
129 bounds.bottom() >= y && | |
sadrul
2017/07/13 20:17:20
Use gfx::Rect::Contains(gfx::Point)
thanhph
2017/07/14 16:59:46
Done.
| |
130 (*min_bounds) > bounds.width() + bounds.height()) { | |
131 *element_id = child->node_id(); | |
132 *min_bounds = bounds.width() + bounds.height(); | |
sadrul
2017/07/13 20:17:20
I don't understand why you need |min_bounds| here.
thanhph
2017/07/14 16:59:46
Acknowledged. We just select the deepest element i
| |
133 LOG(ERROR) << "*min_bounds: " << *min_bounds; | |
134 LOG(ERROR) << "*element_id: " << *element_id; | |
135 } | |
136 FindElement(child, x, y, min_bounds, element_id); | |
137 } | |
138 } | |
139 | |
117 } // namespace | 140 } // namespace |
118 | 141 |
119 UIDevToolsDOMAgent::UIDevToolsDOMAgent() : is_building_tree_(false) { | 142 UIDevToolsDOMAgent::UIDevToolsDOMAgent(UIDevToolsOverlayAgent* overlay_agent) |
143 : overlay_agent_(overlay_agent), is_building_tree_(false) { | |
120 aura::Env::GetInstance()->AddObserver(this); | 144 aura::Env::GetInstance()->AddObserver(this); |
121 } | 145 } |
122 | 146 |
123 UIDevToolsDOMAgent::~UIDevToolsDOMAgent() { | 147 UIDevToolsDOMAgent::~UIDevToolsDOMAgent() { |
124 aura::Env::GetInstance()->RemoveObserver(this); | 148 aura::Env::GetInstance()->RemoveObserver(this); |
125 Reset(); | 149 Reset(); |
126 } | 150 } |
127 | 151 |
128 ui_devtools::protocol::Response UIDevToolsDOMAgent::disable() { | 152 ui_devtools::protocol::Response UIDevToolsDOMAgent::disable() { |
129 Reset(); | 153 Reset(); |
130 return ui_devtools::protocol::Response::OK(); | 154 return ui_devtools::protocol::Response::OK(); |
131 } | 155 } |
132 | 156 |
133 ui_devtools::protocol::Response UIDevToolsDOMAgent::getDocument( | 157 ui_devtools::protocol::Response UIDevToolsDOMAgent::getDocument( |
134 std::unique_ptr<ui_devtools::protocol::DOM::Node>* out_root) { | 158 std::unique_ptr<ui_devtools::protocol::DOM::Node>* out_root) { |
135 *out_root = BuildInitialTree(); | 159 *out_root = BuildInitialTree(); |
136 return ui_devtools::protocol::Response::OK(); | 160 return ui_devtools::protocol::Response::OK(); |
137 } | 161 } |
138 | 162 |
139 ui_devtools::protocol::Response UIDevToolsDOMAgent::highlightNode( | 163 ui_devtools::protocol::Response UIDevToolsDOMAgent::highlightNode( |
140 std::unique_ptr<ui_devtools::protocol::DOM::HighlightConfig> | 164 std::unique_ptr<ui_devtools::protocol::DOM::HighlightConfig> |
141 highlight_config, | 165 highlight_config, |
142 ui_devtools::protocol::Maybe<int> node_id) { | 166 ui_devtools::protocol::Maybe<int> node_id) { |
143 return HighlightNode(std::move(highlight_config), node_id.fromJust()); | 167 return HighlightNode(std::move(highlight_config), node_id.fromJust()); |
144 } | 168 } |
145 | 169 |
170 ui_devtools::protocol::Response UIDevToolsDOMAgent::setInspectMode( | |
171 ui_devtools::protocol::Maybe<String> mode, | |
172 std::unique_ptr<ui_devtools::protocol::DOM::HighlightConfig> | |
173 highlight_config, | |
174 ui_devtools::protocol::Maybe<int> node_id) { | |
175 LOG(ERROR) << __PRETTY_FUNCTION__; | |
176 if (mode.fromJust().compare("searchForUAShadowDOM") == 0) | |
177 aura::Env::GetInstance()->PrependPreTargetHandler(this); | |
178 else if (mode.fromJust().compare("none") == 0) | |
179 aura::Env::GetInstance()->RemovePreTargetHandler(this); | |
180 | |
181 return ui_devtools::protocol::Response::OK(); | |
182 } | |
183 | |
146 ui_devtools::protocol::Response UIDevToolsDOMAgent::hideHighlight() { | 184 ui_devtools::protocol::Response UIDevToolsDOMAgent::hideHighlight() { |
147 if (widget_for_highlighting_ && widget_for_highlighting_->IsVisible()) | 185 if (widget_for_highlighting_ && widget_for_highlighting_->IsVisible()) |
148 widget_for_highlighting_->Hide(); | 186 widget_for_highlighting_->Hide(); |
149 return ui_devtools::protocol::Response::OK(); | 187 return ui_devtools::protocol::Response::OK(); |
150 } | 188 } |
151 | 189 |
152 void UIDevToolsDOMAgent::OnUIElementAdded(UIElement* parent, UIElement* child) { | 190 void UIDevToolsDOMAgent::OnUIElementAdded(UIElement* parent, UIElement* child) { |
153 // When parent is null, only need to update |node_id_to_ui_element_|. | 191 // When parent is null, only need to update |node_id_to_ui_element_|. |
154 if (!parent) { | 192 if (!parent) { |
155 node_id_to_ui_element_[child->node_id()] = child; | 193 node_id_to_ui_element_[child->node_id()] = child; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
191 void UIDevToolsDOMAgent::OnUIElementBoundsChanged(UIElement* ui_element) { | 229 void UIDevToolsDOMAgent::OnUIElementBoundsChanged(UIElement* ui_element) { |
192 for (auto& observer : observers_) | 230 for (auto& observer : observers_) |
193 observer.OnNodeBoundsChanged(ui_element->node_id()); | 231 observer.OnNodeBoundsChanged(ui_element->node_id()); |
194 } | 232 } |
195 | 233 |
196 bool UIDevToolsDOMAgent::IsHighlightingWindow(aura::Window* window) { | 234 bool UIDevToolsDOMAgent::IsHighlightingWindow(aura::Window* window) { |
197 return widget_for_highlighting_ && | 235 return widget_for_highlighting_ && |
198 GetWidgetFromWindow(window) == widget_for_highlighting_.get(); | 236 GetWidgetFromWindow(window) == widget_for_highlighting_.get(); |
199 } | 237 } |
200 | 238 |
239 void UIDevToolsDOMAgent::OnMouseEvent(ui::MouseEvent* event) { | |
240 if (!window_element_root_) | |
241 return; | |
242 | |
243 if (event->type() == ui::ET_MOUSE_PRESSED) { | |
244 // TODO(thanhph): needs to disable the highlighting inspection arrow. | |
245 frontend()->setInspectMode(Maybe<ui_devtools::String>("none")); | |
246 overlay_agent_->setInspectMode( | |
247 "none", protocol::Maybe<protocol::Overlay::HighlightConfig>()); | |
248 aura::Env::GetInstance()->RemovePreTargetHandler(this); | |
249 return; | |
250 } | |
251 if (event->type() != ui::ET_MOUSEWHEEL) | |
252 return; | |
253 | |
254 // maxmium of width + height of a screen. | |
255 int min_bounds = 1000000; | |
256 | |
257 // Node id of the element whose bounds contain the mouse pointer location. | |
258 int element_id = 1; | |
259 FindElement(window_element_root_.get(), event->location().x(), | |
sadrul
2017/07/13 20:17:20
event->location() is in the coordinate space of |e
thanhph
2017/07/14 16:59:46
I picked the 1st approach.
| |
260 event->location().y(), &min_bounds, &element_id); | |
261 LOG(ERROR) << "Find - event->location().x():" << event->location().x() | |
262 << "event->location().y(): " << event->location().y(); | |
263 gfx::Rect bounds1; | |
264 node_id_to_ui_element_[element_id]->GetBounds(&bounds1); | |
265 LOG(ERROR) << "bounds1 node_id_to_ui_element_[element_id]: " << bounds1.x() | |
266 << " - " << bounds1.y() << " - " << bounds1.right() << " - " | |
267 << bounds1.bottom(); | |
268 frontend()->nodeHighlightRequested(element_id); | |
269 } | |
270 | |
201 void UIDevToolsDOMAgent::AddObserver(UIDevToolsDOMAgentObserver* observer) { | 271 void UIDevToolsDOMAgent::AddObserver(UIDevToolsDOMAgentObserver* observer) { |
202 observers_.AddObserver(observer); | 272 observers_.AddObserver(observer); |
203 } | 273 } |
204 | 274 |
205 void UIDevToolsDOMAgent::RemoveObserver(UIDevToolsDOMAgentObserver* observer) { | 275 void UIDevToolsDOMAgent::RemoveObserver(UIDevToolsDOMAgentObserver* observer) { |
206 observers_.RemoveObserver(observer); | 276 observers_.RemoveObserver(observer); |
207 } | 277 } |
208 | 278 |
209 UIElement* UIDevToolsDOMAgent::GetElementFromNodeId(int node_id) { | 279 UIElement* UIDevToolsDOMAgent::GetElementFromNodeId(int node_id) { |
210 return node_id_to_ui_element_[node_id]; | 280 return node_id_to_ui_element_[node_id]; |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
395 RGBAToSkColor(highlight_config->getContentColor(nullptr)); | 465 RGBAToSkColor(highlight_config->getContentColor(nullptr)); |
396 UpdateHighlight(window_and_bounds, content_color, border_color); | 466 UpdateHighlight(window_and_bounds, content_color, border_color); |
397 | 467 |
398 if (!widget_for_highlighting_->IsVisible()) | 468 if (!widget_for_highlighting_->IsVisible()) |
399 widget_for_highlighting_->Show(); | 469 widget_for_highlighting_->Show(); |
400 | 470 |
401 return ui_devtools::protocol::Response::OK(); | 471 return ui_devtools::protocol::Response::OK(); |
402 } | 472 } |
403 | 473 |
404 } // namespace ui_devtools | 474 } // namespace ui_devtools |
OLD | NEW |