• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2014 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.
4
5var embedder = {};
6
7// TODO(lfg) Move these functions to a common js.
8window.runTest = function(testName) {
9  if (!embedder.test.testList[testName]) {
10    window.console.warn('Incorrect testName: ' + testName);
11    embedder.test.fail();
12    return;
13  }
14
15  // Run the test.
16  embedder.test.testList[testName]();
17};
18
19embedder.test = {};
20
21embedder.test.assertEq = function(a, b) {
22  if (a != b) {
23    window.console.warn('assertion failed: ' + a + ' != ' + b);
24    embedder.test.fail();
25  }
26};
27
28embedder.test.assertFalse = function(condition) {
29  if (condition) {
30    window.console.warn('assertion failed: false != ' + condition);
31    embedder.test.fail();
32  }
33};
34
35embedder.test.assertTrue = function(condition) {
36  if (!condition) {
37    window.console.warn('assertion failed: true != ' + condition);
38    embedder.test.fail();
39  }
40};
41
42embedder.test.fail = function() {
43  chrome.test.sendMessage('TEST_FAILED');
44};
45
46embedder.test.succeed = function() {
47  chrome.test.sendMessage('TEST_PASSED');
48};
49
50
51// Tests begin.
52
53// This test verifies that the allowtransparency property cannot be changed
54// once set. The attribute can only be deleted.
55function testAllowTransparencyAttribute() {
56  var webview = document.createElement('webview');
57  webview.src = 'data:text/html,webview test';
58  webview.allowtransparency = true;
59
60  webview.addEventListener('loadstop', function(e) {
61    embedder.test.assertTrue(webview.hasAttribute('allowtransparency'));
62    webview.allowtransparency = false;
63    embedder.test.assertTrue(webview.allowtransparency);
64    embedder.test.assertTrue(webview.hasAttribute('allowtransparency'));
65    webview.removeAttribute('allowtransparency');
66    embedder.test.assertFalse(webview.allowtransparency);
67    embedder.test.succeed();
68  });
69
70  document.body.appendChild(webview);
71}
72
73function testAPIMethodExistence() {
74  var apiMethodsToCheck = [
75    'back',
76    'find',
77    'forward',
78    'canGoBack',
79    'canGoForward',
80    'clearData',
81    'getProcessId',
82    'getZoom',
83    'go',
84    'print',
85    'reload',
86    'setZoom',
87    'stop',
88    'stopFinding',
89    'terminate',
90    'executeScript',
91    'insertCSS',
92    'getUserAgent',
93    'isUserAgentOverridden',
94    'setUserAgentOverride'
95  ];
96  var webview = document.createElement('webview');
97  webview.setAttribute('partition', arguments.callee.name);
98  webview.addEventListener('loadstop', function(e) {
99    for (var i = 0; i < apiMethodsToCheck.length; ++i) {
100      embedder.test.assertEq('function',
101                             typeof webview[apiMethodsToCheck[i]]);
102    }
103
104    // Check contentWindow.
105    embedder.test.assertEq('object', typeof webview.contentWindow);
106    embedder.test.assertEq('function',
107                           typeof webview.contentWindow.postMessage);
108    embedder.test.succeed();
109  });
110  webview.setAttribute('src', 'data:text/html,webview check api');
111  document.body.appendChild(webview);
112}
113
114// Makes sure 'sizechanged' event is fired only if autosize attribute is
115// specified.
116// After loading <webview> without autosize attribute and a size, say size1,
117// we set autosize attribute and new min size with size2. We would get (only
118// one) sizechanged event with size1 as old size and size2 as new size.
119function testAutosizeAfterNavigation() {
120  var webview = document.createElement('webview');
121
122  var step = 1;
123  var sizeChangeHandler = function(e) {
124    switch (step) {
125      case 1:
126        // This would be triggered after we set autosize attribute.
127        embedder.test.assertEq(50, e.oldWidth);
128        embedder.test.assertEq(100, e.oldHeight);
129        embedder.test.assertTrue(e.newWidth >= 60 && e.newWidth <= 70);
130        embedder.test.assertTrue(e.newHeight >= 110 && e.newHeight <= 120);
131
132        // Remove autosize attribute and expect webview to return to its
133        // original size.
134        webview.removeAttribute('autosize');
135        break;
136      case 2:
137        // Expect 50x100.
138        embedder.test.assertEq(50, e.newWidth);
139        embedder.test.assertEq(100, e.newHeight);
140
141        embedder.test.succeed();
142        break;
143      default:
144        window.console.log('Unexpected sizechanged event, step = ' + step);
145        embedder.test.fail();
146        break;
147    }
148
149    ++step;
150  };
151
152  webview.addEventListener('sizechanged', sizeChangeHandler);
153
154  webview.addEventListener('loadstop', function(e) {
155    webview.setAttribute('autosize', true);
156    webview.setAttribute('minwidth', 60);
157    webview.setAttribute('maxwidth', 70);
158    webview.setAttribute('minheight', 110);
159    webview.setAttribute('maxheight', 120);
160  });
161
162  webview.style.width = '50px';
163  webview.style.height = '100px';
164  webview.setAttribute('src', 'data:text/html,webview test sizechanged event');
165  document.body.appendChild(webview);
166}
167
168// This test verifies that if a browser plugin is in autosize mode before
169// navigation then the guest starts auto-sized.
170function testAutosizeBeforeNavigation() {
171  var webview = document.createElement('webview');
172
173  webview.setAttribute('autosize', 'true');
174  webview.setAttribute('minwidth', 200);
175  webview.setAttribute('maxwidth', 210);
176  webview.setAttribute('minheight', 100);
177  webview.setAttribute('maxheight', 110);
178
179  webview.addEventListener('sizechanged', function(e) {
180    embedder.test.assertTrue(e.newWidth >= 200 && e.newWidth <= 210);
181    embedder.test.assertTrue(e.newHeight >= 100 && e.newHeight <= 110);
182    embedder.test.succeed();
183  });
184
185  webview.setAttribute('src', 'data:text/html,webview test sizechanged event');
186  document.body.appendChild(webview);
187}
188
189// This test verifies that a lengthy page with autosize enabled will report
190// the correct height in the sizechanged event.
191function testAutosizeHeight() {
192  var webview = document.createElement('webview');
193
194  webview.autosize = true;
195  webview.minwidth = 200;
196  webview.maxwidth = 210;
197  webview.minheight = 40;
198  webview.maxheight = 200;
199
200  var step = 1;
201  webview.addEventListener('sizechanged', function(e) {
202    switch (step) {
203      case 1:
204        embedder.test.assertEq(200, e.newHeight);
205        // Change the maxheight to verify that we see the change.
206        webview.maxheight = 50;
207        break;
208      case 2:
209        embedder.test.assertEq(200, e.oldHeight);
210        embedder.test.assertEq(50, e.newHeight);
211        embedder.test.succeed();
212        break;
213      default:
214        window.console.log('Unexpected sizechanged event, step = ' + step);
215        embedder.test.fail();
216        break;
217    }
218    ++step;
219  });
220
221  webview.src = 'data:text/html,' +
222                'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>' +
223                'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>' +
224                'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>' +
225                'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>' +
226                'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>';
227  document.body.appendChild(webview);
228}
229
230// This test verifies that all autosize attributes can be removed
231// without crashing the plugin, or throwing errors.
232function testAutosizeRemoveAttributes() {
233  var webview = document.createElement('webview');
234
235  var step = 1;
236  var sizeChangeHandler = function(e) {
237    switch (step) {
238      case 1:
239        // This is the sizechanged event for autosize.
240
241        // Remove attributes.
242        webview.removeAttribute('minwidth');
243        webview.removeAttribute('maxwidth');
244        webview.removeAttribute('minheight');
245        webview.removeAttribute('maxheight');
246        webview.removeAttribute('autosize');
247
248        // We'd get one more sizechanged event after we turn off
249        // autosize.
250        webview.style.width = '500px';
251        webview.style.height = '500px';
252        break;
253      case 2:
254        embedder.test.succeed();
255        break;
256    }
257
258    ++step;
259  };
260
261  webview.addEventListener('loadstop', function(e) {
262    webview.minwidth = 300;
263    webview.maxwidth = 700;
264    webview.minheight = 600;
265    webview.maxheight = 400;
266    webview.autosize = true;
267  });
268
269  webview.addEventListener('sizechanged', sizeChangeHandler);
270
271  webview.style.width = '640px';
272  webview.style.height = '480px';
273  webview.setAttribute('src', 'data:text/html,webview check autosize');
274  document.body.appendChild(webview);
275}
276
277// This test verifies that autosize works when some of the parameters are unset.
278function testAutosizeWithPartialAttributes() {
279  window.console.log('testAutosizeWithPartialAttributes');
280  var webview = document.createElement('webview');
281
282  var step = 1;
283  var sizeChangeHandler = function(e) {
284    window.console.log('sizeChangeHandler, new: ' +
285                       e.newWidth + ' X ' + e.newHeight);
286    switch (step) {
287      case 1:
288        // Expect 300x200.
289        embedder.test.assertEq(300, e.newWidth);
290        embedder.test.assertEq(200, e.newHeight);
291
292        // Change the min size to cause a relayout.
293        webview.minwidth = 500;
294        break;
295      case 2:
296        embedder.test.assertTrue(e.newWidth >= webview.minwidth);
297        embedder.test.assertTrue(e.newWidth <= webview.maxwidth);
298
299        // Tests when minwidth > maxwidth, minwidth = maxwidth.
300        // i.e. minwidth is essentially 700.
301        webview.minwidth = 800;
302        break;
303      case 3:
304        // Expect 700X?
305        embedder.test.assertEq(700, e.newWidth);
306        embedder.test.assertTrue(e.newHeight >= 200);
307        embedder.test.assertTrue(e.newHeight <= 600);
308
309        embedder.test.succeed();
310        break;
311      default:
312        window.console.log('Unexpected sizechanged event, step = ' + step);
313        embedder.test.fail();
314        break;
315    }
316
317    ++step;
318  };
319
320  webview.addEventListener('sizechanged', sizeChangeHandler);
321
322  webview.addEventListener('loadstop', function(e) {
323    webview.minwidth = 300;
324    webview.maxwidth = 700;
325    webview.minheight = 200;
326    webview.maxheight = 600;
327    webview.autosize = true;
328  });
329
330  webview.style.width = '640px';
331  webview.style.height = '480px';
332  webview.setAttribute('src', 'data:text/html,webview check autosize');
333  document.body.appendChild(webview);
334}
335
336
337// Tests end.
338
339embedder.test.testList = {
340  'testAllowTransparencyAttribute': testAllowTransparencyAttribute,
341  'testAPIMethodExistence': testAPIMethodExistence,
342  'testAutosizeAfterNavigation': testAutosizeAfterNavigation,
343  'testAutosizeBeforeNavigation': testAutosizeBeforeNavigation,
344  'testAutosizeHeight': testAutosizeHeight,
345  'testAutosizeRemoveAttributes': testAutosizeRemoveAttributes,
346  'testAutosizeWithPartialAttributes': testAutosizeWithPartialAttributes
347};
348
349onload = function() {
350  chrome.test.sendMessage('LAUNCHED');
351};
352