Jacek Caban : mshtml: Improved IHTMLElement2::doScroll stub.

Alexandre Julliard julliard at winehq.org
Mon Oct 12 11:19:41 CDT 2009


Module: wine
Branch: master
Commit: ae6fed5c4ff376d064655770ddd7ac73a4b171bf
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ae6fed5c4ff376d064655770ddd7ac73a4b171bf

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sun Oct 11 21:10:47 2009 +0200

mshtml: Improved IHTMLElement2::doScroll stub.

---

 dlls/mshtml/htmlelem2.c      |   11 ++++++-
 dlls/mshtml/mshtml_private.h |    1 +
 dlls/mshtml/mutation.c       |    2 +
 dlls/mshtml/tests/htmldoc.c  |   65 ++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 77 insertions(+), 2 deletions(-)

diff --git a/dlls/mshtml/htmlelem2.c b/dlls/mshtml/htmlelem2.c
index fd7cb69..d001eaa 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 18719fe..2f9e1e5 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 dd47522..023c9c4 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 7a4d5ee..e02951f 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)




More information about the wine-cvs mailing list