Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 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 "chrome/browser/browser_process_platform_part_aurawin.h"
      6 
      7 #include "base/command_line.h"
      8 #include "base/logging.h"
      9 #include "base/prefs/pref_service.h"
     10 #include "base/process/kill.h"
     11 #include "base/win/windows_version.h"
     12 #include "chrome/browser/browser_process.h"
     13 #include "chrome/browser/chrome_notification_types.h"
     14 #include "chrome/browser/first_run/upgrade_util.h"
     15 #include "chrome/browser/first_run/upgrade_util_win.h"
     16 #include "chrome/browser/lifetime/application_lifetime.h"
     17 #include "chrome/browser/metro_viewer/chrome_metro_viewer_process_host_aurawin.h"
     18 #include "chrome/common/chrome_switches.h"
     19 #include "chrome/common/pref_names.h"
     20 #include "content/public/browser/notification_service.h"
     21 
     22 #include "ui/aura/remote_window_tree_host_win.h"
     23 #include "ui/base/ui_base_switches.h"
     24 
     25 BrowserProcessPlatformPart::BrowserProcessPlatformPart() {
     26   if (base::win::GetVersion() >= base::win::VERSION_WIN7) {
     27     // Tell metro viewer to close when we are shutting down.
     28     registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING,
     29                    content::NotificationService::AllSources());
     30   }
     31 }
     32 
     33 BrowserProcessPlatformPart::~BrowserProcessPlatformPart() {
     34 }
     35 
     36 void BrowserProcessPlatformPart::OnMetroViewerProcessTerminated() {
     37   metro_viewer_process_host_.reset(NULL);
     38 }
     39 
     40 void BrowserProcessPlatformPart::PlatformSpecificCommandLineProcessing(
     41     const CommandLine& command_line) {
     42   // Check for Windows 8 specific commandlines requesting that this process
     43   // either connect to an existing viewer or launch a new viewer and
     44   // synchronously wait for it to connect.
     45 
     46   bool launch = command_line.HasSwitch(switches::kViewerLaunchViaAppId);
     47   bool connect = (launch ||
     48                   (command_line.HasSwitch(switches::kViewerConnect) &&
     49                    !metro_viewer_process_host_.get()));
     50   if (!connect)
     51     return;
     52   // Create a host to connect to the Metro viewer process over IPC.
     53   metro_viewer_process_host_.reset(new ChromeMetroViewerProcessHost());
     54   if (launch) {
     55     CHECK(metro_viewer_process_host_->LaunchViewerAndWaitForConnection(
     56         command_line.GetSwitchValueNative(
     57             switches::kViewerLaunchViaAppId)));
     58   }
     59 
     60 }
     61 
     62 void BrowserProcessPlatformPart::Observe(
     63     int type,
     64     const content::NotificationSource& source,
     65     const content::NotificationDetails& details) {
     66 
     67   DCHECK(type == chrome::NOTIFICATION_APP_TERMINATING);
     68   PrefService* pref_service = g_browser_process->local_state();
     69   bool is_relaunch = pref_service->GetBoolean(prefs::kWasRestarted);
     70   if (is_relaunch) {
     71     upgrade_util::RelaunchMode mode =
     72         upgrade_util::RelaunchModeStringToEnum(
     73             pref_service->GetString(prefs::kRelaunchMode));
     74     if (metro_viewer_process_host_.get()) {
     75       if (mode == upgrade_util::RELAUNCH_MODE_DESKTOP) {
     76         // Metro -> Desktop
     77         chrome::ActivateDesktopHelper(chrome::ASH_TERMINATE);
     78       } else {
     79         // Metro -> Metro
     80         ChromeMetroViewerProcessHost::HandleMetroExit();
     81       }
     82     }
     83   }
     84 }
     85