| Index: ash/devtools/ash_devtools_dom_agent.h
 | 
| diff --git a/ash/devtools/ash_devtools_dom_agent.h b/ash/devtools/ash_devtools_dom_agent.h
 | 
| index 91074fb1452c5cc60b6171821c8b172a82c646bf..80e2404a627113b89069205e5ce04b72d805a3c0 100644
 | 
| --- a/ash/devtools/ash_devtools_dom_agent.h
 | 
| +++ b/ash/devtools/ash_devtools_dom_agent.h
 | 
| @@ -6,37 +6,44 @@
 | 
|  #define ASH_DEVTOOLS_ASH_DEVTOOLS_DOM_AGENT_H_
 | 
|  
 | 
|  #include "ash/ash_export.h"
 | 
| -#include "ash/devtools/ui_element_delegate.h"
 | 
|  #include "base/macros.h"
 | 
| +#include "base/observer_list.h"
 | 
|  #include "components/ui_devtools/DOM.h"
 | 
|  #include "components/ui_devtools/devtools_base_agent.h"
 | 
| +#include "ui/aura/window_observer.h"
 | 
|  #include "ui/views/view.h"
 | 
| +#include "ui/views/view_observer.h"
 | 
|  #include "ui/views/widget/widget.h"
 | 
| +#include "ui/views/widget/widget_observer.h"
 | 
| +#include "ui/views/widget/widget_removals_observer.h"
 | 
|  
 | 
|  namespace aura {
 | 
|  class Window;
 | 
|  }
 | 
|  
 | 
|  namespace ash {
 | 
| +
 | 
|  namespace devtools {
 | 
| -
 | 
| -class UIElement;
 | 
|  
 | 
|  class ASH_EXPORT AshDevToolsDOMAgentObserver {
 | 
|   public:
 | 
| -  // TODO(thanhph): Use UIElement* as input argument instead.
 | 
| -  virtual void OnNodeBoundsChanged(int node_id) = 0;
 | 
| +  virtual void OnWindowBoundsChanged(aura::Window* window) {}
 | 
| +  virtual void OnWidgetBoundsChanged(views::Widget* widget) {}
 | 
| +  virtual void OnViewBoundsChanged(views::View* view) {}
 | 
|  };
 | 
|  
 | 
|  class ASH_EXPORT AshDevToolsDOMAgent
 | 
|      : public NON_EXPORTED_BASE(ui::devtools::UiDevToolsBaseAgent<
 | 
|                                 ui::devtools::protocol::DOM::Metainfo>),
 | 
| -      public UIElementDelegate {
 | 
| +      public aura::WindowObserver,
 | 
| +      public views::WidgetObserver,
 | 
| +      public views::WidgetRemovalsObserver,
 | 
| +      public views::ViewObserver {
 | 
|   public:
 | 
|    AshDevToolsDOMAgent();
 | 
|    ~AshDevToolsDOMAgent() override;
 | 
|  
 | 
| -  // DOM::Backend:
 | 
| +  // DOM::Backend
 | 
|    ui::devtools::protocol::Response disable() override;
 | 
|    ui::devtools::protocol::Response getDocument(
 | 
|        std::unique_ptr<ui::devtools::protocol::DOM::Node>* out_root) override;
 | 
| @@ -46,49 +53,101 @@
 | 
|        ui::devtools::protocol::Maybe<int> node_id) override;
 | 
|    ui::devtools::protocol::Response hideHighlight() override;
 | 
|  
 | 
| -  // UIElementDelegate:
 | 
| -  void OnUIElementAdded(UIElement* parent, UIElement* child) override;
 | 
| -  void OnUIElementReordered(UIElement* parent, UIElement* child) override;
 | 
| -  void OnUIElementRemoved(UIElement* ui_element) override;
 | 
| -  void OnUIElementBoundsChanged(UIElement* ui_element) override;
 | 
| -  bool IsHighlightingWindow(aura::Window* window) override;
 | 
| +  // WindowObserver
 | 
| +  void OnWindowHierarchyChanging(const HierarchyChangeParams& params) override;
 | 
| +  void OnWindowHierarchyChanged(const HierarchyChangeParams& params) override;
 | 
| +  void OnWindowStackingChanged(aura::Window* window) override;
 | 
| +  void OnWindowBoundsChanged(aura::Window* window,
 | 
| +                             const gfx::Rect& old_bounds,
 | 
| +                             const gfx::Rect& new_bounds) override;
 | 
| +
 | 
| +  // views::WidgetRemovalsObserver
 | 
| +  void OnWillRemoveView(views::Widget* widget, views::View* view) override;
 | 
| +
 | 
| +  // views::WidgetObserver
 | 
| +  void OnWidgetBoundsChanged(views::Widget* widget,
 | 
| +                             const gfx::Rect& new_bounds) override;
 | 
| +
 | 
| +  // views::ViewObserver
 | 
| +  void OnChildViewRemoved(views::View* parent, views::View* view) override;
 | 
| +  void OnChildViewAdded(views::View* parent, views::View* view) override;
 | 
| +  void OnChildViewReordered(views::View* parent, views::View*) override;
 | 
| +  void OnViewBoundsChanged(views::View* view) override;
 | 
| +
 | 
| +  aura::Window* GetWindowFromNodeId(int nodeId);
 | 
| +  views::Widget* GetWidgetFromNodeId(int nodeId);
 | 
| +  views::View* GetViewFromNodeId(int nodeId);
 | 
| +
 | 
| +  int GetNodeIdFromWindow(aura::Window* window);
 | 
| +  int GetNodeIdFromWidget(views::Widget* widget);
 | 
| +  int GetNodeIdFromView(views::View* view);
 | 
|  
 | 
|    void AddObserver(AshDevToolsDOMAgentObserver* observer);
 | 
|    void RemoveObserver(AshDevToolsDOMAgentObserver* observer);
 | 
| -  UIElement* GetElementFromNodeId(int node_id);
 | 
| -  UIElement* window_element_root() const { return window_element_root_; };
 | 
|  
 | 
|   private:
 | 
| -  void OnNodeBoundsChanged(int node_id);
 | 
| -
 | 
|    std::unique_ptr<ui::devtools::protocol::DOM::Node> BuildInitialTree();
 | 
| -  std::unique_ptr<ui::devtools::protocol::DOM::Node> BuildTreeForUIElement(
 | 
| -      UIElement* ui_element);
 | 
|    std::unique_ptr<ui::devtools::protocol::DOM::Node> BuildTreeForWindow(
 | 
| -      UIElement* window_element_root,
 | 
|        aura::Window* window);
 | 
|    std::unique_ptr<ui::devtools::protocol::DOM::Node> BuildTreeForRootWidget(
 | 
| -      UIElement* widget_element,
 | 
|        views::Widget* widget);
 | 
|    std::unique_ptr<ui::devtools::protocol::DOM::Node> BuildTreeForView(
 | 
| -      UIElement* view_element,
 | 
|        views::View* view);
 | 
| -  void RemoveDomNode(UIElement* ui_element);
 | 
| +
 | 
| +  void AddWindowTree(aura::Window* window);
 | 
| +  // |remove_observer| ensures that we don't add a duplicate observer in any
 | 
| +  // observer callback. For example, |remove_observer| is false when rebuilding
 | 
| +  // the tree in OnWindowStackingChanged so that the observer is not removed and
 | 
| +  // re-added, thus causing endless calls on the observer.
 | 
| +  void RemoveWindowTree(aura::Window* window, bool remove_observer);
 | 
| +  void RemoveWindowNode(aura::Window* window, bool remove_observer);
 | 
| +
 | 
| +  // Don't need AddWidgetTree because |widget| will always be inside a window,
 | 
| +  // so when windows are created, their widget nodes are created as well.
 | 
| +  void RemoveWidgetTree(views::Widget* widget, bool remove_observer);
 | 
| +  void RemoveWidgetNode(views::Widget* widget, bool remove_observer);
 | 
| +
 | 
| +  void AddViewTree(views::View* view);
 | 
| +  void RemoveViewTree(views::View* view,
 | 
| +                      views::View* parent,
 | 
| +                      bool remove_observer);
 | 
| +  void RemoveViewNode(views::View* view,
 | 
| +                      views::View* parent,
 | 
| +                      bool remove_observer);
 | 
| +
 | 
| +  void DestroyHighlightingWidget();
 | 
| +  void RemoveObservers();
 | 
|    void Reset();
 | 
| +
 | 
| +  using WindowAndBoundsPair = std::pair<aura::Window*, gfx::Rect>;
 | 
| +  WindowAndBoundsPair GetNodeWindowAndBounds(int node_id);
 | 
|    void InitializeHighlightingWidget();
 | 
| -  void UpdateHighlight(
 | 
| -      const std::pair<aura::Window*, gfx::Rect>& window_and_bounds,
 | 
| -      SkColor background,
 | 
| -      SkColor border);
 | 
| +  void UpdateHighlight(const WindowAndBoundsPair& window_and_bounds,
 | 
| +                       SkColor background,
 | 
| +                       SkColor border);
 | 
|    ui::devtools::protocol::Response HighlightNode(
 | 
|        std::unique_ptr<ui::devtools::protocol::DOM::HighlightConfig>
 | 
|            highlight_config,
 | 
|        int node_id);
 | 
| +  bool IsHighlightingWindow(aura::Window* window);
 | 
|  
 | 
| -  bool is_building_tree_;
 | 
| -  UIElement* window_element_root_;
 | 
| -  std::unordered_map<int, UIElement*> node_id_to_ui_element_;
 | 
|    std::unique_ptr<views::Widget> widget_for_highlighting_;
 | 
| +
 | 
| +  using WindowToNodeIdMap = std::unordered_map<aura::Window*, int>;
 | 
| +  WindowToNodeIdMap window_to_node_id_map_;
 | 
| +  using NodeIdToWindowMap = std::unordered_map<int, aura::Window*>;
 | 
| +  NodeIdToWindowMap node_id_to_window_map_;
 | 
| +
 | 
| +  using WidgetToNodeIdMap = std::unordered_map<views::Widget*, int>;
 | 
| +  WidgetToNodeIdMap widget_to_node_id_map_;
 | 
| +  using NodeIdToWidgetMap = std::unordered_map<int, views::Widget*>;
 | 
| +  NodeIdToWidgetMap node_id_to_widget_map_;
 | 
| +
 | 
| +  using ViewToNodeIdMap = std::unordered_map<views::View*, int>;
 | 
| +  ViewToNodeIdMap view_to_node_id_map_;
 | 
| +  using NodeIdToViewMap = std::unordered_map<int, views::View*>;
 | 
| +  NodeIdToViewMap node_id_to_view_map_;
 | 
| +
 | 
|    base::ObserverList<AshDevToolsDOMAgentObserver> observers_;
 | 
|  
 | 
|    DISALLOW_COPY_AND_ASSIGN(AshDevToolsDOMAgent);
 | 
| 
 |