window-open-popup-behavior.html (2287B)
1 <!DOCTYPE html> 2 <meta charset=utf-8> 3 <meta name="timeout" content="long"> 4 <title>Window.open popup behavior</title> 5 <link rel="author" href="masonf@chromium.org"> 6 <link rel="help" href="https://html.spec.whatwg.org/multipage/window-object.html#window-open-steps"> 7 <script src="/resources/testharness.js"></script> 8 <script src="/resources/testharnessreport.js"></script> 9 10 <script> 11 function testOne(windowFeatures, expectPopup) { 12 const windowName = Math.round(Math.random()*1e12); 13 const channel = new BroadcastChannel(windowName); 14 var w; 15 promise_test(() => { 16 return new Promise(resolve => { 17 w = window.open("support/window-open-popup-target.html", windowName, windowFeatures); 18 channel.addEventListener('message', resolve); 19 }).then(e => { 20 // Send message first so if asserts throw the popup is still closed 21 channel.postMessage(null); 22 assert_false(e.data.mixedState, "No mixed state"); 23 assert_equals(e.data.isPopup, expectPopup, "Popup state"); 24 }); 25 },`${windowFeatures} (expect ${expectPopup ? "popup" : "tab"})`); 26 } 27 28 // No windowpreferences at all - tab. 29 testOne(undefined, /*expectPopup=*/false); 30 31 // Test all permutations of these properties: 32 const features = ["location","toolbar","menubar","resizable","scrollbars","status"]; 33 const nProps = features.length; 34 const skip = 7; // To speed up the test, don't test all values. Skip 7 to pseudo-randomize. 35 for(let i=0;i<2**nProps;i+=skip) { 36 const enableVec = Number(i).toString(2).padStart(nProps,'0').split('').map(s => (s==="1")); 37 let windowFeatures = []; 38 for(let i=0;i<nProps;++i) { 39 if (enableVec[i]) 40 windowFeatures.push(features[i] + "=yes"); 41 } 42 windowFeatures = windowFeatures.join(','); 43 // We get a popup we got windowFeatures, and any of them are false: 44 const expectPopup = !!windowFeatures.length && (!(enableVec[0] || enableVec[1]) || !enableVec[2] || !enableVec[3] || !enableVec[4] || !enableVec[5]); 45 testOne(windowFeatures, expectPopup); 46 testOne(windowFeatures + ",noopener", /*expectPopup=*/false); 47 testOne(windowFeatures + ",noreferrer", /*expectPopup=*/false); 48 testOne(windowFeatures + ",popup", /*expectPopup=*/true); // "popup" feature = popup 49 testOne(windowFeatures + ",noopener,noreferrer,popup", /*expectPopup=*/false); 50 } 51 </script>