1cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Copyright 2014 The Chromium Authors. All rights reserved. 2cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Use of this source code is governed by a BSD-style license that can be 3cef7893435aa41160dd1255c43cb8498279738ccChris Craik# found in the LICENSE file. 4cef7893435aa41160dd1255c43cb8498279738ccChris Craik 5cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport collections 6cef7893435aa41160dd1255c43cb8498279738ccChris Craik 7cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.internal.backends.chrome_inspector import inspector_backend_list 8cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.internal.browser import extension_page 9cef7893435aa41160dd1255c43cb8498279738ccChris Craik 10cef7893435aa41160dd1255c43cb8498279738ccChris Craik 11cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass ExtensionBackendList(inspector_backend_list.InspectorBackendList): 12cef7893435aa41160dd1255c43cb8498279738ccChris Craik """A dynamic sequence of extension_page.ExtensionPages.""" 13cef7893435aa41160dd1255c43cb8498279738ccChris Craik 14cef7893435aa41160dd1255c43cb8498279738ccChris Craik def __init__(self, browser_backend): 15cef7893435aa41160dd1255c43cb8498279738ccChris Craik super(ExtensionBackendList, self).__init__(browser_backend) 16cef7893435aa41160dd1255c43cb8498279738ccChris Craik 17cef7893435aa41160dd1255c43cb8498279738ccChris Craik def ShouldIncludeContext(self, context): 18cef7893435aa41160dd1255c43cb8498279738ccChris Craik return context['url'].startswith('chrome-extension://') 19cef7893435aa41160dd1255c43cb8498279738ccChris Craik 20cef7893435aa41160dd1255c43cb8498279738ccChris Craik def CreateWrapper(self, inspector_backend): 21cef7893435aa41160dd1255c43cb8498279738ccChris Craik return extension_page.ExtensionPage(inspector_backend) 22cef7893435aa41160dd1255c43cb8498279738ccChris Craik 23cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass ExtensionBackendDict(collections.Mapping): 24cef7893435aa41160dd1255c43cb8498279738ccChris Craik """A dynamic mapping of extension_id to extension_page.ExtensionPages.""" 25cef7893435aa41160dd1255c43cb8498279738ccChris Craik 26cef7893435aa41160dd1255c43cb8498279738ccChris Craik def __init__(self, browser_backend): 27cef7893435aa41160dd1255c43cb8498279738ccChris Craik self._extension_backend_list = ExtensionBackendList(browser_backend) 28cef7893435aa41160dd1255c43cb8498279738ccChris Craik 29cef7893435aa41160dd1255c43cb8498279738ccChris Craik def __getitem__(self, extension_id): 30cef7893435aa41160dd1255c43cb8498279738ccChris Craik extensions = [] 31cef7893435aa41160dd1255c43cb8498279738ccChris Craik for context_id in self._extension_backend_list.IterContextIds(): 32cef7893435aa41160dd1255c43cb8498279738ccChris Craik if self.ContextIdToExtensionId(context_id) == extension_id: 33cef7893435aa41160dd1255c43cb8498279738ccChris Craik extensions.append( 34cef7893435aa41160dd1255c43cb8498279738ccChris Craik self._extension_backend_list.GetBackendFromContextId(context_id)) 35cef7893435aa41160dd1255c43cb8498279738ccChris Craik if not extensions: 36cef7893435aa41160dd1255c43cb8498279738ccChris Craik raise KeyError('Cannot find an extension with id=%s' % extension_id) 37cef7893435aa41160dd1255c43cb8498279738ccChris Craik return extensions 38cef7893435aa41160dd1255c43cb8498279738ccChris Craik 39cef7893435aa41160dd1255c43cb8498279738ccChris Craik def __iter__(self): 40cef7893435aa41160dd1255c43cb8498279738ccChris Craik for context_id in self._extension_backend_list.IterContextIds(): 41cef7893435aa41160dd1255c43cb8498279738ccChris Craik yield self._extension_backend_list.GetBackendFromContextId(context_id) 42cef7893435aa41160dd1255c43cb8498279738ccChris Craik 43cef7893435aa41160dd1255c43cb8498279738ccChris Craik def __len__(self): 44cef7893435aa41160dd1255c43cb8498279738ccChris Craik return len(self._extension_backend_list) 45cef7893435aa41160dd1255c43cb8498279738ccChris Craik 46cef7893435aa41160dd1255c43cb8498279738ccChris Craik def ContextIdToExtensionId(self, context_id): 47cef7893435aa41160dd1255c43cb8498279738ccChris Craik context = self._extension_backend_list.GetContextInfo(context_id) 48cef7893435aa41160dd1255c43cb8498279738ccChris Craik return extension_page.UrlToExtensionId(context['url']) 49