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)