1 # Copyright 2012 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.
11 from telemetry.core import browser_finder
12 from telemetry.core import extension_to_load
13 from telemetry.core import util
14 from telemetry.unittest import options_for_unittests
17 class ExtensionTest(unittest.TestCase):
20 self._extension = None
21 self._extension_id = None
23 def CreateBrowserWithExtension(self, ext_path):
24 extension_path = os.path.join(util.GetUnittestDataDir(), ext_path)
25 options = options_for_unittests.GetCopy()
26 load_extension = extension_to_load.ExtensionToLoad(
27 extension_path, options.browser_type)
28 options.extensions_to_load = [load_extension]
29 browser_to_create = browser_finder.FindBrowser(options)
31 if not browser_to_create:
32 # May not find a browser that supports extensions.
34 self._browser = browser_to_create.Create()
35 self._extension = self._browser.extensions[load_extension]
36 self._extension_id = load_extension.extension_id
37 self.assertTrue(self._extension)
44 def testExtensionBasic(self):
45 """Test ExtensionPage's ExecuteJavaScript and EvaluateJavaScript."""
46 if not self.CreateBrowserWithExtension('simple_extension'):
47 logging.warning('Did not find a browser that supports extensions, '
51 self._extension.EvaluateJavaScript('chrome.runtime != null'))
52 self._extension.ExecuteJavaScript('setTestVar("abcdef")')
53 self.assertEquals('abcdef',
54 self._extension.EvaluateJavaScript('_testVar'))
56 def testExtensionGetByExtensionId(self):
57 """Test GetByExtensionId for a simple extension with a background page."""
58 if not self.CreateBrowserWithExtension('simple_extension'):
59 logging.warning('Did not find a browser that supports extensions, '
62 ext = self._browser.extensions.GetByExtensionId(self._extension_id)
63 self.assertEqual(1, len(ext))
64 self.assertEqual(ext[0], self._extension)
66 ext[0].EvaluateJavaScript('chrome.runtime != null'))
69 """Tests GetByExtensionId for a web app with multiple pages."""
70 if not self.CreateBrowserWithExtension('simple_app'):
71 logging.warning('Did not find a browser that supports extensions, '
74 extensions = self._browser.extensions.GetByExtensionId(self._extension_id)
75 extension_urls = set([ext.EvaluateJavaScript('location.href;')
76 for ext in extensions])
77 expected_urls = set(['chrome-extension://' + self._extension_id + '/' + path
78 for path in ['main.html', 'second.html',
79 '_generated_background_page.html']])
81 self.assertEqual(expected_urls, extension_urls)
83 class NonExistentExtensionTest(unittest.TestCase):
84 def testNonExistentExtensionPath(self):
85 """Test that a non-existent extension path will raise an exception."""
86 extension_path = os.path.join(util.GetUnittestDataDir(), 'foo')
87 options = options_for_unittests.GetCopy()
88 self.assertRaises(extension_to_load.ExtensionPathNonExistentException,
89 lambda: extension_to_load.ExtensionToLoad(
90 extension_path, options.browser_type))
92 def testExtensionNotLoaded(self):
93 """Querying an extension that was not loaded will return None"""
94 extension_path = os.path.join(util.GetUnittestDataDir(), 'simple_extension')
95 options = options_for_unittests.GetCopy()
96 load_extension = extension_to_load.ExtensionToLoad(
97 extension_path, options.browser_type)
98 browser_to_create = browser_finder.FindBrowser(options)
99 with browser_to_create.Create() as b:
100 if b.supports_extensions:
101 self.assertRaises(KeyError, lambda: b.extensions[load_extension])
103 class MultipleExtensionTest(unittest.TestCase):
105 """ Copy the manifest and background.js files of simple_extension to a
106 number of temporary directories to load as extensions"""
107 self._extension_dirs = [tempfile.mkdtemp()
108 for i in range(3)] # pylint: disable=W0612
109 src_extension_dir = os.path.join(
110 util.GetUnittestDataDir(), 'simple_extension')
111 manifest_path = os.path.join(src_extension_dir, 'manifest.json')
112 script_path = os.path.join(src_extension_dir, 'background.js')
113 for d in self._extension_dirs:
114 shutil.copy(manifest_path, d)
115 shutil.copy(script_path, d)
116 options = options_for_unittests.GetCopy()
117 self._extensions_to_load = [extension_to_load.ExtensionToLoad(
118 d, options.browser_type)
119 for d in self._extension_dirs]
120 options.extensions_to_load = self._extensions_to_load
121 browser_to_create = browser_finder.FindBrowser(options)
123 # May not find a browser that supports extensions.
124 if browser_to_create:
125 self._browser = browser_to_create.Create()
129 self._browser.Close()
130 for d in self._extension_dirs:
133 def testMultipleExtensions(self):
134 if not self._browser:
135 logging.warning('Did not find a browser that supports extensions, '
140 loaded_extensions = filter(lambda e: e in self._browser.extensions,
141 self._extensions_to_load)
142 self.assertEqual(len(loaded_extensions), len(self._extensions_to_load))
144 for load_extension in self._extensions_to_load:
145 extension = self._browser.extensions[load_extension]
148 extension.EvaluateJavaScript('chrome.runtime != null'))
149 extension.ExecuteJavaScript('setTestVar("abcdef")')
150 self.assertEquals('abcdef', extension.EvaluateJavaScript('_testVar'))
153 class ComponentExtensionTest(unittest.TestCase):
154 def testComponentExtensionBasic(self):
155 extension_path = os.path.join(
156 util.GetUnittestDataDir(), 'component_extension')
157 options = options_for_unittests.GetCopy()
158 load_extension = extension_to_load.ExtensionToLoad(
159 extension_path, options.browser_type, is_component=True)
161 options.extensions_to_load = [load_extension]
162 browser_to_create = browser_finder.FindBrowser(options)
163 if not browser_to_create:
164 logging.warning('Did not find a browser that supports extensions, '
168 with browser_to_create.Create() as b:
169 extension = b.extensions[load_extension]
171 extension.EvaluateJavaScript('chrome.runtime != null'))
172 extension.ExecuteJavaScript('setTestVar("abcdef")')
173 self.assertEquals('abcdef', extension.EvaluateJavaScript('_testVar'))
175 def testComponentExtensionNoPublicKey(self):
176 # simple_extension does not have a public key.
177 extension_path = os.path.join(util.GetUnittestDataDir(), 'simple_extension')
178 options = options_for_unittests.GetCopy()
179 self.assertRaises(extension_to_load.MissingPublicKeyException,
180 lambda: extension_to_load.ExtensionToLoad(
182 browser_type=options.browser_type,