1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromecast/shell/browser/cast_browser_main_parts.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/command_line.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/message_loop/message_loop.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chromecast/common/chromecast_config.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/metrics/cast_metrics_service_client.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromecast/net/network_change_notifier_cast.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromecast/net/network_change_notifier_factory_cast.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromecast/service/cast_service.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromecast/shell/browser/cast_browser_context.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/shell/browser/cast_browser_process.h"
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chromecast/shell/browser/devtools/remote_debugging_server.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromecast/shell/browser/url_request_context_factory.h"
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chromecast/shell/browser/webui/webui_cast.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/browser_thread.h"
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/common/content_switches.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_ANDROID)
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/android/network_change_notifier_factory_android.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // defined(OS_ANDROID)
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace chromecast {
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace shell {
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct DefaultCommandLineSwitch {
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* const switch_name;
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char* const switch_value;
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
37116680a4aac90f2aa7413d9095a592090648e557Ben MurdochDefaultCommandLineSwitch g_default_switches[] = {
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  { switches::kDisableApplicationCache, "" },
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  { switches::kDisablePlugins, "" },
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Always enable HTMLMediaElement logs.
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  { switches::kBlinkPlatformLogChannels, "Media"},
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  { NULL, NULL },  // Termination
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid AddDefaultCommandLineSwitches(CommandLine* command_line) {
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int i = 0;
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  while (g_default_switches[i].switch_name != NULL) {
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    command_line->AppendSwitchASCII(
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        std::string(g_default_switches[i].switch_name),
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        std::string(g_default_switches[i].switch_value));
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ++i;
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
57116680a4aac90f2aa7413d9095a592090648e557Ben MurdochCastBrowserMainParts::CastBrowserMainParts(
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const content::MainFunctionParams& parameters,
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    URLRequestContextFactory* url_request_context_factory)
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : BrowserMainParts(),
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cast_browser_process_(new CastBrowserProcess()),
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      parameters_(parameters),
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      url_request_context_factory_(url_request_context_factory) {
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CommandLine* command_line = CommandLine::ForCurrentProcess();
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddDefaultCommandLineSwitches(command_line);
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
68116680a4aac90f2aa7413d9095a592090648e557Ben MurdochCastBrowserMainParts::~CastBrowserMainParts() {
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid CastBrowserMainParts::PreMainMessageLoopStart() {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_ANDROID)
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::NetworkChangeNotifier::SetFactory(
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new net::NetworkChangeNotifierFactoryAndroid());
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  net::NetworkChangeNotifier::SetFactory(
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new NetworkChangeNotifierFactoryCast());
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // defined(OS_ANDROID)
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid CastBrowserMainParts::PostMainMessageLoopStart() {
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_ANDROID)
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::MessageLoopForUI::current()->Start();
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // defined(OS_ANDROID)
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint CastBrowserMainParts::PreCreateThreads() {
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ChromecastConfig::Create(new PrefRegistrySimple());
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return 0;
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid CastBrowserMainParts::PreMainMessageLoopRun() {
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  url_request_context_factory_->InitializeOnUIThread();
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cast_browser_process_->SetBrowserContext(
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new CastBrowserContext(url_request_context_factory_));
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cast_browser_process_->SetMetricsServiceClient(
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      metrics::CastMetricsServiceClient::Create(
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          content::BrowserThread::GetBlockingPool(),
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ChromecastConfig::GetInstance()->pref_service(),
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          cast_browser_process_->browser_context()->GetRequestContext()));
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cast_browser_process_->SetRemoteDebuggingServer(new RemoteDebuggingServer());
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  InitializeWebUI();
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cast_browser_process_->SetCastService(
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CastService::Create(cast_browser_process_->browser_context(),
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          url_request_context_factory_->GetSystemGetter()));
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cast_browser_process_->cast_service()->Start();
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool CastBrowserMainParts::MainMessageLoopRun(int* result_code) {
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If parameters_.ui_task is not NULL, we are running browser tests. In this
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // case, the browser's main message loop will not run.
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (parameters_.ui_task) {
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    parameters_.ui_task->Run();
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::MessageLoopForUI::current()->Run();
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid CastBrowserMainParts::PostMainMessageLoopRun() {
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cast_browser_process_->cast_service()->Stop();
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cast_browser_process_.reset();
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace shell
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace chromecast
130