Index: tools/telemetry/telemetry/extension_dict_backend.py |
=================================================================== |
--- tools/telemetry/telemetry/extension_dict_backend.py (revision 0) |
+++ tools/telemetry/telemetry/extension_dict_backend.py (revision 0) |
@@ -0,0 +1,81 @@ |
+# 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 re |
+import socket |
+import urllib2 |
+import weakref |
+ |
+from telemetry import browser_gone_exception |
+from telemetry import extension_page |
+from telemetry import inspector_backend |
+ |
+class BrowserConnectionGoneException( |
+ browser_gone_exception.BrowserGoneException): |
+ pass |
+ |
+class ExtensionDictBackend(object): |
+ def __init__(self, browser_backend): |
+ self._browser_backend = browser_backend |
+ # Maps extension ids to ExtensionPage objects. |
+ self._extension_dict = weakref.WeakValueDictionary() |
+ |
+ def __getitem__(self, extension_id): |
+ 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 __contains__(self, extension_id): |
+ return extension_id in self._GetExtensionIds() |
+ |
+ @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 ExtensionDictBackend._ExtractExtensionId(extension_info['url']) |
+ |
+ def _CreateExtensionObject(self, extension_id): |
+ extension_info = self._FindExtensionInfo(extension_id) |
+ if not extension_info or not 'webSocketDebuggerUrl' in extension_info: |
+ return None |
+ return extension_page.ExtensionPage( |
+ self._CreateInspectorBackendForDebuggerUrl( |
+ extension_info['webSocketDebuggerUrl'])) |
+ |
+ def _CreateInspectorBackendForDebuggerUrl(self, debugger_url): |
+ return inspector_backend.InspectorBackend(self._browser_backend.browser, |
+ self._browser_backend, |
+ debugger_url) |
+ |
+ 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_pages): |
+ return [page_info for page_info in all_pages |
+ if page_info['url'].startswith('chrome-extension://')] |
+ |
+ def _GetExtensionIds(self): |
+ return map(self._GetExtensionId, self._GetExtensionInfoList()) |
Property changes on: tools/telemetry/telemetry/extension_dict_backend.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |