1 # Copyright 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. 4 5 import json 6 7 from extensions_paths import CHROME_EXTENSIONS 8 from third_party.json_schema_compiler.json_parse import OrderedDict 9 from test_file_system import MoveAllTo, MoveTo 10 11 12 CANNED_CHANNELS = OrderedDict([ 13 ('master', 'master'), 14 ('dev', 31), 15 ('beta', 30), 16 ('stable', 29) 17 ]) 18 19 20 CANNED_BRANCHES = OrderedDict([ 21 ('master', 'master'), 22 (31, '1612'), 23 (30, '1599'), 24 (29, '1547'), 25 (28, '1500'), 26 (27, '1453'), 27 (26, '1410'), 28 (25, '1364'), 29 (24, '1312'), 30 (23, '1271'), 31 (22, '1229'), 32 (21, '1180'), 33 (20, '1132'), 34 (19, '1084'), 35 (18, '1025'), 36 (17, '963'), 37 (16, '912'), 38 (15, '874'), 39 (14, '835'), 40 (13, '782'), 41 (12, '742'), 42 (11, '696'), 43 (10, '648'), 44 ( 9, '597'), 45 ( 8, '552'), 46 ( 7, '544'), 47 ( 6, '495'), 48 ( 5, '396'), 49 ]) 50 51 52 CANNED_TEST_FILE_SYSTEM_DATA = MoveTo(CHROME_EXTENSIONS, { 53 'api': { 54 '_api_features.json': json.dumps({ 55 'ref_test': { 'dependencies': ['permission:ref_test'] }, 56 'tester': { 'dependencies': ['permission:tester', 'manifest:tester'] } 57 }), 58 '_manifest_features.json': '{}', 59 '_permission_features.json': '{}' 60 }, 61 'docs': { 62 'templates': { 63 'articles': { 64 'test_article.html': 65 '<h1>hi</h1>you<h2>first</h2><h3>inner</h3><h2>second</h2>' 66 }, 67 'intros': { 68 'test_intro.html': 69 'you<h2>first</h2><h3>inner</h3><h2>second</h2>' 70 }, 71 'json': { 72 'api_availabilities.json': json.dumps({ 73 'master_api': { 74 'channel': 'master' 75 }, 76 'dev_api': { 77 'channel': 'dev' 78 }, 79 'beta_api': { 80 'channel': 'beta' 81 }, 82 'stable_api': { 83 'channel': 'stable', 84 'version': 20 85 } 86 }), 87 'intro_tables.json': json.dumps({ 88 'tester': { 89 'Permissions': [ 90 { 91 'class': 'override', 92 'text': '"tester"' 93 }, 94 { 95 'text': 'is an API for testing things.' 96 } 97 ], 98 'Learn More': [ 99 { 100 'link': 'https://tester.test.com/welcome.html', 101 'text': 'Welcome!' 102 } 103 ] 104 } 105 }), 106 'manifest.json': '{}', 107 'permissions.json': '{}' 108 }, 109 'private': { 110 'intro_tables': { 111 'master_message.html': 'available on master' 112 }, 113 'table_of_contents.html': '<table-of-contents>', 114 } 115 } 116 } 117 }) 118 119 120 _TEST_WHATS_NEW_JSON = { 121 "backgroundpages.to-be-non-persistent": { 122 "type": "additionsToExistingApis", 123 "description": "backgrounds to be non persistent", 124 "version": 22 125 }, 126 "chromeSetting.set-regular-only-scope": { 127 "type": "additionsToExistingApis", 128 "description": "ChromeSetting.set now has a regular_only scope.", 129 "version": 21 130 }, 131 "manifest-v1-deprecated": { 132 "type": "manifestChanges", 133 "description": "Manifest version 1 was deprecated in Chrome 18", 134 "version": 20 135 } 136 } 137 138 139 CANNED_API_FILE_SYSTEM_DATA = MoveAllTo(CHROME_EXTENSIONS, { 140 'master': { 141 'api': { 142 '_api_features.json': json.dumps({ 143 'alarm': { 144 'channel': 'stable' 145 }, 146 'app.window': { 147 'channel': 'stable' 148 }, 149 'browserAction': { 150 'channel': 'stable' 151 }, 152 'contextMenus': { 153 'channel': 'stable' 154 }, 155 'events': { 156 'channel': 'stable' 157 }, 158 'extension': { 159 'channel': 'stable' 160 }, 161 'signedInDevices': { 162 'channel': 'stable' 163 }, 164 'systemInfo.cpu': { 165 'channel': 'stable' 166 }, 167 'systemInfo.stuff': { 168 'channel': 'dev' 169 } 170 }), 171 '_manifest_features.json': json.dumps({ 172 'history': { 173 'channel': 'beta' 174 }, 175 'notifications': { 176 'channel': 'beta' 177 }, 178 'page_action': { 179 'channel': 'stable' 180 }, 181 'runtime': { 182 'channel': 'stable' 183 }, 184 'storage': { 185 'channel': 'beta' 186 }, 187 'sync': { 188 'channel': 'master' 189 }, 190 'web_request': { 191 'channel': 'stable' 192 } 193 }), 194 '_permission_features.json': json.dumps({ 195 'alarms': { 196 'channel': 'stable' 197 }, 198 'bluetooth': { 199 'channel': 'dev' 200 }, 201 'bookmarks': { 202 'channel': 'stable' 203 }, 204 'cookies': { 205 'channel': 'dev' 206 }, 207 'declarativeContent': { 208 'channel': 'master' 209 }, 210 'declarativeWebRequest': [ 211 { 'channel': 'beta', 212 'extension_types': ['extension'] 213 }, 214 { 'channel': 'stable', 215 'extension_types': ['extension'], 216 'whitelist': ['aaa'] 217 }, 218 ], 219 'falseBetaAPI': { 220 'channel': 'beta' 221 }, 222 'systemInfo.display': { 223 'channel': 'stable' 224 }, 225 'masterAPI': { 226 'channel': 'master' 227 } 228 }), 229 'alarm.json': json.dumps([{ 230 'namespace': 'alarm', 231 'description': '<code>alarm</code>' 232 }]), 233 'app_window.json': json.dumps([{ 234 'namespace': 'app.window', 235 'description': '<code>app.window</code>' 236 }]), 237 'browser_action.json': json.dumps([{ 238 'namespace': 'browserAction', 239 'description': '<code>browserAction</code>' 240 }]), 241 'bluetooth.idl': '\n'.join(('//Copyleft Schmopyright', 242 '', 243 '//An IDL description, oh my!', 244 'namespace bluetooth {', 245 ' dictionary Socket {', 246 ' long id;', 247 ' };', 248 '};')), 249 'context_menus.json': json.dumps([{ 250 'namespace': 'contextMenus', 251 'description': '' 252 }]), 253 'json_stable_api.json': json.dumps([{ 254 'namespace': 'jsonStableAPI', 255 'description': 'An API with a predetermined availability.' 256 }]), 257 'idle.json': json.dumps([{'namespace': 'idle', 'description': ''}]), 258 'input_ime.json': json.dumps([{ 259 'namespace': 'input.ime', 260 'description': 'An API that has the potential to cause some trouble.' 261 }]), 262 'menus.json': json.dumps([{'namespace': 'menus', 'description': ''}]), 263 'signed_in_devices.json': json.dumps([{ 264 'namespace': 'signedInDevices', 265 'description': 'Another API that could cause some trouble.' 266 }]), 267 'system_info_stuff.json': json.dumps([{ 268 'namespace': 'systemInfo.stuff', 269 'description': 'Yet another API that could wreck havoc...' 270 }]), 271 'tabs.json': json.dumps([{'namespace': 'tabs', 'description': ''}]), 272 'windows.json': json.dumps([{'namespace': 'windows', 'description': ''}]) 273 }, 274 'docs': { 275 'templates': { 276 'json': { 277 'api_availabilities.json': json.dumps({ 278 'jsonMasterAPI': { 279 'channel': 'master' 280 }, 281 'jsonDevAPI': { 282 'channel': 'dev' 283 }, 284 'jsonBetaAPI': { 285 'channel': 'beta' 286 }, 287 'jsonStableAPI': { 288 'channel': 'stable', 289 'version': 20 290 } 291 }), 292 'intro_tables.json': json.dumps({ 293 'test': [ 294 { 295 'Permissions': 'probably none' 296 } 297 ] 298 }), 299 'manifest.json': '{}', 300 'permissions.json': '{}', 301 'whats_new.json': json.dumps(_TEST_WHATS_NEW_JSON) 302 }, 303 'public': { 304 'apps': { 305 'alarm.html': 'alarm.html', 306 'app_window.html': 'app_window.html', 307 'contextMenus.html': 'contextMenus.html', 308 }, 309 'extensions': { 310 'alarm.html': 'alarm.html', 311 'browserAction.html': 'browserAction.html', 312 'contextMenus.html': 'contextMenus.html', 313 } 314 } 315 } 316 } 317 }, 318 '1612': { 319 'api': { 320 '_api_features.json': json.dumps({ 321 'alarm': { 322 'channel': 'stable' 323 }, 324 'app.window': { 325 'channel': 'stable' 326 }, 327 'browserAction': { 328 'channel': 'stable' 329 }, 330 'events': { 331 'channel': 'master' 332 }, 333 'extension': { 334 'channel': 'stable' 335 }, 336 'systemInfo.cpu': { 337 'channel': 'stable' 338 }, 339 'systemInfo.stuff': { 340 'channel': 'dev' 341 } 342 }), 343 '_manifest_features.json': json.dumps({ 344 'contextMenus': { 345 'channel': 'master' 346 }, 347 'notifications': { 348 'channel': 'beta' 349 }, 350 'page_action': { 351 'channel': 'stable' 352 }, 353 'runtime': { 354 'channel': 'stable' 355 }, 356 'storage': { 357 'channel': 'dev' 358 }, 359 'sync': { 360 'channel': 'master' 361 }, 362 'system_info_display': { 363 'channel': 'stable' 364 }, 365 'web_request': { 366 'channel': 'stable' 367 } 368 }), 369 '_permission_features.json': json.dumps({ 370 'alarms': { 371 'channel': 'stable' 372 }, 373 'appsFirst': { 374 'channel': 'stable', 375 'extension_types': ['extension', 'platform_app'] 376 }, 377 'bluetooth': { 378 'channel': 'dev' 379 }, 380 'bookmarks': { 381 'channel': 'stable' 382 }, 383 'cookies': { 384 'channel': 'dev' 385 }, 386 'declarativeContent': { 387 'channel': 'master' 388 }, 389 'declarativeWebRequest': [ 390 { 'channel': 'beta' }, 391 { 'channel': 'stable', 'whitelist': ['aaa'] } 392 ], 393 'downloads': { 394 'channel': 'beta' 395 } 396 }), 397 'alarm.json': json.dumps([{ 398 'namespace': 'alarm', 399 'description': '<code>alarm</code>' 400 }]), 401 'app_window.json': json.dumps([{ 402 'namespace': 'app.window', 403 'description': '<code>app.window</code>' 404 }]), 405 'browser_action.json': json.dumps([{ 406 'namespace': 'browserAction', 407 'description': '<code>browserAction</code>' 408 }]), 409 'idle.json': json.dumps([{'namespace': 'idle'}]), 410 'input_ime.json': json.dumps([{'namespace': 'input.ime'}]), 411 'menus.json': json.dumps([{'namespace': 'menus'}]), 412 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 413 'windows.json': json.dumps([{'namespace': 'windows'}]) 414 }, 415 'docs': { 416 'templates': { 417 'json': { 418 'api_availabilities.json': json.dumps({ 419 'jsonMasterAPI': { 420 'channel': 'master' 421 }, 422 'jsonDevAPI': { 423 'channel': 'dev' 424 }, 425 'jsonBetaAPI': { 426 'channel': 'beta' 427 }, 428 'jsonStableAPI': { 429 'channel': 'stable', 430 'version': 20 431 } 432 }), 433 'intro_tables.json': json.dumps({ 434 'test': [ 435 { 436 'Permissions': 'probably none' 437 } 438 ] 439 }), 440 'manifest.json': '{}', 441 'permissions.json': '{}', 442 'whats_new.json': json.dumps(_TEST_WHATS_NEW_JSON) 443 }, 444 'public': { 445 'apps': { 446 'alarm.html': 'alarm.html', 447 'app_window.html': 'app_window.html', 448 }, 449 'extensions': { 450 'alarm.html': 'alarm.html', 451 'browserAction.html': 'browserAction.html', 452 } 453 } 454 } 455 } 456 }, 457 '1599': { 458 'api': { 459 '_api_features.json': json.dumps({ 460 'alarm': { 461 'channel': 'stable' 462 }, 463 'app.window': { 464 'channel': 'stable' 465 }, 466 'browserAction': { 467 'channel': 'stable' 468 }, 469 'events': { 470 'channel': 'master' 471 }, 472 'extension': { 473 'channel': 'stable' 474 }, 475 'systemInfo.cpu': { 476 'channel': 'beta' 477 }, 478 'systemInfo.stuff': { 479 'channel': 'dev' 480 } 481 }), 482 '_manifest_features.json': json.dumps({ 483 'contextMenus': { 484 'channel': 'master' 485 }, 486 'notifications': { 487 'channel': 'dev' 488 }, 489 'page_action': { 490 'channel': 'stable' 491 }, 492 'runtime': { 493 'channel': 'stable' 494 }, 495 'storage': { 496 'channel': 'dev' 497 }, 498 'sync': { 499 'channel': 'master' 500 }, 501 'system_info_display': { 502 'channel': 'stable' 503 }, 504 'web_request': { 505 'channel': 'stable' 506 } 507 }), 508 '_permission_features.json': json.dumps({ 509 'alarms': { 510 'channel': 'stable' 511 }, 512 'appsFirst': { 513 'channel': 'stable', 514 'extension_types': ['extension', 'platform_app'] 515 }, 516 'bluetooth': { 517 'channel': 'dev' 518 }, 519 'bookmarks': { 520 'channel': 'stable' 521 }, 522 'cookies': { 523 'channel': 'dev' 524 }, 525 'declarativeContent': { 526 'channel': 'master' 527 }, 528 'declarativeWebRequest': [ 529 { 'channel': 'beta' }, 530 { 'channel': 'stable', 'whitelist': ['aaa'] } 531 ], 532 'downloads': { 533 'channel': 'beta' 534 } 535 }), 536 'alarm.json': json.dumps([{ 537 'namespace': 'alarm', 538 'description': '<code>alarm</code>' 539 }]), 540 'app_window.json': json.dumps([{ 541 'namespace': 'app.window', 542 'description': '<code>app.window</code>' 543 }]), 544 'browser_action.json': json.dumps([{ 545 'namespace': 'browserAction', 546 'description': '<code>browserAction</code>' 547 }]), 548 'idle.json': json.dumps([{'namespace': 'idle'}]), 549 'input_ime.json': json.dumps([{'namespace': 'input.ime'}]), 550 'menus.json': json.dumps([{'namespace': 'menus'}]), 551 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 552 'windows.json': json.dumps([{'namespace': 'windows'}]) 553 }, 554 'docs': { 555 'templates': { 556 'json': { 557 'api_availabilities.json': json.dumps({ 558 'jsonMasterAPI': { 559 'channel': 'master' 560 }, 561 'jsonDevAPI': { 562 'channel': 'dev' 563 }, 564 'jsonBetaAPI': { 565 'channel': 'beta' 566 }, 567 'jsonStableAPI': { 568 'channel': 'stable', 569 'version': 20 570 } 571 }), 572 'intro_tables.json': json.dumps({ 573 'test': [ 574 { 575 'Permissions': 'probably none' 576 } 577 ] 578 }), 579 'manifest.json': '{}', 580 'permissions.json': '{}', 581 'whats_new.json': json.dumps(_TEST_WHATS_NEW_JSON) 582 }, 583 'public': { 584 'apps': { 585 'alarm.html': 'alarm.html', 586 'app_window.html': 'app_window.html', 587 }, 588 'extensions': { 589 'alarm.html': 'alarm.html', 590 'browserAction.html': 'browserAction.html', 591 } 592 } 593 } 594 } 595 }, 596 '1547': { 597 'api': { 598 '_api_features.json': json.dumps({ 599 'alarm': { 600 'channel': 'stable' 601 }, 602 'app.window': { 603 'channel': 'stable' 604 }, 605 'browserAction': { 606 'channel': 'stable' 607 }, 608 'events': { 609 'channel': 'master' 610 }, 611 'extension': { 612 'channel': 'stable' 613 }, 614 'systemInfo.stuff': { 615 'channel': 'dev' 616 } 617 }), 618 '_manifest_features.json': json.dumps({ 619 'contextMenus': { 620 'channel': 'master' 621 }, 622 'notifications': { 623 'channel': 'dev' 624 }, 625 'page_action': { 626 'channel': 'stable' 627 }, 628 'runtime': { 629 'channel': 'stable' 630 }, 631 'storage': { 632 'channel': 'dev' 633 }, 634 'sync': { 635 'channel': 'master' 636 }, 637 'system_info_display': { 638 'channel': 'stable' 639 }, 640 'web_request': { 641 'channel': 'stable' 642 } 643 }), 644 '_permission_features.json': json.dumps({ 645 'alarms': { 646 'channel': 'stable' 647 }, 648 'appsFirst': { 649 'channel': 'stable', 650 'extension_types': ['extension', 'platform_app'] 651 }, 652 'bluetooth': { 653 'channel': 'dev' 654 }, 655 'bookmarks': { 656 'channel': 'stable' 657 }, 658 'cookies': { 659 'channel': 'dev' 660 }, 661 'declarativeContent': { 662 'channel': 'master' 663 }, 664 'declarativeWebRequest': [ 665 { 'channel': 'beta' }, 666 { 'channel': 'stable', 'whitelist': ['aaa'] } 667 ], 668 'downloads': { 669 'channel': 'beta' 670 } 671 }), 672 'alarm.json': json.dumps([{ 673 'namespace': 'alarm', 674 'description': '<code>alarm</code>' 675 }]), 676 'app_window.json': json.dumps([{ 677 'namespace': 'app.window', 678 'description': '<code>app.window</code>' 679 }]), 680 'browser_action.json': json.dumps([{ 681 'namespace': 'browserAction', 682 'description': '<code>browserAction</code>' 683 }]), 684 'idle.json': json.dumps([{'namespace': 'idle'}]), 685 'input_ime.json': json.dumps([{'namespace': 'input.ime'}]), 686 'menus.json': json.dumps([{'namespace': 'menus'}]), 687 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 688 'windows.json': json.dumps([{'namespace': 'windows'}]) 689 }, 690 'docs': { 691 'templates': { 692 'json': { 693 'api_availabilities.json': json.dumps({ 694 'jsonMasterAPI': { 695 'channel': 'master' 696 }, 697 'jsonDevAPI': { 698 'channel': 'dev' 699 }, 700 'jsonBetaAPI': { 701 'channel': 'beta' 702 }, 703 'jsonStableAPI': { 704 'channel': 'stable', 705 'version': 20 706 } 707 }), 708 'intro_tables.json': json.dumps({ 709 'test': [ 710 { 711 'Permissions': 'probably none' 712 } 713 ] 714 }), 715 'manifest.json': '{}', 716 'permissions.json': '{}', 717 'whats_new.json': json.dumps(_TEST_WHATS_NEW_JSON) 718 }, 719 'public': { 720 'apps': { 721 'alarm.html': 'alarm.html', 722 'app_window.html': 'app_window.html', 723 }, 724 'extensions': { 725 'alarm.html': 'alarm.html', 726 'browserAction.html': 'browserAction.html', 727 } 728 } 729 } 730 } 731 }, 732 '1500': { 733 'api': { 734 '_api_features.json': json.dumps({ 735 'alarm': { 736 'channel': 'stable' 737 }, 738 'app.window': { 739 'channel': 'stable' 740 }, 741 'browserAction': { 742 'channel': 'stable' 743 }, 744 'events': { 745 'channel': 'master' 746 }, 747 'extension': { 748 'channel': 'stable' 749 }, 750 'systemInfo.stuff': { 751 'channel': 'dev' 752 } 753 }), 754 '_manifest_features.json': json.dumps({ 755 'contextMenus': { 756 'channel': 'master' 757 }, 758 'notifications': { 759 'channel': 'dev' 760 }, 761 'page_action': { 762 'channel': 'stable' 763 }, 764 'runtime': { 765 'channel': 'stable' 766 }, 767 'storage': { 768 'channel': 'dev' 769 }, 770 'sync': { 771 'channel': 'master' 772 }, 773 'system_info_display': { 774 'channel': 'stable' 775 }, 776 'web_request': { 777 'channel': 'stable' 778 } 779 }), 780 '_permission_features.json': json.dumps({ 781 'alarms': { 782 'channel': 'stable' 783 }, 784 'appsFirst': { 785 'channel': 'stable', 786 'extension_types': ['extension', 'platform_app'] 787 }, 788 'bluetooth': { 789 'channel': 'dev' 790 }, 791 'bookmarks': { 792 'channel': 'stable' 793 }, 794 'cookies': { 795 'channel': 'dev' 796 }, 797 'declarativeContent': { 798 'channel': 'master' 799 }, 800 'declarativeWebRequest': [ 801 { 'channel': 'beta' }, 802 { 'channel': 'stable', 'whitelist': ['aaa'] } 803 ], 804 'downloads': { 805 'channel': 'beta' 806 } 807 }), 808 'alarm.json': json.dumps([{ 809 'namespace': 'alarm', 810 'description': '<code>alarm</code>' 811 }]), 812 'app_window.json': json.dumps([{ 813 'namespace': 'app.window', 814 'description': '<code>app.window</code>' 815 }]), 816 'browser_action.json': json.dumps([{ 817 'namespace': 'browserAction', 818 'description': '<code>browserAction</code>' 819 }]), 820 'idle.json': json.dumps([{'namespace': 'idle'}]), 821 'input_ime.json': json.dumps([{'namespace': 'input.ime'}]), 822 'menus.json': json.dumps([{'namespace': 'menus'}]), 823 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 824 'windows.json': json.dumps([{'namespace': 'windows'}]) 825 }, 826 'docs': { 827 'templates': { 828 'json': { 829 'api_availabilities.json': json.dumps({ 830 'jsonMasterAPI': { 831 'channel': 'master' 832 }, 833 'jsonDevAPI': { 834 'channel': 'dev' 835 }, 836 'jsonBetaAPI': { 837 'channel': 'beta' 838 }, 839 'jsonStableAPI': { 840 'channel': 'stable', 841 'version': 20 842 } 843 }), 844 'intro_tables.json': json.dumps({ 845 'test': [ 846 { 847 'Permissions': 'probably none' 848 } 849 ] 850 }), 851 'manifest.json': '{}', 852 'permissions.json': '{}', 853 'whats_new.json': json.dumps(_TEST_WHATS_NEW_JSON) 854 }, 855 'public': { 856 'apps': { 857 'alarm.html': 'alarm.html', 858 'app_window.html': 'app_window.html', 859 }, 860 'extensions': { 861 'alarm.html': 'alarm.html', 862 'browserAction.html': 'browserAction.html', 863 } 864 } 865 } 866 } 867 }, 868 '1453': { 869 'api': { 870 '_api_features.json': json.dumps({ 871 'alarm': { 872 'channel': 'stable' 873 }, 874 'app.window': { 875 'channel': 'stable' 876 }, 877 'browserAction': { 878 'channel': 'stable' 879 }, 880 'events': { 881 'channel': 'dev' 882 }, 883 'extension': { 884 'channel': 'stable' 885 }, 886 'systemInfo.stuff': { 887 'channel': 'dev' 888 } 889 }), 890 '_manifest_features.json': json.dumps({ 891 'notifications': { 892 'channel': 'dev' 893 }, 894 'page_action': { 895 'channel': 'stable' 896 }, 897 'runtime': { 898 'channel': 'stable' 899 }, 900 'storage': { 901 'channel': 'dev' 902 }, 903 'system_info_display': { 904 'channel': 'stable' 905 }, 906 'web_request': { 907 'channel': 'stable' 908 } 909 }), 910 '_permission_features.json': json.dumps({ 911 'alarms': { 912 'channel': 'stable' 913 }, 914 'appsFirst': { 915 'channel': 'stable', 916 'extension_types': ['extension', 'platform_app'] 917 }, 918 'bluetooth': { 919 'channel': 'dev' 920 }, 921 'bookmarks': { 922 'channel': 'stable' 923 }, 924 'context_menus': { 925 'channel': 'master' 926 }, 927 'declarativeContent': { 928 'channel': 'master' 929 }, 930 'declarativeWebRequest': [ 931 { 'channel': 'beta' }, 932 { 'channel': 'stable', 'whitelist': ['aaa'] } 933 ], 934 'downloads': { 935 'channel': 'dev' 936 } 937 }), 938 'alarm.json': json.dumps([{ 939 'namespace': 'alarm', 940 'description': '<code>alarm</code>' 941 }]), 942 'app_window.json': json.dumps([{ 943 'namespace': 'app.window', 944 'description': '<code>app.window</code>' 945 }]), 946 'browser_action.json': json.dumps([{ 947 'namespace': 'browserAction', 948 'description': '<code>browserAction</code>' 949 }]), 950 'idle.json': json.dumps([{'namespace': 'idle'}]), 951 'input_ime.json': json.dumps([{'namespace': 'input.ime'}]), 952 'menus.json': json.dumps([{'namespace': 'menus'}]), 953 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 954 'windows.json': json.dumps([{'namespace': 'windows'}]) 955 }, 956 'docs': { 957 'templates': { 958 'json': { 959 'api_availabilities.json': json.dumps({ 960 'jsonMasterAPI': { 961 'channel': 'master' 962 }, 963 'jsonDevAPI': { 964 'channel': 'dev' 965 }, 966 'jsonBetaAPI': { 967 'channel': 'beta' 968 }, 969 'jsonStableAPI': { 970 'channel': 'stable', 971 'version': 20 972 } 973 }), 974 'intro_tables.json': json.dumps({ 975 'test': [ 976 { 977 'Permissions': 'probably none' 978 } 979 ] 980 }), 981 'manifest.json': '{}', 982 'permissions.json': '{}', 983 'whats_new.json': json.dumps(_TEST_WHATS_NEW_JSON) 984 }, 985 'public': { 986 'apps': { 987 'alarm.html': 'alarm.html', 988 'app_window.html': 'app_window.html', 989 }, 990 'extensions': { 991 'alarm.html': 'alarm.html', 992 'browserAction.html': 'browserAction.html', 993 } 994 995 } 996 } 997 } 998 }, 999 '1410': { 1000 'api': { 1001 '_manifest_features.json': json.dumps({ 1002 'alarm': { 1003 'channel': 'stable' 1004 }, 1005 'app.window': { 1006 'channel': 'stable' 1007 }, 1008 'browserAction': { 1009 'channel': 'stable' 1010 }, 1011 'events': { 1012 'channel': 'beta' 1013 }, 1014 'notifications': { 1015 'channel': 'dev' 1016 }, 1017 'page_action': { 1018 'channel': 'stable' 1019 }, 1020 'runtime': { 1021 'channel': 'stable' 1022 }, 1023 'web_request': { 1024 'channel': 'stable' 1025 } 1026 }), 1027 '_permission_features.json': json.dumps({ 1028 'alarms': { 1029 'channel': 'stable' 1030 }, 1031 'appsFirst': { 1032 'channel': 'stable', 1033 'extension_types': ['extension', 'platform_app'] 1034 }, 1035 'bluetooth': { 1036 'channel': 'dev' 1037 }, 1038 'bookmarks': { 1039 'channel': 'stable' 1040 }, 1041 'context_menus': { 1042 'channel': 'master' 1043 }, 1044 'declarativeContent': { 1045 'channel': 'master' 1046 }, 1047 'declarativeWebRequest': [ 1048 { 'channel': 'beta' }, 1049 { 'channel': 'stable', 'whitelist': ['aaa'] } 1050 ], 1051 'systemInfo.display': { 1052 'channel': 'stable' 1053 } 1054 }), 1055 'alarm.json': json.dumps([{ 1056 'namespace': 'alarm', 1057 'description': '<code>alarm</code>' 1058 }]), 1059 'app_window.json': json.dumps([{ 1060 'namespace': 'app.window', 1061 'description': '<code>app.window</code>' 1062 }]), 1063 'browser_action.json': json.dumps([{ 1064 'namespace': 'browserAction', 1065 'description': '<code>browserAction</code>' 1066 }]), 1067 'idle.json': json.dumps([{'namespace': 'idle'}]), 1068 'input_ime.json': json.dumps([{'namespace': 'input.ime'}]), 1069 'menus.json': json.dumps([{'namespace': 'menus'}]), 1070 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 1071 'windows.json': json.dumps([{'namespace': 'windows'}]) 1072 } 1073 }, 1074 '1364': { 1075 'api': { 1076 '_manifest_features.json': json.dumps({ 1077 'page_action': { 1078 'channel': 'stable' 1079 }, 1080 'runtime': { 1081 'channel': 'stable' 1082 } 1083 }), 1084 '_permission_features.json': json.dumps({ 1085 'alarms': { 1086 'channel': 'stable' 1087 }, 1088 'appsFirst': { 1089 'channel': 'stable', 1090 'extension_types': ['platform_app'] 1091 }, 1092 'bookmarks': { 1093 'channel': 'stable' 1094 }, 1095 'systemInfo.display': { 1096 'channel': 'stable' 1097 }, 1098 'webRequest': { 1099 'channel': 'stable' 1100 } 1101 }), 1102 'idle.json': json.dumps([{'namespace': 'idle'}]), 1103 'input_ime.json': json.dumps([{'namespace': 'input.ime'}]), 1104 'menus.json': json.dumps([{'namespace': 'menus'}]), 1105 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 1106 'windows.json': json.dumps([{'namespace': 'windows'}]) 1107 } 1108 }, 1109 '1312': { 1110 'api': { 1111 '_manifest_features.json': json.dumps({ 1112 'page_action': { 1113 'channel': 'stable' 1114 }, 1115 'runtime': { 1116 'channel': 'stable' 1117 }, 1118 'web_request': { 1119 'channel': 'stable' 1120 } 1121 }), 1122 '_permission_features.json': json.dumps({ 1123 'alarms': { 1124 'channel': 'stable' 1125 }, 1126 'bookmarks': { 1127 'channel': 'stable' 1128 }, 1129 'systemInfo.display': { 1130 'channel': 'stable' 1131 } 1132 }), 1133 'idle.json': json.dumps([{'namespace': 'idle'}]), 1134 'input_ime.json': json.dumps([{'namespace': 'input.ime'}]), 1135 'menus.json': json.dumps([{'namespace': 'menus'}]), 1136 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 1137 'windows.json': json.dumps([{'namespace': 'windows'}]) 1138 } 1139 }, 1140 '1271': { 1141 'api': { 1142 '_manifest_features.json': json.dumps({ 1143 'page_action': { 1144 'channel': 'stable' 1145 }, 1146 'runtime': { 1147 'channel': 'stable' 1148 }, 1149 'system_info_display': { 1150 'channel': 'stable' 1151 } 1152 }), 1153 '_permission_features.json': json.dumps({ 1154 'alarms': { 1155 'channel': 'beta' 1156 }, 1157 'bookmarks': { 1158 'channel': 'stable' 1159 }, 1160 'webRequest': { 1161 'channel': 'stable' 1162 } 1163 }), 1164 'alarms.idl': '//copy\n\n//desc\nnamespace alarms {}', 1165 'idle.json': json.dumps([{'namespace': 'idle'}]), 1166 'input_ime.json': json.dumps([{'namespace': 'input.ime'}]), 1167 'menus.json': json.dumps([{'namespace': 'menus'}]), 1168 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 1169 'windows.json': json.dumps([{'namespace': 'windows'}]) 1170 } 1171 }, 1172 '1229': { 1173 'api': { 1174 '_manifest_features.json': json.dumps({ 1175 'page_action': { 1176 'channel': 'stable' 1177 }, 1178 'runtime': { 1179 'channel': 'stable' 1180 }, 1181 'web_request': { 1182 'channel': 'stable' 1183 } 1184 }), 1185 '_permission_features.json': json.dumps({ 1186 'bookmarks': { 1187 'channel': 'stable' 1188 }, 1189 'systemInfo.display': { 1190 'channel': 'beta' 1191 } 1192 }), 1193 'alarms.idl': '//copy\n\n//desc\nnamespace alarms {}', 1194 'idle.json': json.dumps([{'namespace': 'idle'}]), 1195 'input_ime.json': json.dumps([{'namespace': 'input.ime'}]), 1196 'menus.json': json.dumps([{'namespace': 'menus'}]), 1197 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 1198 } 1199 }, 1200 '1180': { 1201 'api': { 1202 '_manifest_features.json': json.dumps({ 1203 'page_action': { 1204 'channel': 'stable' 1205 }, 1206 'runtime': { 1207 'channel': 'stable' 1208 } 1209 }), 1210 '_permission_features.json': json.dumps({ 1211 'bookmarks': { 1212 'channel': 'stable' 1213 }, 1214 'webRequest': { 1215 'channel': 'stable' 1216 } 1217 }), 1218 'bookmarks.json': json.dumps([{'namespace': 'bookmarks'}]), 1219 'idle.json': json.dumps([{'namespace': 'idle'}]), 1220 'input_ime.json': json.dumps([{'namespace': 'input.ime'}]), 1221 'menus.json': json.dumps([{'namespace': 'menus'}]), 1222 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 1223 } 1224 }, 1225 '1132': { 1226 'api': { 1227 '_manifest_features.json': json.dumps({ 1228 'bookmarks': { 1229 'channel': 'master' 1230 }, 1231 'page_action': { 1232 'channel': 'stable' 1233 } 1234 }), 1235 '_permission_features.json': json.dumps({ 1236 'webRequest': { 1237 'channel': 'stable' 1238 } 1239 }), 1240 'bookmarks.json': json.dumps([{'namespace': 'bookmarks'}]), 1241 'idle.json': json.dumps([{'namespace': 'idle'}]), 1242 'input.ime.json': json.dumps([{'namespace': 'input.ime'}]), 1243 'menus.json': json.dumps([{'namespace': 'menus'}]), 1244 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 1245 } 1246 }, 1247 '1084': { 1248 'api': { 1249 '_manifest_features.json': json.dumps({ 1250 'contents': 'nothing of interest here,really' 1251 }), 1252 'bookmarks.json': json.dumps([{'namespace': 'bookmarks'}]), 1253 'idle.json': json.dumps([{'namespace': 'idle'}]), 1254 'input.ime.json': json.dumps([{'namespace': 'input.ime'}]), 1255 'menus.json': json.dumps([{'namespace': 'menus'}]), 1256 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 1257 'pageAction.json': json.dumps([{'namespace': 'pageAction'}]), 1258 'webRequest.json': json.dumps([{'namespace': 'webRequest'}]) 1259 } 1260 }, 1261 '1025': { 1262 'api': { 1263 'bookmarks.json': json.dumps([{'namespace': 'bookmarks'}]), 1264 'idle.json': json.dumps([{'namespace': 'idle'}]), 1265 'input.ime.json': json.dumps([{'namespace': 'input.ime'}]), 1266 'menus.json': json.dumps([{'namespace': 'menus'}]), 1267 'tabs.json': json.dumps([{'namespace': 'tabs'}]), 1268 'pageAction.json': json.dumps([{'namespace': 'pageAction'}]), 1269 'webRequest.json': json.dumps([{'namespace': 'webRequest'}]) 1270 } 1271 }, 1272 '963': { 1273 'api': { 1274 'extension_api.json': json.dumps([ 1275 { 1276 'namespace': 'idle' 1277 }, 1278 { 1279 'namespace': 'menus' 1280 }, 1281 { 1282 'namespace': 'pageAction' 1283 }, 1284 { 1285 'namespace': 'webRequest' 1286 } 1287 ]) 1288 } 1289 }, 1290 '912': { 1291 'api': { 1292 'extension_api.json': json.dumps([ 1293 { 1294 'namespace': 'idle' 1295 }, 1296 { 1297 'namespace': 'menus' 1298 }, 1299 { 1300 'namespace': 'pageAction' 1301 }, 1302 { 1303 'namespace': 'experimental.webRequest' 1304 } 1305 ]) 1306 } 1307 }, 1308 '874': { 1309 'api': { 1310 'extension_api.json': json.dumps([ 1311 { 1312 'namespace': 'idle' 1313 }, 1314 { 1315 'namespace': 'menus' 1316 }, 1317 { 1318 'namespace': 'pageAction' 1319 } 1320 ]) 1321 } 1322 }, 1323 '835': { 1324 'api': { 1325 'extension_api.json': json.dumps([ 1326 { 1327 'namespace': 'idle' 1328 }, 1329 { 1330 'namespace': 'menus' 1331 }, 1332 { 1333 'namespace': 'pageAction' 1334 } 1335 ]) 1336 } 1337 }, 1338 '782': { 1339 'api': { 1340 'extension_api.json': json.dumps([ 1341 { 1342 'namespace': 'idle' 1343 }, 1344 { 1345 'namespace': 'menus' 1346 }, 1347 { 1348 'namespace': 'pageAction' 1349 } 1350 ]) 1351 } 1352 }, 1353 '742': { 1354 'api': { 1355 'extension_api.json': json.dumps([ 1356 { 1357 'namespace': 'idle' 1358 }, 1359 { 1360 'namespace': 'menus' 1361 }, 1362 { 1363 'namespace': 'pageAction' 1364 } 1365 ]) 1366 } 1367 }, 1368 '696': { 1369 'api': { 1370 'extension_api.json': json.dumps([ 1371 { 1372 'namespace': 'idle' 1373 }, 1374 { 1375 'namespace': 'menus' 1376 }, 1377 { 1378 'namespace': 'pageAction' 1379 } 1380 ]) 1381 } 1382 }, 1383 '648': { 1384 'api': { 1385 'extension_api.json': json.dumps([ 1386 { 1387 'namespace': 'idle' 1388 }, 1389 { 1390 'namespace': 'menus' 1391 }, 1392 { 1393 'namespace': 'pageAction' 1394 } 1395 ]) 1396 } 1397 }, 1398 '597': { 1399 'api': { 1400 'extension_api.json': json.dumps([ 1401 { 1402 'namespace': 'idle' 1403 }, 1404 { 1405 'namespace': 'menus' 1406 }, 1407 { 1408 'namespace': 'pageAction' 1409 } 1410 ]) 1411 } 1412 }, 1413 '552': { 1414 'api': { 1415 'extension_api.json': json.dumps([ 1416 { 1417 'namespace': 'idle' 1418 }, 1419 { 1420 'namespace': 'menus' 1421 }, 1422 { 1423 'namespace': 'pageAction' 1424 } 1425 ]) 1426 } 1427 }, 1428 '544': { 1429 'api': { 1430 'extension_api.json': json.dumps([ 1431 { 1432 'namespace': 'idle' 1433 }, 1434 { 1435 'namespace': 'menus' 1436 } 1437 ]) 1438 } 1439 }, 1440 '495': { 1441 'api': { 1442 'extension_api.json': json.dumps([ 1443 { 1444 'namespace': 'idle' 1445 }, 1446 { 1447 'namespace': 'menus' 1448 } 1449 ]) 1450 } 1451 }, 1452 '396': { 1453 'api': { 1454 'extension_api.json': json.dumps([ 1455 { 1456 'namespace': 'idle' 1457 }, 1458 { 1459 'namespace': 'experimental.menus' 1460 } 1461 ]) 1462 } 1463 } 1464 }) 1465