Chromium Code Reviews| Index: ash/common/devtools/ash_devtools_dom_agent.cc |
| diff --git a/ash/common/devtools/ash_devtools_dom_agent.cc b/ash/common/devtools/ash_devtools_dom_agent.cc |
| index 16e9059bdf585407db664ea77fbda7455c25e826..a8dcd7dcd2e96efc598637b552f3e826d9808e90 100644 |
| --- a/ash/common/devtools/ash_devtools_dom_agent.cc |
| +++ b/ash/common/devtools/ash_devtools_dom_agent.cc |
| @@ -13,6 +13,7 @@ namespace devtools { |
| namespace { |
| using namespace ui::devtools::protocol; |
| +// TODO(mhashmi): Make ids reusable |
| DOM::NodeId node_ids = 1; |
| std::unique_ptr<DOM::Node> BuildNode( |
| @@ -56,7 +57,6 @@ std::unique_ptr<Array<std::string>> GetAttributes(const views::View* view) { |
| return attributes; |
| } |
| - |
| WmWindow* FindPreviousSibling(WmWindow* window) { |
| std::vector<WmWindow*> siblings = window->GetParent()->GetChildren(); |
| std::vector<WmWindow*>::iterator it = |
| @@ -76,6 +76,7 @@ AshDevToolsDOMAgent::~AshDevToolsDOMAgent() { |
| RemoveObserverFromAllWindows(); |
| } |
| +// DOM::Backend implementation |
|
sadrul
2016/11/25 18:19:20
Remove these comments.
Sarmad Hashmi
2016/11/25 23:27:30
Done.
|
| ui::devtools::protocol::Response AshDevToolsDOMAgent::disable() { |
| Reset(); |
| return ui::devtools::protocol::Response::OK(); |
| @@ -87,6 +88,7 @@ ui::devtools::protocol::Response AshDevToolsDOMAgent::getDocument( |
| return ui::devtools::protocol::Response::OK(); |
| } |
| +// WindowObserver implementation |
| // Handles removing windows. |
| void AshDevToolsDOMAgent::OnWindowTreeChanging(WmWindow* window, |
| const TreeChangeParams& params) { |
| @@ -98,7 +100,7 @@ void AshDevToolsDOMAgent::OnWindowTreeChanging(WmWindow* window, |
| // Finally, We only trigger this 0 or 1 times as an old_parent will |
| // either exist and only call this callback once, or not at all. |
| if (window == params.old_parent) |
| - RemoveWindowNode(params.target); |
| + RemoveWindowTree(params.target, true); |
| } |
| // Handles adding windows. |
| @@ -110,12 +112,12 @@ void AshDevToolsDOMAgent::OnWindowTreeChanged(WmWindow* window, |
| // If there is only a new_parent, OnWindowTreeChanging is never called and |
| // the window is only added here. |
| if (window == params.new_parent) |
| - AddWindowNode(params.target); |
| + AddWindowTree(params.target); |
| } |
| void AshDevToolsDOMAgent::OnWindowStackingChanged(WmWindow* window) { |
| - RemoveWindowNode(window); |
| - AddWindowNode(window); |
| + RemoveWindowTree(window, false); |
| + AddWindowTree(window); |
| } |
| WmWindow* AshDevToolsDOMAgent::GetWindowFromNodeId(int nodeId) { |
| @@ -148,59 +150,61 @@ int AshDevToolsDOMAgent::GetNodeIdFromView(views::View* view) { |
| return view_to_node_id_map_[view]; |
| } |
| -std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForView( |
| - views::View* view) { |
| - std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); |
| - for (int i = 0, count = view->child_count(); i < count; i++) { |
| - children->addItem(BuildTreeForView(view->child_at(i))); |
| - } |
| - std::unique_ptr<ui::devtools::protocol::DOM::Node> node = |
| - BuildNode("View", GetAttributes(view), std::move(children)); |
| - view_to_node_id_map_[view] = node->getNodeId(); |
| - node_id_to_view_map_[node->getNodeId()] = view; |
| - return node; |
| -} |
| - |
| -std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForRootWidget( |
| - views::Widget* widget) { |
| +std::unique_ptr<ui::devtools::protocol::DOM::Node> |
| +AshDevToolsDOMAgent::BuildInitialTree() { |
| std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); |
| - children->addItem(BuildTreeForView(widget->GetRootView())); |
| - std::unique_ptr<ui::devtools::protocol::DOM::Node> node = |
| - BuildNode("Widget", GetAttributes(widget), std::move(children)); |
| - widget_to_node_id_map_[widget] = node->getNodeId(); |
| - node_id_to_widget_map_[node->getNodeId()] = widget; |
| - return node; |
| + for (ash::WmWindow* window : shell_->GetAllRootWindows()) |
| + children->addItem(BuildTreeForWindow(window)); |
| + return BuildNode("root", nullptr, std::move(children)); |
| } |
| std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForWindow( |
| ash::WmWindow* window) { |
| + DCHECK(!window_to_node_id_map_.count(window)); |
| std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); |
| views::Widget* widget = window->GetInternalWidget(); |
| if (widget) |
| children->addItem(BuildTreeForRootWidget(widget)); |
| - for (ash::WmWindow* child : window->GetChildren()) { |
| + for (ash::WmWindow* child : window->GetChildren()) |
| children->addItem(BuildTreeForWindow(child)); |
| - } |
| + |
| std::unique_ptr<ui::devtools::protocol::DOM::Node> node = |
| BuildNode("Window", GetAttributes(window), std::move(children)); |
| - // Only add as observer if window is not in map |
| - if (!window_to_node_id_map_.count(window)) |
| + if (!window->HasObserver(this)) |
| window->AddObserver(this); |
| window_to_node_id_map_[window] = node->getNodeId(); |
| node_id_to_window_map_[node->getNodeId()] = window; |
| return node; |
| } |
| -std::unique_ptr<ui::devtools::protocol::DOM::Node> |
| -AshDevToolsDOMAgent::BuildInitialTree() { |
| +std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForRootWidget( |
| + views::Widget* widget) { |
| + DCHECK(!widget_to_node_id_map_.count(widget)); |
| std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); |
| - for (ash::WmWindow* window : shell_->GetAllRootWindows()) { |
| - children->addItem(BuildTreeForWindow(window)); |
| - } |
| - return BuildNode("root", nullptr, std::move(children)); |
| + children->addItem(BuildTreeForView(widget->GetRootView())); |
| + std::unique_ptr<ui::devtools::protocol::DOM::Node> node = |
| + BuildNode("Widget", GetAttributes(widget), std::move(children)); |
| + // TODO(mhashmi): Add WidgetRemovalsObserver here |
| + widget_to_node_id_map_[widget] = node->getNodeId(); |
| + node_id_to_widget_map_[node->getNodeId()] = widget; |
| + return node; |
| +} |
| + |
| +std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForView( |
| + views::View* view) { |
| + DCHECK(!view_to_node_id_map_.count(view)); |
| + std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); |
| + for (int i = 0, count = view->child_count(); i < count; i++) |
| + children->addItem(BuildTreeForView(view->child_at(i))); |
| + std::unique_ptr<ui::devtools::protocol::DOM::Node> node = |
| + BuildNode("View", GetAttributes(view), std::move(children)); |
| + // TODO(mhashmi): Add ViewObserver here |
| + view_to_node_id_map_[view] = node->getNodeId(); |
| + node_id_to_view_map_[node->getNodeId()] = view; |
| + return node; |
| } |
| -void AshDevToolsDOMAgent::AddWindowNode(WmWindow* window) { |
| +void AshDevToolsDOMAgent::AddWindowTree(WmWindow* window) { |
| DCHECK(window_to_node_id_map_.count(window->GetParent())); |
| WmWindow* prev_sibling = FindPreviousSibling(window); |
| frontend()->childNodeInserted( |
| @@ -209,31 +213,48 @@ void AshDevToolsDOMAgent::AddWindowNode(WmWindow* window) { |
| BuildTreeForWindow(window)); |
| } |
| -void AshDevToolsDOMAgent::RemoveWindowNode(WmWindow* window) { |
| - WmWindow* parent = window->GetParent(); |
| - DCHECK(parent); |
| +void AshDevToolsDOMAgent::RemoveWindowTree(WmWindow* window, |
| + bool remove_observer) { |
| + DCHECK(window); |
| + if (window->GetInternalWidget()) |
| + RemoveWidgetTree(window->GetInternalWidget(), remove_observer); |
| + |
| + for (ash::WmWindow* child : window->GetChildren()) |
| + RemoveWindowTree(child, remove_observer); |
| + |
| + RemoveWindowNode(window, remove_observer); |
| +} |
| + |
| +void AshDevToolsDOMAgent::RemoveWindowNode(WmWindow* window, |
| + bool remove_observer) { |
| WindowToNodeIdMap::iterator window_to_node_id_it = |
| window_to_node_id_map_.find(window); |
| DCHECK(window_to_node_id_it != window_to_node_id_map_.end()); |
| int node_id = window_to_node_id_it->second; |
| - int parent_id = GetNodeIdFromWindow(parent); |
| + int parent_id = GetNodeIdFromWindow(window->GetParent()); |
| NodeIdToWindowMap::iterator node_id_to_window_it = |
| node_id_to_window_map_.find(node_id); |
| DCHECK(node_id_to_window_it != node_id_to_window_map_.end()); |
| - views::Widget* widget = window->GetInternalWidget(); |
| - if (widget) |
| - RemoveWidgetNode(widget); |
| - |
| - window->RemoveObserver(this); |
| + if (remove_observer) |
| + window->RemoveObserver(this); |
| node_id_to_window_map_.erase(node_id_to_window_it); |
| window_to_node_id_map_.erase(window_to_node_id_it); |
| frontend()->childNodeRemoved(parent_id, node_id); |
| } |
| -void AshDevToolsDOMAgent::RemoveWidgetNode(views::Widget* widget) { |
| +void AshDevToolsDOMAgent::RemoveWidgetTree(views::Widget* widget, |
| + bool remove_observer) { |
| + DCHECK(widget); |
| + if (widget->GetRootView()) |
| + RemoveViewTree(widget->GetRootView(), nullptr, remove_observer); |
| + RemoveWidgetNode(widget, remove_observer); |
| +} |
| + |
| +void AshDevToolsDOMAgent::RemoveWidgetNode(views::Widget* widget, |
| + bool remove_observer) { |
| WidgetToNodeIdMap::iterator widget_to_node_id_it = |
| widget_to_node_id_map_.find(widget); |
| DCHECK(widget_to_node_id_it != widget_to_node_id_map_.end()); |
| @@ -242,7 +263,8 @@ void AshDevToolsDOMAgent::RemoveWidgetNode(views::Widget* widget) { |
| int parent_id = |
| GetNodeIdFromWindow(WmLookup::Get()->GetWindowForWidget(widget)); |
| - RemoveViewNode(widget->GetRootView()); |
| + // TODO(mhashmi): Add WidgetRemovalsObserver and remove it here based on |
| + // |remove_observer| |
| NodeIdToWidgetMap::iterator node_id_to_widget_it = |
| node_id_to_widget_map_.find(node_id); |
| @@ -253,9 +275,39 @@ void AshDevToolsDOMAgent::RemoveWidgetNode(views::Widget* widget) { |
| frontend()->childNodeRemoved(parent_id, node_id); |
| } |
| -void AshDevToolsDOMAgent::RemoveViewNode(views::View* view) { |
| - // TODO(mhashmi): Add observers to views/widgets so new views exist |
| - // in the map and can be removed here |
| +void AshDevToolsDOMAgent::RemoveViewTree(views::View* view, |
| + views::View* parent, |
| + bool remove_observer) { |
| + DCHECK(view); |
| + for (int i = 0, count = view->child_count(); i < count; i++) |
| + RemoveViewTree(view->child_at(i), view, remove_observer); |
| + RemoveViewNode(view, parent, remove_observer); |
| +} |
| + |
| +void AshDevToolsDOMAgent::RemoveViewNode(views::View* view, |
| + views::View* parent, |
| + bool remove_observer) { |
| + ViewToNodeIdMap::iterator view_to_node_id_it = |
| + view_to_node_id_map_.find(view); |
| + DCHECK(view_to_node_id_it != view_to_node_id_map_.end()); |
| + |
| + int node_id = view_to_node_id_it->second; |
| + int parent_id = 0; |
| + if (parent) |
| + parent_id = GetNodeIdFromView(parent); |
| + else // views::RootView |
| + parent_id = GetNodeIdFromWidget(view->GetWidget()); |
| + |
| + // TODO(mhashmi): Add ViewObserver and remove it here based on |
| + // |remove_observer| |
| + |
| + NodeIdToViewMap::iterator node_id_to_view_it = |
| + node_id_to_view_map_.find(node_id); |
| + DCHECK(node_id_to_view_it != node_id_to_view_map_.end()); |
| + |
| + view_to_node_id_map_.erase(view_to_node_id_it); |
| + node_id_to_view_map_.erase(node_id_to_view_it); |
| + frontend()->childNodeRemoved(parent_id, node_id); |
| } |
| void AshDevToolsDOMAgent::RemoveObserverFromAllWindows() { |