15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/chrome_frame_operations.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/channel_info.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/helper.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/master_preferences.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/master_preferences_constants.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/util_constants.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace installer {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeFrameOperations::ReadOptions(const MasterPreferences& prefs,
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        std::set<base::string16>* options)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(options);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const struct PrefToOption {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* pref_name;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const wchar_t* option_name;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } map[] = {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { master_preferences::kMultiInstall, kOptionMultiInstall }
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool pref_value;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (const PrefToOption* scan = &map[0], *end = &map[arraysize(map)];
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       scan != end; ++scan) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prefs.GetBool(scan->pref_name, &pref_value) && pref_value)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options->insert(scan->option_name);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeFrameOperations::ReadOptions(const CommandLine& uninstall_command,
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        std::set<base::string16>* options)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(options);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const struct FlagToOption {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* flag_name;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const wchar_t* option_name;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } map[] = {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { switches::kMultiInstall, kOptionMultiInstall }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (const FlagToOption* scan = &map[0], *end = &map[arraysize(map)];
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       scan != end; ++scan) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uninstall_command.HasSwitch(scan->flag_name))
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options->insert(scan->option_name);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeFrameOperations::AddKeyFiles(
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::set<base::string16>& options,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<base::FilePath>* key_files) const {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(key_files);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  key_files->push_back(base::FilePath(installer::kChromeFrameDll));
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  key_files->push_back(base::FilePath(installer::kChromeFrameHelperExe));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeFrameOperations::AddComDllList(
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::set<base::string16>& options,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<base::FilePath>* com_dll_list) const {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(com_dll_list);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  com_dll_list->push_back(base::FilePath(installer::kChromeFrameDll));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeFrameOperations::AppendProductFlags(
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::set<base::string16>& options,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CommandLine* cmd_line) const {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(cmd_line);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_multi_install = options.find(kOptionMultiInstall) != options.end();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add --multi-install if it isn't already there.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_multi_install && !cmd_line->HasSwitch(switches::kMultiInstall))
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd_line->AppendSwitch(switches::kMultiInstall);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // --chrome-frame is always needed.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd_line->AppendSwitch(switches::kChromeFrame);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChromeFrameOperations::AppendRenameFlags(
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::set<base::string16>& options,
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CommandLine* cmd_line) const {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(cmd_line);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_multi_install = options.find(kOptionMultiInstall) != options.end();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add --multi-install if it isn't already there.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_multi_install && !cmd_line->HasSwitch(switches::kMultiInstall))
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd_line->AppendSwitch(switches::kMultiInstall);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // --chrome-frame is needed for single installs.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_multi_install)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd_line->AppendSwitch(switches::kChromeFrame);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ChromeFrameOperations::SetChannelFlags(
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::set<base::string16>& options,
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool set,
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ChannelInfo* channel_info) const {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(channel_info);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool modified = channel_info->SetChromeFrame(set);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Unconditionally remove the legacy -readymode flag.
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  modified |= channel_info->SetReadyMode(false);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return modified;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeFrameOperations::ShouldCreateUninstallEntry(
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::set<base::string16>& options) const {
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeFrameOperations::AddDefaultShortcutProperties(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserDistribution* dist,
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& target_exe,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShellUtil::ShortcutProperties* properties) const {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED() << "Chrome Frame does not create shortcuts.";
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeFrameOperations::LaunchUserExperiment(
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& setup_path,
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::set<base::string16>& options,
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InstallStatus status,
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool system_level) const {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No experiments yet.  If adding some in the future, need to have
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ChromeFrameDistribution::HasUserExperiments() return true.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace installer
142