browser_blocking_image.js (5359B)
1 const TEST_URI = 2 getRootDirectory(gTestPath).replace( 3 "chrome://mochitests/content", 4 "https://example.com" 5 ) + "file_blocking_image.html"; 6 7 /** 8 * Loading an image from https:// should work. 9 */ 10 add_task(async function load_image_from_https_test() { 11 let tab = BrowserTestUtils.addTab(gBrowser, TEST_URI); 12 await BrowserTestUtils.browserLoaded(tab.linkedBrowser); 13 14 gBrowser.selectedTab = tab; 15 16 await SpecialPowers.spawn(tab.linkedBrowser, [], async function () { 17 function imgListener(img) { 18 return new Promise((resolve, reject) => { 19 img.addEventListener("load", () => resolve()); 20 img.addEventListener("error", () => reject()); 21 }); 22 } 23 24 let img = content.document.createElement("img"); 25 img.src = "https://example.com/tests/image/test/mochitest/shaver.png"; 26 content.document.body.appendChild(img); 27 28 try { 29 await imgListener(img); 30 Assert.ok(true); 31 } catch (e) { 32 Assert.ok(false); 33 } 34 }); 35 36 gBrowser.removeTab(tab); 37 }); 38 39 /** 40 * Loading an image from http:// should be rejected. 41 */ 42 add_task(async function load_image_from_http_test() { 43 let tab = BrowserTestUtils.addTab(gBrowser, TEST_URI); 44 await BrowserTestUtils.browserLoaded(tab.linkedBrowser); 45 46 gBrowser.selectedTab = tab; 47 48 await SpecialPowers.spawn(tab.linkedBrowser, [], async function () { 49 function imgListener(img) { 50 return new Promise((resolve, reject) => { 51 img.addEventListener("load", () => reject()); 52 img.addEventListener("error", () => resolve()); 53 }); 54 } 55 56 let img = content.document.createElement("img"); 57 img.src = "http://example.com/tests/image/test/mochitest/shaver.png"; 58 content.document.body.appendChild(img); 59 60 try { 61 await imgListener(img); 62 Assert.ok(true); 63 } catch (e) { 64 Assert.ok(false); 65 } 66 }); 67 68 gBrowser.removeTab(tab); 69 }); 70 71 /** 72 * Loading an image from http:// immediately after loading from https:// 73 * The load from https:// should be replaced. 74 */ 75 add_task(async function load_https_and_http_test() { 76 let tab = BrowserTestUtils.addTab(gBrowser, TEST_URI); 77 await BrowserTestUtils.browserLoaded(tab.linkedBrowser); 78 79 // Clear image cache, otherwise in non-e10s mode the image might be cached by 80 // previous test, and make the image from https is loaded immediately. 81 let imgTools = Cc["@mozilla.org/image/tools;1"].getService(Ci.imgITools); 82 let imageCache = imgTools.getImgCacheForDocument(window.document); 83 imageCache.clearCache(false); // false=content 84 85 gBrowser.selectedTab = tab; 86 87 await SpecialPowers.spawn(tab.linkedBrowser, [], async function () { 88 function imgListener(img) { 89 return new Promise((resolve, reject) => { 90 img.addEventListener("load", () => reject()); 91 img.addEventListener("error", () => resolve()); 92 }); 93 } 94 95 let img = content.document.createElement("img"); 96 img.src = "https://example.com/tests/image/test/mochitest/shaver.png"; 97 img.src = "http://example.com/tests/image/test/mochitest/shaver.png"; 98 99 content.document.body.appendChild(img); 100 101 try { 102 await imgListener(img); 103 Assert.ok(true); 104 } catch (e) { 105 Assert.ok(false); 106 } 107 }); 108 109 gBrowser.removeTab(tab); 110 }); 111 112 /** 113 * Loading an image from https. 114 * Then after we have size information of the image, we immediately change the 115 * location to a http:// site (hence should be blocked by CSP). 116 */ 117 add_task(async function block_pending_request_test() { 118 let tab = BrowserTestUtils.addTab(gBrowser, TEST_URI); 119 await BrowserTestUtils.browserLoaded(tab.linkedBrowser); 120 121 gBrowser.selectedTab = tab; 122 123 await SpecialPowers.spawn(tab.linkedBrowser, [], async function () { 124 let wrapper = { 125 _resolve: null, 126 _sizeAvail: false, 127 128 sizeAvailable(request) { 129 // In non-e10s mode the image may have already been cached, so sometimes 130 // sizeAvailable() is called earlier then waitUntilSizeAvailable(). 131 if (this._resolve) { 132 this._resolve(); 133 } else { 134 this._sizeAvail = true; 135 } 136 }, 137 138 waitUntilSizeAvailable() { 139 return new Promise(resolve => { 140 this._resolve = resolve; 141 if (this._sizeAvail) { 142 resolve(); 143 } 144 }); 145 }, 146 147 QueryInterface(aIID) { 148 if (aIID.equals(Ci.imgIScriptedNotificationObserver)) { 149 return this; 150 } 151 throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE); 152 }, 153 }; 154 155 let observer = Cc["@mozilla.org/image/tools;1"] 156 .getService(Ci.imgITools) 157 .createScriptedObserver(wrapper); 158 159 let img = content.document.createElement("img"); 160 img.src = "https://example.com/tests/image/test/mochitest/shaver.png"; 161 img.addObserver(observer); 162 163 content.document.body.appendChild(img); 164 165 info("Wait until Size Available"); 166 await wrapper.waitUntilSizeAvailable(); 167 info("Size Available now!"); 168 img.removeObserver(observer); 169 170 let req = img.getRequest(Ci.nsIImageLoadingContent.CURRENT_REQUEST); 171 // Now we change to load from http:// site, which will be blocked. 172 img.src = "http://example.com/tests/image/test/mochitest/shaver.png"; 173 174 Assert.equal( 175 img.getRequest(Ci.nsIImageLoadingContent.CURRENT_REQUEST), 176 req, 177 "CURRENT_REQUEST shouldn't be replaced." 178 ); 179 }); 180 181 gBrowser.removeTab(tab); 182 });