1cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Copyright 2014 The Chromium Authors. All rights reserved.
2cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Use of this source code is governed by a BSD-style license that can be
3cef7893435aa41160dd1255c43cb8498279738ccChris Craik# found in the LICENSE file.
4cef7893435aa41160dd1255c43cb8498279738ccChris Craik
5cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport collections
6cef7893435aa41160dd1255c43cb8498279738ccChris Craik
7cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.internal.backends.chrome_inspector import inspector_backend_list
8cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.internal.browser import extension_page
9cef7893435aa41160dd1255c43cb8498279738ccChris Craik
10cef7893435aa41160dd1255c43cb8498279738ccChris Craik
11cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass ExtensionBackendList(inspector_backend_list.InspectorBackendList):
12cef7893435aa41160dd1255c43cb8498279738ccChris Craik  """A dynamic sequence of extension_page.ExtensionPages."""
13cef7893435aa41160dd1255c43cb8498279738ccChris Craik
14cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def __init__(self, browser_backend):
15cef7893435aa41160dd1255c43cb8498279738ccChris Craik    super(ExtensionBackendList, self).__init__(browser_backend)
16cef7893435aa41160dd1255c43cb8498279738ccChris Craik
17cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def ShouldIncludeContext(self, context):
18cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return context['url'].startswith('chrome-extension://')
19cef7893435aa41160dd1255c43cb8498279738ccChris Craik
20cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def CreateWrapper(self, inspector_backend):
21cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return extension_page.ExtensionPage(inspector_backend)
22cef7893435aa41160dd1255c43cb8498279738ccChris Craik
23cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass ExtensionBackendDict(collections.Mapping):
24cef7893435aa41160dd1255c43cb8498279738ccChris Craik  """A dynamic mapping of extension_id to extension_page.ExtensionPages."""
25cef7893435aa41160dd1255c43cb8498279738ccChris Craik
26cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def __init__(self, browser_backend):
27cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self._extension_backend_list = ExtensionBackendList(browser_backend)
28cef7893435aa41160dd1255c43cb8498279738ccChris Craik
29cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def __getitem__(self, extension_id):
30cef7893435aa41160dd1255c43cb8498279738ccChris Craik    extensions = []
31cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for context_id in self._extension_backend_list.IterContextIds():
32cef7893435aa41160dd1255c43cb8498279738ccChris Craik      if self.ContextIdToExtensionId(context_id) == extension_id:
33cef7893435aa41160dd1255c43cb8498279738ccChris Craik        extensions.append(
34cef7893435aa41160dd1255c43cb8498279738ccChris Craik            self._extension_backend_list.GetBackendFromContextId(context_id))
35cef7893435aa41160dd1255c43cb8498279738ccChris Craik    if not extensions:
36cef7893435aa41160dd1255c43cb8498279738ccChris Craik      raise KeyError('Cannot find an extension with id=%s' % extension_id)
37cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return extensions
38cef7893435aa41160dd1255c43cb8498279738ccChris Craik
39cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def __iter__(self):
40cef7893435aa41160dd1255c43cb8498279738ccChris Craik    for context_id in self._extension_backend_list.IterContextIds():
41cef7893435aa41160dd1255c43cb8498279738ccChris Craik      yield self._extension_backend_list.GetBackendFromContextId(context_id)
42cef7893435aa41160dd1255c43cb8498279738ccChris Craik
43cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def __len__(self):
44cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return len(self._extension_backend_list)
45cef7893435aa41160dd1255c43cb8498279738ccChris Craik
46cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def ContextIdToExtensionId(self, context_id):
47cef7893435aa41160dd1255c43cb8498279738ccChris Craik    context = self._extension_backend_list.GetContextInfo(context_id)
48cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return extension_page.UrlToExtensionId(context['url'])
49