Home | History | Annotate | Download | only in worker
      1 // Copyright (c) 2011 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/base_switches.h"
      6 #include "base/command_line.h"
      7 #include "base/message_loop/message_loop.h"
      8 #include "base/strings/string_util.h"
      9 #include "base/threading/platform_thread.h"
     10 #include "base/timer/hi_res_timer_manager.h"
     11 #include "content/child/child_process.h"
     12 #include "content/common/sandbox_linux/sandbox_linux.h"
     13 #include "content/public/common/main_function_params.h"
     14 #include "content/public/common/sandbox_init.h"
     15 #include "content/worker/worker_thread.h"
     16 
     17 #if defined(OS_WIN)
     18 #include "sandbox/win/src/sandbox.h"
     19 #endif
     20 
     21 #if defined(OS_MACOSX)
     22 #include "content/common/sandbox_mac.h"
     23 #endif
     24 
     25 namespace content {
     26 
     27 // Mainline routine for running as the worker process.
     28 int WorkerMain(const MainFunctionParams& parameters) {
     29   // The main message loop of the worker process.
     30   base::MessageLoop main_message_loop;
     31   base::PlatformThread::SetName("CrWorkerMain");
     32   base::debug::TraceLog::GetInstance()->SetProcessName("Shared Web Worker");
     33 
     34 #if defined(OS_WIN)
     35   sandbox::TargetServices* target_services =
     36       parameters.sandbox_info->target_services;
     37   if (!target_services)
     38     return false;
     39 
     40   // Cause advapi32 to load before the sandbox is turned on.
     41   unsigned int dummy_rand;
     42   rand_s(&dummy_rand);
     43   // Warm up language subsystems before the sandbox is turned on.
     44   ::GetUserDefaultLangID();
     45   ::GetUserDefaultLCID();
     46 
     47   target_services->LowerToken();
     48 #elif defined(OS_MACOSX)
     49   // Sandbox should already be activated at this point.
     50   CHECK(Sandbox::SandboxIsCurrentlyActive());
     51 #elif defined(OS_LINUX)
     52   // On Linux, the sandbox must be initialized early, before any thread is
     53   // created.
     54   LinuxSandbox::InitializeSandbox();
     55 #endif
     56 
     57   ChildProcess worker_process;
     58   worker_process.set_main_thread(new WorkerThread());
     59 
     60   base::HighResolutionTimerManager hi_res_timer_manager;
     61 
     62   const CommandLine& parsed_command_line = parameters.command_line;
     63   if (parsed_command_line.HasSwitch(switches::kWaitForDebugger)) {
     64     ChildProcess::WaitForDebugger("Worker");
     65   }
     66 
     67   // Load the accelerator table from the browser executable and tell the
     68   // message loop to use it when translating messages.
     69   base::MessageLoop::current()->Run();
     70 
     71   return 0;
     72 }
     73 
     74 }  // namespace content
     75