Index: ash/devtools/ash_devtools_dom_agent.cc |
diff --git a/ash/devtools/ash_devtools_dom_agent.cc b/ash/devtools/ash_devtools_dom_agent.cc |
deleted file mode 100644 |
index 72fc8e3bad08fda5126fe46831766c6be335fff9..0000000000000000000000000000000000000000 |
--- a/ash/devtools/ash_devtools_dom_agent.cc |
+++ /dev/null |
@@ -1,409 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "ash/devtools/ash_devtools_dom_agent.h" |
- |
-#include "ash/devtools/ui_element.h" |
-#include "ash/devtools/view_element.h" |
-#include "ash/devtools/widget_element.h" |
-#include "ash/devtools/window_element.h" |
-#include "ash/public/cpp/shell_window_ids.h" |
-#include "components/ui_devtools/devtools_server.h" |
-#include "third_party/skia/include/core/SkColor.h" |
-#include "ui/aura/client/screen_position_client.h" |
-#include "ui/aura/env.h" |
-#include "ui/aura/window.h" |
-#include "ui/aura/window_tree_host.h" |
-#include "ui/display/display.h" |
-#include "ui/display/screen.h" |
-#include "ui/views/background.h" |
-#include "ui/views/border.h" |
-#include "ui/views/view.h" |
-#include "ui/views/widget/widget.h" |
-#include "ui/wm/core/window_util.h" |
- |
-namespace ash { |
-namespace devtools { |
-namespace { |
- |
-using namespace ui::devtools::protocol; |
-// TODO(mhashmi): Make ids reusable |
- |
-std::unique_ptr<DOM::Node> BuildNode( |
- const std::string& name, |
- std::unique_ptr<Array<std::string>> attributes, |
- std::unique_ptr<Array<DOM::Node>> children, |
- int node_ids) { |
- constexpr int kDomElementNodeType = 1; |
- std::unique_ptr<DOM::Node> node = DOM::Node::create() |
- .setNodeId(node_ids) |
- .setNodeName(name) |
- .setNodeType(kDomElementNodeType) |
- .setAttributes(std::move(attributes)) |
- .build(); |
- node->setChildNodeCount(children->length()); |
- node->setChildren(std::move(children)); |
- return node; |
-} |
- |
-// TODO(thanhph): Move this function to UIElement::GetAttributes(). |
-std::unique_ptr<Array<std::string>> GetAttributes(UIElement* ui_element) { |
- std::unique_ptr<Array<std::string>> attributes = Array<std::string>::create(); |
- attributes->addItem("name"); |
- switch (ui_element->type()) { |
- case UIElementType::WINDOW: { |
- aura::Window* window = |
- UIElement::GetBackingElement<aura::Window, WindowElement>(ui_element); |
- attributes->addItem(window->GetName()); |
- attributes->addItem("active"); |
- attributes->addItem(::wm::IsActiveWindow(window) ? "true" : "false"); |
- break; |
- } |
- case UIElementType::WIDGET: { |
- views::Widget* widget = |
- UIElement::GetBackingElement<views::Widget, WidgetElement>( |
- ui_element); |
- attributes->addItem(widget->GetName()); |
- attributes->addItem("active"); |
- attributes->addItem(widget->IsActive() ? "true" : "false"); |
- break; |
- } |
- case UIElementType::VIEW: { |
- attributes->addItem( |
- UIElement::GetBackingElement<views::View, ViewElement>(ui_element) |
- ->GetClassName()); |
- break; |
- } |
- default: |
- DCHECK(false); |
- } |
- return attributes; |
-} |
- |
-int MaskColor(int value) { |
- return value & 0xff; |
-} |
- |
-SkColor RGBAToSkColor(DOM::RGBA* rgba) { |
- if (!rgba) |
- return SkColorSetARGB(0, 0, 0, 0); |
- // Default alpha value is 0 (not visible) and need to convert alpha decimal |
- // percentage value to hex |
- return SkColorSetARGB(MaskColor(static_cast<int>(rgba->getA(0) * 255)), |
- MaskColor(rgba->getR()), MaskColor(rgba->getG()), |
- MaskColor(rgba->getB())); |
-} |
- |
-views::Widget* GetWidgetFromWindow(aura::Window* window) { |
- return views::Widget::GetWidgetForNativeView(window); |
-} |
- |
-std::unique_ptr<DOM::Node> BuildDomNodeFromUIElement(UIElement* root) { |
- std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); |
- for (auto* it : root->children()) |
- children->addItem(BuildDomNodeFromUIElement(it)); |
- |
- constexpr int kDomElementNodeType = 1; |
- std::unique_ptr<DOM::Node> node = DOM::Node::create() |
- .setNodeId(root->node_id()) |
- .setNodeName(root->GetTypeName()) |
- .setNodeType(kDomElementNodeType) |
- .setAttributes(GetAttributes(root)) |
- .build(); |
- node->setChildNodeCount(children->length()); |
- node->setChildren(std::move(children)); |
- return node; |
-} |
- |
-} // namespace |
- |
-AshDevToolsDOMAgent::AshDevToolsDOMAgent() : is_building_tree_(false) { |
- aura::Env::GetInstance()->AddObserver(this); |
-} |
- |
-AshDevToolsDOMAgent::~AshDevToolsDOMAgent() { |
- aura::Env::GetInstance()->RemoveObserver(this); |
- Reset(); |
-} |
- |
-ui::devtools::protocol::Response AshDevToolsDOMAgent::disable() { |
- Reset(); |
- return ui::devtools::protocol::Response::OK(); |
-} |
- |
-ui::devtools::protocol::Response AshDevToolsDOMAgent::getDocument( |
- std::unique_ptr<ui::devtools::protocol::DOM::Node>* out_root) { |
- *out_root = BuildInitialTree(); |
- return ui::devtools::protocol::Response::OK(); |
-} |
- |
-ui::devtools::protocol::Response AshDevToolsDOMAgent::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 AshDevToolsDOMAgent::hideHighlight() { |
- if (widget_for_highlighting_ && widget_for_highlighting_->IsVisible()) |
- widget_for_highlighting_->Hide(); |
- return ui::devtools::protocol::Response::OK(); |
-} |
- |
-void AshDevToolsDOMAgent::OnUIElementAdded(UIElement* parent, |
- UIElement* child) { |
- // When parent is null, only need to update |node_id_to_ui_element_|. |
- if (!parent) { |
- node_id_to_ui_element_[child->node_id()] = child; |
- return; |
- } |
- // If tree is being built, don't add child to dom tree again. |
- if (is_building_tree_) |
- return; |
- DCHECK(node_id_to_ui_element_.count(parent->node_id())); |
- |
- const auto& children = parent->children(); |
- auto iter = std::find(children.begin(), children.end(), child); |
- int prev_node_id = |
- (iter == children.end() - 1) ? 0 : (*std::next(iter))->node_id(); |
- frontend()->childNodeInserted(parent->node_id(), prev_node_id, |
- BuildTreeForUIElement(child)); |
-} |
- |
-void AshDevToolsDOMAgent::OnUIElementReordered(UIElement* parent, |
- UIElement* child) { |
- DCHECK(node_id_to_ui_element_.count(parent->node_id())); |
- |
- const auto& children = parent->children(); |
- auto iter = std::find(children.begin(), children.end(), child); |
- int prev_node_id = |
- (iter == children.begin()) ? 0 : (*std::prev(iter))->node_id(); |
- RemoveDomNode(child); |
- frontend()->childNodeInserted(parent->node_id(), prev_node_id, |
- BuildDomNodeFromUIElement(child)); |
-} |
- |
-void AshDevToolsDOMAgent::OnUIElementRemoved(UIElement* ui_element) { |
- DCHECK(node_id_to_ui_element_.count(ui_element->node_id())); |
- |
- RemoveDomNode(ui_element); |
- node_id_to_ui_element_.erase(ui_element->node_id()); |
-} |
- |
-void AshDevToolsDOMAgent::OnUIElementBoundsChanged(UIElement* ui_element) { |
- for (auto& observer : observers_) |
- observer.OnNodeBoundsChanged(ui_element->node_id()); |
-} |
- |
-bool AshDevToolsDOMAgent::IsHighlightingWindow(aura::Window* window) { |
- return widget_for_highlighting_ && |
- GetWidgetFromWindow(window) == widget_for_highlighting_.get(); |
-} |
- |
-void AshDevToolsDOMAgent::AddObserver(AshDevToolsDOMAgentObserver* observer) { |
- observers_.AddObserver(observer); |
-} |
- |
-void AshDevToolsDOMAgent::RemoveObserver( |
- AshDevToolsDOMAgentObserver* observer) { |
- observers_.RemoveObserver(observer); |
-} |
- |
-UIElement* AshDevToolsDOMAgent::GetElementFromNodeId(int node_id) { |
- return node_id_to_ui_element_[node_id]; |
-} |
- |
-void AshDevToolsDOMAgent::OnHostInitialized(aura::WindowTreeHost* host) { |
- root_windows_.push_back(host->window()); |
-} |
- |
-void AshDevToolsDOMAgent::OnNodeBoundsChanged(int node_id) { |
- for (auto& observer : observers_) |
- observer.OnNodeBoundsChanged(node_id); |
-} |
- |
-std::unique_ptr<ui::devtools::protocol::DOM::Node> |
-AshDevToolsDOMAgent::BuildInitialTree() { |
- is_building_tree_ = true; |
- std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); |
- |
- // TODO(thanhph): Root of UIElement tree shoudn't be WindowElement |
- // but maybe a new different element type. |
- window_element_root_ = |
- base::MakeUnique<WindowElement>(nullptr, this, nullptr); |
- |
- for (aura::Window* window : root_windows()) { |
- UIElement* window_element = |
- new WindowElement(window, this, window_element_root_.get()); |
- |
- children->addItem(BuildTreeForUIElement(window_element)); |
- window_element_root_->AddChild(window_element); |
- } |
- std::unique_ptr<ui::devtools::protocol::DOM::Node> root_node = BuildNode( |
- "root", nullptr, std::move(children), window_element_root_->node_id()); |
- is_building_tree_ = false; |
- return root_node; |
-} |
- |
-std::unique_ptr<ui::devtools::protocol::DOM::Node> |
-AshDevToolsDOMAgent::BuildTreeForUIElement(UIElement* ui_element) { |
- if (ui_element->type() == UIElementType::WINDOW) { |
- return BuildTreeForWindow( |
- ui_element, |
- UIElement::GetBackingElement<aura::Window, WindowElement>(ui_element)); |
- } else if (ui_element->type() == UIElementType::WIDGET) { |
- return BuildTreeForRootWidget( |
- ui_element, |
- UIElement::GetBackingElement<views::Widget, WidgetElement>(ui_element)); |
- } else if (ui_element->type() == UIElementType::VIEW) { |
- return BuildTreeForView( |
- ui_element, |
- UIElement::GetBackingElement<views::View, ViewElement>(ui_element)); |
- } |
- return nullptr; |
-} |
- |
-std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForWindow( |
- UIElement* window_element_root, |
- aura::Window* window) { |
- std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); |
- views::Widget* widget = GetWidgetFromWindow(window); |
- if (widget) { |
- UIElement* widget_element = |
- new WidgetElement(widget, this, window_element_root); |
- |
- children->addItem(BuildTreeForRootWidget(widget_element, widget)); |
- window_element_root->AddChild(widget_element); |
- } |
- for (aura::Window* child : window->children()) { |
- UIElement* window_element = |
- new WindowElement(child, this, window_element_root); |
- |
- children->addItem(BuildTreeForWindow(window_element, child)); |
- window_element_root->AddChild(window_element); |
- } |
- std::unique_ptr<ui::devtools::protocol::DOM::Node> node = |
- BuildNode("Window", GetAttributes(window_element_root), |
- std::move(children), window_element_root->node_id()); |
- return node; |
-} |
- |
-std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForRootWidget( |
- UIElement* widget_element, |
- views::Widget* widget) { |
- std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); |
- |
- UIElement* view_element = |
- new ViewElement(widget->GetRootView(), this, widget_element); |
- |
- children->addItem(BuildTreeForView(view_element, widget->GetRootView())); |
- widget_element->AddChild(view_element); |
- |
- std::unique_ptr<ui::devtools::protocol::DOM::Node> node = |
- BuildNode("Widget", GetAttributes(widget_element), std::move(children), |
- widget_element->node_id()); |
- return node; |
-} |
- |
-std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForView( |
- UIElement* view_element, |
- views::View* view) { |
- std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); |
- |
- for (auto* child : view->GetChildrenInZOrder()) { |
- UIElement* view_element_child = new ViewElement(child, this, view_element); |
- |
- children->addItem(BuildTreeForView(view_element_child, child)); |
- view_element->AddChild(view_element_child); |
- } |
- std::unique_ptr<ui::devtools::protocol::DOM::Node> node = |
- BuildNode("View", GetAttributes(view_element), std::move(children), |
- view_element->node_id()); |
- return node; |
-} |
- |
-void AshDevToolsDOMAgent::RemoveDomNode(UIElement* ui_element) { |
- for (auto* child_element : ui_element->children()) |
- RemoveDomNode(child_element); |
- frontend()->childNodeRemoved(ui_element->parent()->node_id(), |
- ui_element->node_id()); |
-} |
- |
-void AshDevToolsDOMAgent::Reset() { |
- is_building_tree_ = false; |
- widget_for_highlighting_.reset(); |
- window_element_root_.reset(); |
- node_id_to_ui_element_.clear(); |
- observers_.Clear(); |
-} |
- |
-void AshDevToolsDOMAgent::InitializeHighlightingWidget() { |
- DCHECK(!widget_for_highlighting_); |
- widget_for_highlighting_.reset(new views::Widget); |
- views::Widget::InitParams params; |
- params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS; |
- params.activatable = views::Widget::InitParams::ACTIVATABLE_NO; |
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
- params.opacity = views::Widget::InitParams::WindowOpacity::TRANSLUCENT_WINDOW; |
- params.name = "HighlightingWidget"; |
- params.keep_on_top = true; |
- params.accept_events = false; |
- widget_for_highlighting_->Init(params); |
-} |
- |
-void AshDevToolsDOMAgent::UpdateHighlight( |
- const std::pair<aura::Window*, gfx::Rect>& window_and_bounds, |
- SkColor background, |
- SkColor border) { |
- constexpr int kBorderThickness = 1; |
- views::View* root_view = widget_for_highlighting_->GetRootView(); |
- root_view->SetBorder(views::CreateSolidBorder(kBorderThickness, border)); |
- root_view->SetBackground(views::CreateSolidBackground(background)); |
- display::Display display = |
- display::Screen::GetScreen()->GetDisplayNearestWindow( |
- window_and_bounds.first); |
- aura::Window* root = window_and_bounds.first->GetRootWindow(); |
- if (root != widget_for_highlighting_->GetNativeWindow()->GetRootWindow()) |
- root->AddChild(widget_for_highlighting_->GetNativeWindow()); |
- |
- aura::client::ScreenPositionClient* screen_position_client = |
- aura::client::GetScreenPositionClient(root); |
- |
- gfx::Rect bounds(window_and_bounds.second); |
- gfx::Point origin = bounds.origin(); |
- screen_position_client->ConvertPointFromScreen(root, &origin); |
- bounds.set_origin(origin); |
- widget_for_highlighting_->GetNativeWindow()->SetBounds(bounds); |
-} |
- |
-ui::devtools::protocol::Response AshDevToolsDOMAgent::HighlightNode( |
- std::unique_ptr<ui::devtools::protocol::DOM::HighlightConfig> |
- highlight_config, |
- int node_id) { |
- if (!widget_for_highlighting_) |
- InitializeHighlightingWidget(); |
- |
- 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 border_color = |
- RGBAToSkColor(highlight_config->getBorderColor(nullptr)); |
- SkColor content_color = |
- RGBAToSkColor(highlight_config->getContentColor(nullptr)); |
- UpdateHighlight(window_and_bounds, content_color, border_color); |
- |
- if (!widget_for_highlighting_->IsVisible()) |
- widget_for_highlighting_->Show(); |
- |
- return ui::devtools::protocol::Response::OK(); |
-} |
- |
-} // namespace devtools |
-} // namespace ash |