text: # Copyright 2013 The Chromium Authors. All rights reserved.
  # Use of this source code is governed by a BSD-style license that can be
  # found in the LICENSE file.
  
  import json
  
  from extensions_paths import CHROME_EXTENSIONS, SERVER2
  from test_file_system import MoveAllTo
  from test_util import ReadFile
  
  FAKE_TABS_IDL = '\n'.join([
    '// Copyleft stuff.',
    '',
    '// Some description here.',
    'namespace fakeTabs {',
    '  dictionary WasImplicitlyInlinedType {};',
    '  interface Functions {',
    '    static void myFunc(WasImplicitlyInlinedType arg);',
    '    static void anotherFunc(WasImplicitlyInlinedType arg);',
    '  };',
    '};'])
  
  FAKE_TABS_WITH_INLINING_IDL = '\n'.join([
    '// Copyleft stuff.',
    '',
    '// Some description here.',
    'namespace fakeTabs {',
    '  dictionary WasImplicitlyInlinedType {};',
    '  interface Functions {',
    '    static void myFunc(WasImplicitlyInlinedType arg);',
    '  };',
    '};'])
  
  TABS_SCHEMA_BRANCHES = MoveAllTo(CHROME_EXTENSIONS, {
    'trunk': {
      'docs': {
        'templates': {
          'json': {
            'api_availabilities.json': '{}',
            'intro_tables.json': '{}'
          }
        }
      },
      'api': {
        '_api_features.json': json.dumps({
          'tabs.scheduledFunc': {
            'channel': 'stable'
          }
        }),
        '_manifest_features.json': '{}',
        '_permission_features.json': '{}',
        'fake_tabs.idl': FAKE_TABS_IDL,
        'tabs.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'type': 'any',
              'properties': {
                'url': {
                  'type': 'any'
                },
                'index': {
                  'type': 'any'
                },
                'selected': {
                  'type': 'any'
                },
                'id': {
                  'type': 'any'
                },
                'windowId': {
                  'type': 'any'
                }
              }
            },
            {
              'id': 'InlinedType',
              'type': 'any',
              'inline_doc': True
            },
            {
              'id': 'InjectDetails',
              'type': 'any',
              'properties': {
                'allFrames': {
                  'type': 'any'
                },
                'code': {
                  'type': 'any'
                },
                'file': {
                  'type':'any'
                }
              }
            },
            {
              'id': 'DeprecatedType',
              'type': 'any',
              'deprecated': 'This is deprecated'
            }
          ],
          'properties': {
            'fakeTabsProperty1': {
              'type': 'any'
            },
            'fakeTabsProperty2': {
              'type': 'any'
            },
            'fakeTabsProperty3': {
              'type': 'any'
            }
          },
          'functions': [
            {
              'name': 'getCurrent',
              'parameters': [
                {
                  'name': 'callback',
                  'type': 'function',
                  'parameters': [
                    {
                      'name': 'tab',
                      'type': 'any'
                    }
                  ]
                }
              ]
            },
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'type': 'function',
                  'parameters': [
                    {
                      'name': 'tab',
                      'type': 'any'
                    }
                  ]
                },
                {
                  'name': 'tabId',
                  'type': 'any'
                }
              ]
            },
            {
              'name': 'scheduledFunc',
              'parameters': []
            }
          ],
          'events': [
            {
              'name': 'onActivated',
              'type': 'event',
              'parameters': [
                {
                  'name': 'activeInfo',
                  'type': 'any',
                  'properties': {
                    'tabId': {
                      'type': 'any'
                    },
                    'windowId': {
                      'type': 'any'
                    }
                  }
                }
              ]
            },
            {
              'name': 'onUpdated',
              'type': 'event',
              'parameters': [
                {
                  'name': 'tabId',
                  'type': 'any'
                },
                {
                  'name': 'tab',
                  'type': 'any'
                },
                {
                  'name': 'changeInfo',
                  'type': 'any',
                  'properties': {
                    'pinned': {
                      'type': 'any'
                    },
                    'status': {
                      'type': 'any'
                    }
                  }
                }
              ]
            }
          ]
        }])
      }
    },
    '1500': {
      'api': {
        '_api_features.json': json.dumps({
          'tabs.scheduledFunc': {
            'channel': 'stable'
          }
        }),
        '_manifest_features.json': "{}",
        '_permission_features.json': "{}",
        'fake_tabs.idl': FAKE_TABS_IDL,
        'tabs.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'index': {},
                'selected': {},
                'id': {},
                'windowId': {}
              }
            },
            {
              'id': 'InjectDetails',
              'properties': {
                'allFrames': {},
                'code': {},
                'file': {}
              }
            },
            {
              'id': 'DeprecatedType',
              'deprecated': 'This is deprecated'
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'getCurrent',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            },
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                },
                {
                  'name': 'tabId'
                }
              ]
            },
            {
              'name': 'scheduledFunc',
              'parameters': []
            }
          ],
          'events': [
            {
              'name': 'onActivated',
              'parameters': [
                {
                  'name': 'activeInfo',
                  'properties': {
                    'tabId': {},
                    'windowId': {}
                  }
                }
              ]
            },
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                },
                {
                  'name': 'tab'
                },
                {
                  'name': 'changeInfo',
                  'properties': {
                    'pinned': {},
                    'status': {}
                  }
                }
              ]
            }
          ]
        }])
      }
    },
    '1453': {
      'api': {
        '_api_features.json': "{}",
        '_manifest_features.json': "{}",
        '_permission_features.json': "{}",
        'fake_tabs.idl': FAKE_TABS_IDL,
        'tabs.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'index': {},
                'selected': {},
                'id': {},
                'windowId': {}
              }
            },
            {
              'id': 'InjectDetails',
              'properties': {
                'allFrames': {},
                'code': {},
                'file': {}
              }
            },
            {
              'id': 'DeprecatedType',
              'deprecated': 'This is deprecated'
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'getCurrent',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            },
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                },
                {
                  'name': 'tabId'
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onActivated',
              'parameters': [
                {
                  'name': 'activeInfo',
                  'properties': {
                    'tabId': {}
                  }
                }
              ]
            },
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                },
                {
                  'name': 'changeInfo',
                  'properties': {
                    'pinned': {},
                    'status': {}
                  }
                }
              ]
            }
          ]
        }])
      }
    },
    '1410': {
      'api': {
        '_manifest_features.json': "{}",
        '_permission_features.json': "{}",
        'fake_tabs.idl': FAKE_TABS_IDL,
        'tabs.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'index': {},
                'selected': {},
                'id': {},
                'windowId': {}
              }
            },
            {
              'id': 'InjectDetails',
              'properties': {
                'allFrames': {},
                'code': {},
                'file': {}
              }
            },
            {
              'id': 'DeprecatedType',
              'deprecated': 'This is deprecated'
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'getCurrent',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            },
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                },
                {
                  'name': 'changeInfo',
                  'properties': {
                    'pinned': {},
                    'status': {}
                  }
                }
              ]
            }
          ]
        }])
      }
    },
    '1364': {
      'api': {
        '_manifest_features.json': "{}",
        '_permission_features.json': "{}",
        'fake_tabs.idl': FAKE_TABS_WITH_INLINING_IDL,
        'tabs.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'index': {},
                'selected': {},
                'id': {},
                'windowId': {}
              }
            },
            {
              'id': 'InjectDetails',
              'properties': {
                'allFrames': {}
              }
            },
            {
              'id': 'DeprecatedType',
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'getCurrent',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            },
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                },
                {
                  'name': 'changeInfo',
                  'properties': {
                    'pinned': {},
                    'status': {}
                  }
                }
              ]
            }
          ]
        }])
      }
    },
    '1312': {
      'api': {
        '_manifest_features.json': "{}",
        '_permission_features.json': "{}",
        'tabs.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'index': {},
                'selected': {},
                'id': {},
                'windowId': {}
              }
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'getCurrent',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            },
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                },
                {
                  'name': 'changeInfo',
                  'properties': {
                    'pinned': {},
                    'status': {}
                  }
                }
              ]
            }
          ]
        }])
      }
    },
    '1271': {
      'api': {
        '_manifest_features.json': "{}",
        '_permission_features.json': "{}",
        'tabs.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'index': {},
                'selected': {},
                'id': {},
                'windowId': {}
              }
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'getCurrent',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            },
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                },
                {
                  'name': 'changeInfo',
                  'properties': {
                    'pinned': {},
                    'status': {}
                  }
                }
              ]
            }
          ]
        }])
      }
    },
    '1229': {
      'api': {
        '_manifest_features.json': "{}",
        '_permission_features.json': "{}",
        'tabs.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'index': {},
                'selected': {},
                'id': {},
                'windowId': {}
              }
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'getCurrent',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            },
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                },
                {
                  'name': 'changeInfo',
                  'properties': {
                    'pinned': {},
                    'status': {}
                  }
                }
              ]
            }
          ]
        }])
      }
    },
    '1180': {
      'api': {
        '_manifest_features.json': "{}",
        '_permission_features.json': "{}",
        'tabs.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'index': {},
                'selected': {},
                'id': {}
              }
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'getCurrent',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            },
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                },
                {
                  'name': 'changeInfo',
                  'properties': {
                    'pinned': {},
                    'status': {}
                  }
                }
              ]
            }
          ]
        }])
      }
    },
    '1132': {
      'api': {
        '_manifest_features.json': "{}",
        '_permission_features.json': "{}",
        'tabs.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'index': {},
                'id': {}
              }
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'getCurrent',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            },
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                },
                {
                  'name': 'changeInfo',
                  'properties': {
                    'pinned': {},
                    'status': {}
                  }
                }
              ]
            }
          ]
        }])
      }
    },
    '1084': {
      'api': {
        'tabs.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'index': {},
                'id': {}
              }
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'getCurrent',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            },
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                },
                {
                  'name': 'changeInfo',
                  'properties': {
                    'pinned': {},
                    'status': {}
                  }
                }
              ]
            }
          ]
        }])
      }
    },
    '1025': {
      'api': {
        'tabs.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'index': {},
                'id': {}
              }
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                },
                {
                  'name': 'changeInfo',
                  'properties': {
                    'pinned': {},
                    'status': {}
                  }
                }
              ]
            }
          ]
        }])
      }
    },
    '963': {
      'api': {
        'extension_api.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'id': {}
              }
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                },
                {
                  'name': 'changeInfo',
                  'properties': {
                    'pinned': {},
                    'status': {}
                  }
                }
              ]
            }
          ]
        }])
      }
    },
    '912': {
      'api': {
        'extension_api.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'id': {}
              }
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                }
              ]
            }
          ]
        }])
      }
    },
    '874': {
      'api': {
        'extension_api.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'id': {}
              }
            }
          ],
          'properties': {
            'fakeTabsProperty1': {},
            'fakeTabsProperty2': {}
          },
          'functions': [
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                }
              ]
            }
          ]
        }])
      }
    },
    '835': {
      'api': {
        'extension_api.json': json.dumps([{
          'namespace': 'tabs',
          'types': [
            {
              'id': 'Tab',
              'properties': {
                'url': {},
                'id': {}
              }
            }
          ],
          'properties': {
            'fakeTabsProperty1': {}
          },
          'functions': [
            {
              'name': 'get',
              'parameters': [
                {
                  'name': 'callback',
                  'parameters': [
                    {
                      'name': 'tab'
                    }
                  ]
                }
              ]
            }
          ],
          'events': [
            {
              'name': 'onUpdated',
              'parameters': [
                {
                  'name': 'tabId'
                }
              ]
            }
          ]
        }])
      }
    },
    '782': {
      'api': {
        'extension_api.json': "{}"
      }
    }
  })
  