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