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.
7 // TODO(lfg) Move these functions to a common js.
8 embedder
.setUp_ = function(config
) {
9 if (!config
|| !config
.testServer
) {
12 embedder
.baseGuestURL
= 'http://localhost:' + config
.testServer
.port
;
13 embedder
.closeSocketURL
= embedder
.baseGuestURL
+ '/close-socket';
14 embedder
.emptyGuestURL
= embedder
.baseGuestURL
+ '/empty_guest.html';
15 embedder
.noReferrerGuestURL
=
16 embedder
.baseGuestURL
+ '/guest_noreferrer.html';
17 embedder
.detectUserAgentURL
= embedder
.baseGuestURL
+ '/detect-user-agent';
18 embedder
.redirectGuestURL
= embedder
.baseGuestURL
+ '/server-redirect';
19 embedder
.redirectGuestURLDest
=
20 embedder
.baseGuestURL
+ '/guest_redirect.html';
21 embedder
.windowOpenGuestURL
= embedder
.baseGuestURL
+ '/guest.html';
24 window
.runTest = function(testName
) {
25 if (!embedder
.test
.testList
[testName
]) {
26 window
.console
.warn('Incorrect testName: ' + testName
);
32 embedder
.test
.testList
[testName
]();
37 embedder
.test
.assertEq = function(a
, b
) {
39 window
.console
.warn('assertion failed: ' + a
+ ' != ' + b
);
44 embedder
.test
.assertFalse = function(condition
) {
46 window
.console
.warn('assertion failed: false != ' + condition
);
51 embedder
.test
.assertTrue = function(condition
) {
53 window
.console
.warn('assertion failed: true != ' + condition
);
58 embedder
.test
.fail = function() {
59 chrome
.test
.sendMessage('TEST_FAILED');
62 embedder
.test
.succeed = function() {
63 chrome
.test
.sendMessage('TEST_PASSED');
69 // This test verifies that the allowtransparency property cannot be changed
70 // once set. The attribute can only be deleted.
71 function testAllowTransparencyAttribute() {
72 var webview
= document
.createElement('webview');
73 webview
.src
= 'data:text/html,webview test';
74 embedder
.test
.assertFalse(webview
.hasAttribute('allowtransparency'));
75 embedder
.test
.assertFalse(webview
.allowtransparency
);
76 webview
.allowtransparency
= true;
78 webview
.addEventListener('loadstop', function(e
) {
79 embedder
.test
.assertTrue(webview
.hasAttribute('allowtransparency'));
80 embedder
.test
.assertTrue(webview
.allowtransparency
);
81 webview
.allowtransparency
= false;
82 embedder
.test
.assertFalse(webview
.hasAttribute('allowtransparency'));
83 embedder
.test
.assertFalse(webview
.allowtransparency
);
84 webview
.allowtransparency
= '';
85 embedder
.test
.assertFalse(webview
.hasAttribute('allowtransparency'));
86 embedder
.test
.assertFalse(webview
.allowtransparency
);
87 webview
.allowtransparency
= 'some string';
88 embedder
.test
.assertTrue(webview
.hasAttribute('allowtransparency'));
89 embedder
.test
.assertTrue(webview
.allowtransparency
);
90 embedder
.test
.succeed();
93 document
.body
.appendChild(webview
);
96 function testAPIMethodExistence() {
97 var apiMethodsToCheck
= [
116 'isUserAgentOverridden',
117 'setUserAgentOverride'
119 var webview
= document
.createElement('webview');
120 webview
.setAttribute('partition', arguments
.callee
.name
);
121 webview
.addEventListener('loadstop', function(e
) {
122 for (var i
= 0; i
< apiMethodsToCheck
.length
; ++i
) {
123 embedder
.test
.assertEq('function',
124 typeof webview
[apiMethodsToCheck
[i
]]);
127 // Check contentWindow.
128 embedder
.test
.assertEq('object', typeof webview
.contentWindow
);
129 embedder
.test
.assertEq('function',
130 typeof webview
.contentWindow
.postMessage
);
131 embedder
.test
.succeed();
133 webview
.setAttribute('src', 'data:text/html,webview check api');
134 document
.body
.appendChild(webview
);
137 // This test verifies that assigning the src attribute the same value it had
138 // prior to a crash spawns off a new guest process.
139 function testAssignSrcAfterCrash() {
140 var webview
= document
.createElement('webview');
141 webview
.setAttribute('partition', arguments
.callee
.name
);
142 var terminated
= false;
143 webview
.addEventListener('loadstop', function(evt
) {
148 // The guest has recovered after being terminated.
149 embedder
.test
.succeed();
151 webview
.addEventListener('exit', function(evt
) {
153 webview
.setAttribute('src', 'data:text/html,test page');
155 webview
.setAttribute('src', 'data:text/html,test page');
156 document
.body
.appendChild(webview
);
159 // Makes sure 'sizechanged' event is fired only if autosize attribute is
161 // After loading <webview> without autosize attribute and a size, say size1,
162 // we set autosize attribute and new min size with size2. We would get (only
163 // one) sizechanged event with size1 as old size and size2 as new size.
164 function testAutosizeAfterNavigation() {
165 var webview
= document
.createElement('webview');
168 var autosizeWidth
= -1;
169 var autosizeHeight
= -1;
170 var sizeChangeHandler = function(e
) {
173 // This would be triggered after we set autosize attribute.
174 embedder
.test
.assertEq(50, e
.oldWidth
);
175 embedder
.test
.assertEq(100, e
.oldHeight
);
176 embedder
.test
.assertTrue(e
.newWidth
>= 60 && e
.newWidth
<= 70);
177 embedder
.test
.assertTrue(e
.newHeight
>= 110 && e
.newHeight
<= 120);
179 // Remove autosize attribute and expect webview to retain the same size.
180 autosizeWidth
= e
.newWidth
;
181 autosizeHeight
= e
.newHeight
;
182 webview
.removeAttribute('autosize');
185 // Expect the autosized size.
186 embedder
.test
.assertEq(autosizeWidth
, e
.newWidth
);
187 embedder
.test
.assertEq(autosizeHeight
, e
.newHeight
);
189 embedder
.test
.succeed();
192 window
.console
.log('Unexpected sizechanged event, step = ' + step
);
193 embedder
.test
.fail();
200 webview
.addEventListener('sizechanged', sizeChangeHandler
);
202 webview
.addEventListener('loadstop', function(e
) {
203 webview
.setAttribute('autosize', true);
204 webview
.setAttribute('minwidth', 60);
205 webview
.setAttribute('maxwidth', 70);
206 webview
.setAttribute('minheight', 110);
207 webview
.setAttribute('maxheight', 120);
210 webview
.style
.width
= '50px';
211 webview
.style
.height
= '100px';
212 webview
.setAttribute('src', 'data:text/html,webview test sizechanged event');
213 document
.body
.appendChild(webview
);
216 // This test verifies that if a browser plugin is in autosize mode before
217 // navigation then the guest starts auto-sized.
218 function testAutosizeBeforeNavigation() {
219 var webview
= document
.createElement('webview');
221 webview
.setAttribute('autosize', 'true');
222 webview
.setAttribute('minwidth', 200);
223 webview
.setAttribute('maxwidth', 210);
224 webview
.setAttribute('minheight', 100);
225 webview
.setAttribute('maxheight', 110);
227 webview
.addEventListener('sizechanged', function(e
) {
228 embedder
.test
.assertTrue(e
.newWidth
>= 200 && e
.newWidth
<= 210);
229 embedder
.test
.assertTrue(e
.newHeight
>= 100 && e
.newHeight
<= 110);
230 embedder
.test
.succeed();
233 webview
.setAttribute('src', 'data:text/html,webview test sizechanged event');
234 document
.body
.appendChild(webview
);
237 // This test verifies that a lengthy page with autosize enabled will report
238 // the correct height in the sizechanged event.
239 function testAutosizeHeight() {
240 var webview
= document
.createElement('webview');
242 webview
.autosize
= true;
243 webview
.minwidth
= 200;
244 webview
.maxwidth
= 210;
245 webview
.minheight
= 40;
246 webview
.maxheight
= 200;
249 webview
.addEventListener('sizechanged', function(e
) {
252 embedder
.test
.assertEq(200, e
.newHeight
);
253 // Change the maxheight to verify that we see the change.
254 webview
.maxheight
= 50;
257 embedder
.test
.assertEq(200, e
.oldHeight
);
258 embedder
.test
.assertEq(50, e
.newHeight
);
259 embedder
.test
.succeed();
262 window
.console
.log('Unexpected sizechanged event, step = ' + step
);
263 embedder
.test
.fail();
269 webview
.src
= 'data:text/html,' +
270 'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>' +
271 'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>' +
272 'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>' +
273 'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>' +
274 'a<br/>b<br/>c<br/>d<br/>e<br/>f<br/>';
275 document
.body
.appendChild(webview
);
278 // This test verifies that all autosize attributes can be removed
279 // without crashing the plugin, or throwing errors.
280 function testAutosizeRemoveAttributes() {
281 var webview
= document
.createElement('webview');
284 var sizeChangeHandler = function(e
) {
287 // This is the sizechanged event for autosize.
289 // Remove attributes.
290 webview
.removeAttribute('minwidth');
291 webview
.removeAttribute('maxwidth');
292 webview
.removeAttribute('minheight');
293 webview
.removeAttribute('maxheight');
294 webview
.removeAttribute('autosize');
296 // We'd get one more sizechanged event after we turn off
298 webview
.style
.width
= '500px';
299 webview
.style
.height
= '500px';
302 embedder
.test
.succeed();
309 webview
.addEventListener('loadstop', function(e
) {
310 webview
.minwidth
= 300;
311 webview
.maxwidth
= 700;
312 webview
.minheight
= 600;
313 webview
.maxheight
= 400;
314 webview
.autosize
= true;
317 webview
.addEventListener('sizechanged', sizeChangeHandler
);
319 webview
.style
.width
= '640px';
320 webview
.style
.height
= '480px';
321 webview
.setAttribute('src', 'data:text/html,webview check autosize');
322 document
.body
.appendChild(webview
);
325 // This test verifies that autosize works when some of the parameters are unset.
326 function testAutosizeWithPartialAttributes() {
327 window
.console
.log('testAutosizeWithPartialAttributes');
328 var webview
= document
.createElement('webview');
331 var sizeChangeHandler = function(e
) {
332 window
.console
.log('sizeChangeHandler, new: ' +
333 e
.newWidth
+ ' X ' + e
.newHeight
);
337 embedder
.test
.assertEq(300, e
.newWidth
);
338 embedder
.test
.assertEq(200, e
.newHeight
);
340 // Change the min size to cause a relayout.
341 webview
.minwidth
= 500;
344 embedder
.test
.assertTrue(e
.newWidth
>= webview
.minwidth
);
345 embedder
.test
.assertTrue(e
.newWidth
<= webview
.maxwidth
);
347 // Tests when minwidth > maxwidth, minwidth = maxwidth.
348 // i.e. minwidth is essentially 700.
349 webview
.minwidth
= 800;
353 embedder
.test
.assertEq(700, e
.newWidth
);
354 embedder
.test
.assertTrue(e
.newHeight
>= 200);
355 embedder
.test
.assertTrue(e
.newHeight
<= 600);
357 embedder
.test
.succeed();
360 window
.console
.log('Unexpected sizechanged event, step = ' + step
);
361 embedder
.test
.fail();
368 webview
.addEventListener('sizechanged', sizeChangeHandler
);
370 webview
.addEventListener('loadstop', function(e
) {
371 webview
.minwidth
= 300;
372 webview
.maxwidth
= 700;
373 webview
.minheight
= 200;
374 webview
.maxheight
= 600;
375 webview
.autosize
= true;
378 webview
.style
.width
= '640px';
379 webview
.style
.height
= '480px';
380 webview
.setAttribute('src', 'data:text/html,webview check autosize');
381 document
.body
.appendChild(webview
);
384 // This test registers two event listeners on a same event (loadcommit).
385 // Each of the listener tries to change some properties on the event param,
386 // which should not be possible.
387 function testCannotMutateEventName() {
388 var webview
= document
.createElement('webview');
389 var url
= 'data:text/html,<body>Two</body>';
390 var loadCommitACalled
= false;
391 var loadCommitBCalled
= false;
393 var maybeFinishTest = function(e
) {
394 if (loadCommitACalled
&& loadCommitBCalled
) {
395 embedder
.test
.assertEq('loadcommit', e
.type
);
396 embedder
.test
.succeed();
400 var onLoadCommitA = function(e
) {
402 embedder
.test
.assertEq('loadcommit', e
.type
);
403 embedder
.test
.assertTrue(e
.isTopLevel
);
404 embedder
.test
.assertFalse(loadCommitACalled
);
405 loadCommitACalled
= true;
406 // Try mucking with properities inside |e|.
411 var onLoadCommitB = function(e
) {
413 embedder
.test
.assertEq('loadcommit', e
.type
);
414 embedder
.test
.assertTrue(e
.isTopLevel
);
415 embedder
.test
.assertFalse(loadCommitBCalled
);
416 loadCommitBCalled
= true;
417 // Try mucking with properities inside |e|.
423 // The test starts from here, by setting the src to |url|. Event
424 // listener registration works because we already have a (dummy) src set
425 // on the <webview> tag.
426 webview
.addEventListener('loadcommit', onLoadCommitA
);
427 webview
.addEventListener('loadcommit', onLoadCommitB
);
428 webview
.setAttribute('src', url
);
429 document
.body
.appendChild(webview
);
432 // This test verifies that the loadstop event fires when loading a webview
433 // accessible resource from a partition that is privileged if the src URL
434 // is not fully qualified.
435 function testChromeExtensionRelativePath() {
436 var webview
= document
.createElement('webview');
437 // foobar is a privileged partition according to the manifest file.
438 webview
.partition
= 'foobar';
439 webview
.addEventListener('loadabort', function(e
) {
440 embedder
.test
.fail();
442 webview
.addEventListener('loadstop', function(e
) {
443 embedder
.test
.succeed();
445 webview
.setAttribute('src', 'guest_with_inline_script.html');
446 document
.body
.appendChild(webview
);
449 // This test verifies that the loadstop event fires when loading a webview
450 // accessible resource from a partition that is privileged.
451 function testChromeExtensionURL() {
452 var localResource
= chrome
.runtime
.getURL('guest_with_inline_script.html');
453 var webview
= document
.createElement('webview');
454 // foobar is a privileged partition according to the manifest file.
455 webview
.partition
= 'foobar';
456 webview
.addEventListener('loadabort', function(e
) {
457 embedder
.test
.fail();
459 webview
.addEventListener('loadstop', function(e
) {
460 embedder
.test
.succeed();
462 webview
.setAttribute('src', localResource
);
463 document
.body
.appendChild(webview
);
466 // This test verifies that the load event fires when the a new page is
468 // TODO(fsamuel): Add a test to verify that subframe loads within a guest
469 // do not fire the 'contentload' event.
470 function testContentLoadEvent() {
471 var webview
= document
.createElement('webview');
472 webview
.addEventListener('contentload', function(e
) {
473 embedder
.test
.succeed();
475 webview
.setAttribute('src', 'data:text/html,trigger navigation');
476 document
.body
.appendChild(webview
);
479 // This test verifies that the basic use cases of the declarative WebRequest API
480 // work as expected. This test demonstrates that rules can be added prior to
481 // navigation and attachment.
482 // 1. It adds a rule to block URLs that contain guest.
483 // 2. It attempts to navigate to a guest.html page.
484 // 3. It detects the appropriate loadabort message.
485 // 4. It removes the rule blocking the page and reloads.
486 // 5. The page loads successfully.
487 function testDeclarativeWebRequestAPI() {
489 var webview
= new WebView();
492 new chrome
.webViewRequest
.RequestMatcher(
494 url
: { urlContains
: 'guest' }
499 new chrome
.webViewRequest
.CancelRequest()
502 webview
.request
.onRequest
.addRules([rule
]);
503 webview
.addEventListener('loadabort', function(e
) {
504 embedder
.test
.assertEq(1, step
);
505 embedder
.test
.assertEq('ERR_BLOCKED_BY_CLIENT', e
.reason
);
507 webview
.request
.onRequest
.removeRules();
510 webview
.addEventListener('loadstop', function(e
) {
511 embedder
.test
.assertEq(2, step
);
512 embedder
.test
.succeed();
514 webview
.src
= embedder
.emptyGuestURL
;
515 document
.body
.appendChild(webview
);
518 function testDeclarativeWebRequestAPISendMessage() {
519 var webview
= new WebView();
520 window
.console
.log(embedder
.emptyGuestURL
);
523 new chrome
.webViewRequest
.RequestMatcher(
525 url
: { urlContains
: 'guest' }
530 new chrome
.webViewRequest
.SendMessageToExtension({ message
: 'bleep' })
533 webview
.request
.onRequest
.addRules([rule
]);
534 webview
.request
.onMessage
.addListener(function(e
) {
535 embedder
.test
.assertEq('bleep', e
.message
);
536 embedder
.test
.succeed();
538 webview
.src
= embedder
.emptyGuestURL
;
539 document
.body
.appendChild(webview
);
542 // This test registers two listeners on an event (loadcommit) and removes
543 // the <webview> tag when the first listener fires.
544 // Current expected behavior is that the second event listener will still
545 // fire without crashing.
546 function testDestroyOnEventListener() {
547 var webview
= document
.createElement('webview');
548 var url
= 'data:text/html,<body>Destroy test</body>';
550 var loadCommitCount
= 0;
551 function loadCommitCommon(e
) {
552 embedder
.test
.assertEq('loadcommit', e
.type
);
556 if (loadCommitCount
== 2) {
557 // Pass in a timeout so that we can catch if any additional loadcommit
559 setTimeout(function() {
560 embedder
.test
.succeed();
562 } else if (loadCommitCount
> 2) {
563 embedder
.test
.fail();
567 // The test starts from here, by setting the src to |url|.
568 webview
.addEventListener('loadcommit', function(e
) {
569 window
.console
.log('loadcommit1');
570 webview
.parentNode
.removeChild(webview
);
573 webview
.addEventListener('loadcommit', function(e
) {
574 window
.console
.log('loadcommit2');
577 webview
.setAttribute('src', url
);
578 document
.body
.appendChild(webview
);
581 // Tests that a <webview> that starts with "display: none" style loads
583 function testDisplayNoneWebviewLoad() {
584 var webview
= document
.createElement('webview');
586 webview
.style
.display
= 'none';
587 // foobar is a privileged partition according to the manifest file.
588 webview
.partition
= 'foobar';
589 webview
.addEventListener('loadabort', function(e
) {
590 embedder
.test
.fail();
592 webview
.addEventListener('loadstop', function(e
) {
593 embedder
.test
.assertTrue(visible
);
594 embedder
.test
.succeed();
596 // Set the .src while we are "display: none".
597 webview
.setAttribute('src', 'about:blank');
598 document
.body
.appendChild(webview
);
600 setTimeout(function() {
602 // This should trigger loadstop.
603 webview
.style
.display
= '';
607 function testDisplayNoneWebviewRemoveChild() {
608 var webview
= document
.createElement('webview');
609 var visibleAndInDOM
= false;
610 webview
.style
.display
= 'none';
611 // foobar is a privileged partition according to the manifest file.
612 webview
.partition
= 'foobar';
613 webview
.addEventListener('loadabort', function(e
) {
614 embedder
.test
.fail();
616 webview
.addEventListener('loadstop', function(e
) {
617 embedder
.test
.assertTrue(visibleAndInDOM
);
618 embedder
.test
.succeed();
620 // Set the .src while we are "display: none".
621 webview
.setAttribute('src', 'about:blank');
622 document
.body
.appendChild(webview
);
624 setTimeout(function() {
625 webview
.parentNode
.removeChild(webview
);
626 webview
.style
.display
= '';
627 visibleAndInDOM
= true;
628 // This should trigger loadstop.
629 document
.body
.appendChild(webview
);
633 // This test verifies that the loadstart, loadstop, and exit events fire as
635 function testEventName() {
636 var webview
= document
.createElement('webview');
637 webview
.setAttribute('partition', arguments
.callee
.name
);
639 webview
.addEventListener('loadstart', function(evt
) {
640 embedder
.test
.assertEq('loadstart', evt
.type
);
643 webview
.addEventListener('loadstop', function(evt
) {
644 embedder
.test
.assertEq('loadstop', evt
.type
);
648 webview
.addEventListener('exit', function(evt
) {
649 embedder
.test
.assertEq('exit', evt
.type
);
650 embedder
.test
.succeed();
653 webview
.setAttribute('src', 'data:text/html,trigger navigation');
654 document
.body
.appendChild(webview
);
657 function testExecuteScript() {
658 var webview
= document
.createElement('webview');
659 webview
.addEventListener('loadstop', function() {
660 webview
.executeScript(
661 {code
:'document.body.style.backgroundColor = "red";'},
663 embedder
.test
.assertEq(1, results
.length
);
664 embedder
.test
.assertEq('red', results
[0]);
665 embedder
.test
.succeed();
668 webview
.setAttribute('src', 'data:text/html,trigger navigation');
669 document
.body
.appendChild(webview
);
672 function testExecuteScriptFail() {
673 var webview
= document
.createElement('webview');
674 document
.body
.appendChild(webview
);
675 setTimeout(function() {
676 webview
.executeScript(
677 {code
:'document.body.style.backgroundColor = "red";'},
679 embedder
.test
.fail();
681 setTimeout(function() {
682 embedder
.test
.succeed();
687 // This test verifies that the call to executeScript will fail and return null
688 // if the webview has been navigated between the time the call was made and the
689 // time it arrives in the guest process.
690 function testExecuteScriptIsAbortedWhenWebViewSourceIsChanged() {
691 var webview
= document
.createElement('webview');
692 webview
.addEventListener('loadstop', function onLoadStop(e
) {
693 window
.console
.log('2. Inject script to trigger a guest-initiated ' +
695 var navUrl
= 'data:text/html,trigger nav';
696 webview
.executeScript({
697 code
: 'window.location.href = "' + navUrl
+ '";'
700 window
.console
.log('3. Listening for the load that will be started as a ' +
702 webview
.addEventListener('loadstart', function onLoadStart(e
) {
703 embedder
.test
.assertEq('about:blank', webview
.src
);
704 window
.console
.log('4. Attempting to inject script into about:blank. ' +
705 'This is expected to fail.');
706 webview
.executeScript(
707 { code
: 'document.body.style.backgroundColor = "red";' },
710 '5. Verify that executeScript has, indeed, failed.');
711 embedder
.test
.assertEq(null, results
);
712 embedder
.test
.assertEq(navUrl
, webview
.src
);
713 embedder
.test
.succeed();
716 webview
.removeEventListener('loadstart', onLoadStart
);
718 webview
.removeEventListener('loadstop', onLoadStop
);
721 window
.console
.log('1. Performing initial navigation.');
722 webview
.setAttribute('src', 'about:blank');
723 document
.body
.appendChild(webview
);
726 function testFindAPI() {
727 var webview
= new WebView();
728 webview
.src
= 'data:text/html,Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
729 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
730 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
731 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
732 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
733 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
734 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
735 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
736 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
737 'Dog dog dog Dog dog dogcatDog dogDogdog<br><br>' +
738 '<a href="about:blank">Click here!</a>';
740 var loadstopListener2 = function(e
) {
741 embedder
.test
.assertEq(webview
.src
, "about:blank");
742 embedder
.test
.succeed();
745 var loadstopListener1 = function(e
) {
746 // Test find results.
747 webview
.find("dog", {}, function(results
) {
749 embedder
.test
.assertEq(results
.numberOfMatches
, 100);
750 embedder
.test
.assertTrue(results
.selectionRect
.width
> 0);
751 embedder
.test
.assertTrue(results
.selectionRect
.height
> 0);
753 // Test finding next active matches.
758 webview
.find("dog", {}, function(results
) {
759 embedder
.test
.assertEq(results
.activeMatchOrdinal
, 6);
760 webview
.find("dog", {backward
: true});
761 webview
.find("dog", {backward
: true}, function(results
) {
762 // Test the |backward| find option.
763 embedder
.test
.assertEq(results
.activeMatchOrdinal
, 4);
765 // Test the |matchCase| find option.
766 webview
.find("Dog", {matchCase
: true}, function(results
) {
767 embedder
.test
.assertEq(results
.numberOfMatches
, 40);
769 // Test canceling find requests.
771 webview
.stopFinding();
775 // Test find results when looking for something that isn't there.
776 webview
.find("fish", {}, function(results
) {
777 embedder
.test
.assertEq(results
.numberOfMatches
, 0);
778 embedder
.test
.assertEq(results
.activeMatchOrdinal
, 0);
779 embedder
.test
.assertEq(results
.selectionRect
.left
, 0);
780 embedder
.test
.assertEq(results
.selectionRect
.top
, 0);
781 embedder
.test
.assertEq(results
.selectionRect
.width
, 0);
782 embedder
.test
.assertEq(results
.selectionRect
.height
, 0);
784 // Test following a link with stopFinding().
785 webview
.removeEventListener('loadstop', loadstopListener1
);
786 webview
.addEventListener('loadstop', loadstopListener2
);
787 webview
.find("click here!", {}, function() {
788 webview
.stopFinding("activate");
797 webview
.addEventListener('loadstop', loadstopListener1
);
798 document
.body
.appendChild(webview
);
801 function testFindAPI_findupdate() {
802 var webview
= new WebView();
803 webview
.src
= 'data:text/html,Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
804 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
805 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
806 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
807 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
808 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
809 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
810 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
811 'Dog dog dog Dog dog dogcatDog dogDogdog<br>' +
812 'Dog dog dog Dog dog dogcatDog dogDogdog<br><br>' +
813 '<a href="about:blank">Click here!</a>';
814 var canceledTest
= false;
815 webview
.addEventListener('loadstop', function(e
) {
816 // Test the |findupdate| event.
817 webview
.addEventListener('findupdate', function(e
) {
818 if (e
.activeMatchOrdinal
> 0) {
819 // embedder.test.assertTrue(e.numberOfMatches >= e.activeMatchOrdinal)
820 // This currently fails because of http://crbug.com/342445 .
821 embedder
.test
.assertTrue(e
.selectionRect
.width
> 0);
822 embedder
.test
.assertTrue(e
.selectionRect
.height
> 0);
829 embedder
.test
.assertEq(e
.searchText
, "dog");
830 embedder
.test
.assertEq(e
.numberOfMatches
, 100);
831 embedder
.test
.assertEq(e
.activeMatchOrdinal
, 1);
832 embedder
.test
.assertTrue(canceledTest
);
833 embedder
.test
.succeed();
842 document
.body
.appendChild(webview
);
845 // This test verifies that getProcessId is defined and returns a non-zero
846 // value corresponding to the processId of the guest process.
847 function testGetProcessId() {
848 var webview
= document
.createElement('webview');
849 webview
.setAttribute('src', 'data:text/html,trigger navigation');
850 var firstLoad = function() {
851 webview
.removeEventListener('loadstop', firstLoad
);
852 embedder
.test
.assertTrue(webview
.getProcessId() > 0);
853 embedder
.test
.succeed();
855 webview
.addEventListener('loadstop', firstLoad
);
856 document
.body
.appendChild(webview
);
859 function testHiddenBeforeNavigation() {
860 var webview
= document
.createElement('webview');
861 webview
.style
.visibility
= 'hidden';
863 var postMessageHandler = function(e
) {
864 var data
= JSON
.parse(e
.data
);
865 window
.removeEventListener('message', postMessageHandler
);
866 if (data
[0] == 'visibilityState-response') {
867 embedder
.test
.assertEq('hidden', data
[1]);
868 embedder
.test
.succeed();
870 window
.console
.warn('Unexpected message: ' + data
);
871 embedder
.test
.fail();
875 webview
.addEventListener('loadstop', function(e
) {
876 window
.console
.warn('webview.loadstop');
877 window
.addEventListener('message', postMessageHandler
);
878 webview
.addEventListener('consolemessage', function(e
) {
879 window
.console
.warn('g: ' + e
.message
);
882 webview
.executeScript(
883 {file
: 'inject_hidden_test.js'},
885 if (!results
|| !results
.length
) {
886 window
.console
.warn('Failed to inject script: inject_hidden_test.js');
887 embedder
.test
.fail();
891 window
.console
.warn('script injection success');
892 webview
.contentWindow
.postMessage(
893 JSON
.stringify(['visibilityState-request']), '*');
897 webview
.setAttribute('src', 'data:text/html,<html><body></body></html>');
898 document
.body
.appendChild(webview
);
901 // Makes sure inline scripts works inside guest that was loaded from
902 // accessible_resources.
903 function testInlineScriptFromAccessibleResources() {
904 var webview
= document
.createElement('webview');
905 // foobar is a privileged partition according to the manifest file.
906 webview
.partition
= 'foobar';
907 webview
.addEventListener('loadabort', function(e
) {
908 embedder
.test
.fail();
910 webview
.addEventListener('consolemessage', function(e
) {
911 window
.console
.log('consolemessage: ' + e
.message
);
912 if (e
.message
== 'guest_with_inline_script.html: Inline script ran') {
913 embedder
.test
.succeed();
916 webview
.setAttribute('src', 'guest_with_inline_script.html');
917 document
.body
.appendChild(webview
);
920 // This tests verifies that webview fires a loadabort event instead of crashing
921 // the browser if we attempt to navigate to a chrome-extension: URL with an
922 // extension ID that does not exist.
923 function testInvalidChromeExtensionURL() {
924 var invalidResource
= 'chrome-extension://abc123/guest.html';
925 var webview
= document
.createElement('webview');
926 // foobar is a privileged partition according to the manifest file.
927 webview
.partition
= 'foobar';
928 webview
.addEventListener('loadabort', function(e
) {
929 embedder
.test
.succeed();
931 webview
.setAttribute('src', invalidResource
);
932 document
.body
.appendChild(webview
);
935 // This test verifies that the loadabort event fires when loading a webview
936 // accessible resource from a partition that is not privileged.
937 function testLoadAbortChromeExtensionURLWrongPartition() {
938 var localResource
= chrome
.runtime
.getURL('guest.html');
939 var webview
= document
.createElement('webview');
940 webview
.addEventListener('loadabort', function(e
) {
941 embedder
.test
.assertEq('ERR_ADDRESS_UNREACHABLE', e
.reason
);
942 embedder
.test
.succeed();
944 webview
.addEventListener('loadstop', function(e
) {
945 embedder
.test
.fail();
947 webview
.setAttribute('src', localResource
);
948 document
.body
.appendChild(webview
);
951 // This test verifies that the loadabort event fires as expected and with the
952 // appropriate fields when an empty response is returned.
953 function testLoadAbortEmptyResponse() {
954 var webview
= document
.createElement('webview');
955 webview
.addEventListener('loadabort', function(e
) {
956 embedder
.test
.assertEq('ERR_EMPTY_RESPONSE', e
.reason
);
957 embedder
.test
.succeed();
959 webview
.setAttribute('src', embedder
.closeSocketURL
);
960 document
.body
.appendChild(webview
);
963 // This test verifies that the loadabort event fires as expected when an illegal
964 // chrome URL is provided.
965 function testLoadAbortIllegalChromeURL() {
966 var webview
= document
.createElement('webview');
967 webview
.addEventListener('loadabort', function(e
) {
968 embedder
.test
.assertEq('ERR_ABORTED', e
.reason
);
970 webview
.addEventListener('loadstop', function(e
) {
971 embedder
.test
.assertEq('about:blank', webview
.src
);
972 embedder
.test
.succeed();
974 webview
.src
= 'chrome://newtab';
975 document
.body
.appendChild(webview
);
978 function testLoadAbortIllegalFileURL() {
979 var webview
= document
.createElement('webview');
980 webview
.addEventListener('loadabort', function(e
) {
981 embedder
.test
.assertEq('ERR_ABORTED', e
.reason
);
983 webview
.addEventListener('loadstop', function(e
) {
984 embedder
.test
.assertEq('about:blank', webview
.src
);
985 embedder
.test
.succeed();
987 webview
.src
= 'file://foo';
988 document
.body
.appendChild(webview
);
991 function testLoadAbortIllegalJavaScriptURL() {
992 var webview
= document
.createElement('webview');
993 webview
.addEventListener('loadabort', function(e
) {
994 embedder
.test
.assertEq('ERR_ABORTED', e
.reason
);
996 webview
.addEventListener('loadstop', function(e
) {
997 embedder
.test
.assertEq('about:blank', webview
.src
);
998 embedder
.test
.succeed();
1000 webview
.setAttribute('src', 'javascript:void(document.bgColor="#0000FF")');
1001 document
.body
.appendChild(webview
);
1004 // Verifies that navigating to invalid URL (e.g. 'http:') doesn't cause a crash.
1005 function testLoadAbortInvalidNavigation() {
1006 var webview
= document
.createElement('webview');
1007 webview
.addEventListener('loadabort', function(e
) {
1008 embedder
.test
.assertEq('ERR_ABORTED', e
.reason
);
1009 embedder
.test
.assertEq('', e
.url
);
1011 webview
.addEventListener('loadstop', function(e
) {
1012 embedder
.test
.assertEq('about:blank', webview
.src
);
1013 embedder
.test
.succeed();
1015 webview
.addEventListener('exit', function(e
) {
1016 // We should not crash.
1017 embedder
.test
.fail();
1019 webview
.src
= 'http:';
1020 document
.body
.appendChild(webview
);
1023 // Verifies that navigation to a URL that is valid but not web-safe or
1024 // pseudo-scheme fires loadabort and doesn't cause a crash.
1025 function testLoadAbortNonWebSafeScheme() {
1026 var webview
= document
.createElement('webview');
1027 var chromeGuestURL
= 'chrome-guest://abc123/';
1028 webview
.addEventListener('loadabort', function(e
) {
1029 embedder
.test
.assertEq('ERR_ABORTED', e
.reason
);
1030 embedder
.test
.assertEq(chromeGuestURL
, e
.url
);
1032 webview
.addEventListener('loadstop', function(e
) {
1033 embedder
.test
.assertEq('about:blank', webview
.src
);
1034 embedder
.test
.succeed();
1036 webview
.addEventListener('exit', function(e
) {
1037 // We should not crash.
1038 embedder
.test
.fail();
1040 webview
.src
= chromeGuestURL
;
1041 document
.body
.appendChild(webview
);
1044 // Tests that the 'loadprogress' event is triggered correctly.
1045 function testLoadProgressEvent() {
1046 var webview
= document
.createElement('webview');
1049 webview
.addEventListener('loadstop', function(evt
) {
1050 embedder
.test
.assertEq(1, progress
);
1051 embedder
.test
.succeed();
1054 webview
.addEventListener('loadprogress', function(evt
) {
1055 progress
= evt
.progress
;
1058 webview
.setAttribute('src', 'data:text/html,trigger navigation');
1059 document
.body
.appendChild(webview
);
1062 // This test verifies that the loadstart event fires at the beginning of a load
1063 // and the loadredirect event fires when a redirect occurs.
1064 function testLoadStartLoadRedirect() {
1065 var webview
= document
.createElement('webview');
1066 var loadstartCalled
= false;
1067 webview
.setAttribute('src', embedder
.redirectGuestURL
);
1068 webview
.addEventListener('loadstart', function(e
) {
1069 embedder
.test
.assertTrue(e
.isTopLevel
);
1070 embedder
.test
.assertEq(embedder
.redirectGuestURL
, e
.url
);
1071 loadstartCalled
= true;
1073 webview
.addEventListener('loadredirect', function(e
) {
1074 embedder
.test
.assertTrue(e
.isTopLevel
);
1075 embedder
.test
.assertEq(embedder
.redirectGuestURL
,
1076 e
.oldUrl
.replace('127.0.0.1', 'localhost'));
1077 embedder
.test
.assertEq(embedder
.redirectGuestURLDest
,
1078 e
.newUrl
.replace('127.0.0.1', 'localhost'));
1079 if (loadstartCalled
) {
1080 embedder
.test
.succeed();
1082 embedder
.test
.fail();
1085 document
.body
.appendChild(webview
);
1088 function testNavigationToExternalProtocol() {
1089 var webview
= document
.createElement('webview');
1090 webview
.addEventListener('loadstop', function(e
) {
1091 webview
.addEventListener('loadabort', function(e
) {
1092 embedder
.test
.assertEq('ERR_UNKNOWN_URL_SCHEME', e
.reason
);
1093 embedder
.test
.succeed();
1095 webview
.executeScript({
1096 code
: 'window.location.href = "tel:+12223334444";'
1097 }, function(results
) {});
1099 webview
.setAttribute('src', 'data:text/html,navigate to external protocol');
1100 document
.body
.appendChild(webview
);
1103 // This test ensures if the guest isn't there and we resize the guest (from JS),
1104 // it remembers the size correctly.
1105 function testNavigateAfterResize() {
1106 var webview
= document
.createElement('webview');
1108 var postMessageHandler = function(e
) {
1109 var data
= JSON
.parse(e
.data
);
1110 webview
.removeEventListener('message', postMessageHandler
);
1111 if (data
[0] == 'dimension-response') {
1112 var actualWidth
= data
[1];
1113 var actualHeight
= data
[2];
1114 embedder
.test
.assertEq(100, actualWidth
);
1115 embedder
.test
.assertEq(125, actualHeight
);
1116 embedder
.test
.succeed();
1119 window
.addEventListener('message', postMessageHandler
);
1121 webview
.addEventListener('consolemessage', function(e
) {
1122 window
.console
.warn('guest log: ' + e
.message
);
1125 webview
.addEventListener('loadstop', function(e
) {
1126 webview
.executeScript(
1127 {file
: 'navigate_after_resize.js'},
1129 if (!results
|| !results
.length
) {
1130 window
.console
.warn('Failed to inject navigate_after_resize.js');
1131 embedder
.test
.fail();
1134 var msg
= ['dimension-request'];
1135 webview
.contentWindow
.postMessage(JSON
.stringify(msg
), '*');
1140 webview
.style
.width
= '100px';
1141 webview
.style
.height
= '125px';
1144 webview
.src
= 'about:blank';
1145 document
.body
.appendChild(webview
);
1148 // This test verifies that multiple consecutive changes to the <webview> src
1149 // attribute will cause a navigation.
1150 function testNavOnConsecutiveSrcAttributeChanges() {
1151 var testPage1
= 'data:text/html,test page 1';
1152 var testPage2
= 'data:text/html,test page 2';
1153 var testPage3
= 'data:text/html,test page 3';
1154 var webview
= document
.createElement('webview');
1155 webview
.partition
= arguments
.callee
.name
;
1156 var loadCommitCount
= 0;
1157 webview
.addEventListener('loadcommit', function(e
) {
1158 if (e
.url
== testPage3
) {
1159 embedder
.test
.succeed();
1162 if (loadCommitCount
> 3) {
1163 embedder
.test
.fail();
1166 document
.body
.appendChild(webview
);
1167 webview
.src
= testPage1
;
1168 webview
.src
= testPage2
;
1169 webview
.src
= testPage3
;
1172 // This test verifies that we can set the <webview> src multiple times and the
1173 // changes will cause a navigation.
1174 function testNavOnSrcAttributeChange() {
1175 var testPage1
= 'data:text/html,test page 1';
1176 var testPage2
= 'data:text/html,test page 2';
1177 var testPage3
= 'data:text/html,test page 3';
1178 var tests
= [testPage1
, testPage2
, testPage3
];
1179 var webview
= document
.createElement('webview');
1180 webview
.partition
= arguments
.callee
.name
;
1181 var loadCommitCount
= 0;
1182 webview
.addEventListener('loadcommit', function(evt
) {
1183 var success
= tests
.indexOf(evt
.url
) > -1;
1184 embedder
.test
.assertTrue(success
);
1186 if (loadCommitCount
== tests
.length
) {
1187 embedder
.test
.succeed();
1188 } else if (loadCommitCount
> tests
.length
) {
1189 embedder
.test
.fail();
1191 webview
.src
= tests
[loadCommitCount
];
1194 webview
.src
= tests
[0];
1195 document
.body
.appendChild(webview
);
1198 // This test verifies that new window attachment functions as expected.
1199 function testNewWindow() {
1200 var webview
= document
.createElement('webview');
1201 webview
.addEventListener('newwindow', function(e
) {
1203 var newwebview
= document
.createElement('webview');
1204 newwebview
.addEventListener('loadstop', function(evt
) {
1205 // If the new window finishes loading, the test is successful.
1206 embedder
.test
.succeed();
1208 document
.body
.appendChild(newwebview
);
1209 // Attach the new window to the new <webview>.
1210 e
.window
.attach(newwebview
);
1212 webview
.setAttribute('src', embedder
.windowOpenGuestURL
);
1213 document
.body
.appendChild(webview
);
1216 // This test verifies that the attach can be called inline without
1217 // preventing default.
1218 function testNewWindowNoPreventDefault() {
1219 var webview
= document
.createElement('webview');
1220 webview
.addEventListener('newwindow', function(e
) {
1221 var newwebview
= document
.createElement('webview');
1222 document
.body
.appendChild(newwebview
);
1223 // Attach the new window to the new <webview>.
1225 e
.window
.attach(newwebview
);
1226 embedder
.test
.succeed();
1228 embedder
.test
.fail();
1231 webview
.setAttribute('src', embedder
.windowOpenGuestURL
);
1232 document
.body
.appendChild(webview
);
1235 function testNewWindowNoReferrerLink() {
1236 var webview
= document
.createElement('webview');
1237 webview
.addEventListener('newwindow', function(e
) {
1239 var newwebview
= document
.createElement('webview');
1240 newwebview
.addEventListener('loadstop', function(evt
) {
1241 // If the new window finishes loading, the test is successful.
1242 embedder
.test
.succeed();
1244 document
.body
.appendChild(newwebview
);
1245 // Attach the new window to the new <webview>.
1246 e
.window
.attach(newwebview
);
1248 webview
.setAttribute('src', embedder
.noReferrerGuestURL
);
1249 document
.body
.appendChild(webview
);
1252 // This test verifies "first-call-wins" semantics. That is, the first call
1253 // to perform an action on the new window takes the action and all
1254 // subsequent calls throw an exception.
1255 function testNewWindowTwoListeners() {
1256 var webview
= document
.createElement('webview');
1258 webview
.addEventListener('newwindow', function(e
) {
1260 var newwebview
= document
.createElement('webview');
1261 document
.body
.appendChild(newwebview
);
1263 e
.window
.attach(newwebview
);
1265 embedder
.test
.fail();
1268 webview
.addEventListener('newwindow', function(e
) {
1273 embedder
.test
.succeed();
1276 webview
.setAttribute('src', embedder
.windowOpenGuestURL
);
1277 document
.body
.appendChild(webview
);
1280 function testOnEventProperties() {
1281 var sequence
= ['first', 'second', 'third', 'fourth'];
1282 var webview
= document
.createElement('webview');
1283 function createHandler(id
) {
1284 return function(e
) {
1285 embedder
.test
.assertEq(id
, sequence
.shift());
1289 webview
.addEventListener('loadstart', createHandler('first'));
1290 webview
.addEventListener('loadstart', createHandler('second'));
1291 webview
.onloadstart
= createHandler('third');
1292 webview
.addEventListener('loadstart', createHandler('fourth'));
1293 webview
.addEventListener('loadstop', function(evt
) {
1294 embedder
.test
.assertEq(0, sequence
.length
);
1296 // Test that setting another 'onloadstart' handler replaces the previous
1298 sequence
= ['first', 'second', 'fourth'];
1299 webview
.onloadstart = function() {
1300 embedder
.test
.assertEq(0, sequence
.length
);
1301 embedder
.test
.succeed();
1304 webview
.setAttribute('src', 'data:text/html,next navigation');
1307 webview
.setAttribute('src', 'data:text/html,trigger navigation');
1308 document
.body
.appendChild(webview
);
1311 // This test verifies that the partion attribute cannot be changed after the src
1313 function testPartitionChangeAfterNavigation() {
1314 var webview
= document
.createElement('webview');
1315 var partitionAttribute
= arguments
.callee
.name
;
1316 webview
.setAttribute('partition', partitionAttribute
);
1318 var loadstopHandler = function(e
) {
1319 webview
.partition
= 'illegal';
1320 embedder
.test
.assertEq(partitionAttribute
, webview
.partition
);
1321 embedder
.test
.succeed();
1323 webview
.addEventListener('loadstop', loadstopHandler
);
1325 webview
.setAttribute('src', 'data:text/html,trigger navigation');
1326 document
.body
.appendChild(webview
);
1329 // This test verifies that removing partition attribute after navigation does
1330 // not work, i.e. the partition remains the same.
1331 function testPartitionRemovalAfterNavigationFails() {
1332 var webview
= document
.createElement('webview');
1334 var partition
= 'testme';
1335 webview
.setAttribute('partition', partition
);
1337 var loadstopHandler = function(e
) {
1338 // Removing after navigation should not change the partition.
1339 webview
.removeAttribute('partition');
1340 embedder
.test
.assertEq('testme', webview
.partition
);
1341 embedder
.test
.succeed();
1343 webview
.addEventListener('loadstop', loadstopHandler
);
1345 webview
.setAttribute('src', 'data:text/html,<html><body>guest</body></html>');
1346 document
.body
.appendChild(webview
);
1349 // This test verifies that <webview> reloads the page if the src attribute is
1350 // assigned the same value.
1351 function testReassignSrcAttribute() {
1352 var dataUrl
= 'data:text/html,test page';
1353 var webview
= document
.createElement('webview');
1354 webview
.partition
= arguments
.callee
.name
;
1356 var loadStopCount
= 0;
1357 webview
.addEventListener('loadstop', function(evt
) {
1358 embedder
.test
.assertEq(dataUrl
, webview
.getAttribute('src'));
1360 console
.log('[' + loadStopCount
+ '] loadstop called');
1361 if (loadStopCount
== 3) {
1362 embedder
.test
.succeed();
1363 } else if (loadStopCount
> 3) {
1364 embedder
.test
.fail();
1366 webview
.src
= dataUrl
;
1369 webview
.src
= dataUrl
;
1370 document
.body
.appendChild(webview
);
1373 // This test verifies that the reload method on webview functions as expected.
1374 function testReload() {
1375 var triggerNavUrl
= 'data:text/html,trigger navigation';
1376 var webview
= document
.createElement('webview');
1378 var loadCommitCount
= 0;
1379 webview
.addEventListener('loadstop', function(e
) {
1380 if (loadCommitCount
< 2) {
1382 } else if (loadCommitCount
== 2) {
1383 embedder
.test
.succeed();
1385 embedder
.test
.fail();
1388 webview
.addEventListener('loadcommit', function(e
) {
1389 embedder
.test
.assertEq(triggerNavUrl
, e
.url
);
1390 embedder
.test
.assertTrue(e
.isTopLevel
);
1394 webview
.setAttribute('src', triggerNavUrl
);
1395 document
.body
.appendChild(webview
);
1398 // This test verifies that the reload method on webview functions as expected.
1399 function testReloadAfterTerminate() {
1400 var triggerNavUrl
= 'data:text/html,trigger navigation';
1401 var webview
= document
.createElement('webview');
1404 webview
.addEventListener('loadstop', function(e
) {
1407 webview
.terminate();
1410 setTimeout(function() { embedder
.test
.succeed(); }, 0);
1413 window
.console
.log('Unexpected loadstop event, step = ' + step
);
1414 embedder
.test
.fail();
1420 webview
.addEventListener('exit', function(e
) {
1421 // Trigger a focus state change of the guest to test for
1422 // http://crbug.com/413874.
1425 setTimeout(function() { webview
.reload(); }, 0);
1428 webview
.src
= triggerNavUrl
;
1429 document
.body
.appendChild(webview
);
1432 // This test verifies that <webview> restores the src attribute if it is
1433 // removed after navigation.
1434 function testRemoveSrcAttribute() {
1435 var dataUrl
= 'data:text/html,test page';
1436 var webview
= document
.createElement('webview');
1437 webview
.setAttribute('partition', arguments
.callee
.name
);
1438 var terminated
= false;
1439 webview
.addEventListener('loadstop', function(evt
) {
1440 webview
.removeAttribute('src');
1441 setTimeout(function() {
1442 embedder
.test
.assertEq(dataUrl
, webview
.getAttribute('src'));
1443 embedder
.test
.succeed();
1446 webview
.setAttribute('src', dataUrl
);
1447 document
.body
.appendChild(webview
);
1450 function testRemoveWebviewAfterNavigation() {
1451 var webview
= document
.createElement('webview');
1452 document
.body
.appendChild(webview
);
1453 webview
.src
= 'data:text/html,trigger navigation';
1454 document
.body
.removeChild(webview
);
1455 setTimeout(function() {
1456 embedder
.test
.succeed();
1460 // This test verifies that a <webview> is torn down gracefully when removed from
1462 window
.removeWebviewOnExitDoCrash
= null;
1463 function testRemoveWebviewOnExit() {
1464 var triggerNavUrl
= 'data:text/html,trigger navigation';
1465 var webview
= document
.createElement('webview');
1467 webview
.addEventListener('loadstop', function(e
) {
1468 chrome
.test
.sendMessage('guest-loaded');
1471 window
.removeWebviewOnExitDoCrash = function() {
1472 webview
.terminate();
1475 webview
.addEventListener('exit', function(e
) {
1476 // We expected to be killed.
1477 if (e
.reason
!= 'killed') {
1480 webview
.parentNode
.removeChild(webview
);
1483 // Trigger a navigation to create a guest process.
1484 webview
.setAttribute('src', embedder
.emptyGuestURL
);
1485 document
.body
.appendChild(webview
);
1488 function testResizeWebviewResizesContent() {
1489 var webview
= document
.createElement('webview');
1490 webview
.src
= 'about:blank';
1491 webview
.addEventListener('loadstop', function(e
) {
1492 webview
.executeScript(
1493 {file
: 'inject_resize_test.js'},
1495 window
.console
.log('The resize test has been injected into webview.');
1498 webview
.executeScript(
1499 {file
: 'inject_comm_channel.js'},
1501 window
.console
.log('The guest script for a two-way comm channel has ' +
1502 'been injected into webview.');
1503 // Establish a communication channel with the guest.
1504 var msg
= ['connect'];
1505 webview
.contentWindow
.postMessage(JSON
.stringify(msg
), '*');
1509 window
.addEventListener('message', function(e
) {
1510 var data
= JSON
.parse(e
.data
);
1511 if (data
[0] == 'connected') {
1512 console
.log('A communication channel has been established with webview.');
1513 console
.log('Resizing <webview> width from 300px to 400px.');
1514 webview
.style
.width
= '400px';
1517 if (data
[0] == 'resize') {
1518 var width
= data
[1];
1519 var height
= data
[2];
1520 embedder
.test
.assertEq(400, width
);
1521 embedder
.test
.assertEq(300, height
);
1522 embedder
.test
.succeed();
1525 console
.log('Unexpected message: \'' + data
[0] + '\'');
1526 embedder
.test
.fail();
1528 document
.body
.appendChild(webview
);
1531 // This test calls terminate() on guest after it has already been
1532 // terminated. This makes sure we ignore the call gracefully.
1533 function testTerminateAfterExit() {
1534 var webview
= document
.createElement('webview');
1535 webview
.setAttribute('partition', arguments
.callee
.name
);
1536 var loadstopSucceedsTest
= false;
1537 webview
.addEventListener('loadstop', function(evt
) {
1538 embedder
.test
.assertEq('loadstop', evt
.type
);
1539 if (loadstopSucceedsTest
) {
1540 embedder
.test
.succeed();
1544 webview
.terminate();
1547 webview
.addEventListener('exit', function(evt
) {
1548 embedder
.test
.assertEq('exit', evt
.type
);
1549 // Call terminate again.
1550 webview
.terminate();
1551 // Load another page. The test would pass when loadstop is called on
1552 // this second page. This would hopefully catch if call to
1553 // webview.terminate() caused a browser crash.
1554 setTimeout(function() {
1555 loadstopSucceedsTest
= true;
1556 webview
.setAttribute('src', 'data:text/html,test second page');
1560 webview
.setAttribute('src', 'data:text/html,test terminate() crash.');
1561 document
.body
.appendChild(webview
);
1564 // This test verifies that the WebRequest API onBeforeRequest event fires on
1566 function testWebRequestAPI() {
1567 var webview
= new WebView();
1568 webview
.request
.onBeforeRequest
.addListener(function(e
) {
1569 embedder
.test
.succeed();
1570 }, { urls
: ['<all_urls>']}) ;
1571 webview
.src
= embedder
.windowOpenGuestURL
;
1572 document
.body
.appendChild(webview
);
1575 // This test verifies that the WebRequest API onBeforeSendHeaders event fires on
1576 // webview and supports headers. This tests verifies that we can modify HTTP
1577 // headers via the WebRequest API and those modified headers will be sent to the
1579 function testWebRequestAPIWithHeaders() {
1580 var webview
= new WebView();
1581 var requestFilter
= {
1582 urls
: ['<all_urls>']
1584 var extraInfoSpec
= ['requestHeaders', 'blocking'];
1585 webview
.request
.onBeforeSendHeaders
.addListener(function(details
) {
1586 var headers
= details
.requestHeaders
;
1587 for( var i
= 0, l
= headers
.length
; i
< l
; ++i
) {
1588 if (headers
[i
].name
== 'User-Agent') {
1589 headers
[i
].value
= 'foobar';
1593 var blockingResponse
= {};
1594 blockingResponse
.requestHeaders
= headers
;
1595 return blockingResponse
;
1596 }, requestFilter
, extraInfoSpec
);
1598 var loadstartCalled
= false;
1599 webview
.addEventListener('loadstart', function(e
) {
1600 embedder
.test
.assertTrue(e
.isTopLevel
);
1601 embedder
.test
.assertEq(embedder
.detectUserAgentURL
, e
.url
);
1602 loadstartCalled
= true;
1605 webview
.addEventListener('loadredirect', function(e
) {
1606 embedder
.test
.assertTrue(e
.isTopLevel
);
1607 embedder
.test
.assertEq(embedder
.detectUserAgentURL
,
1608 e
.oldUrl
.replace('127.0.0.1', 'localhost'));
1609 embedder
.test
.assertEq(embedder
.redirectGuestURLDest
,
1610 e
.newUrl
.replace('127.0.0.1', 'localhost'));
1611 if (loadstartCalled
) {
1612 embedder
.test
.succeed();
1614 embedder
.test
.fail();
1617 webview
.src
= embedder
.detectUserAgentURL
;
1618 document
.body
.appendChild(webview
);
1621 function testWebRequestAPIExistence() {
1622 var apiPropertiesToCheck
= [
1623 // Declarative WebRequest API.
1628 'onBeforeSendHeaders',
1630 'onHeadersReceived',
1633 'onResponseStarted',
1637 var webview
= document
.createElement('webview');
1638 webview
.setAttribute('partition', arguments
.callee
.name
);
1639 webview
.addEventListener('loadstop', function(e
) {
1640 for (var i
= 0; i
< apiPropertiesToCheck
.length
; ++i
) {
1641 embedder
.test
.assertEq('object',
1642 typeof webview
.request
[apiPropertiesToCheck
[i
]]);
1643 embedder
.test
.assertEq(
1645 typeof webview
.request
[apiPropertiesToCheck
[i
]].addListener
);
1646 embedder
.test
.assertEq(
1648 typeof webview
.request
[apiPropertiesToCheck
[i
]].addRules
);
1649 embedder
.test
.assertEq(
1651 typeof webview
.request
[apiPropertiesToCheck
[i
]].getRules
);
1652 embedder
.test
.assertEq(
1654 typeof webview
.request
[apiPropertiesToCheck
[i
]].removeRules
);
1657 // Try to overwrite webview.request, shall not succeed.
1658 webview
.request
= '123';
1659 embedder
.test
.assertTrue(typeof webview
.request
!== 'string');
1661 embedder
.test
.succeed();
1663 webview
.setAttribute('src', 'data:text/html,webview check api');
1664 document
.body
.appendChild(webview
);
1667 // This test verifies that the WebRequest API onBeforeRequest event fires on
1668 // clients*.google.com URLs.
1669 function testWebRequestAPIGoogleProperty() {
1670 var webview
= new WebView();
1671 webview
.request
.onBeforeRequest
.addListener(function(e
) {
1672 embedder
.test
.succeed();
1673 return {cancel
: true};
1674 }, { urls
: ['<all_urls>']}, ['blocking']) ;
1675 webview
.src
= 'http://clients6.google.com';
1676 document
.body
.appendChild(webview
);
1681 embedder
.test
.testList
= {
1682 'testAllowTransparencyAttribute': testAllowTransparencyAttribute
,
1683 'testAPIMethodExistence': testAPIMethodExistence
,
1684 'testAssignSrcAfterCrash': testAssignSrcAfterCrash
,
1685 'testAutosizeAfterNavigation': testAutosizeAfterNavigation
,
1686 'testAutosizeBeforeNavigation': testAutosizeBeforeNavigation
,
1687 'testAutosizeHeight': testAutosizeHeight
,
1688 'testAutosizeRemoveAttributes': testAutosizeRemoveAttributes
,
1689 'testAutosizeWithPartialAttributes': testAutosizeWithPartialAttributes
,
1690 'testCannotMutateEventName': testCannotMutateEventName
,
1691 'testChromeExtensionRelativePath': testChromeExtensionRelativePath
,
1692 'testChromeExtensionURL': testChromeExtensionURL
,
1693 'testContentLoadEvent': testContentLoadEvent
,
1694 'testDeclarativeWebRequestAPI': testDeclarativeWebRequestAPI
,
1695 'testDeclarativeWebRequestAPISendMessage':
1696 testDeclarativeWebRequestAPISendMessage
,
1697 'testDestroyOnEventListener': testDestroyOnEventListener
,
1698 'testDisplayNoneWebviewLoad': testDisplayNoneWebviewLoad
,
1699 'testDisplayNoneWebviewRemoveChild': testDisplayNoneWebviewRemoveChild
,
1700 'testEventName': testEventName
,
1701 'testExecuteScript': testExecuteScript
,
1702 'testExecuteScriptFail': testExecuteScriptFail
,
1703 'testExecuteScriptIsAbortedWhenWebViewSourceIsChanged':
1704 testExecuteScriptIsAbortedWhenWebViewSourceIsChanged
,
1705 'testFindAPI': testFindAPI
,
1706 'testFindAPI_findupdate': testFindAPI
,
1707 'testGetProcessId': testGetProcessId
,
1708 'testHiddenBeforeNavigation': testHiddenBeforeNavigation
,
1709 'testInlineScriptFromAccessibleResources':
1710 testInlineScriptFromAccessibleResources
,
1711 'testInvalidChromeExtensionURL': testInvalidChromeExtensionURL
,
1712 'testLoadAbortChromeExtensionURLWrongPartition':
1713 testLoadAbortChromeExtensionURLWrongPartition
,
1714 'testLoadAbortEmptyResponse': testLoadAbortEmptyResponse
,
1715 'testLoadAbortIllegalChromeURL': testLoadAbortIllegalChromeURL
,
1716 'testLoadAbortIllegalFileURL': testLoadAbortIllegalFileURL
,
1717 'testLoadAbortIllegalJavaScriptURL': testLoadAbortIllegalJavaScriptURL
,
1718 'testLoadAbortInvalidNavigation': testLoadAbortInvalidNavigation
,
1719 'testLoadAbortNonWebSafeScheme': testLoadAbortNonWebSafeScheme
,
1720 'testLoadProgressEvent': testLoadProgressEvent
,
1721 'testLoadStartLoadRedirect': testLoadStartLoadRedirect
,
1722 'testNavigateAfterResize': testNavigateAfterResize
,
1723 'testNavigationToExternalProtocol': testNavigationToExternalProtocol
,
1724 'testNavOnConsecutiveSrcAttributeChanges':
1725 testNavOnConsecutiveSrcAttributeChanges
,
1726 'testNavOnSrcAttributeChange': testNavOnSrcAttributeChange
,
1727 'testNewWindow': testNewWindow
,
1728 'testNewWindowNoPreventDefault': testNewWindowNoPreventDefault
,
1729 'testNewWindowNoReferrerLink': testNewWindowNoReferrerLink
,
1730 'testNewWindowTwoListeners': testNewWindowTwoListeners
,
1731 'testOnEventProperties': testOnEventProperties
,
1732 'testPartitionChangeAfterNavigation': testPartitionChangeAfterNavigation
,
1733 'testPartitionRemovalAfterNavigationFails':
1734 testPartitionRemovalAfterNavigationFails
,
1735 'testReassignSrcAttribute': testReassignSrcAttribute
,
1736 'testReload': testReload
,
1737 'testReloadAfterTerminate': testReloadAfterTerminate
,
1738 'testRemoveSrcAttribute': testRemoveSrcAttribute
,
1739 'testRemoveWebviewAfterNavigation': testRemoveWebviewAfterNavigation
,
1740 'testRemoveWebviewOnExit': testRemoveWebviewOnExit
,
1741 'testResizeWebviewResizesContent': testResizeWebviewResizesContent
,
1742 'testTerminateAfterExit': testTerminateAfterExit
,
1743 'testWebRequestAPI': testWebRequestAPI
,
1744 'testWebRequestAPIWithHeaders': testWebRequestAPIWithHeaders
,
1745 'testWebRequestAPIExistence': testWebRequestAPIExistence
,
1746 'testWebRequestAPIGoogleProperty': testWebRequestAPIGoogleProperty
1749 onload = function() {
1750 chrome
.test
.getConfig(function(config
) {
1751 embedder
.setUp_(config
);
1752 chrome
.test
.sendMessage('LAUNCHED');