Home | History | Annotate | Download | only in service
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chromecast/service/cast_service_simple.h"
      6 
      7 #include "base/command_line.h"
      8 #include "base/files/file_path.h"
      9 #include "base/macros.h"
     10 #include "content/public/browser/render_view_host.h"
     11 #include "content/public/browser/web_contents.h"
     12 #include "net/base/filename_util.h"
     13 #include "net/url_request/url_request_context_getter.h"
     14 #include "ui/aura/env.h"
     15 #include "ui/aura/layout_manager.h"
     16 #include "ui/aura/test/test_screen.h"
     17 #include "ui/aura/window.h"
     18 #include "ui/aura/window_tree_host.h"
     19 #include "ui/gfx/size.h"
     20 #include "url/gurl.h"
     21 
     22 namespace chromecast {
     23 
     24 namespace {
     25 
     26 GURL GetStartupURL() {
     27   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
     28   const base::CommandLine::StringVector& args = command_line->GetArgs();
     29 
     30   if (args.empty())
     31     return GURL("http://www.google.com/");
     32 
     33   GURL url(args[0]);
     34   if (url.is_valid() && url.has_scheme())
     35     return url;
     36 
     37   return net::FilePathToFileURL(base::FilePath(args[0]));
     38 }
     39 
     40 class FillLayout : public aura::LayoutManager {
     41  public:
     42   explicit FillLayout(aura::Window* root) : root_(root) {}
     43   virtual ~FillLayout() {}
     44 
     45  private:
     46   // aura::LayoutManager:
     47   virtual void OnWindowResized() OVERRIDE {}
     48 
     49   virtual void OnWindowAddedToLayout(aura::Window* child) OVERRIDE {
     50     child->SetBounds(root_->bounds());
     51   }
     52 
     53   virtual void OnWillRemoveWindowFromLayout(aura::Window* child) OVERRIDE {}
     54 
     55   virtual void OnWindowRemovedFromLayout(aura::Window* child) OVERRIDE {}
     56 
     57   virtual void OnChildWindowVisibilityChanged(aura::Window* child,
     58                                               bool visible) OVERRIDE {}
     59 
     60   virtual void SetChildBounds(aura::Window* child,
     61                               const gfx::Rect& requested_bounds) OVERRIDE {
     62     SetChildBoundsDirect(child, requested_bounds);
     63   }
     64 
     65   aura::Window* root_;
     66 
     67   DISALLOW_COPY_AND_ASSIGN(FillLayout);
     68 };
     69 
     70 }  // namespace
     71 
     72 // static
     73 CastService* CastService::Create(
     74     content::BrowserContext* browser_context,
     75     net::URLRequestContextGetter* request_context_getter) {
     76   return new CastServiceSimple(browser_context);
     77 }
     78 
     79 CastServiceSimple::CastServiceSimple(content::BrowserContext* browser_context)
     80     : CastService(browser_context) {
     81 }
     82 
     83 CastServiceSimple::~CastServiceSimple() {
     84 }
     85 
     86 void CastServiceSimple::Initialize() {
     87 }
     88 
     89 void CastServiceSimple::StartInternal() {
     90   // Aura initialization
     91   gfx::Size initial_size = gfx::Size(1280, 720);
     92   // TODO(lcwu): http://crbug.com/391074. Chromecast only needs a minimal
     93   // implementation of gfx::screen and aura's TestScreen will do for now.
     94   // Change the code to use ozone's screen implementation when it is ready.
     95   aura::TestScreen* screen = aura::TestScreen::Create(initial_size);
     96   gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, screen);
     97   CHECK(aura::Env::GetInstance());
     98   window_tree_host_.reset(
     99       aura::WindowTreeHost::Create(gfx::Rect(initial_size)));
    100   window_tree_host_->InitHost();
    101   window_tree_host_->window()->SetLayoutManager(
    102       new FillLayout(window_tree_host_->window()));
    103   window_tree_host_->Show();
    104 
    105   // Create a WebContents
    106   content::WebContents::CreateParams create_params(browser_context(), NULL);
    107   create_params.routing_id = MSG_ROUTING_NONE;
    108   create_params.initial_size = initial_size;
    109   web_contents_.reset(content::WebContents::Create(create_params));
    110 
    111   // Add and show content's view/window
    112   aura::Window* content_window = web_contents_->GetNativeView();
    113   aura::Window* parent = window_tree_host_->window();
    114   if (!parent->Contains(content_window)) {
    115     parent->AddChild(content_window);
    116   }
    117   content_window->Show();
    118 
    119   web_contents_->GetController().LoadURL(GetStartupURL(),
    120                                          content::Referrer(),
    121                                          ui::PAGE_TRANSITION_TYPED,
    122                                          std::string());
    123 }
    124 
    125 void CastServiceSimple::StopInternal() {
    126   web_contents_->GetRenderViewHost()->ClosePage();
    127   window_tree_host_.reset();
    128   gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, NULL);
    129   aura::Env::DeleteInstance();
    130   web_contents_.reset();
    131 }
    132 
    133 }  // namespace chromecast
    134