From da9fa9e80c9c377608369c29c5ba39e85a074dd4 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 11 Dec 2014 16:26:18 +0100 Subject: [PATCH] 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 2a8ccfa8015..a12384ff50b 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 852f81dc82a..783b976aab4 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(""); + + 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"); -- 2.11.4.GIT