michael@0: var user32; michael@0: var sendMessage; michael@0: var getDlgItem; michael@0: var messageBox; michael@0: var watcher; michael@0: michael@0: importScripts("hangui_common.js"); michael@0: importScripts("dialog_watcher.js"); michael@0: michael@0: function initCTypes() { michael@0: if (!user32) { michael@0: user32 = ctypes.open("user32.dll"); michael@0: } michael@0: if (!getDlgItem) { michael@0: getDlgItem = user32.declare("GetDlgItem", michael@0: ctypes.winapi_abi, michael@0: ctypes.uintptr_t, michael@0: ctypes.uintptr_t, michael@0: ctypes.int); michael@0: } michael@0: if (!sendMessage) { michael@0: sendMessage = user32.declare("SendMessageW", michael@0: ctypes.winapi_abi, michael@0: ctypes.intptr_t, michael@0: ctypes.uintptr_t, michael@0: ctypes.uint32_t, michael@0: ctypes.uintptr_t, michael@0: ctypes.intptr_t); michael@0: } michael@0: if (!messageBox) { michael@0: // Handy for debugging the test itself michael@0: messageBox = user32.declare("MessageBoxW", michael@0: ctypes.winapi_abi, michael@0: ctypes.int, michael@0: ctypes.uintptr_t, michael@0: ctypes.jschar.ptr, michael@0: ctypes.jschar.ptr, michael@0: ctypes.uint32_t); michael@0: } michael@0: if (!watcher) { michael@0: watcher = new DialogWatcher("Warning: Unresponsive plugin"); michael@0: } michael@0: } michael@0: michael@0: function postSuccess(params) { michael@0: self.postMessage({"status": true, "params": params}); michael@0: } michael@0: michael@0: function postFail(params, msg) { michael@0: self.postMessage({"status": false, "params": params, "msg": msg}); michael@0: } michael@0: michael@0: function onDialogStart(inparams, hwnd) { michael@0: var params = Object.create(inparams); michael@0: params.testName += " (Start)"; michael@0: params.callback = null; michael@0: if (!params.expectToFind) { michael@0: postFail(params, "Dialog showed when we weren't expecting it to!"); michael@0: return; michael@0: } michael@0: if (params.opCode == HANGUIOP_CANCEL) { michael@0: sendMessage(hwnd, WM_CLOSE, 0, 0); michael@0: } else if (params.opCode == HANGUIOP_COMMAND) { michael@0: if (params.check) { michael@0: var checkbox = getDlgItem(hwnd, IDC_NOFUTURE); michael@0: if (!checkbox) { michael@0: postFail(params, "Couldn't find checkbox"); michael@0: return; michael@0: } michael@0: sendMessage(checkbox, BM_SETCHECK, BST_CHECKED, 0); michael@0: sendMessage(hwnd, WM_COMMAND, (BN_CLICKED << 16) | IDC_NOFUTURE, checkbox); michael@0: } michael@0: var button = getDlgItem(hwnd, params.commandId); michael@0: if (!button) { michael@0: postFail(params, michael@0: "GetDlgItem failed to find button with ID " + params.commandId); michael@0: return; michael@0: } michael@0: sendMessage(hwnd, WM_COMMAND, (BN_CLICKED << 16) | params.commandId, button); michael@0: } michael@0: postSuccess(params); michael@0: } michael@0: michael@0: function onDialogEnd(inparams) { michael@0: var params = Object.create(inparams); michael@0: params.testName += " (End)"; michael@0: params.callback = inparams.callback; michael@0: postSuccess(params); michael@0: } michael@0: michael@0: self.onmessage = function(event) { michael@0: initCTypes(); michael@0: watcher.init(); michael@0: var params = event.data; michael@0: var timeout = params.timeoutMs; michael@0: if (params.expectToFind) { michael@0: watcher.onDialogStart = function(hwnd) { onDialogStart(params, hwnd); }; michael@0: if (params.expectToClose) { michael@0: watcher.onDialogEnd = function() { onDialogEnd(params); }; michael@0: } michael@0: } else { michael@0: watcher.onDialogStart = null; michael@0: watcher.onDialogEnd = null; michael@0: } michael@0: var result = watcher.processWindowEvents(timeout); michael@0: if (result === null) { michael@0: postFail(params, "Hook failed"); michael@0: } else if (!result) { michael@0: if (params.expectToFind) { michael@0: postFail(params, "The dialog didn't show but we were expecting it to"); michael@0: } else { michael@0: postSuccess(params); michael@0: } michael@0: } michael@0: } michael@0: michael@0: self.onerror = function(event) { michael@0: var msg = "Error: " + event.message + " at " + event.filename + ":" + event.lineno; michael@0: postFail(null, msg); michael@0: }; michael@0: