Mercurial > dwindows
changeset 2049:2bf8a22f515e
Win: Attempt to move to Invoke(eval) from the deprecated execScript() method.
execScript() is deprecated and does not seem to be able to return the result.
This is the first attempt, it gets to Invoke() but Invoke() fails, it then
falls back to the older execScript() so the failure is not visible.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Sat, 30 Nov 2019 13:34:01 +0000 |
parents | 2d06f48e9d12 |
children | 13995a6bf05d |
files | win/browser.c |
diffstat | 1 files changed, 36 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/win/browser.c Sat Nov 30 10:43:55 2019 +0000 +++ b/win/browser.c Sat Nov 30 13:34:01 2019 +0000 @@ -1563,7 +1563,6 @@ IHTMLWindow2 *htmlWindow2; IHTMLDocument2 *htmlDocument2; IOleObject *browserObject; - VARIANT result; int retval = DW_ERROR_UNKNOWN; // Retrieve the browser object's pointer we stored in our window's GWL_USERDATA when @@ -1580,28 +1579,47 @@ { if (!pDp->lpVtbl->QueryInterface(pDp, &IID_IHTMLDocument2, (void**)&htmlDocument2)) { - if (!htmlDocument2->lpVtbl->get_parentWindow(htmlDocument2, &htmlWindow2)) + BSTR myscript = SysAllocString(UTF8toWide(script)); + if (myscript) { - BSTR myscript = SysAllocString(UTF8toWide(script)); - if (myscript) + IDispatch* pScript = 0; + HRESULT hr = E_FAIL; + void* params[2]; + VARIANT result; + + VariantInit(&result); + + /* We first attempt to use the Invoke method */ + if(SUCCEEDED(htmlDocument2->lpVtbl->get_Script(htmlDocument2, &pScript))) { - HRESULT hr; - void* params[2]; + DISPID idSave; + LPOLESTR rgszNames[1] = {L"eval"}; - VariantInit(&result); + if(SUCCEEDED(pScript->lpVtbl->GetIDsOfNames(pScript, &IID_NULL, rgszNames, 1, LOCALE_SYSTEM_DEFAULT, &idSave))) + { + DISPPARAMS dispParams = {NULL, NULL, 0, 0}; + dispParams.cArgs = 1; + dispParams.rgvarg = &myscript; + hr = pScript->lpVtbl->Invoke(pScript, idSave, &IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispParams, &result, NULL, NULL); + } + pScript->lpVtbl->Release(pScript); + } + /* If Invoke fails, fall back to execScript */ + if(FAILED(hr) && SUCCEEDED(htmlDocument2->lpVtbl->get_parentWindow(htmlDocument2, &htmlWindow2))) + { hr = htmlWindow2->lpVtbl->execScript(htmlWindow2, myscript, L"javascript", &result); - params[0] = (void*)(result.vt == VT_BSTR ? WideToUTF8(result.bstrVal) : NULL); - params[1] = DW_INT_TO_POINTER((hr == S_OK ? DW_ERROR_NONE : DW_ERROR_UNKNOWN)); - /* Pass the result back for event handling */ - _wndproc(hwnd, WM_USER+100, (WPARAM)params, (LPARAM)scriptdata); - VariantClear(&result); - SysFreeString(myscript); - retval = DW_ERROR_NONE; + // We no longer need the IWebBrowser2 object (ie, we don't plan to call any more functions in it, + // so we can release our hold on it). Note that we'll still maintain our hold on the browser + // object. + htmlWindow2->lpVtbl->Release(htmlWindow2); } - // We no longer need the IWebBrowser2 object (ie, we don't plan to call any more functions in it, - // so we can release our hold on it). Note that we'll still maintain our hold on the browser - // object. - htmlWindow2->lpVtbl->Release(htmlWindow2); + params[0] = (void*)(result.vt == VT_BSTR ? WideToUTF8(result.bstrVal) : NULL); + params[1] = DW_INT_TO_POINTER((SUCCEEDED(hr) ? DW_ERROR_NONE : DW_ERROR_UNKNOWN)); + /* Pass the result back for event handling */ + _wndproc(hwnd, WM_USER+100, (WPARAM)params, (LPARAM)scriptdata); + VariantClear(&result); + SysFreeString(myscript); + retval = DW_ERROR_NONE; } htmlDocument2->lpVtbl->Release(htmlDocument2); }