Home | History | Annotate | Download | only in desktop
      1 // Copyright 2013 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 "base/at_exit.h"
      6 #include "base/bind.h"
      7 #include "base/command_line.h"
      8 #include "base/logging.h"
      9 #include "base/message_loop/message_loop.h"
     10 #include "mojo/shell/child_process.h"
     11 #include "mojo/shell/context.h"
     12 #include "mojo/shell/init.h"
     13 #include "mojo/shell/switches.h"
     14 #include "ui/gfx/switches.h"
     15 
     16 #if defined(COMPONENT_BUILD)
     17 #include "ui/gl/gl_surface.h"
     18 #endif
     19 
     20 namespace {
     21 
     22 void RunApps(mojo::shell::Context* context) {
     23   const base::CommandLine& command_line =
     24       *base::CommandLine::ForCurrentProcess();
     25   base::CommandLine::StringVector args = command_line.GetArgs();
     26   for (base::CommandLine::StringVector::const_iterator it = args.begin();
     27        it != args.end();
     28        ++it) {
     29     context->Run(GURL(*it));
     30   }
     31 }
     32 
     33 }  // namespace
     34 
     35 int main(int argc, char** argv) {
     36   base::AtExitManager at_exit;
     37   base::CommandLine::Init(argc, argv);
     38 #if defined(OS_LINUX)
     39   // We use gfx::RenderText from multiple threads concurrently and the pango
     40   // backend (currently the default on linux) is not close to threadsafe. Force
     41   // use of the harfbuzz backend for now.
     42   base::CommandLine::ForCurrentProcess()->AppendSwitch(
     43       switches::kEnableHarfBuzzRenderText);
     44 #endif
     45   mojo::shell::InitializeLogging();
     46 
     47   // TODO(vtl): Unify parent and child process cases to the extent possible.
     48   if (scoped_ptr<mojo::shell::ChildProcess> child_process =
     49           mojo::shell::ChildProcess::Create(
     50               *base::CommandLine::ForCurrentProcess())) {
     51     child_process->Main();
     52   } else {
     53 #if defined(COMPONENT_BUILD)
     54     gfx::GLSurface::InitializeOneOff();
     55 #endif
     56     // We want the shell::Context to outlive the MessageLoop so that pipes are
     57     // all gracefully closed / error-out before we try to shut the Context down.
     58     mojo::shell::Context shell_context;
     59     {
     60       base::MessageLoop message_loop;
     61       shell_context.Init();
     62 
     63       const base::CommandLine& command_line =
     64           *base::CommandLine::ForCurrentProcess();
     65       if (command_line.HasSwitch(switches::kOrigin)) {
     66         shell_context.mojo_url_resolver()->SetBaseURL(
     67             GURL(command_line.GetSwitchValueASCII(switches::kOrigin)));
     68       }
     69 
     70       message_loop.PostTask(FROM_HERE, base::Bind(RunApps, &shell_context));
     71       message_loop.Run();
     72     }
     73   }
     74   return 0;
     75 }
     76