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