diff --git a/dlls/mshtml/htmlelem2.c b/dlls/mshtml/htmlelem2.c index fd7cb69f46d..d001eaa82f6 100644 --- a/dlls/mshtml/htmlelem2.c +++ b/dlls/mshtml/htmlelem2.c @@ -130,8 +130,15 @@ static HRESULT WINAPI HTMLElement2_componentFromPoint(IHTMLElement2 *iface, static HRESULT WINAPI HTMLElement2_doScroll(IHTMLElement2 *iface, VARIANT component) { HTMLElement *This = HTMLELEM2_THIS(iface); - FIXME("(%p)->()\n", This); - return E_NOTIMPL; + + TRACE("(%p)->(%s)\n", This, debugstr_variant(&component)); + + if(!This->node.doc->content_ready + || !This->node.doc->basedoc.doc_obj->in_place_active) + return E_PENDING; + + WARN("stub\n"); + return S_OK; } static HRESULT WINAPI HTMLElement2_put_onscroll(IHTMLElement2 *iface, VARIANT v) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 18719fe89b9..2f9e1e53560 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -472,6 +472,7 @@ struct HTMLDocumentNode { LONG ref; HTMLDOMNode *nodes; + BOOL content_ready; IInternetSecurityManager *secmgr; diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c index dd47522f7c7..023c9c4122a 100644 --- a/dlls/mshtml/mutation.c +++ b/dlls/mshtml/mutation.c @@ -466,6 +466,8 @@ static void NSAPI nsDocumentObserver_EndLoad(nsIDocumentObserver *iface, nsIDocu TRACE("\n"); + This->doc->basedoc.doc_node->content_ready = TRUE; + task = heap_alloc(sizeof(task_t)); task->doc = &This->doc->basedoc; diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c index 7a4d5eeeeaa..e02951f6e9f 100644 --- a/dlls/mshtml/tests/htmldoc.c +++ b/dlls/mshtml/tests/htmldoc.c @@ -157,6 +157,7 @@ static BOOL ipsex; static BOOL set_clientsite = FALSE, container_locked = FALSE; static BOOL readystate_set_loading = FALSE, readystate_set_interactive = FALSE, load_from_stream; static BOOL editmode = FALSE, show_failed; +static BOOL inplace_deactivated; static int stream_read, protocol_read; static enum load_state_t { LD_DOLOAD, @@ -211,6 +212,18 @@ static int strcmp_wa(LPCWSTR strw, const char *stra) return lstrcmpA(stra, buf); } +static BSTR a2bstr(const char *str) +{ + BSTR ret; + int len; + + len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); + ret = SysAllocStringLen(NULL, len); + MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len); + + return ret; +} + static BOOL is_english(void) { return PRIMARYLANGID(GetSystemDefaultLangID()) == LANG_ENGLISH @@ -1493,6 +1506,7 @@ static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface) static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface) { CHECK_EXPECT(OnInPlaceActivate); + inplace_deactivated = FALSE; return S_OK; } @@ -1550,6 +1564,7 @@ static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface) { CHECK_EXPECT(OnInPlaceDeactivate); + inplace_deactivated = TRUE; return S_OK; } @@ -2565,6 +2580,53 @@ static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam return DefWindowProc(hwnd, msg, wParam, lParam); } +static void test_doscroll(IUnknown *unk) +{ + IHTMLDocument3 *doc; + IHTMLElement2 *elem2; + IHTMLElement *elem; + VARIANT v; + HRESULT hres; + + hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument3, (void**)&doc); + ok(hres == S_OK, "Could not get IHTMLDocument3 iface: %08x\n", hres); + if(FAILED(hres)) + return; + + hres = IHTMLDocument3_get_documentElement(doc, &elem); + IHTMLDocument3_Release(doc); + ok(hres == S_OK, "get_documentElement failed: %08x\n", hres); + switch(load_state) { + case LD_DOLOAD: + case LD_NO: + ok(!elem, "elem != NULL\n"); + default: + break; + case LD_INTERACTIVE: + case LD_COMPLETE: + ok(elem != NULL, "elem == NULL\n"); + } + if(!elem) + return; + + hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLElement2, (void**)&elem2); + IHTMLElement_Release(elem); + ok(hres == S_OK, "Could not get IHTMLElement2 iface: %08x\n", hres); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = a2bstr("left"); + hres = IHTMLElement2_doScroll(elem2, v); + SysFreeString(V_BSTR(&v)); + IHTMLElement2_Release(elem2); + + if(inplace_deactivated) + ok(hres == E_PENDING, "doScroll failed: %08x\n", hres); + else if(load_state == LD_COMPLETE) + ok(hres == S_OK, "doScroll failed: %08x\n", hres); + else + ok(hres == E_PENDING || hres == S_OK, "doScroll failed: %08x\n", hres); +} + static void _test_readyState(unsigned line, IUnknown *unk) { IHTMLDocument2 *htmldoc; @@ -2618,6 +2680,8 @@ static void _test_readyState(unsigned line, IUnknown *unk) ok_(__FILE__,line) (V_VT(&out) == VT_I4, "V_VT(out)=%d\n", V_VT(&out)); ok_(__FILE__,line) (V_I4(&out) == load_state%5, "VT_I4(out)=%d, expected %d\n", V_I4(&out), load_state%5); + test_doscroll((IUnknown*)htmldoc); + IHTMLDocument2_Release(htmldoc); } @@ -3868,6 +3932,7 @@ static void init_test(enum load_state_t ls) { stream_read = 0; protocol_read = 0; ipsex = FALSE; + inplace_deactivated = FALSE; } static void test_HTMLDocument(BOOL do_load)