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.
8 from telemetry.core import extension_page
9 from telemetry.core.backends.chrome import inspector_backend
11 class ExtensionNotFoundException(Exception):
14 class ExtensionDictBackend(object):
15 def __init__(self, browser_backend):
16 self._browser_backend = browser_backend
17 # Maps extension ids to ExtensionPage objects.
18 self._extension_dict = weakref.WeakValueDictionary()
20 def __getitem__(self, extension_id):
21 extension_object = self._extension_dict.get(extension_id)
22 if not extension_object:
23 extension_object = self._CreateExtensionObject(extension_id)
24 assert extension_object
25 self._extension_dict[extension_id] = extension_object
26 return extension_object
28 def __contains__(self, extension_id):
29 return extension_id in self._GetExtensionIds()
32 def _ExtractExtensionId(url):
33 m = re.match(r"(chrome-extension://)([^/]+)", url)
38 def _GetExtensionId(extension_info):
39 if 'url' not in extension_info:
41 return ExtensionDictBackend._ExtractExtensionId(extension_info['url'])
43 def _CreateExtensionObject(self, extension_id):
44 extension_info = self._FindExtensionInfo(extension_id)
45 if not extension_info or not 'webSocketDebuggerUrl' in extension_info:
46 raise ExtensionNotFoundException()
47 return extension_page.ExtensionPage(
49 extension_info['url'],
50 self._CreateInspectorBackendForDebuggerUrl(
51 extension_info['webSocketDebuggerUrl']))
53 def _CreateInspectorBackendForDebuggerUrl(self, debugger_url):
54 return inspector_backend.InspectorBackend(self._browser_backend.browser,
55 self._browser_backend,
58 def _FindExtensionInfo(self, extension_id):
59 for extension_info in self.GetExtensionInfoList():
60 if self._GetExtensionId(extension_info) == extension_id:
64 def GetExtensionInfoList(self, timeout=None):
65 data = self._browser_backend.Request('', timeout=timeout)
66 return self._FilterExtensions(json.loads(data))
68 def _FilterExtensions(self, all_pages):
69 return [page_info for page_info in all_pages
70 if page_info['url'].startswith('chrome-extension://')]
72 def _GetExtensionIds(self):
73 return map(self._GetExtensionId, self.GetExtensionInfoList())