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  "declarativeNetRequest": {
140    "dependencies": ["permission:declarativeNetRequest"],
141    "contexts": ["blessed_extension"]
142  },
143  "declarativeNetRequest.getAvailableStaticRuleCount": {
144    // TODO(crbug.com/983299): Enable on stable once the global rules limit
145    // feature is enabled by default.
146    "channel": "trunk"
147  },
148  "declarativeNetRequest.onRuleMatchedDebug": {
149    "dependencies": ["permission:declarativeNetRequest", "permission:declarativeNetRequestFeedback"],
150    "location": "unpacked"
151  },
152  "declarativeWebRequest": {
153    "dependencies": ["permission:declarativeWebRequest"],
154    "contexts": ["blessed_extension"]
155  },
156  "diagnostics": {
157    "dependencies": ["permission:diagnostics"],
158    "extension_types": ["platform_app"],
159    "contexts": ["blessed_extension"]
160  },
161  "displaySource": {
162    "dependencies": ["permission:displaySource"],
163    "contexts": ["blessed_extension"]
164  },
165  "dns": {
166    "dependencies": ["permission:dns"],
167    "contexts": ["blessed_extension"]
168  },
169  // This is not a real API, only here for documentation purposes.
170  // See http://crbug.com/275944 for background.
171  "extensionTypes": {
172    "internal": true,
173    "channel": "stable",
174    "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
175    "contexts": ["blessed_extension"]
176  },
177  "events": {
178    "internal": true,
179    "channel": "stable",
180    "extension_types": ["platform_app", "extension"],
181    "contexts": "all",
182    "matches": ["<all_urls>"]
183  },
184  "feedbackPrivate": {
185    "dependencies": ["permission:feedbackPrivate"],
186    "contexts": ["blessed_extension"]
187  },
188  "feedbackPrivate.readLogSource": {
189    "platforms": ["chromeos"],
190    "session_types": ["kiosk"]
191  },
192  "fileSystem": {
193    "dependencies": ["permission:fileSystem"],
194    "contexts": ["blessed_extension"],
195    "disallow_for_service_workers": true
196  },
197  "guestViewInternal": [
198    {
199      "internal": true,
200      "channel": "stable",
201      "contexts": ["blessed_extension"]
202    }, {
203      "internal": true,
204      "channel": "stable",
205      "contexts": ["webui"],
206      "matches": [
207        "chrome://add-supervision/*",
208        "chrome://assistant-optin/*",
209        "chrome://cellular-setup/*",
210        "chrome://discards/*",
211        "chrome://extensions/*",
212        "chrome://home/*",
213        "chrome://chrome-signin/*",
214        "chrome://hats/*",
215        "chrome://mobilesetup/*",
216        "chrome://oobe/*",
217        "chrome://password-change/*",
218        "chrome://lock-reauth/*"
219      ]
220    }
221  ],
222  "hid": {
223    "dependencies": ["permission:hid"],
224    "contexts": ["blessed_extension"]
225  },
226  "hid.getUserSelectedDevices": {
227    "contexts": ["blessed_extension"],
228    "channel": "dev",
229    "dependencies": ["permission:hid"]
230  },
231  "idle": {
232    "dependencies": ["permission:idle"],
233    "contexts": ["blessed_extension"]
234  },
235  "idle.getAutoLockDelay": {
236    "platforms": ["chromeos"]
237  },
238  "lockScreen.data": {
239    "dependencies": ["permission:lockScreen"],
240    "contexts": ["blessed_extension", "lock_screen_extension"]
241  },
242  "lockScreen.data.create": {
243    "contexts": ["lock_screen_extension"]
244  },
245  "management": [{
246    "dependencies": ["permission:management"],
247    "contexts": ["blessed_extension"],
248    "default_parent": true
249  }, {
250    "channel": "stable",
251    "contexts": ["webui"],
252    "matches": [
253      "chrome://extensions/*",
254      "chrome://settings/*"
255    ]
256  }],
257  "management.getPermissionWarningsByManifest": {
258    "dependencies": [],
259    "channel": "stable",
260    "extension_types": ["extension", "legacy_packaged_app", "platform_app"]
261  },
262  "management.getSelf": {
263    "dependencies": [],
264    "channel": "stable",
265    "extension_types": ["extension", "legacy_packaged_app", "platform_app"]
266  },
267  "management.canInstallReplacementAndroidApp": {
268    "dependencies": ["manifest:replacement_android_app"],
269    // TODO(jshikaram): add test coverage before trunk promotion.
270    "channel": "trunk",
271    "extension_types": ["platform_app"]
272  },
273  "management.installReplacementAndroidApp": {
274    "dependencies": ["manifest:replacement_android_app"],
275    "channel": "trunk",
276    "extension_types": ["platform_app"]
277  },
278  "management.installReplacementWebApp": {
279    "dependencies": ["manifest:replacement_web_app"],
280    "channel": "stable",
281    "extension_types": ["extension", "platform_app"]
282  },
283  "management.uninstallSelf": {
284    "dependencies": [],
285    "channel": "stable",
286    "extension_types": ["extension", "legacy_packaged_app", "platform_app"]
287  },
288  "mediaPerceptionPrivate": {
289    "dependencies": ["permission:mediaPerceptionPrivate"],
290    "contexts": ["blessed_extension"]
291  },
292  "metricsPrivate": [{
293    "dependencies": ["permission:metricsPrivate"],
294    "contexts": ["blessed_extension"],
295    "default_parent": true
296  }, {
297    "channel": "stable",
298    "contexts": ["webui"],
299    "matches": [
300      "chrome://bookmarks/*",
301      "chrome://extensions/*",
302      "chrome://os-settings/*",
303      "chrome://settings/*",
304      "chrome://sync-confirmation/*",
305      "chrome://tab-search/*",
306      "chrome://tab-strip/*",
307      "chrome://welcome/*",
308      "chrome://profile-picker/*"
309    ]
310  }, {
311    "channel": "stable",
312    "contexts": ["webui_untrusted"],
313    "matches": [
314      "chrome-untrusted://help-app/*",
315      "chrome-untrusted://media-app/*"
316    ]
317  }],
318  "metricsPrivate.getIsCrashReportingEnabled": {
319    "whitelist": [
320      // This function inherits the extension restrictions of metricsPrivate,
321      // but also requires whitelisting. New uses of this function should get
322      // /tools/metrics/OWNERS approval of the usage before adding entries
323      // below. See crbug.com/374199.
324      "2FC374607C2DF285634B67C64A2E356C607091C3",  // Quickoffice
325      "3727DD3E564B6055387425027AD74C58784ACC15",  // Quickoffice internal
326      "12E618C3C6E97495AAECF2AC12DEB082353241C6",  // QO component extension
327      "3727DD3E564B6055387425027AD74C58784ACC15",  // Editor
328      "C41AD9DCD670210295614257EF8C9945AD68D86E",  // Google Now
329      "D7986543275120831B39EF28D1327552FC343960",  // http://crbug.com/378067
330      "A291B26E088FA6BA53FFD72F0916F06EBA7C585A",  // http://crbug.com/378067
331      "07BD6A765FFC289FF755D7CAB2893A40EC337FEC",  // http://crbug.com/456214
332      "896B85CC7E913E11C34892C1425A093C0701D386",  // http://crbug.com/456214
333      "11A01C82EF355E674E4F9728A801F5C3CB40D83F",  // http://crbug.com/456214
334      "F410C88469990EE7947450311D24B8AF2ADB2595",  // http://crbug.com/456214
335      "63ED55E43214C211F82122ED56407FF1A807F2A3",  // Media Router Dev
336      "226CF815E39A363090A1E547D53063472B8279FA",  // Media Router Stable
337      // TODO (ntang) Remove the following 2 hashes by 12/31/2017.
338      "B620CF4203315F9F2E046EDED22C7571A935958D",  // http://crbug.com/510270
339      "B206D8716769728278D2D300349C6CB7D7DE2EF9",  // http://crbug.com/510270
340      "2B6C6A4A5940017146F3E58B7F90116206E84685",  // http://crbug.com/642141
341      "B6C2EFAB3EC3BF6EF03701408B6B09A67B2D0069",  // http://crbug.com/642141
342      "96FF2FFA5C9173C76D47184B3E86D267B37781DE",  // http://crbug.com/642141
343      "0136FCB13DB29FD5CD442F56E59E53B61F1DF96F",  // http://crbug.com/642141
344      "46578A13607D38F1DC8E280C4F499FB0A2F9565C",  // http://crbug.com/819404
345      "898FB5A39687D210766B8998BA4530B99C9E6586",  // http://crbug.com/819404
346      "82F30B65397BC3E4ADE627BBD857AB8A58210648",  // http://crbug.com/819404
347      "A3E3DE9E9F16B41D4A2FAD106BD6CA76B94A0C94",  // http://crbug.com/932466
348      "B41E7F08E1179CC03CBD1F49E57CF353A40ADE07",  // http://crbug.com/932466
349      "C74B2AF138F9EDECD04D0965AB36CA66C8290466"   // http://crbug.com/957772
350    ]
351  },
352  "mimeHandlerPrivate": {
353    "dependencies": ["manifest:mime_types_handler"],
354    "contexts": ["blessed_extension"]
355  },
356  "mojoPrivate": [{
357    "contexts": ["blessed_extension"],
358    "channel": "stable",
359    "extension_types": ["platform_app", "extension"],
360    "whitelist": [
361      "63ED55E43214C211F82122ED56407FF1A807F2A3",   // Media Router Dev
362      "226CF815E39A363090A1E547D53063472B8279FA",   // Media Router Stable
363      "B41E7F08E1179CC03CBD1F49E57CF353A40ADE07",   // Chrome Camera App Dev
364      "A3E3DE9E9F16B41D4A2FAD106BD6CA76B94A0C94"    // Chrome Camera App Stable
365    ]
366  }, {
367    "contexts": ["blessed_extension"],
368    "dependencies": ["behavior:imprivata_in_session_extension"],
369    "extension_types": ["extension"],
370    "location": "policy",
371    "platforms": ["chromeos"]
372  }],
373  "networking.onc": {
374    "dependencies": ["permission:networking.onc"],
375    "contexts": ["blessed_extension"],
376    "source": "networkingPrivate"
377  },
378  "networkingPrivate": [{
379    "dependencies": ["permission:networkingPrivate"],
380    "contexts": ["blessed_extension"],
381    // TODO(tbarzic): networkingPrivate is being renamed to networking.onc.
382    // The goal is to eventually remove networkingPrivate API in favour of
383    // networking.onc, but until current usages are migrated to the new
384    // name, use API aliasing to expose the API under both names.
385    // (http://crbug.com/672186).
386    "alias": "networking.onc"
387  }, {
388    "channel": "stable",
389    "contexts": ["webui"],
390    "matches": [
391      "chrome://network/*",
392      "chrome://oobe/*",
393      "chrome://internet-config-dialog/*",
394      "chrome://internet-detail-dialog/*",
395      "chrome://os-settings/*"
396    ]
397  }],
398  "power": {
399    "dependencies": ["permission:power"],
400    "contexts": ["blessed_extension"]
401  },
402  "printerProvider": {
403    "dependencies": ["permission:printerProvider"],
404    "contexts": ["blessed_extension"],
405    "disallow_for_service_workers": true
406  },
407  "printerProviderInternal": {
408    "internal": true,
409    "dependencies": ["permission:printerProvider"],
410    "contexts": ["blessed_extension"],
411    "disallow_for_service_workers": true
412  },
413  "runtime": {
414    "channel": "stable",
415    "extension_types": [
416      "extension",
417      "legacy_packaged_app",
418      "platform_app",
419      "login_screen_extension"
420    ],
421    "contexts": [
422      "blessed_extension",
423      "lock_screen_extension"
424    ]
425  },
426  "runtime.getBackgroundPage": {
427    "disallow_for_service_workers": true
428  },
429  "runtime.getPackageDirectoryEntry": {
430    "disallow_for_service_workers": true
431  },
432  "runtime.getManifest": {
433    "contexts": [
434      "blessed_extension",
435      "lock_screen_extension",
436      "unblessed_extension",
437      "content_script"
438    ]
439  },
440  "runtime.connect": {
441    // Everything except WebUI.
442    "contexts": [
443      "blessed_web_page",
444      "content_script",
445      "blessed_extension",
446      "lock_screen_extension",
447      "unblessed_extension",
448      "web_page"
449    ],
450    "matches": ["<all_urls>"]
451  },
452  "runtime.connectNative": {
453    "dependencies": ["permission:nativeMessaging"],
454    "contexts": ["blessed_extension"]
455  },
456  "runtime.getURL": {
457    "contexts": [
458      "blessed_extension",
459      "lock_screen_extension",
460      "unblessed_extension",
461      "content_script"
462    ]
463  },
464  "runtime.id": {
465    "contexts": [
466      "blessed_extension",
467      "lock_screen_extension",
468      "unblessed_extension",
469      "content_script"
470    ]
471  },
472  "runtime.lastError": {
473    "contexts": "all",
474    "extension_types": "all",
475    "matches": ["<all_urls>"]
476  },
477  "runtime.onConnect": {
478    "contexts": [
479      "blessed_extension",
480      "lock_screen_extension",
481      "unblessed_extension",
482      "content_script"
483    ]
484  },
485  "runtime.onConnectNative": {
486    "dependencies": ["permission:nativeMessaging"],
487    "contexts": ["blessed_extension"]
488  },
489  "runtime.onMessage": {
490    "contexts": [
491      "blessed_extension",
492      "lock_screen_extension",
493      "unblessed_extension",
494      "content_script"
495    ]
496  },
497  "runtime.sendMessage": [{
498    // Everything except WebUI.
499    "contexts": [
500      "blessed_web_page",
501      "content_script",
502      "blessed_extension",
503      "lock_screen_extension",
504      "unblessed_extension",
505      "web_page"
506    ],
507    "matches": ["<all_urls>"]
508  },{
509    "contexts": ["webui"],
510    "matches": [
511      "chrome://password-change/*"
512    ]
513  }],
514  "runtime.sendNativeMessage": {
515    "dependencies": ["permission:nativeMessaging"],
516    "contexts": ["blessed_extension"]
517  },
518  "serial": {
519    "dependencies": ["permission:serial"],
520    "contexts": ["blessed_extension"]
521  },
522  "socket": {
523    "dependencies": ["permission:socket"],
524    "contexts": ["blessed_extension"]
525  },
526  "sockets.tcp": {
527    "dependencies": ["manifest:sockets"],
528    "contexts": ["blessed_extension"]
529  },
530  "sockets.tcpServer": {
531    "dependencies": ["manifest:sockets"],
532    "contexts": ["blessed_extension"]
533  },
534  "sockets.udp": {
535    "dependencies": ["manifest:sockets"],
536    "contexts": ["blessed_extension"]
537  },
538  "storage": {
539    "dependencies": ["permission:storage"],
540    "contexts": ["blessed_extension", "unblessed_extension", "content_script"]
541  },
542  "system.cpu": {
543    "dependencies": ["permission:system.cpu"],
544    "contexts": ["blessed_extension"]
545  },
546  "system.display": [{
547    "dependencies": ["permission:system.display"],
548    "contexts": ["blessed_extension"],
549    "disallow_for_service_workers": true
550  }, {
551    "channel": "stable",
552    "contexts": ["webui"],
553    "matches": [
554      "chrome://os-settings/*"
555    ]
556  }],
557  "system.memory": {
558    "dependencies": ["permission:system.memory"],
559    "contexts": ["blessed_extension"]
560  },
561  "system.network": {
562    "dependencies": ["permission:system.network"],
563    "contexts": ["blessed_extension"]
564  },
565  "system.powerSource": {
566    "dependencies": ["permission:system.powerSource"],
567    "contexts": ["blessed_extension"]
568  },
569  "system.storage": {
570    "dependencies": ["permission:system.storage"],
571    "contexts": ["blessed_extension"]
572  },
573  "system.storage.getAvailableCapacity": {
574    "channel": "dev"
575  },
576  "test": [{
577    "channel": "stable",
578    "extension_types": "all",
579    // Everything except web pages and WebUI. WebUI is declared in a separate
580    // rule to keep the "matches" property isolated.
581    "contexts": [
582      "blessed_extension",
583      "blessed_web_page",
584      "content_script",
585      "lock_screen_extension",
586      "unblessed_extension"
587    ]
588  }, {
589    "channel": "stable",
590    "contexts": ["webui"],
591    "matches": ["chrome://extensions/*"]
592  }, {
593    "channel": "stable",
594    "contexts": [ "webui_untrusted" ],
595    "matches": [ "chrome-untrusted://api-test/*" ]
596  }],
597  "types": {
598    "internal": true,
599    "channel": "stable",
600    "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
601    "contexts": ["blessed_extension"]
602  },
603  "usb": {
604    "dependencies": ["permission:usb"],
605    "contexts": ["blessed_extension"]
606  },
607  "virtualKeyboard": {
608    "dependencies": ["permission:virtualKeyboard"],
609    "contexts": ["blessed_extension"]
610  },
611  "vpnProvider": {
612    "dependencies": ["permission:vpnProvider"],
613    "contexts": ["blessed_extension"]
614  },
615  "webRequest": {
616    "dependencies": ["permission:webRequest"],
617    "contexts": ["blessed_extension"]
618  },
619  "webRequestInternal": [{
620    "internal": true,
621    "channel": "stable",
622    "contexts": ["blessed_extension"]
623  }, {
624    // webview uses webRequestInternal API.
625    "channel": "stable",
626    "internal": true,
627    "contexts": ["webui"],
628    "matches": [
629      "chrome://add-supervision/*",
630      "chrome://assistant-optin/*",
631      "chrome://cellular-setup/*",
632      "chrome://chrome-signin/*",
633      "chrome://discards/*",
634      "chrome://hats/*",
635      "chrome://home/*",
636      "chrome://mobilesetup/*",
637      "chrome://oobe/*",
638      "chrome://password-change/*",
639      "chrome://lock-reauth/*"
640    ]
641  }],
642  "webViewInternal": [{
643    "internal": true,
644    "dependencies": ["permission:webview"],
645    "contexts": ["blessed_extension"]
646  }, {
647    "internal": true,
648    "channel": "stable",
649    "contexts": ["webui"],
650    "matches": [
651      "chrome://add-supervision/*",
652      "chrome://assistant-optin/*",
653      "chrome://cellular-setup/*",
654      "chrome://chrome-signin/*",
655      "chrome://discards/*",
656      "chrome://hats/*",
657      "chrome://home/*",
658      "chrome://mobilesetup/*",
659      "chrome://oobe/*",
660      "chrome://password-change/*",
661      "chrome://lock-reauth/*"
662    ]
663  }],
664  "webViewRequest": [{
665    "dependencies": ["permission:webview"],
666    "contexts": ["blessed_extension"]
667  }, {
668    "channel": "stable",
669    "contexts": ["webui"],
670    "matches": [
671      "chrome://add-supervision/*",
672      "chrome://assistant-optin/*",
673      "chrome://cellular-setup/*",
674      "chrome://chrome-signin/*",
675      "chrome://discards/*",
676      "chrome://hats/*",
677      "chrome://home/*",
678      "chrome://mobilesetup/*",
679      "chrome://oobe/*"
680    ]
681  }]
682}
683