cast_browser_main_parts.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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/shell/browser/cast_browser_main_parts.h"
6
7#include "base/command_line.h"
8#include "base/message_loop/message_loop.h"
9#include "base/prefs/pref_registry_simple.h"
10#include "chromecast/common/chromecast_config.h"
11#include "chromecast/metrics/cast_metrics_service_client.h"
12#include "chromecast/net/network_change_notifier_cast.h"
13#include "chromecast/net/network_change_notifier_factory_cast.h"
14#include "chromecast/service/cast_service.h"
15#include "chromecast/shell/browser/cast_browser_context.h"
16#include "chromecast/shell/browser/cast_browser_process.h"
17#include "chromecast/shell/browser/devtools/remote_debugging_server.h"
18#include "chromecast/shell/browser/url_request_context_factory.h"
19#include "chromecast/shell/browser/webui/webui_cast.h"
20#include "content/public/browser/browser_thread.h"
21#include "content/public/common/content_switches.h"
22
23#if defined(OS_ANDROID)
24#include "net/android/network_change_notifier_factory_android.h"
25#endif  // defined(OS_ANDROID)
26
27namespace chromecast {
28namespace shell {
29
30namespace {
31
32struct DefaultCommandLineSwitch {
33  const char* const switch_name;
34  const char* const switch_value;
35};
36
37DefaultCommandLineSwitch g_default_switches[] = {
38  { switches::kDisableApplicationCache, "" },
39  { switches::kDisablePlugins, "" },
40  // Always enable HTMLMediaElement logs.
41  { switches::kBlinkPlatformLogChannels, "Media"},
42  { NULL, NULL },  // Termination
43};
44
45void AddDefaultCommandLineSwitches(CommandLine* command_line) {
46  int i = 0;
47  while (g_default_switches[i].switch_name != NULL) {
48    command_line->AppendSwitchASCII(
49        std::string(g_default_switches[i].switch_name),
50        std::string(g_default_switches[i].switch_value));
51    ++i;
52  }
53}
54
55}  // namespace
56
57CastBrowserMainParts::CastBrowserMainParts(
58    const content::MainFunctionParams& parameters,
59    URLRequestContextFactory* url_request_context_factory)
60    : BrowserMainParts(),
61      cast_browser_process_(new CastBrowserProcess()),
62      parameters_(parameters),
63      url_request_context_factory_(url_request_context_factory) {
64  CommandLine* command_line = CommandLine::ForCurrentProcess();
65  AddDefaultCommandLineSwitches(command_line);
66}
67
68CastBrowserMainParts::~CastBrowserMainParts() {
69}
70
71void CastBrowserMainParts::PreMainMessageLoopStart() {
72#if defined(OS_ANDROID)
73  net::NetworkChangeNotifier::SetFactory(
74      new net::NetworkChangeNotifierFactoryAndroid());
75#else
76  net::NetworkChangeNotifier::SetFactory(
77      new NetworkChangeNotifierFactoryCast());
78#endif  // defined(OS_ANDROID)
79}
80
81void CastBrowserMainParts::PostMainMessageLoopStart() {
82#if defined(OS_ANDROID)
83  base::MessageLoopForUI::current()->Start();
84#endif  // defined(OS_ANDROID)
85}
86
87int CastBrowserMainParts::PreCreateThreads() {
88  ChromecastConfig::Create(new PrefRegistrySimple());
89  return 0;
90}
91
92void CastBrowserMainParts::PreMainMessageLoopRun() {
93  url_request_context_factory_->InitializeOnUIThread();
94
95  cast_browser_process_->SetBrowserContext(
96      new CastBrowserContext(url_request_context_factory_));
97  cast_browser_process_->SetMetricsServiceClient(
98      metrics::CastMetricsServiceClient::Create(
99          content::BrowserThread::GetBlockingPool(),
100          ChromecastConfig::GetInstance()->pref_service(),
101          cast_browser_process_->browser_context()->GetRequestContext()));
102  cast_browser_process_->SetRemoteDebuggingServer(new RemoteDebuggingServer());
103
104  InitializeWebUI();
105
106  cast_browser_process_->SetCastService(
107      CastService::Create(cast_browser_process_->browser_context(),
108                          url_request_context_factory_->GetSystemGetter()));
109  cast_browser_process_->cast_service()->Start();
110}
111
112bool CastBrowserMainParts::MainMessageLoopRun(int* result_code) {
113  // If parameters_.ui_task is not NULL, we are running browser tests. In this
114  // case, the browser's main message loop will not run.
115  if (parameters_.ui_task) {
116    parameters_.ui_task->Run();
117  } else {
118    base::MessageLoopForUI::current()->Run();
119  }
120  return true;
121}
122
123void CastBrowserMainParts::PostMainMessageLoopRun() {
124  cast_browser_process_->cast_service()->Stop();
125  cast_browser_process_.reset();
126}
127
128}  // namespace shell
129}  // namespace chromecast
130