summaryrefslogtreecommitdiffstats
path: root/image/test/unit/image_load_helpers.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--image/test/unit/image_load_helpers.js124
1 files changed, 124 insertions, 0 deletions
diff --git a/image/test/unit/image_load_helpers.js b/image/test/unit/image_load_helpers.js
new file mode 100644
index 0000000000..6d1e605bf5
--- /dev/null
+++ b/image/test/unit/image_load_helpers.js
@@ -0,0 +1,124 @@
+/*
+ * Helper structures to track callbacks from image and channel loads.
+ */
+
+// START_REQUEST and STOP_REQUEST are used by ChannelListener, and
+// stored in ChannelListener.requestStatus.
+const START_REQUEST = 0x01;
+const STOP_REQUEST = 0x02;
+const DATA_AVAILABLE = 0x04;
+
+// One bit per callback that imageListener below implements. Stored in
+// ImageListener.state.
+const SIZE_AVAILABLE = 0x01;
+const FRAME_UPDATE = 0x02;
+const FRAME_COMPLETE = 0x04;
+const LOAD_COMPLETE = 0x08;
+const DECODE_COMPLETE = 0x10;
+
+// Safebrowsing requires that the profile dir is set.
+do_get_profile();
+
+// An implementation of imgIScriptedNotificationObserver with the ability to
+// call specified functions on onStartRequest and onStopRequest.
+function ImageListener(start_callback, stop_callback) {
+ this.sizeAvailable = function onSizeAvailable(aRequest) {
+ Assert.ok(!this.synchronous);
+
+ this.state |= SIZE_AVAILABLE;
+
+ if (this.start_callback) {
+ this.start_callback(this, aRequest);
+ }
+ };
+ this.frameComplete = function onFrameComplete(aRequest) {
+ Assert.ok(!this.synchronous);
+
+ this.state |= FRAME_COMPLETE;
+ };
+ this.decodeComplete = function onDecodeComplete(aRequest) {
+ Assert.ok(!this.synchronous);
+
+ this.state |= DECODE_COMPLETE;
+ };
+ this.loadComplete = function onLoadcomplete(aRequest) {
+ Assert.ok(!this.synchronous);
+
+ this.state |= LOAD_COMPLETE;
+
+ if (this.stop_callback) {
+ this.stop_callback(this, aRequest);
+ }
+ };
+ this.frameUpdate = function onFrameUpdate(aRequest) {};
+ this.isAnimated = function onIsAnimated() {};
+
+ // Initialize the synchronous flag to true to start. This must be set to
+ // false before exiting to the event loop!
+ this.synchronous = true;
+
+ // A function to call when onStartRequest is called.
+ this.start_callback = start_callback;
+
+ // A function to call when onStopRequest is called.
+ this.stop_callback = stop_callback;
+
+ // The image load/decode state.
+ // A bitfield that tracks which callbacks have been called. Takes the bits
+ // defined above.
+ this.state = 0;
+}
+
+function NS_FAILED(val) {
+ return !!(val & 0x80000000);
+}
+
+function ChannelListener() {
+ this.onStartRequest = function onStartRequest(aRequest) {
+ if (this.outputListener) {
+ this.outputListener.onStartRequest(aRequest);
+ }
+
+ this.requestStatus |= START_REQUEST;
+ };
+
+ this.onDataAvailable = function onDataAvailable(
+ aRequest,
+ aInputStream,
+ aOffset,
+ aCount
+ ) {
+ if (this.outputListener) {
+ this.outputListener.onDataAvailable(
+ aRequest,
+ aInputStream,
+ aOffset,
+ aCount
+ );
+ }
+
+ this.requestStatus |= DATA_AVAILABLE;
+ };
+
+ this.onStopRequest = function onStopRequest(aRequest, aStatusCode) {
+ if (this.outputListener) {
+ this.outputListener.onStopRequest(aRequest, aStatusCode);
+ }
+
+ // If we failed (or were canceled - failure is implied if canceled),
+ // there's no use tracking our state, since it's meaningless.
+ if (NS_FAILED(aStatusCode)) {
+ this.requestStatus = 0;
+ } else {
+ this.requestStatus |= STOP_REQUEST;
+ }
+ };
+
+ // A listener to pass the notifications we get to.
+ this.outputListener = null;
+
+ // The request's status. A bitfield that holds one or both of START_REQUEST
+ // and STOP_REQUEST, according to which callbacks have been called on the
+ // associated request.
+ this.requestStatus = 0;
+}