| // Copyright 2015 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "chrome/browser/chrome_browser_main_extra_parts_exo.h" | 
 |  | 
 | #include "base/command_line.h" | 
 | #include "base/macros.h" | 
 | #include "base/message_loop/message_loop.h" | 
 | #include "chrome/browser/ui/ash/ash_util.h" | 
 | #include "chrome/common/chrome_switches.h" | 
 | #include "components/exo/display.h" | 
 | #include "components/exo/wayland/server.h" | 
 | #include "content/public/browser/browser_thread.h" | 
 |  | 
 | class ChromeBrowserMainExtraPartsExo::WaylandWatcher | 
 |     : public base::MessagePumpLibevent::Watcher { | 
 |  public: | 
 |   explicit WaylandWatcher(exo::wayland::Server* server) : server_(server) { | 
 |     base::MessageLoopForUI::current()->WatchFileDescriptor( | 
 |         server_->GetFileDescriptor(), | 
 |         true,  // persistent | 
 |         base::MessagePumpLibevent::WATCH_READ, &controller_, this); | 
 |   } | 
 |  | 
 |   // base::MessagePumpLibevent::Watcher: | 
 |   void OnFileCanReadWithoutBlocking(int fd) override { | 
 |     server_->Dispatch(base::TimeDelta()); | 
 |     server_->Flush(); | 
 |   } | 
 |   void OnFileCanWriteWithoutBlocking(int fd) override { NOTREACHED(); } | 
 |  | 
 |  private: | 
 |   base::MessagePumpLibevent::FileDescriptorWatcher controller_; | 
 |   exo::wayland::Server* const server_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(WaylandWatcher); | 
 | }; | 
 |  | 
 | ChromeBrowserMainExtraPartsExo::ChromeBrowserMainExtraPartsExo() | 
 |     : display_(new exo::Display) {} | 
 |  | 
 | ChromeBrowserMainExtraPartsExo::~ChromeBrowserMainExtraPartsExo() {} | 
 |  | 
 | void ChromeBrowserMainExtraPartsExo::PreProfileInit() { | 
 |   if (!chrome::ShouldOpenAshOnStartup()) | 
 |     return; | 
 |  | 
 |   if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 
 |           switches::kEnableWaylandServer)) { | 
 |     wayland_server_ = exo::wayland::Server::Create(display_.get()); | 
 |     wayland_watcher_ = | 
 |         make_scoped_ptr(new WaylandWatcher(wayland_server_.get())); | 
 |   } | 
 | } | 
 |  | 
 | void ChromeBrowserMainExtraPartsExo::PostMainMessageLoopRun() { | 
 |   wayland_watcher_.reset(); | 
 |   wayland_server_.reset(); | 
 | } |