Index: tools/telemetry/telemetry/extension_list_backend.py |
=================================================================== |
--- tools/telemetry/telemetry/extension_list_backend.py (revision 0) |
+++ tools/telemetry/telemetry/extension_list_backend.py (revision 0) |
@@ -0,0 +1,105 @@ |
+# Copyright (c) 2012 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 httplib |
+import json |
+import os |
+import re |
+import socket |
+import urllib2 |
+import weakref |
+ |
+from telemetry import browser_gone_exception |
+from telemetry import crx_id |
+from telemetry import extension_page |
+from telemetry import tab |
+from telemetry import tab_backend |
+ |
+class BrowserConnectionGoneException( |
+ browser_gone_exception.BrowserGoneException): |
+ pass |
+ |
+class ExtensionListBackend(object): |
+ def __init__(self, browser_backend): |
+ self._browser_backend = browser_backend |
+ |
+ # Stores extension ids. |
+ self._extension_ids = [] |
dtu
2013/01/30 00:01:49
You don't need to store this list. You can look it
achuithb
2013/01/30 10:01:56
I think I need this for __iter__ below, right? I c
dtu
2013/01/31 01:37:37
Tried it just now and you can. My guess is the it
achuithb
2013/01/31 02:49:50
Done.
|
+ |
+ # Maps extension ids to ExtensionPage objects. |
+ self._extension_dict = weakref.WeakValueDictionary() |
+ |
+ def Init(self): |
+ self._UpdateExtensionIdList() |
+ |
+ def __iter__(self): |
+ self._UpdateExtensionIdList() |
+ return self._extension_ids.__iter__() |
+ |
+ def __len__(self): |
+ self._UpdateExtensionIdList() |
+ return len(self._extension_ids) |
+ |
+ @staticmethod |
+ def _ExtractExtensionId(url): |
+ m = re.match(r"(chrome-extension://)([^/]+)", url) |
+ assert m |
+ return m.group(2) |
+ |
+ @staticmethod |
+ def _GetExtensionId(extension_info): |
+ if 'url' not in extension_info: |
+ return None |
+ return ExtensionListBackend._ExtractExtensionId(extension_info['url']) |
+ |
+ def GetExtensionById(self, extension_id): |
dtu
2013/01/30 00:01:49
__getitem__
achuithb
2013/01/30 10:01:56
Done.
|
+ extension_object = self._extension_dict.get(extension_id) |
+ if not extension_object: |
+ extension_object = self._CreateExtensionObject(extension_id) |
+ if extension_object: |
+ self._extension_dict[extension_id] = extension_object |
+ return extension_object |
+ |
+ def _CreateExtensionObject(self, extension_id): |
+ extension_info = self._FindExtensionInfo(extension_id) |
+ if not extension_info: |
+ return None |
+ return extension_page.ExtensionPage( |
+ self._CreateContext(extension_info['webSocketDebuggerUrl'])) |
dtu
2013/01/30 00:01:49
Use the TabBackend directly and remove _CreateCont
achuithb
2013/01/30 10:01:56
Done.
|
+ |
+ def _CreateContext(self, debugger_url): |
+ backend = tab_backend.TabBackend(self._browser_backend.browser, |
+ self._browser_backend, |
+ debugger_url) |
+ return tab.Tab(backend) |
+ |
+ def _FindExtensionInfo(self, extension_id): |
+ for extension_info in self._GetExtensionInfoList(): |
+ if self._GetExtensionId(extension_info) == extension_id: |
+ return extension_info |
+ return None |
+ |
+ def _GetExtensionInfoList(self, timeout=None): |
+ try: |
+ data = self._browser_backend.Request('', timeout=timeout) |
+ return self._FilterExtensions(json.loads(data)) |
+ except (socket.error, httplib.BadStatusLine, urllib2.URLError): |
+ if not self._browser_backend.IsBrowserRunning(): |
+ raise browser_gone_exception.BrowserGoneException() |
+ raise BrowserConnectionGoneException() |
+ |
+ def _FilterExtensions(self, all_extensions): |
+ return [page_info for page_info in all_extensions |
+ if page_info['url'].startswith('chrome-extension://')] |
+ |
+ def _UpdateExtensionIdList(self): |
+ self._extension_ids = map( |
+ self._GetExtensionId, self._GetExtensionInfoList()) |
+ |
+ def GetExtensionIds(self): |
dtu
2013/01/30 00:01:49
Remove.
achuithb
2013/01/30 10:01:56
Done.
|
+ self._UpdateExtensionIdList() |
+ return self._extension_ids |
+ |
+ def GetExtensionByPath(self, extension_path): |
+ abs_path = os.path.abspath(extension_path) |
+ return self.GetExtensionById(crx_id.GetCRXAppID(abs_path)) |
Property changes on: tools/telemetry/telemetry/extension_list_backend.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |