1// Copyright (c) 2012 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/debug/debugger.h"
6#include "base/message_loop/message_loop.h"
7#include "chrome/common/chrome_switches.h"
8#include "chrome/common/service_process_util.h"
9#include "chrome/service/service_process.h"
10#include "content/public/common/main_function_params.h"
11#include "net/url_request/url_request.h"
12
13#if defined(OS_WIN)
14#include "content/public/common/sandbox_init.h"
15#include "sandbox/win/src/sandbox_types.h"
16#elif defined(OS_MACOSX)
17#include "chrome/service/chrome_service_application_mac.h"
18#endif  // defined(OS_WIN)
19
20// Mainline routine for running as the service process.
21int ServiceProcessMain(const content::MainFunctionParams& parameters) {
22  // Chrome disallows cookies by default. All code paths that want to use
23  // cookies should go through the browser process.
24  net::URLRequest::SetDefaultCookiePolicyToBlock();
25
26#if defined(OS_MACOSX)
27  chrome_service_mac::RegisterServiceEventHandler();
28#endif
29
30  base::MessageLoopForUI main_message_loop;
31  main_message_loop.set_thread_name("MainThread");
32  if (parameters.command_line.HasSwitch(switches::kWaitForDebugger)) {
33    base::debug::WaitForDebugger(60, true);
34  }
35
36  VLOG(1) << "Service process launched: "
37          << parameters.command_line.GetCommandLineString();
38
39  base::PlatformThread::SetName("CrServiceMain");
40
41  // If there is already a service process running, quit now.
42  scoped_ptr<ServiceProcessState> state(new ServiceProcessState);
43  if (!state->Initialize())
44    return 0;
45
46  ServiceProcess service_process;
47  if (service_process.Initialize(&main_message_loop,
48                                 parameters.command_line,
49                                 state.release())) {
50    base::MessageLoop::current()->Run();
51  } else {
52    LOG(ERROR) << "Service process failed to initialize";
53  }
54  service_process.Teardown();
55  return 0;
56}
57