1// Copyright 2014 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.
4
5// This features file defines extension APIs implemented under src/extensions.
6// See chrome/common/extensions/api/_features.md to understand this file, as
7// well as feature.h, simple_feature.h, and feature_provider.h.
8//
9// Note that specifying "web_page", "blessed_web_page", or "all" as a context
10// type will require manually updating extensions/renderer/extension_bindings_system.cc.
11
12{
13  "alarms": {
14    "dependencies": ["permission:alarms"],
15    "contexts": ["blessed_extension"]
16  },
17  "app.runtime": [{
18    "channel": "stable",
19    "contexts": ["blessed_extension", "lock_screen_extension"],
20    "extension_types": ["platform_app"],
21    "noparent": true
22  }, {
23    "channel": "stable",
24    "component_extensions_auto_granted": false,
25    "contexts": ["blessed_extension"],
26    "extension_types": ["extension"],
27    "noparent": true,
28    "whitelist": [
29      "2FC374607C2DF285634B67C64A2E356C607091C3",  // Quickoffice
30      "3727DD3E564B6055387425027AD74C58784ACC15",  // Quickoffice internal
31      "12E618C3C6E97495AAECF2AC12DEB082353241C6"   // QO component extension
32    ]
33  }],
34  "app.window": [{
35    "channel": "stable",
36    "contexts": ["blessed_extension", "lock_screen_extension"],
37    "extension_types": ["platform_app"],
38    "noparent": true
39  }, {
40    "channel": "stable",
41    "contexts": ["blessed_extension"],
42    "extension_types": ["extension"],
43    "noparent": true,
44    "component_extensions_auto_granted": false,
45    "whitelist": [
46      "B9EF10DDFEA11EF77873CC5009809E5037FC4C7A",  // Google input tools
47      "06BE211D5F014BAB34BC22D9DDA09C63A81D828E",  // Official xkb extension
48      "F94EE6AB36D6C6588670B2B01EB65212D9C64E33"   // Open source xkb extension
49    ]
50  }],
51  "app.currentWindowInternal": {
52    "noparent": true,
53    "internal": true,
54    "channel": "stable",
55    "contexts": ["blessed_extension", "lock_screen_extension"]
56  },
57  "app.currentWindowInternal.setShape": {
58    "dependencies": ["permission:app.window.shape"],
59    "contexts": ["blessed_extension"]
60  },
61  // The API for the *embedder* of appview. Appview has both an embedder and
62  // guest API, which are different.
63  "appViewEmbedderInternal": {
64    "internal": true,
65    "contexts": ["blessed_extension"],
66    "dependencies": ["permission:appview"]
67  },
68  // Note that exposing this doesn't necessarily expose AppView,
69  // appViewEmbedderInternal is required for that.
70  // See http://crbug.com/437891.
71  "appViewGuestInternal": {
72    "internal": true,
73    "channel": "stable",
74    "contexts": ["blessed_extension"]
75  },
76  "audio": {
77    "dependencies": ["permission:audio"],
78    "contexts": ["blessed_extension"]
79  },
80  "automationInternal": {
81    "internal": true,
82    "dependencies": ["manifest:automation"],
83    "contexts": ["blessed_extension"]
84  },
85  "automation": {
86    "dependencies": ["manifest:automation"],
87    "contexts": ["blessed_extension"]
88  },
89  "automation.languageAnnotationForStringAttribute": {
90    "command_line_switch": "enable-experimental-accessibility-chromevox-sub-node-language-switching",
91    "channel": "dev",
92    "contexts": ["blessed_extension"]
93  },
94  "bluetooth": [{
95    "dependencies": ["manifest:bluetooth"],
96    "contexts": ["blessed_extension"]
97  }, {
98    "channel": "stable",
99    "contexts": ["webui"],
100    "matches": [
101      "chrome://bluetooth-pairing/*",
102      "chrome://os-settings/*"
103    ]
104  }],
105  "bluetoothLowEnergy": {
106    "dependencies": ["manifest:bluetooth"],
107    "contexts": ["blessed_extension"],
108    "platforms": ["chromeos", "linux"]
109  },
110  "bluetoothPrivate": [{
111    "dependencies": ["permission:bluetoothPrivate"],
112    "contexts": ["blessed_extension"]
113  }, {
114    "channel": "stable",
115    "contexts": ["webui"],
116    "matches": [
117      "chrome://bluetooth-pairing/*",
118      "chrome://os-settings/*"
119    ]
120  }],
121  "bluetoothSocket": {
122    "dependencies": ["manifest:bluetooth"],
123    "contexts": ["blessed_extension"]
124  },
125  "cecPrivate": {
126    "dependencies": ["permission:cecPrivate"],
127    "contexts": ["blessed_extension"]
128  },
129  "clipboard": {
130    "dependencies": ["permission:clipboard"],
131    "contexts": ["blessed_extension"]
132  },
133  "clipboard.onClipboardDataChanged": {
134    "dependencies": ["permission:clipboardRead"]
135  },
136  "clipboard.setImageData": {
137    "dependencies": ["permission:clipboardWrite"]
138  },
139  "crashReportPrivate": {
140    "dependencies": ["permission:crashReportPrivate"],
141    "contexts": ["blessed_extension"]
142  },
143  "declarativeNetRequest": {
144    "dependencies": ["permission:declarativeNetRequest"],
145    "contexts": ["blessed_extension"]
146  },
147  "declarativeNetRequest.onRuleMatchedDebug": {
148    "dependencies": ["permission:declarativeNetRequest", "permission:declarativeNetRequestFeedback"],
149    "contexts": ["blessed_extension"],
150    "channel": "beta",
151    "location": "unpacked"
152  },
153  "declarativeWebRequest": {
154    "dependencies": ["permission:declarativeWebRequest"],
155    "contexts": ["blessed_extension"]
156  },
157  "diagnostics": {
158    "dependencies": ["permission:diagnostics"],
159    "extension_types": ["platform_app"],
160    "contexts": ["blessed_extension"]
161  },
162  "displaySource": {
163    "dependencies": ["permission:displaySource"],
164    "contexts": ["blessed_extension"]
165  },
166  "dns": {
167    "dependencies": ["permission:dns"],
168    "contexts": ["blessed_extension"]
169  },
170  "documentScan": {
171    "dependencies": ["permission:documentScan"],
172    "contexts": ["blessed_extension"]
173  },
174  // This is not a real API, only here for documentation purposes.
175  // See http://crbug.com/275944 for background.
176  "extensionTypes": {
177    "internal": true,
178    "channel": "stable",
179    "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
180    "contexts": ["blessed_extension"]
181  },
182  "events": {
183    "internal": true,
184    "channel": "stable",
185    "extension_types": ["platform_app", "extension"],
186    "contexts": "all",
187    "matches": ["<all_urls>"]
188  },
189  "feedbackPrivate": {
190    "dependencies": ["permission:feedbackPrivate"],
191    "contexts": ["blessed_extension"]
192  },
193  "feedbackPrivate.readLogSource": {
194    "platforms": ["chromeos"],
195    "session_types": ["kiosk"]
196  },
197  "fileSystem": {
198    "dependencies": ["permission:fileSystem"],
199    "contexts": ["blessed_extension"],
200    "disallow_for_service_workers": true
201  },
202  "guestViewInternal": [
203    {
204      "internal": true,
205      "channel": "stable",
206      "contexts": ["blessed_extension"]
207    }, {
208      "internal": true,
209      "channel": "stable",
210      "contexts": ["webui"],
211      "matches": [
212        "chrome://add-supervision/*",
213        "chrome://assistant-optin/*",
214        "chrome://cast/*",
215        "chrome://cellular-setup/*",
216        "chrome://discards/*",
217        "chrome://extensions/*",
218        "chrome://home/*",
219        "chrome://chrome-signin/*",
220        "chrome://hats/*",
221        "chrome://mobilesetup/*",
222        "chrome://oobe/*",
223        "chrome://password-change/*"
224      ]
225    }
226  ],
227  "hid": {
228    "dependencies": ["permission:hid"],
229    "contexts": ["blessed_extension"]
230  },
231  "hid.getUserSelectedDevices": {
232    "contexts": ["blessed_extension"],
233    "channel": "dev",
234    "dependencies": ["permission:hid"]
235  },
236  "idle": {
237    "dependencies": ["permission:idle"],
238    "contexts": ["blessed_extension"]
239  },
240  "idle.getAutoLockDelay": {
241    "platforms": ["chromeos"]
242  },
243  "lockScreen.data": {
244    "dependencies": ["permission:lockScreen"],
245    "contexts": ["blessed_extension", "lock_screen_extension"]
246  },
247  "lockScreen.data.create": {
248    "contexts": ["lock_screen_extension"]
249  },
250  "management": [{
251    "dependencies": ["permission:management"],
252    "contexts": ["blessed_extension"],
253    "default_parent": true
254  }, {
255    "channel": "stable",
256    "contexts": ["webui"],
257    "matches": [
258      "chrome://extensions/*",
259      "chrome://settings/*"
260    ]
261  }],
262  "management.getPermissionWarningsByManifest": {
263    "dependencies": [],
264    "channel": "stable",
265    "extension_types": ["extension", "legacy_packaged_app", "platform_app"]
266  },
267  "management.getSelf": {
268    "dependencies": [],
269    "channel": "stable",
270    "extension_types": ["extension", "legacy_packaged_app", "platform_app"]
271  },
272  "management.canInstallReplacementAndroidApp": {
273    "dependencies": ["manifest:replacement_android_app"],
274    // TODO(jshikaram): add test coverage before trunk promotion.
275    "channel": "trunk",
276    "extension_types": ["platform_app"]
277  },
278  "management.installReplacementAndroidApp": {
279    "dependencies": ["manifest:replacement_android_app"],
280    "channel": "trunk",
281    "extension_types": ["platform_app"]
282  },
283  "management.installReplacementWebApp": {
284    "dependencies": ["manifest:replacement_web_app"],
285    "channel": "stable",
286    "extension_types": ["extension", "platform_app"]
287  },
288  "management.uninstallSelf": {
289    "dependencies": [],
290    "channel": "stable",
291    "extension_types": ["extension", "legacy_packaged_app", "platform_app"]
292  },
293  "mediaPerceptionPrivate": {
294    "dependencies": ["permission:mediaPerceptionPrivate"],
295    "contexts": ["blessed_extension"]
296  },
297  "metricsPrivate": [{
298    "dependencies": ["permission:metricsPrivate"],
299    "contexts": ["blessed_extension"],
300    "default_parent": true
301  }, {
302    "channel": "stable",
303    "contexts": ["webui"],
304    "matches": [
305      "chrome://bookmarks/*",
306      "chrome://extensions/*",
307      "chrome://os-settings/*",
308      "chrome://settings/*",
309      "chrome://sync-confirmation/*",
310      "chrome://tab-strip/*",
311      "chrome://welcome/*"
312    ]
313  }, {
314    "channel": "stable",
315    "contexts": ["webui_untrusted"],
316    "matches": [
317      "chrome-untrusted://help-app/*",
318      "chrome-untrusted://media-app/*"
319    ]
320  }],
321  "metricsPrivate.getIsCrashReportingEnabled": {
322    "whitelist": [
323      // This function inherits the extension restrictions of metricsPrivate,
324      // but also requires whitelisting. New uses of this function should get
325      // /tools/metrics/OWNERS approval of the usage before adding entries
326      // below. See crbug.com/374199.
327      "2FC374607C2DF285634B67C64A2E356C607091C3",  // Quickoffice
328      "3727DD3E564B6055387425027AD74C58784ACC15",  // Quickoffice internal
329      "12E618C3C6E97495AAECF2AC12DEB082353241C6",  // QO component extension
330      "3727DD3E564B6055387425027AD74C58784ACC15",  // Editor
331      "C41AD9DCD670210295614257EF8C9945AD68D86E",  // Google Now
332      "D7986543275120831B39EF28D1327552FC343960",  // http://crbug.com/378067
333      "A291B26E088FA6BA53FFD72F0916F06EBA7C585A",  // http://crbug.com/378067
334      "07BD6A765FFC289FF755D7CAB2893A40EC337FEC",  // http://crbug.com/456214
335      "896B85CC7E913E11C34892C1425A093C0701D386",  // http://crbug.com/456214
336      "11A01C82EF355E674E4F9728A801F5C3CB40D83F",  // http://crbug.com/456214
337      "F410C88469990EE7947450311D24B8AF2ADB2595",  // http://crbug.com/456214
338      "63ED55E43214C211F82122ED56407FF1A807F2A3",  // Media Router Dev
339      "226CF815E39A363090A1E547D53063472B8279FA",  // Media Router Stable
340      // TODO (ntang) Remove the following 2 hashes by 12/31/2017.
341      "B620CF4203315F9F2E046EDED22C7571A935958D",  // http://crbug.com/510270
342      "B206D8716769728278D2D300349C6CB7D7DE2EF9",  // http://crbug.com/510270
343      "2B6C6A4A5940017146F3E58B7F90116206E84685",  // http://crbug.com/642141
344      "B6C2EFAB3EC3BF6EF03701408B6B09A67B2D0069",  // http://crbug.com/642141
345      "96FF2FFA5C9173C76D47184B3E86D267B37781DE",  // http://crbug.com/642141
346      "0136FCB13DB29FD5CD442F56E59E53B61F1DF96F",  // http://crbug.com/642141
347      "46578A13607D38F1DC8E280C4F499FB0A2F9565C",  // http://crbug.com/819404
348      "898FB5A39687D210766B8998BA4530B99C9E6586",  // http://crbug.com/819404
349      "82F30B65397BC3E4ADE627BBD857AB8A58210648",  // http://crbug.com/819404
350      "A3E3DE9E9F16B41D4A2FAD106BD6CA76B94A0C94",  // http://crbug.com/932466
351      "B41E7F08E1179CC03CBD1F49E57CF353A40ADE07",  // http://crbug.com/932466
352      "C74B2AF138F9EDECD04D0965AB36CA66C8290466"   // http://crbug.com/957772
353    ]
354  },
355  "mimeHandlerPrivate": {
356    "dependencies": ["manifest:mime_types_handler"],
357    "contexts": ["blessed_extension"]
358  },
359  "mojoPrivate": {
360    "contexts": ["blessed_extension"],
361    "channel": "stable",
362    "extension_types": ["platform_app", "extension"],
363    "whitelist": [
364      "63ED55E43214C211F82122ED56407FF1A807F2A3",   // Media Router Dev
365      "226CF815E39A363090A1E547D53063472B8279FA",   // Media Router Stable
366      "B41E7F08E1179CC03CBD1F49E57CF353A40ADE07",   // Chrome Camera App Dev
367      "A3E3DE9E9F16B41D4A2FAD106BD6CA76B94A0C94"    // Chrome Camera App Stable
368    ]
369  },
370  "networking.config": {
371    "dependencies": ["permission:networking.config"],
372    "contexts": ["blessed_extension"]
373  },
374  "networking.onc": {
375    "dependencies": ["permission:networking.onc"],
376    "contexts": ["blessed_extension"],
377    "source": "networkingPrivate"
378  },
379  "networkingPrivate": [{
380    "dependencies": ["permission:networkingPrivate"],
381    "contexts": ["blessed_extension"],
382    // TODO(tbarzic): networkingPrivate is being renamed to networking.onc.
383    // The goal is to eventually remove networkingPrivate API in favour of
384    // networking.onc, but until current usages are migrated to the new
385    // name, use API aliasing to expose the API under both names.
386    // (http://crbug.com/672186).
387    "alias": "networking.onc"
388  }, {
389    "channel": "stable",
390    "contexts": ["webui"],
391    "matches": [
392      "chrome://network/*",
393      "chrome://oobe/*",
394      "chrome://internet-config-dialog/*",
395      "chrome://internet-detail-dialog/*",
396      "chrome://os-settings/*"
397    ]
398  }],
399  "power": {
400    "dependencies": ["permission:power"],
401    "contexts": ["blessed_extension"]
402  },
403  "printerProvider": {
404    "dependencies": ["permission:printerProvider"],
405    "contexts": ["blessed_extension"],
406    "disallow_for_service_workers": true
407  },
408  "printerProviderInternal": {
409    "internal": true,
410    "dependencies": ["permission:printerProvider"],
411    "contexts": ["blessed_extension"],
412    "disallow_for_service_workers": true
413  },
414  "runtime": {
415    "channel": "stable",
416    "extension_types": [
417      "extension",
418      "legacy_packaged_app",
419      "platform_app",
420      "login_screen_extension"
421    ],
422    "contexts": [
423      "blessed_extension",
424      "lock_screen_extension"
425    ]
426  },
427  "runtime.getBackgroundPage": {
428    "disallow_for_service_workers": true
429  },
430  "runtime.getManifest": {
431    "contexts": [
432      "blessed_extension",
433      "lock_screen_extension",
434      "unblessed_extension",
435      "content_script"
436    ]
437  },
438  "runtime.connect": {
439    // Everything except WebUI.
440    "contexts": [
441      "blessed_web_page",
442      "content_script",
443      "blessed_extension",
444      "lock_screen_extension",
445      "unblessed_extension",
446      "web_page"
447    ],
448    "matches": ["<all_urls>"]
449  },
450  "runtime.connectNative": {
451    "dependencies": ["permission:nativeMessaging"],
452    "contexts": ["blessed_extension"]
453  },
454  "runtime.getURL": {
455    "contexts": [
456      "blessed_extension",
457      "lock_screen_extension",
458      "unblessed_extension",
459      "content_script"
460    ]
461  },
462  "runtime.id": {
463    "contexts": [
464      "blessed_extension",
465      "lock_screen_extension",
466      "unblessed_extension",
467      "content_script"
468    ]
469  },
470  "runtime.lastError": {
471    "contexts": "all",
472    "extension_types": "all",
473    "matches": ["<all_urls>"]
474  },
475  "runtime.onConnect": {
476    "contexts": [
477      "blessed_extension",
478      "lock_screen_extension",
479      "unblessed_extension",
480      "content_script"
481    ]
482  },
483  "runtime.onConnectNative": {
484    "dependencies": ["permission:nativeMessaging"],
485    "contexts": ["blessed_extension"]
486  },
487  "runtime.onMessage": {
488    "contexts": [
489      "blessed_extension",
490      "lock_screen_extension",
491      "unblessed_extension",
492      "content_script"
493    ]
494  },
495  "runtime.sendMessage": {
496    // Everything except WebUI.
497    "contexts": [
498      "blessed_web_page",
499      "content_script",
500      "blessed_extension",
501      "lock_screen_extension",
502      "unblessed_extension",
503      "web_page"
504    ],
505    "matches": ["<all_urls>"]
506  },
507  "runtime.sendNativeMessage": {
508    "dependencies": ["permission:nativeMessaging"],
509    "contexts": ["blessed_extension"]
510  },
511  "serial": {
512    "dependencies": ["permission:serial"],
513    "contexts": ["blessed_extension"]
514  },
515  "socket": {
516    "dependencies": ["permission:socket"],
517    "contexts": ["blessed_extension"]
518  },
519  "sockets.tcp": {
520    "dependencies": ["manifest:sockets"],
521    "contexts": ["blessed_extension"]
522  },
523  "sockets.tcpServer": {
524    "dependencies": ["manifest:sockets"],
525    "contexts": ["blessed_extension"]
526  },
527  "sockets.udp": {
528    "dependencies": ["manifest:sockets"],
529    "contexts": ["blessed_extension"]
530  },
531  "storage": {
532    "dependencies": ["permission:storage"],
533    "contexts": ["blessed_extension", "unblessed_extension", "content_script"]
534  },
535  "system.cpu": {
536    "dependencies": ["permission:system.cpu"],
537    "contexts": ["blessed_extension"]
538  },
539  "system.display": [{
540    "dependencies": ["permission:system.display"],
541    "contexts": ["blessed_extension"],
542    "disallow_for_service_workers": true
543  }, {
544    "channel": "stable",
545    "contexts": ["webui"],
546    "matches": [
547      "chrome://os-settings/*"
548    ]
549  }],
550  "system.memory": {
551    "dependencies": ["permission:system.memory"],
552    "contexts": ["blessed_extension"]
553  },
554  "system.network": {
555    "dependencies": ["permission:system.network"],
556    "contexts": ["blessed_extension"]
557  },
558  "system.powerSource": {
559    "dependencies": ["permission:system.powerSource"],
560    "contexts": ["blessed_extension"]
561  },
562  "system.storage": {
563    "dependencies": ["permission:system.storage"],
564    "contexts": ["blessed_extension"]
565  },
566  "system.storage.getAvailableCapacity": {
567    "channel": "dev"
568  },
569  "test": [{
570    "channel": "stable",
571    "extension_types": "all",
572    // Everything except web pages and WebUI. WebUI is declared in a separate
573    // rule to keep the "matches" property isolated.
574    "contexts": [
575      "blessed_extension",
576      "blessed_web_page",
577      "content_script",
578      "lock_screen_extension",
579      "unblessed_extension"
580    ]
581  }, {
582    "channel": "stable",
583    "contexts": ["webui"],
584    "matches": ["chrome://extensions/*"]
585  }, {
586    "channel": "stable",
587    "contexts": [ "webui_untrusted" ],
588    "matches": [ "chrome-untrusted://api-test/*" ]
589  }],
590  "types": {
591    "internal": true,
592    "channel": "stable",
593    "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
594    "contexts": ["blessed_extension"]
595  },
596  "usb": {
597    "dependencies": ["permission:usb"],
598    "contexts": ["blessed_extension"]
599  },
600  "virtualKeyboard": {
601    "dependencies": ["permission:virtualKeyboard"],
602    "contexts": ["blessed_extension"]
603  },
604  "vpnProvider": {
605    "dependencies": ["permission:vpnProvider"],
606    "contexts": ["blessed_extension"]
607  },
608  "webRequest": {
609    "dependencies": ["permission:webRequest"],
610    "contexts": ["blessed_extension"]
611  },
612  "webRequestInternal": [{
613    "internal": true,
614    "channel": "stable",
615    "contexts": ["blessed_extension"]
616  }, {
617    // webview uses webRequestInternal API.
618    "channel": "stable",
619    "internal": true,
620    "contexts": ["webui"],
621    "matches": [
622      "chrome://add-supervision/*",
623      "chrome://assistant-optin/*",
624      "chrome://cellular-setup/*",
625      "chrome://chrome-signin/*",
626      "chrome://discards/*",
627      "chrome://hats/*",
628      "chrome://home/*",
629      "chrome://mobilesetup/*",
630      "chrome://oobe/*",
631      "chrome://password-change/*"
632    ]
633  }],
634  "webViewInternal": [{
635    "internal": true,
636    "dependencies": ["permission:webview"],
637    "contexts": ["blessed_extension"]
638  }, {
639    "internal": true,
640    "channel": "stable",
641    "contexts": ["webui"],
642    "matches": [
643      "chrome://add-supervision/*",
644      "chrome://assistant-optin/*",
645      "chrome://cellular-setup/*",
646      "chrome://chrome-signin/*",
647      "chrome://discards/*",
648      "chrome://hats/*",
649      "chrome://home/*",
650      "chrome://mobilesetup/*",
651      "chrome://oobe/*",
652      "chrome://password-change/*"
653    ]
654  }],
655  "webViewRequest": [{
656    "dependencies": ["permission:webview"],
657    "contexts": ["blessed_extension"]
658  }, {
659    "channel": "stable",
660    "contexts": ["webui"],
661    "matches": [
662      "chrome://add-supervision/*",
663      "chrome://assistant-optin/*",
664      "chrome://cellular-setup/*",
665      "chrome://chrome-signin/*",
666      "chrome://discards/*",
667      "chrome://hats/*",
668      "chrome://home/*",
669      "chrome://mobilesetup/*",
670      "chrome://oobe/*"
671    ]
672  }]
673}
674