| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/extension_prefs.h" | 5 #include "chrome/browser/extensions/extension_prefs.h" |
| 6 | 6 |
| 7 #include <iterator> | 7 #include <iterator> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/prefs/pref_notifier.h" | 10 #include "base/prefs/pref_notifier.h" |
| 11 #include "base/prefs/pref_service.h" | 11 #include "base/prefs/pref_service.h" |
| 12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
| 14 #include "base/value_conversions.h" | 14 #include "base/value_conversions.h" |
| 15 #include "chrome/browser/chrome_notification_types.h" | |
| 16 #include "chrome/browser/extensions/api/content_settings/content_settings_store.
h" | 15 #include "chrome/browser/extensions/api/content_settings/content_settings_store.
h" |
| 17 #include "chrome/browser/extensions/api/preference/preference_api.h" | 16 #include "chrome/browser/extensions/api/preference/preference_api.h" |
| 18 #include "chrome/browser/extensions/extension_pref_store.h" | 17 #include "chrome/browser/extensions/extension_pref_store.h" |
| 19 #include "chrome/browser/extensions/extension_prefs_factory.h" | 18 #include "chrome/browser/extensions/extension_prefs_factory.h" |
| 20 #include "chrome/browser/profiles/profile.h" | |
| 21 #include "chrome/browser/ui/host_desktop.h" | |
| 22 #include "chrome/common/chrome_switches.h" | |
| 23 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" | |
| 24 #include "chrome/common/pref_names.h" | 19 #include "chrome/common/pref_names.h" |
| 25 #include "chrome/common/url_constants.h" | |
| 26 #include "components/user_prefs/pref_registry_syncable.h" | 20 #include "components/user_prefs/pref_registry_syncable.h" |
| 27 #include "content/public/browser/notification_service.h" | |
| 28 #include "extensions/browser/admin_policy.h" | 21 #include "extensions/browser/admin_policy.h" |
| 29 #include "extensions/browser/app_sorting.h" | 22 #include "extensions/browser/app_sorting.h" |
| 30 #include "extensions/browser/event_router.h" | 23 #include "extensions/browser/event_router.h" |
| 31 #include "extensions/browser/pref_names.h" | 24 #include "extensions/browser/pref_names.h" |
| 32 #include "extensions/common/feature_switch.h" | 25 #include "extensions/common/feature_switch.h" |
| 33 #include "extensions/common/manifest.h" | 26 #include "extensions/common/manifest.h" |
| 34 #include "extensions/common/permissions/permission_set.h" | 27 #include "extensions/common/permissions/permission_set.h" |
| 35 #include "extensions/common/permissions/permissions_info.h" | 28 #include "extensions/common/permissions/permissions_info.h" |
| 36 #include "extensions/common/url_pattern.h" | 29 #include "extensions/common/url_pattern.h" |
| 37 #include "extensions/common/user_script.h" | 30 #include "extensions/common/user_script.h" |
| 38 #include "grit/generated_resources.h" | 31 #include "grit/generated_resources.h" |
| 39 #include "ui/base/l10n/l10n_util.h" | 32 #include "ui/base/l10n/l10n_util.h" |
| 40 | 33 |
| 41 #if defined(USE_ASH) | |
| 42 #include "ash/shell.h" | |
| 43 #endif | |
| 44 #if defined(OS_WIN) | |
| 45 #include "win8/util/win8_util.h" | |
| 46 #endif // OS_WIN | |
| 47 | |
| 48 using base::Value; | 34 using base::Value; |
| 49 using base::DictionaryValue; | 35 using base::DictionaryValue; |
| 50 using base::ListValue; | 36 using base::ListValue; |
| 51 | 37 |
| 52 namespace extensions { | 38 namespace extensions { |
| 53 | 39 |
| 54 namespace { | 40 namespace { |
| 55 | 41 |
| 56 // Additional preferences keys, which are not needed by external clients. | 42 // Additional preferences keys, which are not needed by external clients. |
| 57 | 43 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 const char kPrefIncognitoEnabled[] = "incognito"; | 121 const char kPrefIncognitoEnabled[] = "incognito"; |
| 136 | 122 |
| 137 // A preference to control whether an extension is allowed to inject script in | 123 // A preference to control whether an extension is allowed to inject script in |
| 138 // pages with file URLs. | 124 // pages with file URLs. |
| 139 const char kPrefAllowFileAccess[] = "newAllowFileAccess"; | 125 const char kPrefAllowFileAccess[] = "newAllowFileAccess"; |
| 140 // TODO(jstritar): As part of fixing http://crbug.com/91577, we revoked all | 126 // TODO(jstritar): As part of fixing http://crbug.com/91577, we revoked all |
| 141 // extension file access by renaming the pref. We should eventually clean up | 127 // extension file access by renaming the pref. We should eventually clean up |
| 142 // the old flag and possibly go back to that name. | 128 // the old flag and possibly go back to that name. |
| 143 // const char kPrefAllowFileAccessOld[] = "allowFileAccess"; | 129 // const char kPrefAllowFileAccessOld[] = "allowFileAccess"; |
| 144 | 130 |
| 145 // A preference set by the the NTP to persist the desired launch container type | |
| 146 // used for apps. | |
| 147 const char kPrefLaunchType[] = "launchType"; | |
| 148 | |
| 149 // A preference specifying if the user dragged the app on the NTP. | 131 // A preference specifying if the user dragged the app on the NTP. |
| 150 const char kPrefUserDraggedApp[] = "user_dragged_app_ntp"; | 132 const char kPrefUserDraggedApp[] = "user_dragged_app_ntp"; |
| 151 | 133 |
| 152 // Preferences that hold which permissions the user has granted the extension. | 134 // Preferences that hold which permissions the user has granted the extension. |
| 153 // We explicitly keep track of these so that extensions can contain unknown | 135 // We explicitly keep track of these so that extensions can contain unknown |
| 154 // permissions, for backwards compatibility reasons, and we can still prompt | 136 // permissions, for backwards compatibility reasons, and we can still prompt |
| 155 // the user to accept them once recognized. We store the active permission | 137 // the user to accept them once recognized. We store the active permission |
| 156 // permissions because they may differ from those defined in the manifest. | 138 // permissions because they may differ from those defined in the manifest. |
| 157 const char kPrefActivePermissions[] = "active_permissions"; | 139 const char kPrefActivePermissions[] = "active_permissions"; |
| 158 const char kPrefGrantedPermissions[] = "granted_permissions"; | 140 const char kPrefGrantedPermissions[] = "granted_permissions"; |
| (...skipping 907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1066 UpdateExtensionPref(extension_id, kPrefAllowFileAccess, | 1048 UpdateExtensionPref(extension_id, kPrefAllowFileAccess, |
| 1067 new base::FundamentalValue(allow)); | 1049 new base::FundamentalValue(allow)); |
| 1068 } | 1050 } |
| 1069 | 1051 |
| 1070 bool ExtensionPrefs::HasAllowFileAccessSetting( | 1052 bool ExtensionPrefs::HasAllowFileAccessSetting( |
| 1071 const std::string& extension_id) const { | 1053 const std::string& extension_id) const { |
| 1072 const DictionaryValue* ext = GetExtensionPref(extension_id); | 1054 const DictionaryValue* ext = GetExtensionPref(extension_id); |
| 1073 return ext && ext->HasKey(kPrefAllowFileAccess); | 1055 return ext && ext->HasKey(kPrefAllowFileAccess); |
| 1074 } | 1056 } |
| 1075 | 1057 |
| 1076 ExtensionPrefs::LaunchType ExtensionPrefs::GetLaunchType( | |
| 1077 const Extension* extension) { | |
| 1078 int value = -1; | |
| 1079 LaunchType result = LAUNCH_TYPE_DEFAULT; | |
| 1080 | |
| 1081 // Launch hosted apps as windows by default for streamlined hosted apps. | |
| 1082 if (CommandLine::ForCurrentProcess()-> | |
| 1083 HasSwitch(switches::kEnableStreamlinedHostedApps)) { | |
| 1084 result = LAUNCH_TYPE_WINDOW; | |
| 1085 } | |
| 1086 | |
| 1087 if (ReadPrefAsInteger(extension->id(), kPrefLaunchType, &value) && | |
| 1088 (value == LAUNCH_TYPE_PINNED || | |
| 1089 value == LAUNCH_TYPE_REGULAR || | |
| 1090 value == LAUNCH_TYPE_FULLSCREEN || | |
| 1091 value == LAUNCH_TYPE_WINDOW)) { | |
| 1092 result = static_cast<LaunchType>(value); | |
| 1093 } | |
| 1094 #if defined(OS_MACOSX) | |
| 1095 // App windows are not yet supported on mac. Pref sync could make | |
| 1096 // the launch type LAUNCH_TYPE_WINDOW, even if there is no UI to set it | |
| 1097 // on mac. | |
| 1098 if (!extension->is_platform_app() && result == LAUNCH_TYPE_WINDOW) | |
| 1099 result = LAUNCH_TYPE_REGULAR; | |
| 1100 #endif | |
| 1101 | |
| 1102 #if defined(OS_WIN) | |
| 1103 // We don't support app windows in Windows 8 single window Metro mode. | |
| 1104 if (win8::IsSingleWindowMetroMode() && result == LAUNCH_TYPE_WINDOW) | |
| 1105 result = LAUNCH_TYPE_REGULAR; | |
| 1106 #endif // OS_WIN | |
| 1107 | |
| 1108 return result; | |
| 1109 } | |
| 1110 | |
| 1111 LaunchContainer ExtensionPrefs::GetLaunchContainer(const Extension* extension) { | |
| 1112 LaunchContainer manifest_launch_container = | |
| 1113 AppLaunchInfo::GetLaunchContainer(extension); | |
| 1114 | |
| 1115 const LaunchContainer kInvalidLaunchContainer = | |
| 1116 static_cast<LaunchContainer>(-1); | |
| 1117 | |
| 1118 LaunchContainer result = kInvalidLaunchContainer; | |
| 1119 | |
| 1120 if (manifest_launch_container == LAUNCH_PANEL) { | |
| 1121 // Apps with app.launch.container = 'panel' should always respect the | |
| 1122 // manifest setting. | |
| 1123 result = manifest_launch_container; | |
| 1124 } else if (manifest_launch_container == LAUNCH_TAB) { | |
| 1125 // Look for prefs that indicate the user's choice of launch container. The | |
| 1126 // app's menu on the NTP provides a UI to set this preference. | |
| 1127 ExtensionPrefs::LaunchType prefs_launch_type = GetLaunchType(extension); | |
| 1128 | |
| 1129 if (prefs_launch_type == LAUNCH_TYPE_WINDOW) { | |
| 1130 // If the pref is set to launch a window (or no pref is set, and | |
| 1131 // window opening is the default), make the container a window. | |
| 1132 result = LAUNCH_WINDOW; | |
| 1133 #if defined(USE_ASH) | |
| 1134 } else if (prefs_launch_type == LAUNCH_TYPE_FULLSCREEN && | |
| 1135 chrome::GetActiveDesktop() == chrome::HOST_DESKTOP_TYPE_ASH) { | |
| 1136 // LAUNCH_TYPE_FULLSCREEN launches in a maximized app window in ash. | |
| 1137 // For desktop chrome AURA on all platforms we should open the | |
| 1138 // application in full screen mode in the current tab, on the same | |
| 1139 // lines as non AURA chrome. | |
| 1140 result = LAUNCH_WINDOW; | |
| 1141 #endif | |
| 1142 } else { | |
| 1143 // All other launch types (tab, pinned, fullscreen) are | |
| 1144 // implemented as tabs in a window. | |
| 1145 result = LAUNCH_TAB; | |
| 1146 } | |
| 1147 } else { | |
| 1148 // If a new value for app.launch.container is added, logic for it should be | |
| 1149 // added here. LAUNCH_WINDOW is not present because there is no way to set | |
| 1150 // it in a manifest. | |
| 1151 NOTREACHED() << manifest_launch_container; | |
| 1152 } | |
| 1153 | |
| 1154 // All paths should set |result|. | |
| 1155 if (result == kInvalidLaunchContainer) { | |
| 1156 DLOG(FATAL) << "Failed to set a launch container."; | |
| 1157 result = LAUNCH_TAB; | |
| 1158 } | |
| 1159 | |
| 1160 return result; | |
| 1161 } | |
| 1162 | |
| 1163 bool ExtensionPrefs::HasPreferredLaunchContainer(const Extension* extension) { | |
| 1164 int value = -1; | |
| 1165 LaunchContainer manifest_launch_container = | |
| 1166 AppLaunchInfo::GetLaunchContainer(extension); | |
| 1167 return manifest_launch_container == LAUNCH_TAB && | |
| 1168 ReadPrefAsInteger(extension->id(), kPrefLaunchType, &value); | |
| 1169 } | |
| 1170 | |
| 1171 void ExtensionPrefs::SetLaunchType(const std::string& extension_id, | |
| 1172 LaunchType launch_type) { | |
| 1173 UpdateExtensionPref(extension_id, kPrefLaunchType, | |
| 1174 new base::FundamentalValue(static_cast<int>(launch_type))); | |
| 1175 } | |
| 1176 | |
| 1177 bool ExtensionPrefs::DoesExtensionHaveState( | 1058 bool ExtensionPrefs::DoesExtensionHaveState( |
| 1178 const std::string& id, Extension::State check_state) const { | 1059 const std::string& id, Extension::State check_state) const { |
| 1179 const DictionaryValue* extension = GetExtensionPref(id); | 1060 const DictionaryValue* extension = GetExtensionPref(id); |
| 1180 int state = -1; | 1061 int state = -1; |
| 1181 if (!extension || !extension->GetInteger(kPrefState, &state)) | 1062 if (!extension || !extension->GetInteger(kPrefState, &state)) |
| 1182 return false; | 1063 return false; |
| 1183 | 1064 |
| 1184 if (state < 0 || state >= Extension::NUM_STATES) { | 1065 if (state < 0 || state >= Extension::NUM_STATES) { |
| 1185 LOG(ERROR) << "Bad pref 'state' for extension '" << id << "'"; | 1066 LOG(ERROR) << "Bad pref 'state' for extension '" << id << "'"; |
| 1186 return false; | 1067 return false; |
| (...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1996 is_enabled = initial_state == Extension::ENABLED; | 1877 is_enabled = initial_state == Extension::ENABLED; |
| 1997 } | 1878 } |
| 1998 | 1879 |
| 1999 extension_pref_value_map_->RegisterExtension(extension_id, install_time, | 1880 extension_pref_value_map_->RegisterExtension(extension_id, install_time, |
| 2000 is_enabled); | 1881 is_enabled); |
| 2001 content_settings_store_->RegisterExtension(extension_id, install_time, | 1882 content_settings_store_->RegisterExtension(extension_id, install_time, |
| 2002 is_enabled); | 1883 is_enabled); |
| 2003 } | 1884 } |
| 2004 | 1885 |
| 2005 } // namespace extensions | 1886 } // namespace extensions |
| OLD | NEW |