Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(173)

Unified Diff: tools/telemetry/telemetry/extension_list_backend.py

Issue 11882033: Telemetry support for extensions. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: wait for document ready state Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698