Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4393)

Unified Diff: chrome/common/extensions/permissions/chrome_permission_message_rules.cc

Issue 1321333003: Reorder permission message rules, so that related rules appear together (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@optional_rules
Patch Set: fix test Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/common/extensions/permissions/chrome_permission_message_rules.cc
diff --git a/chrome/common/extensions/permissions/chrome_permission_message_rules.cc b/chrome/common/extensions/permissions/chrome_permission_message_rules.cc
index 3ccd4707c5beacb504ad394a196a28192070a332..61a0e56a78b49730455cef02ffb92cc98ff57669 100644
--- a/chrome/common/extensions/permissions/chrome_permission_message_rules.cc
+++ b/chrome/common/extensions/permissions/chrome_permission_message_rules.cc
@@ -384,38 +384,42 @@ ChromePermissionMessageRule::GetAllRules() {
// enough that rules like this should not occur; the visibility of the rules
// system should allow us to design a system that is simple enough to explain
// yet powerful enough to encapsulate all the messages we want to display.
- //
- // TODO(sashab): Once existing message sites are deprecated, reorder this list
- // to better describe the rules generated, rather than the callsites they are
- // migrated from.
ChromePermissionMessageRule rules_arr[] = {
- // Full url access permission messages.
+ // Full access permission messages.
{IDS_EXTENSION_PROMPT_WARNING_DEBUGGER, {APIPermission::kDebugger}, {}},
{IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS,
{APIPermission::kPlugin},
+ // TODO(treib): Add the other IDs implied by kFullAccess/kHostsAll.
{APIPermission::kFullAccess, APIPermission::kHostsAll,
APIPermission::kHostsAllReadOnly, APIPermission::kDeclarativeWebRequest,
APIPermission::kTopSites, APIPermission::kTab}},
{IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS,
{APIPermission::kFullAccess},
+ // TODO(treib): Add the other IDs implied by kHostsAll.
{APIPermission::kHostsAll, APIPermission::kHostsAllReadOnly,
APIPermission::kDeclarativeWebRequest, APIPermission::kTopSites,
APIPermission::kTab}},
- // Parameterized permission messages:
- // Messages generated by the sockets permission.
- {new SpaceSeparatedListFormatter(
- IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN,
- IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS),
- {APIPermission::kSocketDomainHosts},
- {}},
- {new SpaceSeparatedListFormatter(
- IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST,
- IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS),
- {APIPermission::kSocketSpecificHosts},
- {}},
+ // Hosts permission messages.
+ // Full host access already allows DeclarativeWebRequest, reading the list
+ // of most frequently visited sites, and tab access.
+ // The warning message for declarativeWebRequest permissions speaks about
+ // blocking parts of pages, which is a subset of what the "<all_urls>"
+ // access allows. Therefore we display only the "<all_urls>" warning
+ // message if both permissions are required.
+ {IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS,
+ {APIPermission::kHostsAll},
+ // TODO(treib): Add kHostReadWrite and kHostReadOnly.
+ {APIPermission::kDeclarativeWebRequest, APIPermission::kFavicon,
+ APIPermission::kHostsAllReadOnly, APIPermission::kProcesses,
+ APIPermission::kTab, APIPermission::kTopSites,
+ APIPermission::kWebNavigation}},
+ {IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS_READ_ONLY,
+ {APIPermission::kHostsAllReadOnly},
+ // TODO(treib): Add kHostReadOnly.
+ {APIPermission::kFavicon, APIPermission::kProcesses, APIPermission::kTab,
+ APIPermission::kTopSites, APIPermission::kWebNavigation}},
- // Messages generated by host permissions.
{new CommaSeparatedListFormatter(
IDS_EXTENSION_PROMPT_WARNING_1_HOST_READ_ONLY,
IDS_EXTENSION_PROMPT_WARNING_2_HOSTS_READ_ONLY,
@@ -430,6 +434,55 @@ ChromePermissionMessageRule::GetAllRules() {
{APIPermission::kHostReadWrite},
{}},
+ // History-related permission messages.
+ // History already allows reading favicons, tab access and accessing the
+ // list of most frequently visited sites.
+ {IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE_AND_SESSIONS,
+ {APIPermission::kSessions, APIPermission::kHistory},
+ {APIPermission::kFavicon, APIPermission::kProcesses, APIPermission::kTab,
+ APIPermission::kTopSites, APIPermission::kWebNavigation}},
+ {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ_AND_SESSIONS,
+ {APIPermission::kSessions, APIPermission::kTab},
+ {APIPermission::kFavicon, APIPermission::kProcesses,
+ APIPermission::kTopSites, APIPermission::kWebNavigation}},
+ {IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE,
+ {APIPermission::kHistory},
+ {APIPermission::kFavicon, APIPermission::kProcesses, APIPermission::kTab,
+ APIPermission::kTopSites, APIPermission::kWebNavigation}},
+ {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ,
+ {APIPermission::kTab},
+ {APIPermission::kFavicon, APIPermission::kProcesses,
+ APIPermission::kTopSites, APIPermission::kWebNavigation}},
+ // TODO(treib): Should we have _AND_SESSIONS versions of these 2 as well?
Devlin 2015/09/01 15:55:24 I looked a bit more into it, and I think I underst
Marc Treib 2015/09/01 15:59:50 Ah, good to know! Thanks for investigating! I alre
+ {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ,
+ {APIPermission::kProcesses},
+ {}},
+ {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ,
+ {APIPermission::kWebNavigation},
+ {}},
+ {IDS_EXTENSION_PROMPT_WARNING_FAVICON, {APIPermission::kFavicon}, {}},
+ {IDS_EXTENSION_PROMPT_WARNING_TOPSITES, {APIPermission::kTopSites}, {}},
+ {IDS_EXTENSION_PROMPT_WARNING_DECLARATIVE_WEB_REQUEST,
+ {APIPermission::kDeclarativeWebRequest},
+ {}},
+
+ // Messages generated by the sockets permission.
+ {IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST,
+ {APIPermission::kSocketAnyHost},
+ // TODO(treib): Add kSocketDomainHosts and kSocketSpecificHosts.
+ {}},
+ {new SpaceSeparatedListFormatter(
+ IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAIN,
+ IDS_EXTENSION_PROMPT_WARNING_SOCKET_HOSTS_IN_DOMAINS),
+ {APIPermission::kSocketDomainHosts},
+ {}},
+ {new SpaceSeparatedListFormatter(
+ IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOST,
+ IDS_EXTENSION_PROMPT_WARNING_SOCKET_SPECIFIC_HOSTS),
+ {APIPermission::kSocketSpecificHosts},
+ {}},
+
+ // Devices-related messages.
// USB Device Permission rules. Think of these three rules as a single one
// that applies when any of the three kUsb* IDs is there, and pulls them
// all into a single formatter.
@@ -441,20 +494,37 @@ ChromePermissionMessageRule::GetAllRules() {
{APIPermission::kUsbDeviceUnknownProduct},
{APIPermission::kUsbDeviceUnknownVendor}},
{new USBDevicesFormatter, {APIPermission::kUsbDeviceUnknownVendor}, {}},
-
- // Coalesced message rules taken from
- // ChromePermissionMessageProvider::GetWarningMessages():
-
// Access to users' devices should provide a single warning message
// specifying the transport method used; serial and/or Bluetooth.
{IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_SERIAL,
{APIPermission::kBluetooth, APIPermission::kSerial},
{APIPermission::kBluetoothDevices}},
+ {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH,
+ {APIPermission::kBluetooth},
+ {APIPermission::kBluetoothDevices}},
+ {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_DEVICES,
+ {APIPermission::kBluetoothDevices},
+ {}},
+ {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_PRIVATE,
+ {APIPermission::kBluetoothPrivate},
+ {}},
+ {IDS_EXTENSION_PROMPT_WARNING_SERIAL, {APIPermission::kSerial}, {}},
+ // Universal 2nd Factor devices.
+ {IDS_EXTENSION_PROMPT_WARNING_U2F_DEVICES,
+ {APIPermission::kU2fDevices},
+ {}},
+ // Accessibility features.
{IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_READ_MODIFY,
{APIPermission::kAccessibilityFeaturesModify,
APIPermission::kAccessibilityFeaturesRead},
{}},
+ {IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_MODIFY,
+ {APIPermission::kAccessibilityFeaturesModify},
+ {}},
+ {IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_READ,
+ {APIPermission::kAccessibilityFeaturesRead},
+ {}},
// TODO(sashab): Add the missing combinations of media galleries
// permissions so a valid permission is generated for all combinations.
@@ -475,63 +545,59 @@ ChromePermissionMessageRule::GetAllRules() {
{APIPermission::kMediaGalleriesAllGalleriesRead},
{}},
- {IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE_AND_SESSIONS,
- {APIPermission::kSessions, APIPermission::kHistory},
- {APIPermission::kFavicon, APIPermission::kProcesses, APIPermission::kTab,
- APIPermission::kTopSites, APIPermission::kWebNavigation}},
- {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ_AND_SESSIONS,
- {APIPermission::kSessions, APIPermission::kTab},
- {APIPermission::kFavicon, APIPermission::kProcesses,
- APIPermission::kTopSites, APIPermission::kWebNavigation}},
-
- // Suppression list taken from
- // ChromePermissionMessageProvider::GetPermissionMessages():
- // Some warnings are more generic and/or powerful and supercede other
- // warnings. In that case, the first message suppresses the second one.
- {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH,
- {APIPermission::kBluetooth},
- {APIPermission::kBluetoothDevices}},
- {IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS,
- {APIPermission::kBookmark},
- {APIPermission::kOverrideBookmarksUI}},
- // History already allows reading favicons, tab access and accessing the
- // list of most frequently visited sites.
- {IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE,
- {APIPermission::kHistory},
- {APIPermission::kFavicon, APIPermission::kProcesses, APIPermission::kTab,
- APIPermission::kTopSites, APIPermission::kWebNavigation}},
+ // The permission string for "fileSystem" is only shown when
+ // "write" or "directory" is present. Read-only access is only
+ // granted after the user has been shown a file or directory
+ // chooser dialog and selected a file or directory. Selecting
+ // the file or directory is considered consent to read it.
{IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_WRITE_DIRECTORY,
{APIPermission::kFileSystemWrite, APIPermission::kFileSystemDirectory},
{}},
- // Full access already allows DeclarativeWebRequest, reading the list of
- // most frequently visited sites, and tab access.
- // The warning message for declarativeWebRequest
- // permissions speaks about blocking parts of pages, which is a
- // subset of what the "<all_urls>" access allows. Therefore we
- // display only the "<all_urls>" warning message if both permissions
- // are required.
- {IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS,
- {APIPermission::kHostsAll},
- {APIPermission::kDeclarativeWebRequest, APIPermission::kFavicon,
- APIPermission::kHostsAllReadOnly, APIPermission::kProcesses,
- APIPermission::kTab, APIPermission::kTopSites,
- APIPermission::kWebNavigation}},
- // AutomationManifestPermission:
- {IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS_READ_ONLY,
- {APIPermission::kHostsAllReadOnly},
- {APIPermission::kFavicon, APIPermission::kProcesses, APIPermission::kTab,
- APIPermission::kTopSites, APIPermission::kWebNavigation}},
- // Tabs already allows reading favicons and reading the list of most
- // frequently visited sites.
- {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ,
- {APIPermission::kTab},
- {APIPermission::kFavicon, APIPermission::kProcesses,
- APIPermission::kTopSites, APIPermission::kWebNavigation}},
+ {IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_DIRECTORY,
+ {APIPermission::kFileSystemDirectory},
+ {}},
- // Individual message rules taken from
- // ChromeAPIPermissions::GetAllPermissions():
- // Permission messages for all extension types:
+ // Video and audio capture.
+ {IDS_EXTENSION_PROMPT_WARNING_AUDIO_AND_VIDEO_CAPTURE,
+ {APIPermission::kAudioCapture, APIPermission::kVideoCapture},
+ {}},
+ {IDS_EXTENSION_PROMPT_WARNING_AUDIO_CAPTURE,
+ {APIPermission::kAudioCapture},
+ {}},
+ {IDS_EXTENSION_PROMPT_WARNING_VIDEO_CAPTURE,
+ {APIPermission::kVideoCapture},
+ {}},
+
+ // Network-related permissions.
+ {IDS_EXTENSION_PROMPT_WARNING_NETWORKING_PRIVATE,
+ {APIPermission::kNetworkingPrivate},
+ {}},
+ {IDS_EXTENSION_PROMPT_WARNING_NETWORKING_CONFIG,
+ {APIPermission::kNetworkingConfig},
+ {}},
+ {IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE,
+ {APIPermission::kNetworkState},
+ {}},
+ {IDS_EXTENSION_PROMPT_WARNING_VPN, {APIPermission::kVpnProvider}, {}},
+ {IDS_EXTENSION_PROMPT_WARNING_WEB_CONNECTABLE,
+ {APIPermission::kWebConnectable},
+ {}},
+ {new SingleParameterFormatter(
+ IDS_EXTENSION_PROMPT_WARNING_HOME_PAGE_SETTING_OVERRIDE),
+ {APIPermission::kHomepage},
+ {}},
+ {new SingleParameterFormatter(
+ IDS_EXTENSION_PROMPT_WARNING_SEARCH_SETTINGS_OVERRIDE),
+ {APIPermission::kSearchProvider},
+ {}},
+ {new SingleParameterFormatter(
+ IDS_EXTENSION_PROMPT_WARNING_START_PAGE_SETTING_OVERRIDE),
+ {APIPermission::kStartupPages},
+ {}},
+ {IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS,
+ {APIPermission::kBookmark},
+ {APIPermission::kOverrideBookmarksUI}},
{IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD,
{APIPermission::kClipboardRead},
{}},
@@ -548,14 +614,10 @@ ChromePermissionMessageRule::GetAllRules() {
{IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION,
{APIPermission::kGeolocation},
{}},
-
- // Permission messages for extensions:
- {IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_MODIFY,
- {APIPermission::kAccessibilityFeaturesModify},
- {}},
- {IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_READ,
- {APIPermission::kAccessibilityFeaturesRead},
+ {IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION,
+ {APIPermission::kLocation},
{}},
+
{IDS_EXTENSION_PROMPT_WARNING_CONTENT_SETTINGS,
{APIPermission::kContentSettings},
{}},
@@ -565,10 +627,10 @@ ChromePermissionMessageRule::GetAllRules() {
{IDS_EXTENSION_PROMPT_WARNING_DOCUMENT_SCAN,
{APIPermission::kDocumentScan},
{}},
+ {IDS_EXTENSION_PROMPT_WARNING_INTERCEPT_ALL_KEYS,
+ {APIPermission::kInterceptAllKeys},
+ {}}, // TODO(treib): This should probably suppress kInput.
{IDS_EXTENSION_PROMPT_WARNING_INPUT, {APIPermission::kInput}, {}},
- {IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION,
- {APIPermission::kLocation},
- {}},
{IDS_EXTENSION_PROMPT_WARNING_MANAGEMENT,
{APIPermission::kManagement},
{}},
@@ -577,28 +639,20 @@ ChromePermissionMessageRule::GetAllRules() {
{APIPermission::kNativeMessaging},
{}},
{IDS_EXTENSION_PROMPT_WARNING_PRIVACY, {APIPermission::kPrivacy}, {}},
- {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ,
- {APIPermission::kProcesses},
- {}},
{IDS_EXTENSION_PROMPT_WARNING_SIGNED_IN_DEVICES,
{APIPermission::kSignedInDevices},
{}},
{IDS_EXTENSION_PROMPT_WARNING_SYNCFILESYSTEM,
{APIPermission::kSyncFileSystem},
{}},
- {IDS_EXTENSION_PROMPT_WARNING_TOPSITES, {APIPermission::kTopSites}, {}},
{IDS_EXTENSION_PROMPT_WARNING_TTS_ENGINE,
{APIPermission::kTtsEngine},
{}},
{IDS_EXTENSION_PROMPT_WARNING_WALLPAPER, {APIPermission::kWallpaper}, {}},
- {IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ,
- {APIPermission::kWebNavigation},
- {}},
{IDS_EXTENSION_PROMPT_WARNING_PLATFORMKEYS,
{APIPermission::kPlatformKeys},
{}},
- // Permission messages for private permissions:
{IDS_EXTENSION_PROMPT_WARNING_SCREENLOCK_PRIVATE,
{APIPermission::kScreenlockPrivate},
{}},
@@ -608,9 +662,6 @@ ChromePermissionMessageRule::GetAllRules() {
{IDS_EXTENSION_PROMPT_WARNING_EXPERIENCE_SAMPLING_PRIVATE,
{APIPermission::kExperienceSamplingPrivate},
{}},
- {IDS_EXTENSION_PROMPT_WARNING_NETWORKING_PRIVATE,
- {APIPermission::kNetworkingPrivate},
- {}},
{IDS_EXTENSION_PROMPT_WARNING_MUSIC_MANAGER_PRIVATE,
{APIPermission::kMusicManagerPrivate},
{}},
@@ -629,95 +680,6 @@ ChromePermissionMessageRule::GetAllRules() {
{IDS_EXTENSION_PROMPT_WARNING_USERS_PRIVATE,
{APIPermission::kUsersPrivate},
{}},
-
- // Platform-app permission messages.
-
- // The permission string for "fileSystem" is only shown when
- // "write" or "directory" is present. Read-only access is only
- // granted after the user has been shown a file or directory
- // chooser dialog and selected a file or directory. Selecting
- // the file or directory is considered consent to read it.
- {IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_DIRECTORY,
- {APIPermission::kFileSystemDirectory},
- {}},
-
- // Because warning messages for the "mediaGalleries" permission
- // vary based on the permissions parameters, no message ID or
- // message text is specified here. The message ID and text used
- // will be determined at run-time in the
- // |MediaGalleriesPermission| class.
-
- {IDS_EXTENSION_PROMPT_WARNING_INTERCEPT_ALL_KEYS,
- {APIPermission::kInterceptAllKeys},
- {}},
-
- {IDS_EXTENSION_PROMPT_WARNING_AUDIO_AND_VIDEO_CAPTURE,
- {APIPermission::kAudioCapture, APIPermission::kVideoCapture},
- {}},
-
- // Individual message rules taken from
- // ExtensionsAPIPermissions::GetAllPermissions():
- {IDS_EXTENSION_PROMPT_WARNING_AUDIO_CAPTURE,
- {APIPermission::kAudioCapture},
- {}},
- {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_PRIVATE,
- {APIPermission::kBluetoothPrivate},
- {}},
- {IDS_EXTENSION_PROMPT_WARNING_DECLARATIVE_WEB_REQUEST,
- {APIPermission::kDeclarativeWebRequest},
- {}},
- {IDS_EXTENSION_PROMPT_WARNING_SERIAL, {APIPermission::kSerial}, {}},
- {IDS_EXTENSION_PROMPT_WARNING_NETWORKING_CONFIG,
- {APIPermission::kNetworkingConfig},
- {}},
-
- // Because warning messages for the "socket" permission vary based
- // on the permissions parameters, no message ID or message text is
- // specified here. The message ID and text used will be
- // determined at run-time in the |SocketPermission| class.
- {IDS_EXTENSION_PROMPT_WARNING_U2F_DEVICES,
- {APIPermission::kU2fDevices},
- {}},
- {IDS_EXTENSION_PROMPT_WARNING_VIDEO_CAPTURE,
- {APIPermission::kVideoCapture},
- {}},
- {IDS_EXTENSION_PROMPT_WARNING_VPN, {APIPermission::kVpnProvider}, {}},
- {IDS_EXTENSION_PROMPT_WARNING_WEB_CONNECTABLE,
- {APIPermission::kWebConnectable},
- {}},
-
- // Rules from ManifestPermissions:
- // BluetoothManifestPermission:
- {IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_DEVICES,
- {APIPermission::kBluetoothDevices},
- {}},
-
- // SocketsManifestPermission:
- {IDS_EXTENSION_PROMPT_WARNING_SOCKET_ANY_HOST,
- {APIPermission::kSocketAnyHost},
- {}},
- {IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE,
- {APIPermission::kNetworkState},
- {}},
-
- // API permission rules:
- // SettingsOverrideAPIPermission:
- {new SingleParameterFormatter(
- IDS_EXTENSION_PROMPT_WARNING_HOME_PAGE_SETTING_OVERRIDE),
- {APIPermission::kHomepage},
- {}},
- {new SingleParameterFormatter(
- IDS_EXTENSION_PROMPT_WARNING_SEARCH_SETTINGS_OVERRIDE),
- {APIPermission::kSearchProvider},
- {}},
- {new SingleParameterFormatter(
- IDS_EXTENSION_PROMPT_WARNING_START_PAGE_SETTING_OVERRIDE),
- {APIPermission::kStartupPages},
- {}},
-
- // Other rules:
- // From ChromeExtensionsClient::FilterHostPermissions():
- {IDS_EXTENSION_PROMPT_WARNING_FAVICON, {APIPermission::kFavicon}, {}},
};
return std::vector<ChromePermissionMessageRule>(

Powered by Google App Engine
This is Rietveld 408576698