Chromium Code Reviews| Index: services/ui/ws/display.cc | 
| diff --git a/services/ui/ws/display.cc b/services/ui/ws/display.cc | 
| index b3981b86032061140d6c25279a890a940e863eab..6c74be3cb476bdc68d23522ed833bb19644b1be6 100644 | 
| --- a/services/ui/ws/display.cc | 
| +++ b/services/ui/ws/display.cc | 
| @@ -26,6 +26,7 @@ | 
| #include "services/ui/ws/window_server_delegate.h" | 
| #include "services/ui/ws/window_tree.h" | 
| #include "services/ui/ws/window_tree_binding.h" | 
| +#include "services/ui/ws/window_tree_host_factory.h" | 
| #include "ui/base/cursor/cursor.h" | 
| namespace ui { | 
| @@ -62,6 +63,9 @@ Display::~Display() { | 
| void Display::Init(const PlatformDisplayInitParams& init_params, | 
| std::unique_ptr<DisplayBinding> binding) { | 
| + if (window_server_->IsInExternalWindowMode()) | 
| + DCHECK(window_server_->window_tree_host_factory() && binding); | 
| 
 
kylechar
2017/03/07 18:19:37
DCHECKs are compiled out in release builds, that m
 
tonikitoo
2017/03/07 20:09:36
BuildBots (including release bots) seem happy, but
 
 | 
| + | 
| binding_ = std::move(binding); | 
| display_manager()->AddDisplay(this); | 
| @@ -204,7 +208,26 @@ void Display::SetTitle(const std::string& title) { | 
| platform_display_->SetTitle(base::UTF8ToUTF16(title)); | 
| } | 
| +void Display::InitDisplayRoot() { | 
| + DCHECK(window_server_->IsInExternalWindowMode()); | 
| + DCHECK(window_server_->window_tree_host_factory()); | 
| + DCHECK(binding_); | 
| + | 
| + external_window_mode_display_root_ = | 
| + base::MakeUnique<WindowManagerDisplayRoot>(this); | 
| + window_manager_display_root_map_[service_manager::mojom::kRootUserID] = | 
| 
 
kylechar
2017/03/07 18:19:37
Once you aren't using WindowManagerDisplayRoot any
 
tonikitoo
2017/03/07 20:09:36
This is still needed, but should be clean up indee
 
 | 
| + external_window_mode_display_root_.get(); | 
| + | 
| + ServerWindow* server_window = external_window_mode_display_root_->root(); | 
| + WindowTree* window_tree = | 
| + window_server_->window_tree_host_factory()->window_tree(); | 
| + window_tree->AddRoot(server_window); | 
| + window_tree->DoOnEmbed(nullptr /*mojom::WindowTreePtr*/, server_window); | 
| +} | 
| + | 
| void Display::InitWindowManagerDisplayRoots() { | 
| + // Tests can create ws::Display instances, directly by-passing | 
| 
 
kylechar
2017/03/07 18:19:37
The if (binding_) path is only for tests now?
 
tonikitoo
2017/03/07 20:09:36
Yes and No.
Yes, because I believe only tests exe
 
 | 
| + // WindowTreeHostFactory. | 
| if (binding_) { | 
| std::unique_ptr<WindowManagerDisplayRoot> display_root_ptr( | 
| new WindowManagerDisplayRoot(this)); | 
| @@ -220,7 +243,6 @@ void Display::InitWindowManagerDisplayRoots() { | 
| } else { | 
| CreateWindowManagerDisplayRootsFromFactories(); | 
| } | 
| - display_manager()->OnDisplayUpdate(this); | 
| } | 
| void Display::CreateWindowManagerDisplayRootsFromFactories() { | 
| @@ -274,7 +296,13 @@ ServerWindow* Display::GetRootWindow() { | 
| void Display::OnAcceleratedWidgetAvailable() { | 
| display_manager()->OnDisplayAcceleratedWidgetAvailable(this); | 
| - InitWindowManagerDisplayRoots(); | 
| + | 
| + if (window_server_->IsInExternalWindowMode()) | 
| + InitDisplayRoot(); | 
| + else | 
| + InitWindowManagerDisplayRoots(); | 
| + | 
| + display_manager()->OnDisplayUpdate(this); | 
| } | 
| bool Display::IsInHighContrastMode() { | 
| @@ -283,7 +311,7 @@ bool Display::IsInHighContrastMode() { | 
| void Display::OnEvent(const ui::Event& event) { | 
| WindowManagerDisplayRoot* display_root = GetActiveWindowManagerDisplayRoot(); | 
| - if (display_root) | 
| + if (display_root && display_root->window_manager_state()) | 
| display_root->window_manager_state()->ProcessEvent(event, GetId()); | 
| window_server_ | 
| ->GetUserActivityMonitorForUser( | 
| @@ -293,7 +321,7 @@ void Display::OnEvent(const ui::Event& event) { | 
| void Display::OnNativeCaptureLost() { | 
| WindowManagerDisplayRoot* display_root = GetActiveWindowManagerDisplayRoot(); | 
| - if (display_root) | 
| + if (display_root && display_root->window_manager_state()) | 
| display_root->window_manager_state()->SetCapture(nullptr, kInvalidClientId); | 
| } | 
| @@ -376,7 +404,7 @@ void Display::OnFocusChanged(FocusControllerChangeSource change_source, | 
| // WindowManagers are always notified of focus changes. | 
| WindowManagerDisplayRoot* display_root = GetActiveWindowManagerDisplayRoot(); | 
| - if (display_root) { | 
| + if (display_root && display_root->window_manager_state()) { | 
| WindowTree* wm_tree = display_root->window_manager_state()->window_tree(); | 
| if (wm_tree != owning_tree_old && wm_tree != embedded_tree_old && | 
| wm_tree != owning_tree_new && wm_tree != embedded_tree_new) { |