Jacek Caban : mshtml: Added IHTMLObjectElement2:: put_classid semi-stub implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Dec 11 15:22:15 CST 2014


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Dec 11 16:26:18 2014 +0100

mshtml: Added IHTMLObjectElement2::put_classid semi-stub implementation.

---

 dlls/mshtml/htmlobject.c    | 25 ++++++++++++--
 dlls/mshtml/tests/activex.c | 83 ++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 102 insertions(+), 6 deletions(-)

diff --git a/dlls/mshtml/htmlobject.c b/dlls/mshtml/htmlobject.c
index 2a8ccfa..a12384f 100644
--- a/dlls/mshtml/htmlobject.c
+++ b/dlls/mshtml/htmlobject.c
@@ -575,8 +575,29 @@ static HRESULT WINAPI HTMLObjectElement2_namedRecordset(IHTMLObjectElement2 *ifa
 static HRESULT WINAPI HTMLObjectElement2_put_classid(IHTMLObjectElement2 *iface, BSTR v)
 {
     HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface);
-    FIXME("(%p)->(%s)\n", This, debugstr_w(v));
-    return E_NOTIMPL;
+    HRESULT hres;
+
+    static const WCHAR classidW[] = {'c','l','a','s','s','i','d',0};
+
+    FIXME("(%p)->(%s) semi-stub\n", This, debugstr_w(v));
+
+    hres = elem_string_attr_setter(&This->plugin_container.element, classidW, v);
+    if(FAILED(hres))
+        return hres;
+
+    if(This->plugin_container.plugin_host) {
+        FIXME("Host already asociated.\n");
+        return E_NOTIMPL;
+    }
+
+    /*
+     * NOTE:
+     * If the element is not yet in DOM tree, we should embed it as soon as it's added.
+     * However, Gecko for some reason decides not to create NP plugin in this case,
+     * so this won't work.
+     */
+
+    return create_plugin_host(This->plugin_container.element.node.doc, &This->plugin_container);
 }
 
 static HRESULT WINAPI HTMLObjectElement2_get_classid(IHTMLObjectElement2 *iface, BSTR *p)
diff --git a/dlls/mshtml/tests/activex.c b/dlls/mshtml/tests/activex.c
index 852f81d..783b976 100644
--- a/dlls/mshtml/tests/activex.c
+++ b/dlls/mshtml/tests/activex.c
@@ -217,6 +217,7 @@ static BSTR a2bstr(const char *str)
 static IOleClientSite *client_site;
 static IDispatch *sink_disp;
 static READYSTATE plugin_readystate = READYSTATE_UNINITIALIZED;
+static BOOL have_container;
 
 static void set_plugin_readystate(READYSTATE state)
 {
@@ -468,15 +469,19 @@ static HRESULT WINAPI QuickActivate_QuickActivate(IQuickActivate *iface, QACONTA
     ok(!container->pUnkEventSink, "container->pUnkEventSink != NULL\n");
     ok(container->dwAmbientFlags == (QACONTAINER_SUPPORTSMNEMONICS|QACONTAINER_MESSAGEREFLECT|QACONTAINER_USERMODE),
        "container->dwAmbientFlags = %x\n", container->dwAmbientFlags);
-    ok(!container->colorFore, "container->colorFore == 0\n"); /* FIXME */
+    if(have_container)
+        ok(!container->colorFore, "container->colorFore = %d\n", container->colorFore); /* FIXME */
     todo_wine
     ok(container->colorBack, "container->colorBack == 0\n"); /* FIXME */
-    todo_wine
-    ok(container->pFont != NULL, "container->pFont == NULL\n");
+    if(have_container)
+        todo_wine ok(container->pFont != NULL, "container->pFont == NULL\n");
+    else
+        ok(!container->pFont, "container->pFont = %p\n", container->pFont);
     todo_wine
     ok(container->pUndoMgr != NULL, "container->pUndoMgr == NULL\n");
     ok(!container->dwAppearance, "container->dwAppearance = %x\n", container->dwAppearance);
-    ok(!container->lcid, "container->lcid = %x\n", container->lcid);
+    if(have_container)
+        ok(!container->lcid, "container->lcid = %x\n", container->lcid);
     ok(!container->hpal, "container->hpal = %p\n", container->hpal);
     ok(!container->pBindHost, "container->pBindHost != NULL\n");
     ok(!container->pOleControlSite, "container->pOleControlSite != NULL\n");
@@ -2366,6 +2371,7 @@ static void init_test(int behavior)
 
     activex_refcnt = 0;
     no_quickact = behavior == TEST_NOQUICKACT || behavior == TEST_DISPONLY;
+    have_container = TRUE;
 }
 
 static void test_event_call(void)
@@ -2594,6 +2600,73 @@ static void test_nooleobj_ax(void)
     release_doc(doc);
 }
 
+static void test_exec_script(IHTMLDocument2 *doc, const char *codea, const char *langa)
+{
+    IHTMLWindow2 *window;
+    BSTR code, lang;
+    VARIANT v;
+    HRESULT hres;
+
+    hres = IHTMLDocument2_get_parentWindow(doc, &window);
+    ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
+
+    code = a2bstr(codea);
+    lang = a2bstr(langa);
+
+    hres = IHTMLWindow2_execScript(window, code, lang, &v);
+    ok(hres == S_OK, "execScript failed: %08x\n", hres);
+    SysFreeString(lang);
+    VariantClear(&v);
+
+    IHTMLWindow2_Release(window);
+}
+
+static void test_create_element(void)
+{
+    IHTMLDocument2 *doc;
+
+    init_test(TEST_FLASH);
+
+    doc = create_doc("<html></html>");
+
+    have_container = FALSE;
+
+    SET_EXPECT(CreateInstance);
+    SET_EXPECT(FreezeEvents_TRUE);
+    SET_EXPECT(QuickActivate);
+    SET_EXPECT(IPersistPropertyBag_InitNew);
+    SET_EXPECT(Invoke_READYSTATE);
+    SET_EXPECT(FreezeEvents_FALSE);
+
+    test_exec_script(doc,
+                     "var test_elem = document.createElement('object');"
+                     "test_elem.classid = 'CLSID:178fc163-f585-4e24-9c13-4bb7f6680746';",
+                     "javascript");
+
+    CHECK_CALLED(CreateInstance);
+    todo_wine CHECK_CALLED(FreezeEvents_TRUE);
+    CHECK_CALLED(QuickActivate);
+    CHECK_CALLED(IPersistPropertyBag_InitNew);
+    CHECK_CALLED(Invoke_READYSTATE);
+    todo_wine CHECK_CALLED(FreezeEvents_FALSE);
+
+    have_container = TRUE;
+
+    SET_EXPECT(DoVerb);
+    test_exec_script(doc,
+                     "document.body.appendChild(test_elem);",
+                     "javascript");
+    todo_wine CHECK_CALLED(DoVerb);
+
+    SET_EXPECT(InPlaceDeactivate);
+    SET_EXPECT(Close);
+    SET_EXPECT(SetClientSite_NULL);
+    release_doc(doc);
+    todo_wine CHECK_CALLED(InPlaceDeactivate);
+    CHECK_CALLED(Close);
+    CHECK_CALLED(SetClientSite_NULL);
+}
+
 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     return DefWindowProcW(hwnd, msg, wParam, lParam);
@@ -2730,6 +2803,8 @@ START_TEST(activex)
         test_nooleobj_ax();
         trace("Testing event object binding...\n");
         test_event_binding();
+        trace("Testing createElement(object)...\n");
+        test_create_element();
         init_registry(FALSE);
     }else {
         skip("Could not register ActiveX\n");




More information about the wine-cvs mailing list