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.
5 #include "chrome/common/extensions/permissions/chrome_api_permissions.h"
7 #include "extensions/common/permissions/api_permission.h"
8 #include "extensions/common/permissions/api_permission_set.h"
9 #include "extensions/common/permissions/media_galleries_permission.h"
10 #include "extensions/common/permissions/permission_message.h"
11 #include "extensions/common/permissions/permissions_info.h"
12 #include "extensions/common/permissions/socket_permission.h"
13 #include "extensions/common/permissions/usb_device_permission.h"
14 #include "grit/generated_resources.h"
16 namespace extensions {
20 const char kOldAlwaysOnTopWindowsPermission[] = "alwaysOnTopWindows";
21 const char kOldFullscreenPermission[] = "fullscreen";
22 const char kOldOverrideEscFullscreenPermission[] = "overrideEscFullscreen";
23 const char kOldUnlimitedStoragePermission[] = "unlimited_storage";
24 const char kWindowsPermission[] = "windows";
26 template<typename T> APIPermission* CreateAPIPermission(
27 const APIPermissionInfo* permission) {
28 return new T(permission);
33 std::vector<APIPermissionInfo*> ChromeAPIPermissions::GetAllPermissions()
35 struct PermissionRegistration {
40 PermissionMessage::ID message_id;
41 APIPermissionInfo::APIPermissionConstructor constructor;
42 } PermissionsToRegister[] = {
43 // Register permissions for all extension types.
44 {APIPermission::kBackground, "background"},
45 {APIPermission::kClipboardRead, "clipboardRead",
46 APIPermissionInfo::kFlagNone, IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD,
47 PermissionMessage::kClipboard},
48 {APIPermission::kClipboardWrite, "clipboardWrite"},
49 {APIPermission::kDeclarativeContent, "declarativeContent"},
50 {APIPermission::kDeclarativeWebRequest, "declarativeWebRequest",
51 APIPermissionInfo::kFlagNone,
52 IDS_EXTENSION_PROMPT_WARNING_DECLARATIVE_WEB_REQUEST,
53 PermissionMessage::kDeclarativeWebRequest},
54 {APIPermission::kDesktopCapture, "desktopCapture",
55 APIPermissionInfo::kFlagNone,
56 IDS_EXTENSION_PROMPT_WARNING_DESKTOP_CAPTURE,
57 PermissionMessage::kDesktopCapture},
58 {APIPermission::kDns, "dns"},
59 {APIPermission::kDownloads, "downloads", APIPermissionInfo::kFlagNone,
60 IDS_EXTENSION_PROMPT_WARNING_DOWNLOADS, PermissionMessage::kDownloads},
61 {APIPermission::kDownloadsOpen, "downloads.open",
62 APIPermissionInfo::kFlagNone,
63 IDS_EXTENSION_PROMPT_WARNING_DOWNLOADS_OPEN,
64 PermissionMessage::kDownloadsOpen},
65 {APIPermission::kDownloadsShelf, "downloads.shelf"},
66 {APIPermission::kIdentity, "identity"},
67 {APIPermission::kExperimental, "experimental",
68 APIPermissionInfo::kFlagCannotBeOptional},
69 // NOTE(kalman): this is provided by a manifest property but needs to
70 // appear in the install permission dialogue, so we need a fake
71 // permission for it. See http://crbug.com/247857.
72 {APIPermission::kWebConnectable, "webConnectable",
73 APIPermissionInfo::kFlagCannotBeOptional |
74 APIPermissionInfo::kFlagInternal,
75 IDS_EXTENSION_PROMPT_WARNING_WEB_CONNECTABLE,
76 PermissionMessage::kWebConnectable},
77 {APIPermission::kGeolocation, "geolocation",
78 APIPermissionInfo::kFlagCannotBeOptional,
79 IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION,
80 PermissionMessage::kGeolocation},
81 {APIPermission::kNotification, "notifications"},
82 {APIPermission::kUnlimitedStorage, "unlimitedStorage",
83 APIPermissionInfo::kFlagCannotBeOptional},
84 {APIPermission::kGcm, "gcm"},
86 // Register extension permissions.
87 {APIPermission::kAccessibilityFeaturesModify,
88 "accessibilityFeatures.modify", APIPermissionInfo::kFlagNone,
89 IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_MODIFY,
90 PermissionMessage::kAccessibilityFeaturesModify},
91 {APIPermission::kAccessibilityFeaturesRead,
92 "accessibilityFeatures.read", APIPermissionInfo::kFlagNone,
93 IDS_EXTENSION_PROMPT_WARNING_ACCESSIBILITY_FEATURES_READ,
94 PermissionMessage::kAccessibilityFeaturesRead},
95 {APIPermission::kActiveTab, "activeTab"},
96 {APIPermission::kAdView, "adview"},
97 {APIPermission::kAlarms, "alarms"},
98 {APIPermission::kAutomation, "automation",
99 APIPermissionInfo::kFlagCannotBeOptional,
100 IDS_EXTENSION_PROMPT_WARNING_AUTOMATION,
101 PermissionMessage::kAutomation},
102 {APIPermission::kBookmark, "bookmarks", APIPermissionInfo::kFlagNone,
103 IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS, PermissionMessage::kBookmarks},
104 {APIPermission::kBrailleDisplayPrivate, "brailleDisplayPrivate",
105 APIPermissionInfo::kFlagCannotBeOptional},
106 {APIPermission::kBrowsingData, "browsingData"},
107 {APIPermission::kContentSettings, "contentSettings",
108 APIPermissionInfo::kFlagNone,
109 IDS_EXTENSION_PROMPT_WARNING_CONTENT_SETTINGS,
110 PermissionMessage::kContentSettings},
111 {APIPermission::kContextMenus, "contextMenus"},
112 {APIPermission::kCookie, "cookies"},
113 {APIPermission::kFileBrowserHandler, "fileBrowserHandler",
114 APIPermissionInfo::kFlagCannotBeOptional},
115 {APIPermission::kFontSettings, "fontSettings",
116 APIPermissionInfo::kFlagCannotBeOptional},
117 {APIPermission::kHistory, "history", APIPermissionInfo::kFlagNone,
118 IDS_EXTENSION_PROMPT_WARNING_BROWSING_HISTORY,
119 PermissionMessage::kBrowsingHistory},
120 {APIPermission::kIdltest, "idltest"},
121 {APIPermission::kIdle, "idle"},
122 {APIPermission::kInfobars, "infobars"},
123 {APIPermission::kInput, "input", APIPermissionInfo::kFlagNone,
124 IDS_EXTENSION_PROMPT_WARNING_INPUT, PermissionMessage::kInput},
125 {APIPermission::kLocation, "location",
126 APIPermissionInfo::kFlagCannotBeOptional,
127 IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION,
128 PermissionMessage::kGeolocation},
129 {APIPermission::kManagement, "management", APIPermissionInfo::kFlagNone,
130 IDS_EXTENSION_PROMPT_WARNING_MANAGEMENT,
131 PermissionMessage::kManagement},
132 {APIPermission::kNativeMessaging, "nativeMessaging",
133 APIPermissionInfo::kFlagNone,
134 IDS_EXTENSION_PROMPT_WARNING_NATIVE_MESSAGING,
135 PermissionMessage::kNativeMessaging},
136 {APIPermission::kPower, "power", },
137 {APIPermission::kPrivacy, "privacy", APIPermissionInfo::kFlagNone,
138 IDS_EXTENSION_PROMPT_WARNING_PRIVACY, PermissionMessage::kPrivacy},
139 {APIPermission::kProcesses, "processes", APIPermissionInfo::kFlagNone,
140 IDS_EXTENSION_PROMPT_WARNING_TABS, PermissionMessage::kTabs},
141 {APIPermission::kSessions, "sessions"},
142 {APIPermission::kSignedInDevices, "signedInDevices",
143 APIPermissionInfo::kFlagNone,
144 IDS_EXTENSION_PROMPT_WARNING_SIGNED_IN_DEVICES,
145 PermissionMessage::kSignedInDevices},
146 {APIPermission::kStorage, "storage"},
147 {APIPermission::kSyncFileSystem, "syncFileSystem",
148 APIPermissionInfo::kFlagNone,
149 IDS_EXTENSION_PROMPT_WARNING_SYNCFILESYSTEM,
150 PermissionMessage::kSyncFileSystem},
151 {APIPermission::kTab, "tabs", APIPermissionInfo::kFlagNone,
152 IDS_EXTENSION_PROMPT_WARNING_TABS, PermissionMessage::kTabs},
153 {APIPermission::kTopSites, "topSites", APIPermissionInfo::kFlagNone,
154 IDS_EXTENSION_PROMPT_WARNING_BROWSING_HISTORY,
155 PermissionMessage::kBrowsingHistory},
156 {APIPermission::kTts, "tts", 0,
157 APIPermissionInfo::kFlagCannotBeOptional},
158 {APIPermission::kTtsEngine, "ttsEngine",
159 APIPermissionInfo::kFlagCannotBeOptional,
160 IDS_EXTENSION_PROMPT_WARNING_TTS_ENGINE,
161 PermissionMessage::kTtsEngine},
162 {APIPermission::kWallpaper, "wallpaper",
163 APIPermissionInfo::kFlagCannotBeOptional,
164 IDS_EXTENSION_PROMPT_WARNING_WALLPAPER, PermissionMessage::kWallpaper},
165 {APIPermission::kWebNavigation, "webNavigation",
166 APIPermissionInfo::kFlagNone, IDS_EXTENSION_PROMPT_WARNING_TABS,
167 PermissionMessage::kTabs},
168 {APIPermission::kWebRequest, "webRequest"},
169 {APIPermission::kWebRequestBlocking, "webRequestBlocking"},
170 {APIPermission::kWebView, "webview",
171 APIPermissionInfo::kFlagCannotBeOptional},
173 // Register private permissions.
174 {APIPermission::kScreenlockPrivate, "screenlockPrivate",
175 APIPermissionInfo::kFlagCannotBeOptional,
176 IDS_EXTENSION_PROMPT_WARNING_SCREENLOCK_PRIVATE,
177 PermissionMessage::kScreenlockPrivate},
178 {APIPermission::kActivityLogPrivate, "activityLogPrivate",
179 APIPermissionInfo::kFlagCannotBeOptional,
180 IDS_EXTENSION_PROMPT_WARNING_ACTIVITY_LOG_PRIVATE,
181 PermissionMessage::kActivityLogPrivate},
182 {APIPermission::kAutoTestPrivate, "autotestPrivate",
183 APIPermissionInfo::kFlagCannotBeOptional},
184 {APIPermission::kBookmarkManagerPrivate, "bookmarkManagerPrivate",
185 APIPermissionInfo::kFlagCannotBeOptional},
186 {APIPermission::kCast, "cast",
187 APIPermissionInfo::kFlagCannotBeOptional},
188 {APIPermission::kChromeosInfoPrivate, "chromeosInfoPrivate",
189 APIPermissionInfo::kFlagCannotBeOptional},
190 {APIPermission::kCommandLinePrivate, "commandLinePrivate",
191 APIPermissionInfo::kFlagCannotBeOptional},
192 {APIPermission::kDeveloperPrivate, "developerPrivate",
193 APIPermissionInfo::kFlagCannotBeOptional},
194 {APIPermission::kDiagnostics, "diagnostics",
195 APIPermissionInfo::kFlagCannotBeOptional},
196 {APIPermission::kDial, "dial",
197 APIPermissionInfo::kFlagCannotBeOptional},
198 {APIPermission::kDownloadsInternal, "downloadsInternal"},
199 {APIPermission::kFileBrowserHandlerInternal,
200 "fileBrowserHandlerInternal",
201 APIPermissionInfo::kFlagCannotBeOptional},
202 {APIPermission::kFileBrowserPrivate, "fileBrowserPrivate",
203 APIPermissionInfo::kFlagCannotBeOptional},
204 {APIPermission::kHotwordPrivate, "hotwordPrivate",
205 APIPermissionInfo::kFlagCannotBeOptional},
206 {APIPermission::kIdentityPrivate, "identityPrivate",
207 APIPermissionInfo::kFlagCannotBeOptional},
208 {APIPermission::kLogPrivate, "logPrivate"},
209 {APIPermission::kNetworkingPrivate, "networkingPrivate",
210 APIPermissionInfo::kFlagCannotBeOptional,
211 IDS_EXTENSION_PROMPT_WARNING_NETWORKING_PRIVATE,
212 PermissionMessage::kNetworkingPrivate},
213 {APIPermission::kMediaPlayerPrivate, "mediaPlayerPrivate",
214 APIPermissionInfo::kFlagCannotBeOptional},
215 {APIPermission::kMetricsPrivate, "metricsPrivate",
216 APIPermissionInfo::kFlagCannotBeOptional},
217 {APIPermission::kMDns, "mdns",
218 APIPermissionInfo::kFlagCannotBeOptional},
219 {APIPermission::kMusicManagerPrivate, "musicManagerPrivate",
220 APIPermissionInfo::kFlagCannotBeOptional,
221 IDS_EXTENSION_PROMPT_WARNING_MUSIC_MANAGER_PRIVATE,
222 PermissionMessage::kMusicManagerPrivate},
223 {APIPermission::kPreferencesPrivate, "preferencesPrivate",
224 APIPermissionInfo::kFlagCannotBeOptional},
225 {APIPermission::kSystemPrivate, "systemPrivate",
226 APIPermissionInfo::kFlagCannotBeOptional},
227 {APIPermission::kCloudPrintPrivate, "cloudPrintPrivate",
228 APIPermissionInfo::kFlagCannotBeOptional},
229 {APIPermission::kInputMethodPrivate, "inputMethodPrivate",
230 APIPermissionInfo::kFlagCannotBeOptional},
231 {APIPermission::kEchoPrivate, "echoPrivate",
232 APIPermissionInfo::kFlagCannotBeOptional},
233 {APIPermission::kFeedbackPrivate, "feedbackPrivate",
234 APIPermissionInfo::kFlagCannotBeOptional},
235 {APIPermission::kImageWriterPrivate, "imageWriterPrivate",
236 APIPermissionInfo::kFlagCannotBeOptional},
237 {APIPermission::kReadingListPrivate, "readingListPrivate",
238 APIPermissionInfo::kFlagCannotBeOptional},
239 {APIPermission::kRtcPrivate, "rtcPrivate",
240 APIPermissionInfo::kFlagCannotBeOptional},
241 {APIPermission::kTerminalPrivate, "terminalPrivate",
242 APIPermissionInfo::kFlagCannotBeOptional},
243 {APIPermission::kVirtualKeyboardPrivate, "virtualKeyboardPrivate",
244 APIPermissionInfo::kFlagCannotBeOptional},
245 {APIPermission::kWallpaperPrivate, "wallpaperPrivate",
246 APIPermissionInfo::kFlagCannotBeOptional},
247 {APIPermission::kWebRequestInternal, "webRequestInternal"},
248 {APIPermission::kWebstorePrivate, "webstorePrivate",
249 APIPermissionInfo::kFlagCannotBeOptional},
250 {APIPermission::kMediaGalleriesPrivate, "mediaGalleriesPrivate",
251 APIPermissionInfo::kFlagCannotBeOptional},
252 {APIPermission::kStreamsPrivate, "streamsPrivate",
253 APIPermissionInfo::kFlagCannotBeOptional},
254 {APIPermission::kEnterprisePlatformKeysPrivate,
255 "enterprise.platformKeysPrivate",
256 APIPermissionInfo::kFlagCannotBeOptional},
257 {APIPermission::kWebrtcAudioPrivate, "webrtcAudioPrivate",
258 APIPermissionInfo::kFlagCannotBeOptional},
259 {APIPermission::kWebrtcLoggingPrivate, "webrtcLoggingPrivate",
260 APIPermissionInfo::kFlagCannotBeOptional},
261 {APIPermission::kPrincipalsPrivate, "principalsPrivate",
262 APIPermissionInfo::kFlagCannotBeOptional},
263 {APIPermission::kFirstRunPrivate, "firstRunPrivate",
264 APIPermissionInfo::kFlagCannotBeOptional},
266 // Full url access permissions.
267 {APIPermission::kDebugger, "debugger",
268 APIPermissionInfo::kFlagImpliesFullURLAccess |
269 APIPermissionInfo::kFlagCannotBeOptional,
270 IDS_EXTENSION_PROMPT_WARNING_DEBUGGER, PermissionMessage::kDebugger},
271 {APIPermission::kDevtools, "devtools",
272 APIPermissionInfo::kFlagImpliesFullURLAccess |
273 APIPermissionInfo::kFlagCannotBeOptional |
274 APIPermissionInfo::kFlagInternal},
275 {APIPermission::kPageCapture, "pageCapture",
276 APIPermissionInfo::kFlagImpliesFullURLAccess},
277 {APIPermission::kTabCapture, "tabCapture",
278 APIPermissionInfo::kFlagImpliesFullURLAccess},
279 {APIPermission::kTabCaptureForTab, "tabCaptureForTab",
280 APIPermissionInfo::kFlagInternal},
281 {APIPermission::kPlugin, "plugin",
282 APIPermissionInfo::kFlagImpliesFullURLAccess |
283 APIPermissionInfo::kFlagImpliesFullAccess |
284 APIPermissionInfo::kFlagCannotBeOptional |
285 APIPermissionInfo::kFlagInternal,
286 IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS,
287 PermissionMessage::kFullAccess},
288 {APIPermission::kProxy, "proxy",
289 APIPermissionInfo::kFlagImpliesFullURLAccess |
290 APIPermissionInfo::kFlagCannotBeOptional},
292 // Platform-app permissions.
293 {APIPermission::kSerial, "serial", APIPermissionInfo::kFlagNone,
294 IDS_EXTENSION_PROMPT_WARNING_SERIAL, PermissionMessage::kSerial},
295 // Because warning messages for the "socket" permission vary based on
297 // permissions parameters, no message ID or message text is specified
299 // The message ID and text used will be determined at run-time in the
300 // |SocketPermission| class.
301 {APIPermission::kSocket, "socket",
302 APIPermissionInfo::kFlagCannotBeOptional, 0, PermissionMessage::kNone,
303 &CreateAPIPermission<SocketPermission>},
304 {APIPermission::kAlwaysOnTopWindows, "app.window.alwaysOnTop"},
305 {APIPermission::kAudioCapture, "audioCapture",
306 APIPermissionInfo::kFlagNone,
307 IDS_EXTENSION_PROMPT_WARNING_AUDIO_CAPTURE,
308 PermissionMessage::kAudioCapture},
309 {APIPermission::kVideoCapture, "videoCapture",
310 APIPermissionInfo::kFlagNone,
311 IDS_EXTENSION_PROMPT_WARNING_VIDEO_CAPTURE,
312 PermissionMessage::kVideoCapture},
313 // The permission string for "fileSystem" is only shown when "write" or
314 // "directory" is present. Read-only access is only granted after the
316 // has been shown a file or directory chooser dialog and selected a
318 // directory . Selecting the file or directory is considered consent to
320 {APIPermission::kFileSystem, "fileSystem"},
321 {APIPermission::kFileSystemDirectory, "fileSystem.directory",
322 APIPermissionInfo::kFlagNone,
323 IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_DIRECTORY,
324 PermissionMessage::kFileSystemDirectory},
325 {APIPermission::kFileSystemProvider, "fileSystemProvider"},
326 {APIPermission::kFileSystemRetainEntries, "fileSystem.retainEntries"},
327 {APIPermission::kFileSystemWrite, "fileSystem.write",
328 APIPermissionInfo::kFlagNone,
329 IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_WRITE,
330 PermissionMessage::kFileSystemWrite},
331 {APIPermission::kFileSystemWriteDirectory, "fileSystem.writeDirectory",
332 APIPermissionInfo::kFlagNone,
333 IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_WRITE_DIRECTORY,
334 PermissionMessage::kFileSystemWriteDirectory},
335 {APIPermission::kHid, "hid", APIPermissionInfo::kFlagNone,
336 IDS_EXTENSION_PROMPT_WARNING_HID, PermissionMessage::kHid},
337 // Because warning messages for the "mediaGalleries" permission vary
339 // on the permissions parameters, no message ID or message text is
341 // The message ID and text used will be determined at run-time in the
342 // |MediaGalleriesPermission| class.
343 {APIPermission::kMediaGalleries, "mediaGalleries",
344 APIPermissionInfo::kFlagNone, 0, PermissionMessage::kNone,
345 &CreateAPIPermission<MediaGalleriesPermission>},
346 {APIPermission::kPushMessaging, "pushMessaging",
347 APIPermissionInfo::kFlagCannotBeOptional},
348 {APIPermission::kUsb, "usb", APIPermissionInfo::kFlagNone,
349 IDS_EXTENSION_PROMPT_WARNING_USB, PermissionMessage::kUsb},
350 {APIPermission::kUsbDevice, "usbDevices", APIPermissionInfo::kFlagNone,
351 0, PermissionMessage::kNone,
352 &CreateAPIPermission<UsbDevicePermission>},
353 {APIPermission::kSystemIndicator, "systemIndicator",
354 APIPermissionInfo::kFlagNone,
355 IDS_EXTENSION_PROMPT_WARNING_SYSTEM_INDICATOR,
356 PermissionMessage::kSystemIndicator},
357 {APIPermission::kSystemCpu, "system.cpu"},
358 {APIPermission::kSystemMemory, "system.memory"},
359 {APIPermission::kSystemNetwork, "system.network"},
360 {APIPermission::kSystemDisplay, "system.display"},
361 {APIPermission::kSystemStorage, "system.storage"},
362 {APIPermission::kPointerLock, "pointerLock"},
363 {APIPermission::kFullscreen, "app.window.fullscreen"},
364 {APIPermission::kAudio, "audio"},
365 {APIPermission::kCastStreaming, "cast.streaming"},
366 {APIPermission::kOverrideEscFullscreen,
367 "app.window.fullscreen.overrideEsc"},
368 {APIPermission::kWindowShape, "app.window.shape"},
370 // Settings override permissions.
371 {APIPermission::kHomepage, "homepage",
372 APIPermissionInfo::kFlagCannotBeOptional |
373 APIPermissionInfo::kFlagInternal,
374 IDS_EXTENSION_PROMPT_WARNING_HOME_PAGE_SETTING_OVERRIDE,
375 PermissionMessage::kHomepage},
376 {APIPermission::kSearchProvider, "searchProvider",
377 APIPermissionInfo::kFlagCannotBeOptional |
378 APIPermissionInfo::kFlagInternal,
379 IDS_EXTENSION_PROMPT_WARNING_SEARCH_SETTINGS_OVERRIDE,
380 PermissionMessage::kSearchProvider},
381 {APIPermission::kStartupPages, "startupPages",
382 APIPermissionInfo::kFlagCannotBeOptional |
383 APIPermissionInfo::kFlagInternal,
384 IDS_EXTENSION_PROMPT_WARNING_START_PAGE_SETTING_OVERRIDE,
385 PermissionMessage::kStartupPages}, };
387 std::vector<APIPermissionInfo*> permissions;
389 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(PermissionsToRegister); ++i) {
390 const PermissionRegistration& pr = PermissionsToRegister[i];
391 permissions.push_back(new APIPermissionInfo(
392 pr.id, pr.name, pr.l10n_message_id,
393 pr.message_id ? pr.message_id : PermissionMessage::kNone,
400 std::vector<PermissionsProvider::AliasInfo>
401 ChromeAPIPermissions::GetAllAliases() const {
403 std::vector<PermissionsProvider::AliasInfo> aliases;
404 aliases.push_back(PermissionsProvider::AliasInfo(
405 "app.window.alwaysOnTop", kOldAlwaysOnTopWindowsPermission));
406 aliases.push_back(PermissionsProvider::AliasInfo("app.window.fullscreen",
407 kOldFullscreenPermission));
409 PermissionsProvider::AliasInfo("app.window.fullscreen.overrideEsc",
410 kOldOverrideEscFullscreenPermission));
411 aliases.push_back(PermissionsProvider::AliasInfo(
412 "unlimitedStorage", kOldUnlimitedStoragePermission));
413 aliases.push_back(PermissionsProvider::AliasInfo(
414 "tabs", kWindowsPermission));
418 } // namespace extensions