Home | History | Annotate | Download | only in test_data
      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   ('trunk', 'trunk'),
     14   ('dev', 28),
     15   ('beta', 27),
     16   ('stable', 26)
     17 ])
     18 
     19 
     20 CANNED_BRANCHES = OrderedDict([
     21   ('trunk', 'trunk'),
     22   (28, '1500'),
     23   (27, '1453'),
     24   (26, '1410'),
     25   (25, '1364'),
     26   (24, '1312'),
     27   (23, '1271'),
     28   (22, '1229'),
     29   (21, '1180'),
     30   (20, '1132'),
     31   (19, '1084'),
     32   (18, '1025'),
     33   (17, '963'),
     34   (16, '912'),
     35   (15, '874'),
     36   (14, '835'),
     37   (13, '782'),
     38   (12, '742'),
     39   (11, '696'),
     40   (10, '648'),
     41   ( 9, '597'),
     42   ( 8, '552'),
     43   ( 7, '544'),
     44   ( 6, '495'),
     45   ( 5, '396'),
     46 ])
     47 
     48 
     49 CANNED_TEST_FILE_SYSTEM_DATA = MoveTo(CHROME_EXTENSIONS, {
     50   'api': {
     51     '_api_features.json': json.dumps({
     52       'ref_test': { 'dependencies': ['permission:ref_test'] },
     53       'tester': { 'dependencies': ['permission:tester', 'manifest:tester'] }
     54     }),
     55     '_manifest_features.json': '{}',
     56     '_permission_features.json': '{}'
     57   },
     58   'docs': {
     59     'templates': {
     60       'articles': {
     61         'test_article.html':
     62             '<h1>hi</h1>you<h2>first</h2><h3>inner</h3><h2>second</h2>'
     63       },
     64       'intros': {
     65         'test_intro.html':
     66             'you<h2>first</h2><h3>inner</h3><h2>second</h2>'
     67       },
     68       'json': {
     69         'api_availabilities.json': json.dumps({
     70           'trunk_api': {
     71             'channel': 'trunk'
     72           },
     73           'dev_api': {
     74             'channel': 'dev'
     75           },
     76           'beta_api': {
     77             'channel': 'beta'
     78           },
     79           'stable_api': {
     80             'channel': 'stable',
     81             'version': 20
     82           }
     83         }),
     84         'intro_tables.json': json.dumps({
     85           'tester': {
     86             'Permissions': [
     87               {
     88                 'class': 'override',
     89                 'text': '"tester"'
     90               },
     91               {
     92                 'text': 'is an API for testing things.'
     93               }
     94             ],
     95             'Learn More': [
     96               {
     97                 'link': 'https://tester.test.com/welcome.html',
     98                 'text': 'Welcome!'
     99               }
    100             ]
    101           }
    102         }),
    103         'manifest.json': '{}',
    104         'permissions.json': '{}'
    105       },
    106       'private': {
    107         'intro_tables': {
    108           'trunk_message.html': 'available on trunk'
    109         },
    110         'table_of_contents.html': '<table-of-contents>',
    111       }
    112     }
    113   }
    114 })
    115 
    116 
    117 _TEST_WHATS_NEW_JSON = {
    118   "backgroundpages.to-be-non-persistent": {
    119     "type": "additionsToExistingApis",
    120     "description": "backgrounds to be non persistent",
    121     "version": 22
    122   },
    123   "chromeSetting.set-regular-only-scope": {
    124     "type": "additionsToExistingApis",
    125     "description": "ChromeSetting.set now has a regular_only scope.",
    126     "version": 21
    127   },
    128   "manifest-v1-deprecated": {
    129     "type": "manifestChanges",
    130     "description": "Manifest version 1 was deprecated in Chrome 18",
    131     "version": 20
    132   }
    133 }
    134 
    135 
    136 CANNED_API_FILE_SYSTEM_DATA = MoveAllTo(CHROME_EXTENSIONS, {
    137   'trunk': {
    138     'api': {
    139       '_api_features.json': json.dumps({
    140         'alarm': {
    141           'channel': 'stable'
    142         },
    143         'app.window': {
    144           'channel': 'stable'
    145         },
    146         'browserAction': {
    147           'channel': 'stable'
    148         },
    149         'contextMenus': {
    150           'channel': 'stable'
    151         },
    152         'events': {
    153           'channel': 'stable'
    154         },
    155         'extension': {
    156           'channel': 'stable'
    157         },
    158         'systemInfo.cpu': {
    159           'channel': 'stable'
    160         },
    161         'systemInfo.stuff': {
    162           'channel': 'dev'
    163         }
    164       }),
    165       '_manifest_features.json': json.dumps({
    166         'history': {
    167           'channel': 'beta'
    168         },
    169         'notifications': {
    170           'channel': 'beta'
    171         },
    172         'page_action': {
    173           'channel': 'stable'
    174         },
    175         'runtime': {
    176           'channel': 'stable'
    177         },
    178         'storage': {
    179           'channel': 'beta'
    180         },
    181         'sync': {
    182           'channel': 'trunk'
    183         },
    184         'web_request': {
    185           'channel': 'stable'
    186         }
    187       }),
    188       '_permission_features.json': json.dumps({
    189         'alarms': {
    190           'channel': 'stable'
    191         },
    192         'bluetooth': {
    193           'channel': 'dev'
    194         },
    195         'bookmarks': {
    196           'channel': 'stable'
    197         },
    198         'cookies': {
    199           'channel': 'dev'
    200         },
    201         'declarativeContent': {
    202           'channel': 'trunk'
    203         },
    204         'declarativeWebRequest': [
    205           { 'channel': 'beta',
    206             'extension_types': ['extension']
    207           },
    208           { 'channel': 'stable',
    209             'extension_types': ['extension'],
    210             'whitelist': ['aaa']
    211           },
    212         ],
    213         'falseBetaAPI': {
    214           'channel': 'beta'
    215         },
    216         'systemInfo.display': {
    217           'channel': 'stable'
    218         },
    219         'trunkAPI': {
    220           'channel': 'trunk'
    221         }
    222       }),
    223       'alarm.json': json.dumps([{
    224         'namespace': 'alarm',
    225         'description': '<code>alarm</code>'
    226       }]),
    227       'app_window.json': json.dumps([{
    228         'namespace': 'app.window',
    229         'description': '<code>app.window</code>'
    230       }]),
    231       'browser_action.json': json.dumps([{
    232         'namespace': 'browserAction',
    233         'description': '<code>browserAction</code>'
    234       }]),
    235       'bluetooth.idl': '\n'.join(('//Copyleft Schmopyright',
    236                                   '',
    237                                   '//An IDL description, oh my!',
    238                                   'namespace bluetooth {',
    239                                   '  dictionary Socket {',
    240                                   '    long id;',
    241                                   '  };',
    242                                   '};')),
    243       'context_menus.json': json.dumps([{
    244         'namespace': 'contextMenus',
    245         'description': ''
    246       }]),
    247       'json_stable_api.json': json.dumps([{
    248         'namespace': 'jsonStableAPI',
    249         'description': 'An API with a predetermined availability.'
    250       }]),
    251       'idle.json': json.dumps([{'namespace': 'idle', 'description': ''}]),
    252       'input_ime.json': json.dumps([{
    253         'namespace': 'input.ime',
    254         'description': 'An API that has the potential to cause some trouble.'
    255       }]),
    256       'menus.json': json.dumps([{'namespace': 'menus', 'description': ''}]),
    257       'tabs.json': json.dumps([{'namespace': 'tabs', 'description': ''}]),
    258       'windows.json': json.dumps([{'namespace': 'windows', 'description': ''}])
    259     },
    260     'docs': {
    261       'templates': {
    262         'json': {
    263           'api_availabilities.json': json.dumps({
    264             'jsonTrunkAPI': {
    265               'channel': 'trunk'
    266             },
    267             'jsonDevAPI': {
    268               'channel': 'dev'
    269             },
    270             'jsonBetaAPI': {
    271               'channel': 'beta'
    272             },
    273             'jsonStableAPI': {
    274               'channel': 'stable',
    275               'version': 20
    276             }
    277           }),
    278           'intro_tables.json': json.dumps({
    279             'test': [
    280               {
    281                 'Permissions': 'probably none'
    282               }
    283             ]
    284           }),
    285           'manifest.json': '{}',
    286           'permissions.json': '{}',
    287           'whats_new.json': json.dumps(_TEST_WHATS_NEW_JSON)
    288         },
    289         'public': {
    290           'apps': {
    291             'alarm.html': 'alarm.html',
    292             'app_window.html': 'app_window.html',
    293             'contextMenus.html': 'contextMenus.html',
    294           },
    295           'extensions': {
    296             'alarm.html': 'alarm.html',
    297             'browserAction.html': 'browserAction.html',
    298             'contextMenus.html': 'contextMenus.html',
    299           }
    300         }
    301       }
    302     }
    303   },
    304   '1500': {
    305     'api': {
    306       '_api_features.json': json.dumps({
    307         'alarm': {
    308           'channel': 'stable'
    309         },
    310         'app.window': {
    311           'channel': 'stable'
    312         },
    313         'browserAction': {
    314           'channel': 'stable'
    315         },
    316         'events': {
    317           'channel': 'trunk'
    318         },
    319         'extension': {
    320           'channel': 'stable'
    321         },
    322         'systemInfo.cpu': {
    323           'channel': 'stable'
    324         },
    325         'systemInfo.stuff': {
    326           'channel': 'dev'
    327         }
    328       }),
    329       '_manifest_features.json': json.dumps({
    330         'contextMenus': {
    331           'channel': 'trunk'
    332         },
    333         'notifications': {
    334           'channel': 'beta'
    335         },
    336         'page_action': {
    337           'channel': 'stable'
    338         },
    339         'runtime': {
    340           'channel': 'stable'
    341         },
    342         'storage': {
    343           'channel': 'dev'
    344         },
    345         'sync': {
    346           'channel': 'trunk'
    347         },
    348         'system_info_display': {
    349           'channel': 'stable'
    350         },
    351         'web_request': {
    352           'channel': 'stable'
    353         }
    354       }),
    355       '_permission_features.json': json.dumps({
    356         'alarms': {
    357           'channel': 'stable'
    358         },
    359         'bluetooth': {
    360           'channel': 'dev'
    361         },
    362         'bookmarks': {
    363           'channel': 'stable'
    364         },
    365         'cookies': {
    366           'channel': 'dev'
    367         },
    368         'declarativeContent': {
    369           'channel': 'trunk'
    370         },
    371         'declarativeWebRequest': [
    372           { 'channel': 'beta' },
    373           { 'channel': 'stable', 'whitelist': ['aaa'] }
    374         ],
    375         'downloads': {
    376           'channel': 'beta'
    377         }
    378       }),
    379       'alarm.json': json.dumps([{
    380         'namespace': 'alarm',
    381         'description': '<code>alarm</code>'
    382       }]),
    383       'app_window.json': json.dumps([{
    384         'namespace': 'app.window',
    385         'description': '<code>app.window</code>'
    386       }]),
    387       'browser_action.json': json.dumps([{
    388         'namespace': 'browserAction',
    389         'description': '<code>browserAction</code>'
    390       }]),
    391       'idle.json': json.dumps([{'namespace': 'idle'}]),
    392       'input_ime.json': json.dumps([{'namespace': 'input.ime'}]),
    393       'menus.json': json.dumps([{'namespace': 'menus'}]),
    394       'tabs.json': json.dumps([{'namespace': 'tabs'}]),
    395       'windows.json': json.dumps([{'namespace': 'windows'}])
    396     },
    397     'docs': {
    398       'templates': {
    399         'json': {
    400           'api_availabilities.json': json.dumps({
    401             'jsonTrunkAPI': {
    402               'channel': 'trunk'
    403             },
    404             'jsonDevAPI': {
    405               'channel': 'dev'
    406             },
    407             'jsonBetaAPI': {
    408               'channel': 'beta'
    409             },
    410             'jsonStableAPI': {
    411               'channel': 'stable',
    412               'version': 20
    413             }
    414           }),
    415           'intro_tables.json': json.dumps({
    416             'test': [
    417               {
    418                 'Permissions': 'probably none'
    419               }
    420             ]
    421           }),
    422           'manifest.json': '{}',
    423           'permissions.json': '{}',
    424           'whats_new.json': json.dumps(_TEST_WHATS_NEW_JSON)
    425         },
    426         'public': {
    427           'apps': {
    428             'alarm.html': 'alarm.html',
    429             'app_window.html': 'app_window.html',
    430           },
    431           'extensions': {
    432             'alarm.html': 'alarm.html',
    433             'browserAction.html': 'browserAction.html',
    434           }
    435         }
    436       }
    437     }
    438   },
    439   '1453': {
    440     'api': {
    441       '_api_features.json': json.dumps({
    442         'alarm': {
    443           'channel': 'stable'
    444         },
    445         'app.window': {
    446           'channel': 'stable'
    447         },
    448         'browserAction': {
    449           'channel': 'stable'
    450         },
    451         'events': {
    452           'channel': 'dev'
    453         },
    454         'extension': {
    455           'channel': 'stable'
    456         },
    457         'systemInfo.cpu': {
    458           'channel': 'stable'
    459         },
    460         'systemInfo.stuff': {
    461           'channel': 'dev'
    462         }
    463       }),
    464       '_manifest_features.json': json.dumps({
    465         'notifications': {
    466           'channel': 'dev'
    467         },
    468         'page_action': {
    469           'channel': 'stable'
    470         },
    471         'runtime': {
    472           'channel': 'stable'
    473         },
    474         'storage': {
    475           'channel': 'dev'
    476         },
    477         'system_info_display': {
    478           'channel': 'stable'
    479         },
    480         'web_request': {
    481           'channel': 'stable'
    482         }
    483       }),
    484       '_permission_features.json': json.dumps({
    485         'alarms': {
    486           'channel': 'stable'
    487         },
    488         'bluetooth': {
    489           'channel': 'dev'
    490         },
    491         'bookmarks': {
    492           'channel': 'stable'
    493         },
    494         'context_menus': {
    495           'channel': 'trunk'
    496         },
    497         'declarativeContent': {
    498           'channel': 'trunk'
    499         },
    500         'declarativeWebRequest': [
    501           { 'channel': 'beta' },
    502           { 'channel': 'stable', 'whitelist': ['aaa'] }
    503         ],
    504         'downloads': {
    505           'channel': 'dev'
    506         }
    507       }),
    508       'alarm.json': json.dumps([{
    509         'namespace': 'alarm',
    510         'description': '<code>alarm</code>'
    511       }]),
    512       'app_window.json': json.dumps([{
    513         'namespace': 'app.window',
    514         'description': '<code>app.window</code>'
    515       }]),
    516       'browser_action.json': json.dumps([{
    517         'namespace': 'browserAction',
    518         'description': '<code>browserAction</code>'
    519       }]),
    520       'idle.json': json.dumps([{'namespace': 'idle'}]),
    521       'input_ime.json': json.dumps([{'namespace': 'input.ime'}]),
    522       'menus.json': json.dumps([{'namespace': 'menus'}]),
    523       'tabs.json': json.dumps([{'namespace': 'tabs'}]),
    524       'windows.json': json.dumps([{'namespace': 'windows'}])
    525     },
    526     'docs': {
    527       'templates': {
    528         'json': {
    529           'api_availabilities.json': json.dumps({
    530             'jsonTrunkAPI': {
    531               'channel': 'trunk'
    532             },
    533             'jsonDevAPI': {
    534               'channel': 'dev'
    535             },
    536             'jsonBetaAPI': {
    537               'channel': 'beta'
    538             },
    539             'jsonStableAPI': {
    540               'channel': 'stable',
    541               'version': 20
    542             }
    543           }),
    544           'intro_tables.json': json.dumps({
    545             'test': [
    546               {
    547                 'Permissions': 'probably none'
    548               }
    549             ]
    550           }),
    551           'manifest.json': '{}',
    552           'permissions.json': '{}',
    553           'whats_new.json': json.dumps(_TEST_WHATS_NEW_JSON)
    554         },
    555         'public': {
    556           'apps': {
    557             'alarm.html': 'alarm.html',
    558             'app_window.html': 'app_window.html',
    559           },
    560           'extensions': {
    561             'alarm.html': 'alarm.html',
    562             'browserAction.html': 'browserAction.html',
    563           }
    564 
    565         }
    566       }
    567     }
    568   },
    569   '1410': {
    570     'api': {
    571       '_manifest_features.json': json.dumps({
    572         'alarm': {
    573           'channel': 'stable'
    574         },
    575         'app.window': {
    576           'channel': 'stable'
    577         },
    578         'browserAction': {
    579           'channel': 'stable'
    580         },
    581         'events': {
    582           'channel': 'beta'
    583         },
    584         'notifications': {
    585           'channel': 'dev'
    586         },
    587         'page_action': {
    588           'channel': 'stable'
    589         },
    590         'runtime': {
    591           'channel': 'stable'
    592         },
    593         'web_request': {
    594           'channel': 'stable'
    595         }
    596       }),
    597       '_permission_features.json': json.dumps({
    598         'alarms': {
    599           'channel': 'stable'
    600         },
    601         'bluetooth': {
    602           'channel': 'dev'
    603         },
    604         'bookmarks': {
    605           'channel': 'stable'
    606         },
    607         'context_menus': {
    608           'channel': 'trunk'
    609         },
    610         'declarativeContent': {
    611           'channel': 'trunk'
    612         },
    613         'declarativeWebRequest': [
    614           { 'channel': 'beta' },
    615           { 'channel': 'stable', 'whitelist': ['aaa'] }
    616         ],
    617         'systemInfo.display': {
    618           'channel': 'stable'
    619         }
    620       }),
    621       'alarm.json': json.dumps([{
    622         'namespace': 'alarm',
    623         'description': '<code>alarm</code>'
    624       }]),
    625       'app_window.json': json.dumps([{
    626         'namespace': 'app.window',
    627         'description': '<code>app.window</code>'
    628       }]),
    629       'browser_action.json': json.dumps([{
    630         'namespace': 'browserAction',
    631         'description': '<code>browserAction</code>'
    632       }]),
    633       'idle.json': json.dumps([{'namespace': 'idle'}]),
    634       'input_ime.json': json.dumps([{'namespace': 'input.ime'}]),
    635       'menus.json': json.dumps([{'namespace': 'menus'}]),
    636       'tabs.json': json.dumps([{'namespace': 'tabs'}]),
    637       'windows.json': json.dumps([{'namespace': 'windows'}])
    638     }
    639   },
    640   '1364': {
    641     'api': {
    642       '_manifest_features.json': json.dumps({
    643         'page_action': {
    644           'channel': 'stable'
    645         },
    646         'runtime': {
    647           'channel': 'stable'
    648         }
    649       }),
    650       '_permission_features.json': json.dumps({
    651         'alarms': {
    652           'channel': 'stable'
    653         },
    654         'bookmarks': {
    655           'channel': 'stable'
    656         },
    657         'systemInfo.display': {
    658           'channel': 'stable'
    659         },
    660         'webRequest': {
    661           'channel': 'stable'
    662         }
    663       }),
    664       'idle.json': json.dumps([{'namespace': 'idle'}]),
    665       'input_ime.json': json.dumps([{'namespace': 'input.ime'}]),
    666       'menus.json': json.dumps([{'namespace': 'menus'}]),
    667       'tabs.json': json.dumps([{'namespace': 'tabs'}]),
    668       'windows.json': json.dumps([{'namespace': 'windows'}])
    669     }
    670   },
    671   '1312': {
    672     'api': {
    673       '_manifest_features.json': json.dumps({
    674         'page_action': {
    675           'channel': 'stable'
    676         },
    677         'runtime': {
    678           'channel': 'stable'
    679         },
    680         'web_request': {
    681           'channel': 'stable'
    682         }
    683       }),
    684       '_permission_features.json': json.dumps({
    685         'alarms': {
    686           'channel': 'stable'
    687         },
    688         'bookmarks': {
    689           'channel': 'stable'
    690         },
    691         'systemInfo.display': {
    692           'channel': 'stable'
    693         }
    694       }),
    695       'idle.json': json.dumps([{'namespace': 'idle'}]),
    696       'input_ime.json': json.dumps([{'namespace': 'input.ime'}]),
    697       'menus.json': json.dumps([{'namespace': 'menus'}]),
    698       'tabs.json': json.dumps([{'namespace': 'tabs'}]),
    699       'windows.json': json.dumps([{'namespace': 'windows'}])
    700     }
    701   },
    702   '1271': {
    703     'api': {
    704       '_manifest_features.json': json.dumps({
    705         'page_action': {
    706           'channel': 'stable'
    707         },
    708         'runtime': {
    709           'channel': 'stable'
    710         },
    711         'system_info_display': {
    712           'channel': 'stable'
    713         }
    714       }),
    715       '_permission_features.json': json.dumps({
    716         'alarms': {
    717           'channel': 'beta'
    718         },
    719         'bookmarks': {
    720           'channel': 'stable'
    721         },
    722         'webRequest': {
    723           'channel': 'stable'
    724         }
    725       }),
    726       'alarms.idl': '//copy\n\n//desc\nnamespace alarms {}',
    727       'idle.json': json.dumps([{'namespace': 'idle'}]),
    728       'input_ime.json': json.dumps([{'namespace': 'input.ime'}]),
    729       'menus.json': json.dumps([{'namespace': 'menus'}]),
    730       'tabs.json': json.dumps([{'namespace': 'tabs'}]),
    731       'windows.json': json.dumps([{'namespace': 'windows'}])
    732     }
    733   },
    734   '1229': {
    735     'api': {
    736       '_manifest_features.json': json.dumps({
    737         'page_action': {
    738           'channel': 'stable'
    739         },
    740         'runtime': {
    741           'channel': 'stable'
    742         },
    743         'web_request': {
    744           'channel': 'stable'
    745         }
    746       }),
    747       '_permission_features.json': json.dumps({
    748         'bookmarks': {
    749           'channel': 'stable'
    750         },
    751         'systemInfo.display': {
    752           'channel': 'beta'
    753         }
    754       }),
    755       'alarms.idl': '//copy\n\n//desc\nnamespace alarms {}',
    756       'idle.json': json.dumps([{'namespace': 'idle'}]),
    757       'input_ime.json': json.dumps([{'namespace': 'input.ime'}]),
    758       'menus.json': json.dumps([{'namespace': 'menus'}]),
    759       'tabs.json': json.dumps([{'namespace': 'tabs'}]),
    760     }
    761   },
    762   '1180': {
    763     'api': {
    764       '_manifest_features.json': json.dumps({
    765         'page_action': {
    766           'channel': 'stable'
    767         },
    768         'runtime': {
    769           'channel': 'stable'
    770         }
    771       }),
    772       '_permission_features.json': json.dumps({
    773         'bookmarks': {
    774           'channel': 'stable'
    775         },
    776         'webRequest': {
    777           'channel': 'stable'
    778         }
    779       }),
    780       'bookmarks.json': json.dumps([{'namespace': 'bookmarks'}]),
    781       'idle.json': json.dumps([{'namespace': 'idle'}]),
    782       'input_ime.json': json.dumps([{'namespace': 'input.ime'}]),
    783       'menus.json': json.dumps([{'namespace': 'menus'}]),
    784       'tabs.json': json.dumps([{'namespace': 'tabs'}]),
    785     }
    786   },
    787   '1132': {
    788     'api': {
    789       '_manifest_features.json': json.dumps({
    790         'bookmarks': {
    791           'channel': 'trunk'
    792         },
    793         'page_action': {
    794           'channel': 'stable'
    795         }
    796       }),
    797       '_permission_features.json': json.dumps({
    798         'webRequest': {
    799           'channel': 'stable'
    800         }
    801       }),
    802       'bookmarks.json': json.dumps([{'namespace': 'bookmarks'}]),
    803       'idle.json': json.dumps([{'namespace': 'idle'}]),
    804       'input.ime.json': json.dumps([{'namespace': 'input.ime'}]),
    805       'menus.json': json.dumps([{'namespace': 'menus'}]),
    806       'tabs.json': json.dumps([{'namespace': 'tabs'}]),
    807     }
    808   },
    809   '1084': {
    810     'api': {
    811       '_manifest_features.json': json.dumps({
    812         'contents': 'nothing of interest here,really'
    813       }),
    814       'bookmarks.json': json.dumps([{'namespace': 'bookmarks'}]),
    815       'idle.json': json.dumps([{'namespace': 'idle'}]),
    816       'input.ime.json': json.dumps([{'namespace': 'input.ime'}]),
    817       'menus.json': json.dumps([{'namespace': 'menus'}]),
    818       'tabs.json': json.dumps([{'namespace': 'tabs'}]),
    819       'pageAction.json': json.dumps([{'namespace': 'pageAction'}]),
    820       'webRequest.json': json.dumps([{'namespace': 'webRequest'}])
    821     }
    822   },
    823   '1025': {
    824     'api': {
    825       'bookmarks.json': json.dumps([{'namespace': 'bookmarks'}]),
    826       'idle.json': json.dumps([{'namespace': 'idle'}]),
    827       'input.ime.json': json.dumps([{'namespace': 'input.ime'}]),
    828       'menus.json': json.dumps([{'namespace': 'menus'}]),
    829       'tabs.json': json.dumps([{'namespace': 'tabs'}]),
    830       'pageAction.json': json.dumps([{'namespace': 'pageAction'}]),
    831       'webRequest.json': json.dumps([{'namespace': 'webRequest'}])
    832     }
    833   },
    834   '963': {
    835     'api': {
    836       'extension_api.json': json.dumps([
    837         {
    838           'namespace': 'idle'
    839         },
    840         {
    841           'namespace': 'menus'
    842         },
    843         {
    844           'namespace': 'pageAction'
    845         },
    846         {
    847           'namespace': 'webRequest'
    848         }
    849       ])
    850     }
    851   },
    852   '912': {
    853     'api': {
    854       'extension_api.json': json.dumps([
    855         {
    856           'namespace': 'idle'
    857         },
    858         {
    859           'namespace': 'menus'
    860         },
    861         {
    862           'namespace': 'pageAction'
    863         },
    864         {
    865           'namespace': 'experimental.webRequest'
    866         }
    867       ])
    868     }
    869   },
    870   '874': {
    871     'api': {
    872       'extension_api.json': json.dumps([
    873         {
    874           'namespace': 'idle'
    875         },
    876         {
    877           'namespace': 'menus'
    878         },
    879         {
    880           'namespace': 'pageAction'
    881         }
    882       ])
    883     }
    884   },
    885   '835': {
    886     'api': {
    887       'extension_api.json': json.dumps([
    888         {
    889           'namespace': 'idle'
    890         },
    891         {
    892           'namespace': 'menus'
    893         },
    894         {
    895           'namespace': 'pageAction'
    896         }
    897       ])
    898     }
    899   },
    900   '782': {
    901     'api': {
    902       'extension_api.json': json.dumps([
    903         {
    904           'namespace': 'idle'
    905         },
    906         {
    907           'namespace': 'menus'
    908         },
    909         {
    910           'namespace': 'pageAction'
    911         }
    912       ])
    913     }
    914   },
    915   '742': {
    916     'api': {
    917       'extension_api.json': json.dumps([
    918         {
    919           'namespace': 'idle'
    920         },
    921         {
    922           'namespace': 'menus'
    923         },
    924         {
    925           'namespace': 'pageAction'
    926         }
    927       ])
    928     }
    929   },
    930   '696': {
    931     'api': {
    932       'extension_api.json': json.dumps([
    933         {
    934           'namespace': 'idle'
    935         },
    936         {
    937           'namespace': 'menus'
    938         },
    939         {
    940           'namespace': 'pageAction'
    941         }
    942       ])
    943     }
    944   },
    945   '648': {
    946     'api': {
    947       'extension_api.json': json.dumps([
    948         {
    949           'namespace': 'idle'
    950         },
    951         {
    952           'namespace': 'menus'
    953         },
    954         {
    955           'namespace': 'pageAction'
    956         }
    957       ])
    958     }
    959   },
    960   '597': {
    961     'api': {
    962       'extension_api.json': json.dumps([
    963         {
    964           'namespace': 'idle'
    965         },
    966         {
    967           'namespace': 'menus'
    968         },
    969         {
    970           'namespace': 'pageAction'
    971         }
    972       ])
    973     }
    974   },
    975   '552': {
    976     'api': {
    977       'extension_api.json': json.dumps([
    978         {
    979           'namespace': 'idle'
    980         },
    981         {
    982           'namespace': 'menus'
    983         },
    984         {
    985           'namespace': 'pageAction'
    986         }
    987       ])
    988     }
    989   },
    990   '544': {
    991     'api': {
    992       'extension_api.json': json.dumps([
    993         {
    994           'namespace': 'idle'
    995         },
    996         {
    997           'namespace': 'menus'
    998         }
    999       ])
   1000     }
   1001   },
   1002   '495': {
   1003     'api': {
   1004       'extension_api.json': json.dumps([
   1005         {
   1006           'namespace': 'idle'
   1007         },
   1008         {
   1009           'namespace': 'menus'
   1010         }
   1011       ])
   1012     }
   1013   },
   1014   '396': {
   1015     'api': {
   1016       'extension_api.json': json.dumps([
   1017         {
   1018           'namespace': 'idle'
   1019         },
   1020         {
   1021           'namespace': 'experimental.menus'
   1022         }
   1023       ])
   1024     }
   1025   }
   1026 })
   1027