summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_blobIcons.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_blobIcons.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_blobIcons.js133
1 files changed, 133 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_blobIcons.js b/browser/components/urlbar/tests/browser/browser_blobIcons.js
new file mode 100644
index 0000000000..701519c97f
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_blobIcons.js
@@ -0,0 +1,133 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Tests `Blob` icon management in the view.
+
+"use strict";
+
+// `URL.createObjectURL()` should be called the first time a blob icon is shown
+// while the view is open, and `revokeObjectURL()` should be called when the
+// view is closed.
+add_task(async function test() {
+ let sandbox = sinon.createSandbox();
+ registerCleanupFunction(() => sandbox.restore());
+
+ // Spy on `URL.createObjectURL()` and `revokeObjectURL()`.
+ let spies = ["createObjectURL", "revokeObjectURL"].reduce((memo, name) => {
+ memo[name] = sandbox.spy(Cu.getGlobalForObject(gURLBar.view).URL, name);
+ return memo;
+ }, {});
+
+ // Do a search and close the view.
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "test",
+ });
+ await UrlbarTestUtils.promisePopupClose(window);
+
+ // No blob URLs should have been created or revoked since no results that have
+ // blob icons were matched.
+ checkCallCounts(spies, {
+ createObjectURL: 0,
+ revokeObjectURL: 0,
+ });
+
+ // Create a test provider that returns a result with a blob icon.
+ let provider = new UrlbarTestUtils.TestProvider({
+ results: [
+ new UrlbarResult(
+ UrlbarUtils.RESULT_TYPE.URL,
+ UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
+ {
+ url: "https://example.com/",
+ iconBlob: new Blob([new Uint8Array([])]),
+ }
+ ),
+ ],
+ });
+ UrlbarProvidersManager.registerProvider(provider);
+
+ // Do some searches.
+ await doSearches(provider, spies, {
+ createObjectURL: 1,
+ revokeObjectURL: 0,
+ });
+
+ // Closing the view should cause `revokeObjectURL()` to be called.
+ await UrlbarTestUtils.promisePopupClose(window);
+ checkCallCounts(spies, {
+ createObjectURL: 1,
+ revokeObjectURL: 1,
+ });
+
+ // Do some more searches.
+ await doSearches(provider, spies, {
+ createObjectURL: 2,
+ revokeObjectURL: 1,
+ });
+
+ // Close the view.
+ await UrlbarTestUtils.promisePopupClose(window);
+ checkCallCounts(spies, {
+ createObjectURL: 2,
+ revokeObjectURL: 2,
+ });
+
+ // Remove the provider, do another search, and close the view. Since no
+ // results with blob icons are matched, the call counts should not change.
+ UrlbarProvidersManager.unregisterProvider(provider);
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "test",
+ });
+ await UrlbarTestUtils.promisePopupClose(window);
+ checkCallCounts(spies, {
+ createObjectURL: 2,
+ revokeObjectURL: 2,
+ });
+
+ sandbox.restore();
+});
+
+async function doSearches(provider, spies, expectedCountsByName) {
+ let previousImage;
+ for (let i = 0; i < 3; i++) {
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "test " + i,
+ });
+
+ let result = await getTestResult(provider);
+ Assert.ok(result, "Test result should be present");
+ Assert.ok(result.image, "Row has an icon with a src");
+ Assert.ok(result.image.startsWith("blob:"), "Row icon src is a blob URL");
+ if (i > 0) {
+ Assert.equal(
+ result.image,
+ previousImage,
+ "Blob URL should be the same as in previous searches"
+ );
+ }
+ previousImage = result.image;
+
+ // `createObjectURL()` should be called only once across all searches since
+ // the view remains open the whole time.
+ checkCallCounts(spies, expectedCountsByName);
+ }
+}
+
+async function getTestResult(provider) {
+ for (let i = 0; i < UrlbarTestUtils.getResultCount(window); i++) {
+ let result = await UrlbarTestUtils.getDetailsOfResultAt(window, i);
+ if (result.result.providerName == provider.name) {
+ return result;
+ }
+ }
+ return null;
+}
+
+function checkCallCounts(spies, expectedCountsByName) {
+ for (let [name, count] of Object.entries(expectedCountsByName)) {
+ Assert.strictEqual(spies[name].callCount, count, "Spy call count: " + name);
+ }
+}