- add sources.
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / core / backends / chrome / extension_dict_backend.py
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 import json
5 import re
6 import weakref
7
8 from telemetry.core import extension_page
9 from telemetry.core.backends.chrome import inspector_backend
10
11 class ExtensionNotFoundException(Exception):
12   pass
13
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()
19
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
27
28   def __contains__(self, extension_id):
29     return extension_id in self._GetExtensionIds()
30
31   @staticmethod
32   def _ExtractExtensionId(url):
33     m = re.match(r"(chrome-extension://)([^/]+)", url)
34     assert m
35     return m.group(2)
36
37   @staticmethod
38   def _GetExtensionId(extension_info):
39     if 'url' not in extension_info:
40       return None
41     return ExtensionDictBackend._ExtractExtensionId(extension_info['url'])
42
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(
48         extension_id,
49         extension_info['url'],
50         self._CreateInspectorBackendForDebuggerUrl(
51             extension_info['webSocketDebuggerUrl']))
52
53   def _CreateInspectorBackendForDebuggerUrl(self, debugger_url):
54     return inspector_backend.InspectorBackend(self._browser_backend.browser,
55                                               self._browser_backend,
56                                               debugger_url)
57
58   def _FindExtensionInfo(self, extension_id):
59     for extension_info in self.GetExtensionInfoList():
60       if self._GetExtensionId(extension_info) == extension_id:
61         return extension_info
62     return None
63
64   def GetExtensionInfoList(self, timeout=None):
65     data = self._browser_backend.Request('', timeout=timeout)
66     return self._FilterExtensions(json.loads(data))
67
68   def _FilterExtensions(self, all_pages):
69     return [page_info for page_info in all_pages
70             if page_info['url'].startswith('chrome-extension://')]
71
72   def _GetExtensionIds(self):
73     return map(self._GetExtensionId, self.GetExtensionInfoList())