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); |