summaryrefslogtreecommitdiffstats
path: root/dom/plugins/test/mochitest/hangui_iface.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/plugins/test/mochitest/hangui_iface.js')
-rw-r--r--dom/plugins/test/mochitest/hangui_iface.js121
1 files changed, 121 insertions, 0 deletions
diff --git a/dom/plugins/test/mochitest/hangui_iface.js b/dom/plugins/test/mochitest/hangui_iface.js
new file mode 100644
index 000000000..853d136bb
--- /dev/null
+++ b/dom/plugins/test/mochitest/hangui_iface.js
@@ -0,0 +1,121 @@
+var user32;
+var sendMessage;
+var getDlgItem;
+var messageBox;
+var watcher;
+
+importScripts("hangui_common.js");
+importScripts("dialog_watcher.js");
+
+function initCTypes() {
+ if (!user32) {
+ user32 = ctypes.open("user32.dll");
+ }
+ if (!getDlgItem) {
+ getDlgItem = user32.declare("GetDlgItem",
+ ctypes.winapi_abi,
+ ctypes.uintptr_t,
+ ctypes.uintptr_t,
+ ctypes.int);
+ }
+ if (!sendMessage) {
+ sendMessage = user32.declare("SendMessageW",
+ ctypes.winapi_abi,
+ ctypes.intptr_t,
+ ctypes.uintptr_t,
+ ctypes.uint32_t,
+ ctypes.uintptr_t,
+ ctypes.intptr_t);
+ }
+ if (!messageBox) {
+ // Handy for debugging the test itself
+ messageBox = user32.declare("MessageBoxW",
+ ctypes.winapi_abi,
+ ctypes.int,
+ ctypes.uintptr_t,
+ ctypes.char16_t.ptr,
+ ctypes.char16_t.ptr,
+ ctypes.uint32_t);
+ }
+ if (!watcher) {
+ watcher = new DialogWatcher("Warning: Unresponsive plugin");
+ }
+}
+
+function postSuccess(params) {
+ self.postMessage({"status": true, "params": params});
+}
+
+function postFail(params, msg) {
+ self.postMessage({"status": false, "params": params, "msg": msg});
+}
+
+function onDialogStart(inparams, hwnd) {
+ var params = Object.create(inparams);
+ params.testName += " (Start)";
+ params.callback = null;
+ if (!params.expectToFind) {
+ postFail(params, "Dialog showed when we weren't expecting it to!");
+ return;
+ }
+ if (params.opCode == HANGUIOP_CANCEL) {
+ sendMessage(hwnd, WM_CLOSE, 0, 0);
+ } else if (params.opCode == HANGUIOP_COMMAND) {
+ if (params.check) {
+ var checkbox = getDlgItem(hwnd, IDC_NOFUTURE);
+ if (!checkbox) {
+ postFail(params, "Couldn't find checkbox");
+ return;
+ }
+ sendMessage(checkbox, BM_SETCHECK, BST_CHECKED, 0);
+ sendMessage(hwnd, WM_COMMAND, (BN_CLICKED << 16) | IDC_NOFUTURE, checkbox);
+ }
+ var button = getDlgItem(hwnd, params.commandId);
+ if (!button) {
+ postFail(params,
+ "GetDlgItem failed to find button with ID " + params.commandId);
+ return;
+ }
+ sendMessage(hwnd, WM_COMMAND, (BN_CLICKED << 16) | params.commandId, button);
+ }
+ postSuccess(params);
+}
+
+function onDialogEnd(inparams) {
+ var params = Object.create(inparams);
+ params.testName += " (End)";
+ params.callback = inparams.callback;
+ postSuccess(params);
+}
+
+self.onmessage = function(event) {
+ initCTypes();
+ watcher.init();
+ var params = event.data;
+ var timeout = params.timeoutMs;
+ if (params.expectToFind) {
+ watcher.onDialogStart = function(hwnd) { onDialogStart(params, hwnd); };
+ if (params.expectToClose) {
+ watcher.onDialogEnd = function() { onDialogEnd(params); };
+ }
+ } else {
+ watcher.onDialogStart = null;
+ watcher.onDialogEnd = null;
+ }
+ var result = watcher.processWindowEvents(timeout);
+ if (result === null) {
+ postFail(params, "Hook failed");
+ } else if (!result) {
+ if (params.expectToFind) {
+ postFail(params, "The dialog didn't show but we were expecting it to");
+ } else {
+ postSuccess(params);
+ }
+ }
+}
+
+self.onerror = function(event) {
+ var msg = "Error: " + event.message + " at " + event.filename + ":" + event.lineno;
+ postFail(null, msg);
+};
+