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 sizeChangeHandler = function(e) {
171 // This would be triggered after we set autosize attribute.
172 embedder.test.assertEq(50, e.oldWidth);
173 embedder.test.assertEq(100, e.oldHeight);
174 embedder.test.assertTrue(e.newWidth >= 60 && e.newWidth <= 70);
175 embedder.test.assertTrue(e.newHeight >= 110 && e.newHeight <= 120);
177 // Remove autosize attribute and expect webview to return to its
179 webview.removeAttribute('autosize');
183 embedder.test.assertEq(50, e.newWidth);
184 embedder.test.assertEq(100, e.newHeight);
186 embedder.test.succeed();
189 window.console.log('Unexpected sizechanged event, step = ' + step);
190 embedder.test.fail();
197 webview.addEventListener('sizechanged', sizeChangeHandler);
199 webview.addEventListener('loadstop', function(e) {
200 webview.setAttribute('autosize', true);
201 webview.setAttribute('minwidth', 60);
202 webview.setAttribute('maxwidth', 70);
203 webview.setAttribute('minheight', 110);
204 webview.setAttribute('maxheight', 120);
207 webview.style.width = '50px';
208 webview.style.height = '100px';
209 webview.setAttribute('src', 'data:text/html,webview test sizechanged event');
210 document.body.appendChild(webview);
213 // This test verifies that if a browser plugin is in autosize mode before
214 // navigation then the guest starts auto-sized.
215 function testAutosizeBeforeNavigation() {
216 var webview = document.createElement('webview');
218 webview.setAttribute('autosize', 'true');
219 webview.setAttribute('minwidth', 200);
220 webview.setAttribute('maxwidth', 210);
221 webview.setAttribute('minheight', 100);
222 webview.setAttribute('maxheight', 110);
224 webview.addEventListener('sizechanged', function(e) {
225 embedder.test.assertEq(0, e.oldWidth);
226 embedder.test.assertEq(0, e.oldHeight);
227 embedder.test.assertTrue(e.newWidth >= 200 && e.newWidth <= 210);
228 embedder.test.assertTrue(e.newHeight >= 100 && e.newHeight <= 110);
229 embedder.test.succeed();
232 webview.setAttribute('src', 'data:text/html,webview test sizechanged event');
233 document.body.appendChild(webview);
236 // This test verifies that a lengthy page with autosize enabled will report
237 // the correct height in the sizechanged event.
238 function testAutosizeHeight() {
239 var webview = document.createElement('webview');
241 webview.autosize = true;
242 webview.minwidth = 200;
243 webview.maxwidth = 210;
244 webview.minheight = 40;
245 webview.maxheight = 200;
248 webview.addEventListener('sizechanged', function(e) {
251 embedder.test.assertEq(0, e.oldHeight);
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');
675 webview.executeScript(
676 {code: 'document.body.style.backgroundColor = "red";'},
677 function(results) { embedder.test.fail(); });
680 embedder.test.succeed();
684 // This test verifies that the call of executeScript will fail and return null
685 // if the webview has been navigated to another source.
686 function testExecuteScriptIsAbortedWhenWebViewSourceIsChanged() {
687 var webview = document.createElement('webview');
689 var navigationOccur = false;
690 var newSrc = 'data:text/html,trigger navigation';
691 webview.addEventListener('loadstart', function() {
693 webview.setAttribute('src', newSrc);
694 navigationOccur = true;
698 webview.addEventListener('loadstop', function() {
699 webview.executeScript(
700 {code:'document.body.style.backgroundColor = "red";'},
702 if (navigationOccur) {
703 // Expect a null results because the executeScript failed;
704 // return "red", otherwise.
705 embedder.test.assertEq(null, results);
706 embedder.test.succeed();
708 navigationOccur = false;
712 webview.setAttribute('src', "about:blank");
713 document.body.appendChild(webview);
716 function testFindAPI() {
717 var webview = new WebView();
718 webview.src = 'data:text/html,Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
719 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
720 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
721 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
722 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
723 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
724 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
725 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
726 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
727 'Dog dog dog Dog dog dogcatDog dogDogdog.<br><br>' +
728 '<a href="about:blank">Click here!</a>';
730 var loadstopListener2 = function(e) {
731 embedder.test.assertEq(webview.src, "about:blank");
732 embedder.test.succeed();
735 var loadstopListener1 = function(e) {
736 // Test find results.
737 webview.find("dog", {}, function(results) {
739 embedder.test.assertEq(results.numberOfMatches, 100);
740 embedder.test.assertTrue(results.selectionRect.width > 0);
741 embedder.test.assertTrue(results.selectionRect.height > 0);
743 // Test finding next active matches.
748 webview.find("dog", {}, function(results) {
749 embedder.test.assertEq(results.activeMatchOrdinal, 6);
750 webview.find("dog", {backward: true});
751 webview.find("dog", {backward: true}, function(results) {
752 // Test the |backward| find option.
753 embedder.test.assertEq(results.activeMatchOrdinal, 4);
755 // Test the |matchCase| find option.
756 webview.find("Dog", {matchCase: true}, function(results) {
757 embedder.test.assertEq(results.numberOfMatches, 40);
759 // Test canceling find requests.
761 webview.stopFinding();
765 // Test find results when looking for something that isn't there.
766 webview.find("fish", {}, function(results) {
767 embedder.test.assertEq(results.numberOfMatches, 0);
768 embedder.test.assertEq(results.activeMatchOrdinal, 0);
769 embedder.test.assertEq(results.selectionRect.left, 0);
770 embedder.test.assertEq(results.selectionRect.top, 0);
771 embedder.test.assertEq(results.selectionRect.width, 0);
772 embedder.test.assertEq(results.selectionRect.height, 0);
774 // Test following a link with stopFinding().
775 webview.removeEventListener('loadstop', loadstopListener1);
776 webview.addEventListener('loadstop', loadstopListener2);
777 webview.find("click here!", {}, function() {
778 webview.stopFinding("activate");
787 webview.addEventListener('loadstop', loadstopListener1);
788 document.body.appendChild(webview);
791 function testFindAPI_findupdate() {
792 var webview = new WebView();
793 webview.src = 'data:text/html,Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
794 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
795 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
796 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
797 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
798 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
799 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
800 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
801 'Dog dog dog Dog dog dogcatDog dogDogdog.<br>' +
802 'Dog dog dog Dog dog dogcatDog dogDogdog.<br><br>' +
803 '<a href="about:blank">Click here!</a>';
804 var canceledTest = false;
805 webview.addEventListener('loadstop', function(e) {
806 // Test the |findupdate| event.
807 webview.addEventListener('findupdate', function(e) {
808 if (e.activeMatchOrdinal > 0) {
809 // embedder.test.assertTrue(e.numberOfMatches >= e.activeMatchOrdinal)
810 // This currently fails because of http://crbug.com/342445 .
811 embedder.test.assertTrue(e.selectionRect.width > 0);
812 embedder.test.assertTrue(e.selectionRect.height > 0);
819 embedder.test.assertEq(e.searchText, "dog");
820 embedder.test.assertEq(e.numberOfMatches, 100);
821 embedder.test.assertEq(e.activeMatchOrdinal, 1);
822 embedder.test.assertTrue(canceledTest);
823 embedder.test.succeed();
832 document.body.appendChild(webview);
835 // This test verifies that getProcessId is defined and returns a non-zero
836 // value corresponding to the processId of the guest process.
837 function testGetProcessId() {
838 var webview = document.createElement('webview');
839 webview.setAttribute('src', 'data:text/html,trigger navigation');
840 var firstLoad = function() {
841 webview.removeEventListener('loadstop', firstLoad);
842 embedder.test.assertTrue(webview.getProcessId() > 0);
843 embedder.test.succeed();
845 webview.addEventListener('loadstop', firstLoad);
846 document.body.appendChild(webview);
849 function testHiddenBeforeNavigation() {
850 var webview = document.createElement('webview');
851 webview.style.visibility = 'hidden';
853 var postMessageHandler = function(e) {
854 var data = JSON.parse(e.data);
855 window.removeEventListener('message', postMessageHandler);
856 if (data[0] == 'visibilityState-response') {
857 embedder.test.assertEq('hidden', data[1]);
858 embedder.test.succeed();
860 window.console.warn('Unexpected message: ' + data);
861 embedder.test.fail();
865 webview.addEventListener('loadstop', function(e) {
866 window.console.warn('webview.loadstop');
867 window.addEventListener('message', postMessageHandler);
868 webview.addEventListener('consolemessage', function(e) {
869 window.console.warn('g: ' + e.message);
872 webview.executeScript(
873 {file: 'inject_hidden_test.js'},
875 if (!results || !results.length) {
876 window.console.warn('Failed to inject script: inject_hidden_test.js');
877 embedder.test.fail();
881 window.console.warn('script injection success');
882 webview.contentWindow.postMessage(
883 JSON.stringify(['visibilityState-request']), '*');
887 webview.setAttribute('src', 'data:text/html,<html><body></body></html>');
888 document.body.appendChild(webview);
891 // Makes sure inline scripts works inside guest that was loaded from
892 // accessible_resources.
893 function testInlineScriptFromAccessibleResources() {
894 var webview = document.createElement('webview');
895 // foobar is a privileged partition according to the manifest file.
896 webview.partition = 'foobar';
897 webview.addEventListener('loadabort', function(e) {
898 embedder.test.fail();
900 webview.addEventListener('consolemessage', function(e) {
901 window.console.log('consolemessage: ' + e.message);
902 if (e.message == 'guest_with_inline_script.html: Inline script ran') {
903 embedder.test.succeed();
906 webview.setAttribute('src', 'guest_with_inline_script.html');
907 document.body.appendChild(webview);
910 // This tests verifies that webview fires a loadabort event instead of crashing
911 // the browser if we attempt to navigate to a chrome-extension: URL with an
912 // extension ID that does not exist.
913 function testInvalidChromeExtensionURL() {
914 var invalidResource = 'chrome-extension://abc123/guest.html';
915 var webview = document.createElement('webview');
916 // foobar is a privileged partition according to the manifest file.
917 webview.partition = 'foobar';
918 webview.addEventListener('loadabort', function(e) {
919 embedder.test.succeed();
921 webview.setAttribute('src', invalidResource);
922 document.body.appendChild(webview);
925 // This test verifies that the loadabort event fires when loading a webview
926 // accessible resource from a partition that is not privileged.
927 function testLoadAbortChromeExtensionURLWrongPartition() {
928 var localResource = chrome.runtime.getURL('guest.html');
929 var webview = document.createElement('webview');
930 webview.addEventListener('loadabort', function(e) {
931 embedder.test.assertEq('ERR_ADDRESS_UNREACHABLE', e.reason);
932 embedder.test.succeed();
934 webview.addEventListener('loadstop', function(e) {
935 embedder.test.fail();
937 webview.setAttribute('src', localResource);
938 document.body.appendChild(webview);
941 // This test verifies that the loadabort event fires as expected and with the
942 // appropriate fields when an empty response is returned.
943 function testLoadAbortEmptyResponse() {
944 var webview = document.createElement('webview');
945 webview.addEventListener('loadabort', function(e) {
946 embedder.test.assertEq('ERR_EMPTY_RESPONSE', e.reason);
947 embedder.test.succeed();
949 webview.setAttribute('src', embedder.closeSocketURL);
950 document.body.appendChild(webview);
953 // This test verifies that the loadabort event fires as expected when an illegal
954 // chrome URL is provided.
955 function testLoadAbortIllegalChromeURL() {
956 var webview = document.createElement('webview');
957 var onFirstLoadStop = function(e) {
958 webview.removeEventListener('loadstop', onFirstLoadStop);
959 webview.setAttribute('src', 'chrome://newtab');
961 webview.addEventListener('loadstop', onFirstLoadStop);
962 webview.addEventListener('loadabort', function(e) {
963 embedder.test.assertEq('ERR_ABORTED', e.reason);
964 embedder.test.succeed();
966 webview.setAttribute('src', 'about:blank');
967 document.body.appendChild(webview);
970 function testLoadAbortIllegalFileURL() {
971 var webview = document.createElement('webview');
972 webview.addEventListener('loadabort', function(e) {
973 embedder.test.assertEq('ERR_ABORTED', e.reason);
974 embedder.test.succeed();
976 webview.setAttribute('src', 'file://foo');
977 document.body.appendChild(webview);
980 function testLoadAbortIllegalJavaScriptURL() {
981 var webview = document.createElement('webview');
982 webview.addEventListener('loadabort', function(e) {
983 embedder.test.assertEq('ERR_ABORTED', e.reason);
984 embedder.test.succeed();
986 webview.setAttribute('src', 'javascript:void(document.bgColor="#0000FF")');
987 document.body.appendChild(webview);
990 // Verifies that navigating to invalid URL (e.g. 'http:') doesn't cause a crash.
991 function testLoadAbortInvalidNavigation() {
992 var webview = document.createElement('webview');
993 var validSchemeWithEmptyURL = 'http:';
994 webview.addEventListener('loadabort', function(e) {
995 embedder.test.assertEq('ERR_ABORTED', e.reason);
996 embedder.test.assertEq('', e.url);
997 embedder.test.succeed();
999 webview.addEventListener('exit', function(e) {
1000 // We should not crash.
1001 embedder.test.fail();
1003 webview.setAttribute('src', validSchemeWithEmptyURL);
1004 document.body.appendChild(webview);
1007 // Verifies that navigation to a URL that is valid but not web-safe or
1008 // pseudo-scheme fires loadabort and doesn't cause a crash.
1009 function testLoadAbortNonWebSafeScheme() {
1010 var webview = document.createElement('webview');
1011 var chromeGuestURL = 'chrome-guest://abc123';
1012 webview.addEventListener('loadabort', function(e) {
1013 embedder.test.assertEq('ERR_ABORTED', e.reason);
1014 embedder.test.assertEq('chrome-guest://abc123/', e.url);
1015 embedder.test.succeed();
1017 webview.addEventListener('exit', function(e) {
1018 // We should not crash.
1019 embedder.test.fail();
1021 webview.setAttribute('src', chromeGuestURL);
1022 document.body.appendChild(webview);
1025 // Tests that the 'loadprogress' event is triggered correctly.
1026 function testLoadProgressEvent() {
1027 var webview = document.createElement('webview');
1030 webview.addEventListener('loadstop', function(evt) {
1031 embedder.test.assertEq(1, progress);
1032 embedder.test.succeed();
1035 webview.addEventListener('loadprogress', function(evt) {
1036 progress = evt.progress;
1039 webview.setAttribute('src', 'data:text/html,trigger navigation');
1040 document.body.appendChild(webview);
1043 // This test verifies that the loadstart event fires at the beginning of a load
1044 // and the loadredirect event fires when a redirect occurs.
1045 function testLoadStartLoadRedirect() {
1046 var webview = document.createElement('webview');
1047 var loadstartCalled = false;
1048 webview.setAttribute('src', embedder.redirectGuestURL);
1049 webview.addEventListener('loadstart', function(e) {
1050 embedder.test.assertTrue(e.isTopLevel);
1051 embedder.test.assertEq(embedder.redirectGuestURL, e.url);
1052 loadstartCalled = true;
1054 webview.addEventListener('loadredirect', function(e) {
1055 embedder.test.assertTrue(e.isTopLevel);
1056 embedder.test.assertEq(embedder.redirectGuestURL,
1057 e.oldUrl.replace('127.0.0.1', 'localhost'));
1058 embedder.test.assertEq(embedder.redirectGuestURLDest,
1059 e.newUrl.replace('127.0.0.1', 'localhost'));
1060 if (loadstartCalled) {
1061 embedder.test.succeed();
1063 embedder.test.fail();
1066 document.body.appendChild(webview);
1069 function testNavigationToExternalProtocol() {
1070 var webview = document.createElement('webview');
1071 webview.addEventListener('loadstop', function(e) {
1072 webview.addEventListener('loadabort', function(e) {
1073 embedder.test.assertEq('ERR_UNKNOWN_URL_SCHEME', e.reason);
1074 embedder.test.succeed();
1076 webview.executeScript({
1077 code: 'window.location.href = "tel:+12223334444";'
1078 }, function(results) {});
1080 webview.setAttribute('src', 'data:text/html,navigate to external protocol');
1081 document.body.appendChild(webview);
1084 // This test ensures if the guest isn't there and we resize the guest (from JS),
1085 // it remembers the size correctly.
1086 function testNavigateAfterResize() {
1087 var webview = document.createElement('webview');
1089 var postMessageHandler = function(e) {
1090 var data = JSON.parse(e.data);
1091 webview.removeEventListener('message', postMessageHandler);
1092 if (data[0] == 'dimension-response') {
1093 var actualWidth = data[1];
1094 var actualHeight = data[2];
1095 embedder.test.assertEq(100, actualWidth);
1096 embedder.test.assertEq(125, actualHeight);
1097 embedder.test.succeed();
1100 window.addEventListener('message', postMessageHandler);
1102 webview.addEventListener('consolemessage', function(e) {
1103 window.console.warn('guest log: ' + e.message);
1106 webview.addEventListener('loadstop', function(e) {
1107 webview.executeScript(
1108 {file: 'navigate_after_resize.js'},
1110 if (!results || !results.length) {
1111 window.console.warn('Failed to inject navigate_after_resize.js');
1112 embedder.test.fail();
1115 var msg = ['dimension-request'];
1116 webview.contentWindow.postMessage(JSON.stringify(msg), '*');
1121 webview.style.width = '100px';
1122 webview.style.height = '125px';
1125 webview.src = 'about:blank';
1126 document.body.appendChild(webview);
1129 // This test verifies that multiple consecutive changes to the <webview> src
1130 // attribute will cause a navigation.
1131 function testNavOnConsecutiveSrcAttributeChanges() {
1132 var testPage1 = 'data:text/html,test page 1';
1133 var testPage2 = 'data:text/html,test page 2';
1134 var testPage3 = 'data:text/html,test page 3';
1135 var webview = document.createElement('webview');
1136 webview.partition = arguments.callee.name;
1137 var loadCommitCount = 0;
1138 webview.addEventListener('loadcommit', function(e) {
1139 if (e.url == testPage3) {
1140 embedder.test.succeed();
1143 if (loadCommitCount > 3) {
1144 embedder.test.fail();
1147 document.body.appendChild(webview);
1148 webview.src = testPage1;
1149 webview.src = testPage2;
1150 webview.src = testPage3;
1153 // This test verifies that we can set the <webview> src multiple times and the
1154 // changes will cause a navigation.
1155 function testNavOnSrcAttributeChange() {
1156 var testPage1 = 'data:text/html,test page 1';
1157 var testPage2 = 'data:text/html,test page 2';
1158 var testPage3 = 'data:text/html,test page 3';
1159 var tests = [testPage1, testPage2, testPage3];
1160 var webview = document.createElement('webview');
1161 webview.partition = arguments.callee.name;
1162 var loadCommitCount = 0;
1163 webview.addEventListener('loadcommit', function(evt) {
1164 var success = tests.indexOf(evt.url) > -1;
1165 embedder.test.assertTrue(success);
1167 if (loadCommitCount == tests.length) {
1168 embedder.test.succeed();
1169 } else if (loadCommitCount > tests.length) {
1170 embedder.test.fail();
1172 webview.src = tests[loadCommitCount];
1175 webview.src = tests[0];
1176 document.body.appendChild(webview);
1179 // This test verifies that new window attachment functions as expected.
1180 function testNewWindow() {
1181 var webview = document.createElement('webview');
1182 webview.addEventListener('newwindow', function(e) {
1184 var newwebview = document.createElement('webview');
1185 newwebview.addEventListener('loadstop', function(evt) {
1186 // If the new window finishes loading, the test is successful.
1187 embedder.test.succeed();
1189 document.body.appendChild(newwebview);
1190 // Attach the new window to the new <webview>.
1191 e.window.attach(newwebview);
1193 webview.setAttribute('src', embedder.windowOpenGuestURL);
1194 document.body.appendChild(webview);
1197 // This test verifies that the attach can be called inline without
1198 // preventing default.
1199 function testNewWindowNoPreventDefault() {
1200 var webview = document.createElement('webview');
1201 webview.addEventListener('newwindow', function(e) {
1202 var newwebview = document.createElement('webview');
1203 document.body.appendChild(newwebview);
1204 // Attach the new window to the new <webview>.
1206 e.window.attach(newwebview);
1207 embedder.test.succeed();
1209 embedder.test.fail();
1212 webview.setAttribute('src', embedder.windowOpenGuestURL);
1213 document.body.appendChild(webview);
1216 function testNewWindowNoReferrerLink() {
1217 var webview = document.createElement('webview');
1218 webview.addEventListener('newwindow', function(e) {
1220 var newwebview = document.createElement('webview');
1221 newwebview.addEventListener('loadstop', function(evt) {
1222 // If the new window finishes loading, the test is successful.
1223 embedder.test.succeed();
1225 document.body.appendChild(newwebview);
1226 // Attach the new window to the new <webview>.
1227 e.window.attach(newwebview);
1229 webview.setAttribute('src', embedder.noReferrerGuestURL);
1230 document.body.appendChild(webview);
1233 // This test verifies "first-call-wins" semantics. That is, the first call
1234 // to perform an action on the new window takes the action and all
1235 // subsequent calls throw an exception.
1236 function testNewWindowTwoListeners() {
1237 var webview = document.createElement('webview');
1239 webview.addEventListener('newwindow', function(e) {
1241 var newwebview = document.createElement('webview');
1242 document.body.appendChild(newwebview);
1244 e.window.attach(newwebview);
1246 embedder.test.fail();
1249 webview.addEventListener('newwindow', function(e) {
1254 embedder.test.succeed();
1257 webview.setAttribute('src', embedder.windowOpenGuestURL);
1258 document.body.appendChild(webview);
1261 function testOnEventProperties() {
1262 var sequence = ['first', 'second', 'third', 'fourth'];
1263 var webview = document.createElement('webview');
1264 function createHandler(id) {
1265 return function(e) {
1266 embedder.test.assertEq(id, sequence.shift());
1270 webview.addEventListener('loadstart', createHandler('first'));
1271 webview.addEventListener('loadstart', createHandler('second'));
1272 webview.onloadstart = createHandler('third');
1273 webview.addEventListener('loadstart', createHandler('fourth'));
1274 webview.addEventListener('loadstop', function(evt) {
1275 embedder.test.assertEq(0, sequence.length);
1277 // Test that setting another 'onloadstart' handler replaces the previous
1279 sequence = ['first', 'second', 'fourth'];
1280 webview.onloadstart = function() {
1281 embedder.test.assertEq(0, sequence.length);
1282 embedder.test.succeed();
1285 webview.setAttribute('src', 'data:text/html,next navigation');
1288 webview.setAttribute('src', 'data:text/html,trigger navigation');
1289 document.body.appendChild(webview);
1292 // This test verifies that the partion attribute cannot be changed after the src
1294 function testPartitionChangeAfterNavigation() {
1295 var webview = document.createElement('webview');
1296 var partitionAttribute = arguments.callee.name;
1297 webview.setAttribute('partition', partitionAttribute);
1299 var loadstopHandler = function(e) {
1300 webview.partition = 'illegal';
1301 embedder.test.assertEq(partitionAttribute, webview.partition);
1302 embedder.test.succeed();
1304 webview.addEventListener('loadstop', loadstopHandler);
1306 webview.setAttribute('src', 'data:text/html,trigger navigation');
1307 document.body.appendChild(webview);
1310 // This test verifies that removing partition attribute after navigation does
1311 // not work, i.e. the partition remains the same.
1312 function testPartitionRemovalAfterNavigationFails() {
1313 var webview = document.createElement('webview');
1315 var partition = 'testme';
1316 webview.setAttribute('partition', partition);
1318 var loadstopHandler = function(e) {
1319 // Removing after navigation should not change the partition.
1320 webview.removeAttribute('partition');
1321 embedder.test.assertEq('testme', webview.partition);
1322 embedder.test.succeed();
1324 webview.addEventListener('loadstop', loadstopHandler);
1326 webview.setAttribute('src', 'data:text/html,<html><body>guest</body></html>');
1327 document.body.appendChild(webview);
1330 // This test verifies that <webview> reloads the page if the src attribute is
1331 // assigned the same value.
1332 function testReassignSrcAttribute() {
1333 var dataUrl = 'data:text/html,test page';
1334 var webview = document.createElement('webview');
1335 webview.partition = arguments.callee.name;
1337 var loadStopCount = 0;
1338 webview.addEventListener('loadstop', function(evt) {
1339 embedder.test.assertEq(dataUrl, webview.getAttribute('src'));
1341 console.log('[' + loadStopCount + '] loadstop called');
1342 if (loadStopCount == 3) {
1343 embedder.test.succeed();
1344 } else if (loadStopCount > 3) {
1345 embedder.test.fail();
1347 webview.src = dataUrl;
1350 webview.src = dataUrl;
1351 document.body.appendChild(webview);
1354 // This test verifies that the reload method on webview functions as expected.
1355 function testReload() {
1356 var triggerNavUrl = 'data:text/html,trigger navigation';
1357 var webview = document.createElement('webview');
1359 var loadCommitCount = 0;
1360 webview.addEventListener('loadstop', function(e) {
1361 if (loadCommitCount < 2) {
1363 } else if (loadCommitCount == 2) {
1364 embedder.test.succeed();
1366 embedder.test.fail();
1369 webview.addEventListener('loadcommit', function(e) {
1370 embedder.test.assertEq(triggerNavUrl, e.url);
1371 embedder.test.assertTrue(e.isTopLevel);
1375 webview.setAttribute('src', triggerNavUrl);
1376 document.body.appendChild(webview);
1379 // This test verifies that the reload method on webview functions as expected.
1380 function testReloadAfterTerminate() {
1381 var triggerNavUrl = 'data:text/html,trigger navigation';
1382 var webview = document.createElement('webview');
1385 webview.addEventListener('loadstop', function(e) {
1388 webview.terminate();
1391 setTimeout(function() { embedder.test.succeed(); }, 0);
1394 window.console.log('Unexpected loadstop event, step = ' + step);
1395 embedder.test.fail();
1401 webview.addEventListener('exit', function(e) {
1402 // Trigger a focus state change of the guest to test for
1403 // http://crbug.com/413874.
1406 setTimeout(function() { webview.reload(); }, 0);
1409 webview.src = triggerNavUrl;
1410 document.body.appendChild(webview);
1413 // This test verifies that <webview> restores the src attribute if it is
1414 // removed after navigation.
1415 function testRemoveSrcAttribute() {
1416 var dataUrl = 'data:text/html,test page';
1417 var webview = document.createElement('webview');
1418 webview.setAttribute('partition', arguments.callee.name);
1419 var terminated = false;
1420 webview.addEventListener('loadstop', function(evt) {
1421 webview.removeAttribute('src');
1422 setTimeout(function() {
1423 embedder.test.assertEq(dataUrl, webview.getAttribute('src'));
1424 embedder.test.succeed();
1427 webview.setAttribute('src', dataUrl);
1428 document.body.appendChild(webview);
1431 function testRemoveWebviewAfterNavigation() {
1432 var webview = document.createElement('webview');
1433 document.body.appendChild(webview);
1434 webview.src = 'data:text/html,trigger navigation';
1435 document.body.removeChild(webview);
1436 setTimeout(function() {
1437 embedder.test.succeed();
1441 // This test verifies that a <webview> is torn down gracefully when removed from
1443 window.removeWebviewOnExitDoCrash = null;
1444 function testRemoveWebviewOnExit() {
1445 var triggerNavUrl = 'data:text/html,trigger navigation';
1446 var webview = document.createElement('webview');
1448 webview.addEventListener('loadstop', function(e) {
1449 chrome.test.sendMessage('guest-loaded');
1452 window.removeWebviewOnExitDoCrash = function() {
1453 webview.terminate();
1456 webview.addEventListener('exit', function(e) {
1457 // We expected to be killed.
1458 if (e.reason != 'killed') {
1461 webview.parentNode.removeChild(webview);
1464 // Trigger a navigation to create a guest process.
1465 webview.setAttribute('src', embedder.emptyGuestURL);
1466 document.body.appendChild(webview);
1469 function testResizeWebviewResizesContent() {
1470 var webview = document.createElement('webview');
1471 webview.src = 'about:blank';
1472 webview.addEventListener('loadstop', function(e) {
1473 webview.executeScript(
1474 {file: 'inject_resize_test.js'},
1476 window.console.log('The resize test has been injected into webview.');
1479 webview.executeScript(
1480 {file: 'inject_comm_channel.js'},
1482 window.console.log('The guest script for a two-way comm channel has ' +
1483 'been injected into webview.');
1484 // Establish a communication channel with the guest.
1485 var msg = ['connect'];
1486 webview.contentWindow.postMessage(JSON.stringify(msg), '*');
1490 window.addEventListener('message', function(e) {
1491 var data = JSON.parse(e.data);
1492 if (data[0] == 'connected') {
1493 console.log('A communication channel has been established with webview.');
1494 console.log('Resizing <webview> width from 300px to 400px.');
1495 webview.style.width = '400px';
1498 if (data[0] == 'resize') {
1499 var width = data[1];
1500 var height = data[2];
1501 embedder.test.assertEq(400, width);
1502 embedder.test.assertEq(300, height);
1503 embedder.test.succeed();
1506 console.log('Unexpected message: \'' + data[0] + '\'');
1507 embedder.test.fail();
1509 document.body.appendChild(webview);
1512 // This test calls terminate() on guest after it has already been
1513 // terminated. This makes sure we ignore the call gracefully.
1514 function testTerminateAfterExit() {
1515 var webview = document.createElement('webview');
1516 webview.setAttribute('partition', arguments.callee.name);
1517 var loadstopSucceedsTest = false;
1518 webview.addEventListener('loadstop', function(evt) {
1519 embedder.test.assertEq('loadstop', evt.type);
1520 if (loadstopSucceedsTest) {
1521 embedder.test.succeed();
1525 webview.terminate();
1528 webview.addEventListener('exit', function(evt) {
1529 embedder.test.assertEq('exit', evt.type);
1530 // Call terminate again.
1531 webview.terminate();
1532 // Load another page. The test would pass when loadstop is called on
1533 // this second page. This would hopefully catch if call to
1534 // webview.terminate() caused a browser crash.
1535 setTimeout(function() {
1536 loadstopSucceedsTest = true;
1537 webview.setAttribute('src', 'data:text/html,test second page');
1541 webview.setAttribute('src', 'data:text/html,test terminate() crash.');
1542 document.body.appendChild(webview);
1545 // This test verifies that the WebRequest API onBeforeRequest event fires on
1547 function testWebRequestAPI() {
1548 var webview = new WebView();
1549 webview.request.onBeforeRequest.addListener(function(e) {
1550 embedder.test.succeed();
1551 }, { urls: ['<all_urls>']}) ;
1552 webview.src = embedder.windowOpenGuestURL;
1553 document.body.appendChild(webview);
1556 // This test verifies that the WebRequest API onBeforeSendHeaders event fires on
1557 // webview and supports headers. This tests verifies that we can modify HTTP
1558 // headers via the WebRequest API and those modified headers will be sent to the
1560 function testWebRequestAPIWithHeaders() {
1561 var webview = new WebView();
1562 var requestFilter = {
1563 urls: ['<all_urls>']
1565 var extraInfoSpec = ['requestHeaders', 'blocking'];
1566 webview.request.onBeforeSendHeaders.addListener(function(details) {
1567 var headers = details.requestHeaders;
1568 for( var i = 0, l = headers.length; i < l; ++i ) {
1569 if (headers[i].name == 'User-Agent') {
1570 headers[i].value = 'foobar';
1574 var blockingResponse = {};
1575 blockingResponse.requestHeaders = headers;
1576 return blockingResponse;
1577 }, requestFilter, extraInfoSpec);
1579 var loadstartCalled = false;
1580 webview.addEventListener('loadstart', function(e) {
1581 embedder.test.assertTrue(e.isTopLevel);
1582 embedder.test.assertEq(embedder.detectUserAgentURL, e.url);
1583 loadstartCalled = true;
1586 webview.addEventListener('loadredirect', function(e) {
1587 embedder.test.assertTrue(e.isTopLevel);
1588 embedder.test.assertEq(embedder.detectUserAgentURL,
1589 e.oldUrl.replace('127.0.0.1', 'localhost'));
1590 embedder.test.assertEq(embedder.redirectGuestURLDest,
1591 e.newUrl.replace('127.0.0.1', 'localhost'));
1592 if (loadstartCalled) {
1593 embedder.test.succeed();
1595 embedder.test.fail();
1598 webview.src = embedder.detectUserAgentURL;
1599 document.body.appendChild(webview);
1602 function testWebRequestAPIExistence() {
1603 var apiPropertiesToCheck = [
1604 // Declarative WebRequest API.
1609 'onBeforeSendHeaders',
1611 'onHeadersReceived',
1614 'onResponseStarted',
1618 var webview = document.createElement('webview');
1619 webview.setAttribute('partition', arguments.callee.name);
1620 webview.addEventListener('loadstop', function(e) {
1621 for (var i = 0; i < apiPropertiesToCheck.length; ++i) {
1622 embedder.test.assertEq('object',
1623 typeof webview.request[apiPropertiesToCheck[i]]);
1624 embedder.test.assertEq(
1626 typeof webview.request[apiPropertiesToCheck[i]].addListener);
1627 embedder.test.assertEq(
1629 typeof webview.request[apiPropertiesToCheck[i]].addRules);
1630 embedder.test.assertEq(
1632 typeof webview.request[apiPropertiesToCheck[i]].getRules);
1633 embedder.test.assertEq(
1635 typeof webview.request[apiPropertiesToCheck[i]].removeRules);
1638 // Try to overwrite webview.request, shall not succeed.
1639 webview.request = '123';
1640 embedder.test.assertTrue(typeof webview.request !== 'string');
1642 embedder.test.succeed();
1644 webview.setAttribute('src', 'data:text/html,webview check api');
1645 document.body.appendChild(webview);
1648 // This test verifies that the WebRequest API onBeforeRequest event fires on
1649 // clients*.google.com URLs.
1650 function testWebRequestAPIGoogleProperty() {
1651 var webview = new WebView();
1652 webview.request.onBeforeRequest.addListener(function(e) {
1653 embedder.test.succeed();
1654 return {cancel: true};
1655 }, { urls: ['<all_urls>']}, ['blocking']) ;
1656 webview.src = 'http://clients6.google.com';
1657 document.body.appendChild(webview);
1662 embedder.test.testList = {
1663 'testAllowTransparencyAttribute': testAllowTransparencyAttribute,
1664 'testAPIMethodExistence': testAPIMethodExistence,
1665 'testAssignSrcAfterCrash': testAssignSrcAfterCrash,
1666 'testAutosizeAfterNavigation': testAutosizeAfterNavigation,
1667 'testAutosizeBeforeNavigation': testAutosizeBeforeNavigation,
1668 'testAutosizeHeight': testAutosizeHeight,
1669 'testAutosizeRemoveAttributes': testAutosizeRemoveAttributes,
1670 'testAutosizeWithPartialAttributes': testAutosizeWithPartialAttributes,
1671 'testCannotMutateEventName': testCannotMutateEventName,
1672 'testChromeExtensionRelativePath': testChromeExtensionRelativePath,
1673 'testChromeExtensionURL': testChromeExtensionURL,
1674 'testContentLoadEvent': testContentLoadEvent,
1675 'testDeclarativeWebRequestAPI': testDeclarativeWebRequestAPI,
1676 'testDeclarativeWebRequestAPISendMessage':
1677 testDeclarativeWebRequestAPISendMessage,
1678 'testDestroyOnEventListener': testDestroyOnEventListener,
1679 'testDisplayNoneWebviewLoad': testDisplayNoneWebviewLoad,
1680 'testDisplayNoneWebviewRemoveChild': testDisplayNoneWebviewRemoveChild,
1681 'testEventName': testEventName,
1682 'testExecuteScript': testExecuteScript,
1683 'testExecuteScriptFail': testExecuteScriptFail,
1684 'testExecuteScriptIsAbortedWhenWebViewSourceIsChanged':
1685 testExecuteScriptIsAbortedWhenWebViewSourceIsChanged,
1686 'testFindAPI': testFindAPI,
1687 'testFindAPI_findupdate': testFindAPI,
1688 'testGetProcessId': testGetProcessId,
1689 'testHiddenBeforeNavigation': testHiddenBeforeNavigation,
1690 'testInlineScriptFromAccessibleResources':
1691 testInlineScriptFromAccessibleResources,
1692 'testInvalidChromeExtensionURL': testInvalidChromeExtensionURL,
1693 'testLoadAbortChromeExtensionURLWrongPartition':
1694 testLoadAbortChromeExtensionURLWrongPartition,
1695 'testLoadAbortEmptyResponse': testLoadAbortEmptyResponse,
1696 'testLoadAbortIllegalChromeURL': testLoadAbortIllegalChromeURL,
1697 'testLoadAbortIllegalFileURL': testLoadAbortIllegalFileURL,
1698 'testLoadAbortIllegalJavaScriptURL': testLoadAbortIllegalJavaScriptURL,
1699 'testLoadAbortInvalidNavigation': testLoadAbortInvalidNavigation,
1700 'testLoadAbortNonWebSafeScheme': testLoadAbortNonWebSafeScheme,
1701 'testLoadProgressEvent': testLoadProgressEvent,
1702 'testLoadStartLoadRedirect': testLoadStartLoadRedirect,
1703 'testNavigateAfterResize': testNavigateAfterResize,
1704 'testNavigationToExternalProtocol': testNavigationToExternalProtocol,
1705 'testNavOnConsecutiveSrcAttributeChanges':
1706 testNavOnConsecutiveSrcAttributeChanges,
1707 'testNavOnSrcAttributeChange': testNavOnSrcAttributeChange,
1708 'testNewWindow': testNewWindow,
1709 'testNewWindowNoPreventDefault': testNewWindowNoPreventDefault,
1710 'testNewWindowNoReferrerLink': testNewWindowNoReferrerLink,
1711 'testNewWindowTwoListeners': testNewWindowTwoListeners,
1712 'testOnEventProperties': testOnEventProperties,
1713 'testPartitionChangeAfterNavigation': testPartitionChangeAfterNavigation,
1714 'testPartitionRemovalAfterNavigationFails':
1715 testPartitionRemovalAfterNavigationFails,
1716 'testReassignSrcAttribute': testReassignSrcAttribute,
1717 'testReload': testReload,
1718 'testReloadAfterTerminate': testReloadAfterTerminate,
1719 'testRemoveSrcAttribute': testRemoveSrcAttribute,
1720 'testRemoveWebviewAfterNavigation': testRemoveWebviewAfterNavigation,
1721 'testRemoveWebviewOnExit': testRemoveWebviewOnExit,
1722 'testResizeWebviewResizesContent': testResizeWebviewResizesContent,
1723 'testTerminateAfterExit': testTerminateAfterExit,
1724 'testWebRequestAPI': testWebRequestAPI,
1725 'testWebRequestAPIWithHeaders': testWebRequestAPIWithHeaders,
1726 'testWebRequestAPIExistence': testWebRequestAPIExistence,
1727 'testWebRequestAPIGoogleProperty': testWebRequestAPIGoogleProperty
1730 onload = function() {
1731 chrome.test.getConfig(function(config) {
1732 embedder.setUp_(config);
1733 chrome.test.sendMessage('LAUNCHED');