Jacek Caban : mshtml: Added function object default value getter implementation.

Alexandre Julliard julliard at winehq.org
Wed Jun 11 13:36:22 CDT 2014


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Jun  2 15:45:13 2014 +0200

mshtml: Added function object default value getter implementation.

---

 dlls/mshtml/dispex.c          |   31 +++++++++++++++++++++++++++++++
 dlls/mshtml/tests/jstest.html |    3 +++
 dlls/mshtml/tests/script.c    |   37 ++++++++++++++++++++++++++++++++++---
 3 files changed, 68 insertions(+), 3 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index d68a132..a81bf7c 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -717,6 +717,37 @@ static HRESULT function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
             return E_UNEXPECTED;
         hres = typeinfo_invoke(This->obj, This->info, flags, params, res, ei);
         break;
+    case DISPATCH_PROPERTYGET: {
+        unsigned name_len;
+        WCHAR *ptr;
+        BSTR str;
+
+        static const WCHAR func_prefixW[] =
+            {'\n','f','u','n','c','t','i','o','n',' '};
+        static const WCHAR func_suffixW[] =
+            {'(',')',' ','{','\n',' ',' ',' ',' ','[','n','a','t','i','v','e',' ','c','o','d','e',']','\n','}','\n'};
+
+        /* FIXME: This probably should be more generic. Also we should try to get IID_IActiveScriptSite and SID_GetCaller. */
+        if(!caller)
+            return E_ACCESSDENIED;
+
+        name_len = SysStringLen(This->info->name);
+        ptr = str = SysAllocStringLen(NULL, name_len + (sizeof(func_prefixW)+sizeof(func_suffixW))/sizeof(WCHAR));
+        if(!str)
+            return E_OUTOFMEMORY;
+
+        memcpy(ptr, func_prefixW, sizeof(func_prefixW));
+        ptr += sizeof(func_prefixW)/sizeof(WCHAR);
+
+        memcpy(ptr, This->info->name, name_len*sizeof(WCHAR));
+        ptr += name_len;
+
+        memcpy(ptr, func_suffixW, sizeof(func_suffixW));
+
+        V_VT(res) = VT_BSTR;
+        V_BSTR(res) = str;
+        return S_OK;
+    }
     default:
         FIXME("Unimplemented flags %x\n", flags);
         hres = E_NOTIMPL;
diff --git a/dlls/mshtml/tests/jstest.html b/dlls/mshtml/tests/jstest.html
index bfa98c0..b47de42 100644
--- a/dlls/mshtml/tests/jstest.html
+++ b/dlls/mshtml/tests/jstest.html
@@ -165,6 +165,9 @@ function test_override_functions() {
 
     var tmp = div.addBehavior();
     ok(tmp === "test", "div.addBehavior() = " + tmp);
+
+    tmp = String(div.attachEvent);
+    ok(tmp == "\nfunction attachEvent() {\n    [native code]\n}\n", "String(div.attachEvent) = " + tmp);
 }
 
 function test_forin() {
diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c
index df52a75..5e9ca60 100644
--- a/dlls/mshtml/tests/script.c
+++ b/dlls/mshtml/tests/script.c
@@ -132,6 +132,8 @@ DEFINE_EXPECT(AXSetInterfaceSafetyOptions_IDispatchEx_caller_secmgr);
 DEFINE_EXPECT(AXSetInterfaceSafetyOptions_IDispatchEx_caller);
 DEFINE_EXPECT(external_success);
 DEFINE_EXPECT(QS_VariantConversion);
+DEFINE_EXPECT(QS_IActiveScriptSite);
+DEFINE_EXPECT(QS_GetCaller);
 DEFINE_EXPECT(ChangeType);
 
 #define TESTSCRIPT_CLSID "{178fc163-f585-4e24-9c13-4bb7faf80746}"
@@ -162,6 +164,9 @@ static HRESULT ax_getopt_hres = S_OK, ax_setopt_dispex_hres = S_OK;
 static HRESULT ax_setopt_disp_caller_hres = S_OK, ax_setopt_disp_data_hres = S_OK;
 static BOOL skip_loadobject_tests;
 
+static IActiveScriptSite *site;
+static SCRIPTSTATE state;
+
 static int strcmp_wa(LPCWSTR strw, const char *stra)
 {
     CHAR buf[512];
@@ -332,6 +337,19 @@ static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFG
         return S_OK;
     }
 
+    if(IsEqualGUID(guidService, &IID_IActiveScriptSite)) {
+        CHECK_EXPECT(QS_IActiveScriptSite);
+        ok(IsEqualGUID(riid, &IID_IOleCommandTarget), "uenxpected riid %s\n", wine_dbgstr_guid(riid));
+        return IActiveScriptSite_QueryInterface(site, riid, ppv);
+    }
+
+    if(IsEqualGUID(guidService, &SID_GetCaller)) {
+        CHECK_EXPECT(QS_GetCaller);
+        ok(IsEqualGUID(riid, &IID_IServiceProvider), "uenxpected riid %s\n", wine_dbgstr_guid(riid));
+        *ppv = NULL;
+        return E_NOINTERFACE;
+    }
+
     ok(0, "unexpected service %s\n", wine_dbgstr_guid(guidService));
     return E_NOINTERFACE;
 }
@@ -1280,9 +1298,6 @@ static void load_doc(IHTMLDocument2 *doc, const char *str)
     IHTMLElement_Release(body);
 }
 
-static IActiveScriptSite *site;
-static SCRIPTSTATE state;
-
 static HRESULT WINAPI ObjectSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
 {
     *ppv = NULL;
@@ -1902,6 +1917,22 @@ static void test_func(IDispatchEx *obj)
     hres = dispex_propput(obj, id, 0, &var, NULL);
     ok(hres == E_NOTIMPL, "InvokeEx failed: %08x\n", hres);
 
+    hres = dispex_propget(dispex, DISPID_VALUE, &var, NULL);
+    ok(hres == E_ACCESSDENIED, "InvokeEx returned: %08x, expected E_ACCESSDENIED\n", hres);
+    if(SUCCEEDED(hres))
+        VariantClear(&var);
+
+    SET_EXPECT(QS_IActiveScriptSite);
+    SET_EXPECT(QS_GetCaller);
+    hres = dispex_propget(dispex, DISPID_VALUE, &var, &caller_sp);
+    ok(hres == S_OK, "InvokeEx returned: %08x, expected S_OK\n", hres);
+    ok(V_VT(&var) == VT_BSTR, "V_VT(var) = %d\n", V_VT(&var));
+    ok(!strcmp_wa(V_BSTR(&var), "\nfunction toString() {\n    [native code]\n}\n"),
+       "V_BSTR(var) = %s\n", wine_dbgstr_w(V_BSTR(&var)));
+    VariantClear(&var);
+    todo_wine CHECK_CALLED(QS_IActiveScriptSite);
+    todo_wine CHECK_CALLED(QS_GetCaller);
+
     IDispatchEx_Release(dispex);
 }
 




More information about the wine-cvs mailing list