Chromium Code Reviews| 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 |
| index 24cac7f5ed0a1044d6839c703690e0e2a9ae3560..c2785faefd733c3e2d276aff06595c2e039dfca6 100644 |
| --- a/ash/devtools/ash_devtools_dom_agent.cc |
| +++ b/ash/devtools/ash_devtools_dom_agent.cc |
| @@ -9,12 +9,14 @@ |
| #include "ash/devtools/widget_element.h" |
| #include "ash/devtools/window_element.h" |
| #include "ash/public/cpp/shell_window_ids.h" |
| -#include "ash/root_window_controller.h" |
| -#include "ash/shell.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" |
| @@ -116,9 +118,12 @@ std::unique_ptr<DOM::Node> BuildDomNodeFromUIElement(UIElement* root) { |
| } // namespace |
| -AshDevToolsDOMAgent::AshDevToolsDOMAgent() : is_building_tree_(false) {} |
| +AshDevToolsDOMAgent::AshDevToolsDOMAgent() : is_building_tree_(false) { |
| + aura::Env::GetInstance()->AddObserver(this); |
| +} |
| AshDevToolsDOMAgent::~AshDevToolsDOMAgent() { |
| + aura::Env::GetInstance()->RemoveObserver(this); |
| Reset(); |
| } |
| @@ -209,6 +214,12 @@ 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()); |
| + LOG(ERROR) << "host->window()->GetBoundsInScreen():" |
| + << host->window()->GetBoundsInScreen().ToString(); |
| +} |
| + |
| void AshDevToolsDOMAgent::OnNodeBoundsChanged(int node_id) { |
| for (auto& observer : observers_) |
| observer.OnNodeBoundsChanged(node_id); |
| @@ -223,7 +234,7 @@ AshDevToolsDOMAgent::BuildInitialTree() { |
| // but maybe a new different element type. |
| window_element_root_ = new WindowElement(nullptr, this, nullptr); |
| - for (aura::Window* window : Shell::GetAllRootWindows()) { |
| + for (aura::Window* window : root_windows()) { |
| UIElement* window_element = |
| new WindowElement(window, this, window_element_root_); |
| @@ -328,7 +339,7 @@ void AshDevToolsDOMAgent::Reset() { |
| observers_.Clear(); |
| } |
| -void AshDevToolsDOMAgent::InitializeHighlightingWidget() { |
| +void AshDevToolsDOMAgent::InitializeHighlightingWidget(int root_window_index) { |
| DCHECK(!widget_for_highlighting_); |
| widget_for_highlighting_.reset(new views::Widget); |
| views::Widget::InitParams params; |
| @@ -336,11 +347,13 @@ void AshDevToolsDOMAgent::InitializeHighlightingWidget() { |
| params.activatable = views::Widget::InitParams::ACTIVATABLE_NO; |
| params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| params.opacity = views::Widget::InitParams::WindowOpacity::TRANSLUCENT_WINDOW; |
| + LOG(ERROR) << "root_window_index: " << root_window_index; |
| params.name = "HighlightingWidget"; |
| - Shell::GetPrimaryRootWindowController() |
| - ->ConfigureWidgetInitParamsForContainer(widget_for_highlighting_.get(), |
| - kShellWindowId_OverlayContainer, |
| - ¶ms); |
| + params.parent = root_windows()[0]; |
| + DCHECK(root_windows().size()); |
| + // params.parent = |
| + // root_windows()[root_window_index]->GetChildById(kShellWindowId_OverlayContainer);; |
| + // params.parent = root_windows()[root_window_index]; |
| params.keep_on_top = true; |
| params.accept_events = false; |
| widget_for_highlighting_->Init(params); |
| @@ -358,22 +371,58 @@ void AshDevToolsDOMAgent::UpdateHighlight( |
| display::Display display = |
| display::Screen::GetScreen()->GetDisplayNearestWindow( |
| window_and_bounds.first); |
| - widget_for_highlighting_->GetNativeWindow()->SetBoundsInScreen( |
| - window_and_bounds.second, display); |
| + 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( |
| + window_and_bounds.first->GetRootWindow()); |
| + gfx::Point origin_in_screen = window_and_bounds.first->bounds().origin(); |
| + screen_position_client->ConvertPointFromScreen(root, &origin_in_screen); |
| + |
| + gfx::Rect origin_in_window(origin_in_screen, |
| + window_and_bounds.first->bounds().size()); |
| + widget_for_highlighting_->GetNativeWindow()->SetBounds(origin_in_window); |
|
sadrul
2017/05/26 20:09:56
gfx::Rect bounds = window_and_bounds.second;
gfx::
thanhph
2017/05/28 00:04:25
Done. I use gfx::Rect bounds(window_and_bounds.sec
|
| + |
| + LOG(ERROR) << "name: widget_for_highlighting_->GetNativeWindow(): " |
| + << widget_for_highlighting_->GetNativeWindow() |
| + ->GetRootWindow() |
| + ->GetDebugInfo(); |
| + LOG(ERROR) << "widget_for_highlighting_: " |
| + << widget_for_highlighting_->GetNativeWindow() |
| + ->GetBoundsInScreen() |
| + .ToString(); |
| } |
| ui::devtools::protocol::Response AshDevToolsDOMAgent::HighlightNode( |
| std::unique_ptr<ui::devtools::protocol::DOM::HighlightConfig> |
| highlight_config, |
| int node_id) { |
| - if (!widget_for_highlighting_) |
| - InitializeHighlightingWidget(); |
| - |
| + if (!widget_for_highlighting_) { |
| + LOG(ERROR) << "AshDevToolsDOMAgent::HighlightNode - root_window().size(): " |
| + << root_windows().size(); |
| + UIElement* ui_element = GetElementFromNodeId(node_id); |
| + UIElement* child_element = nullptr; |
| + while (ui_element->parent()) { |
| + child_element = ui_element; |
| + ui_element = ui_element->parent(); |
| + } |
| + DCHECK_EQ(UIElementType::WINDOW, child_element->type()); |
| + aura::Window* window = |
| + UIElement::GetBackingElement<aura::Window, WindowElement>( |
| + child_element); |
| + auto iter = std::find(root_windows().begin(), root_windows().end(), window); |
| + DCHECK(iter != root_windows().end()); |
| + InitializeHighlightingWidget(std::distance(root_windows().begin(), iter)); |
| + } |
| 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()); |
| - |
| + LOG(ERROR) << "bounds: " << window_and_bounds.second.ToString(); |
| + LOG(ERROR) << "widget_for_highlighting_: " |
| + << widget_for_highlighting_->GetWindowBoundsInScreen().ToString(); |
| if (!window_and_bounds.first) { |
| return ui::devtools::protocol::Response::Error( |
| "No node found with that id"); |