[ros-diffs] [cwittich] 46303: [MSHTML] sync mshtml with wine 1.1.41

cwittich at svn.reactos.org cwittich at svn.reactos.org
Sun Mar 21 16:12:30 CET 2010


Author: cwittich
Date: Sun Mar 21 16:12:30 2010
New Revision: 46303

URL: http://svn.reactos.org/svn/reactos?rev=46303&view=rev
Log:
[MSHTML]
sync mshtml with wine 1.1.41

Modified:
    trunk/reactos/dll/win32/mshtml/De.rc
    trunk/reactos/dll/win32/mshtml/Fr.rc
    trunk/reactos/dll/win32/mshtml/It.rc
    trunk/reactos/dll/win32/mshtml/Ja.rc
    trunk/reactos/dll/win32/mshtml/Lt.rc
    trunk/reactos/dll/win32/mshtml/No.rc
    trunk/reactos/dll/win32/mshtml/Si.rc
    trunk/reactos/dll/win32/mshtml/htmldoc.c
    trunk/reactos/dll/win32/mshtml/htmldoc3.c
    trunk/reactos/dll/win32/mshtml/htmlelem2.c
    trunk/reactos/dll/win32/mshtml/htmlevent.c
    trunk/reactos/dll/win32/mshtml/htmlevent.h
    trunk/reactos/dll/win32/mshtml/htmlimg.c
    trunk/reactos/dll/win32/mshtml/htmlwindow.c
    trunk/reactos/dll/win32/mshtml/mshtml_private.h
    trunk/reactos/dll/win32/mshtml/mutation.c
    trunk/reactos/dll/win32/mshtml/navigate.c
    trunk/reactos/dll/win32/mshtml/nsevents.c
    trunk/reactos/dll/win32/mshtml/nsio.c
    trunk/reactos/dll/win32/mshtml/omnavigator.c
    trunk/reactos/dll/win32/mshtml/persist.c

Modified: trunk/reactos/dll/win32/mshtml/De.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/De.rc?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/De.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/De.rc [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -72,4 +72,3 @@
     PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
     PUSHBUTTON "Abbrechen", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
 }
-#pragma code_page(default)

Modified: trunk/reactos/dll/win32/mshtml/Fr.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/Fr.rc?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/Fr.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/Fr.rc [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -72,4 +72,3 @@
     PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
     PUSHBUTTON "Annuler", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
 }
-#pragma code_page(default)

Modified: trunk/reactos/dll/win32/mshtml/It.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/It.rc?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/It.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/It.rc [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -69,4 +69,3 @@
     PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
     PUSHBUTTON "Annulla", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
 }
-#pragma code_page(default)

Modified: trunk/reactos/dll/win32/mshtml/Ja.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/Ja.rc?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/Ja.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/Ja.rc [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -69,4 +69,3 @@
     PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
     PUSHBUTTON "キャンセル", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
 }
-#pragma code_page(default)

Modified: trunk/reactos/dll/win32/mshtml/Lt.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/Lt.rc?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/Lt.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/Lt.rc [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -69,4 +69,3 @@
     PUSHBUTTON "Gerai", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
     PUSHBUTTON "Atsisakyti", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
 }
-#pragma code_page(default)

Modified: trunk/reactos/dll/win32/mshtml/No.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/No.rc?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/No.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/No.rc [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -70,4 +70,3 @@
     PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
     PUSHBUTTON "Avbryt", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
 }
-#pragma code_page(default)

Modified: trunk/reactos/dll/win32/mshtml/Si.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/Si.rc?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/Si.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/Si.rc [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -68,4 +68,3 @@
     PUSHBUTTON "V redu", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
     PUSHBUTTON "Prekliči", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
 }
-#pragma code_page(default)

Modified: trunk/reactos/dll/win32/mshtml/htmldoc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/htmldoc.c?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/htmldoc.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/htmldoc.c [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -554,9 +554,12 @@
 static HRESULT WINAPI HTMLDocument_get_referrer(IHTMLDocument2 *iface, BSTR *p)
 {
     HTMLDocument *This = HTMLDOC_THIS(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
-}
+
+    FIXME("(%p)->(%p)\n", This, p);
+
+    *p = NULL;
+    return S_OK;
+ }
 
 static HRESULT WINAPI HTMLDocument_get_location(IHTMLDocument2 *iface, IHTMLLocation **p)
 {
@@ -1474,7 +1477,7 @@
     HTMLDocument *This = HTMLDOC_THIS(iface);
 
     if(This->window)
-        update_cp_events(This->window, cp);
+        update_cp_events(This->window, &This->doc_node->node.event_target, cp, This->doc_node->node.nsnode);
 }
 
 #undef HTMLDOC_THIS
@@ -1595,6 +1598,11 @@
         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
 {
     HTMLDocument *This = DISPEX_THIS(iface);
+
+    if(This->window && id == DISPID_IHTMLDOCUMENT2_LOCATION && (wFlags & DISPATCH_PROPERTYPUT))
+        return IDispatchEx_InvokeEx(DISPATCHEX(This->window), DISPID_IHTMLWINDOW2_LOCATION, lcid, wFlags,
+                pdp, pvarRes, pei, pspCaller);
+
 
     return IDispatchEx_InvokeEx(This->dispex, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
 }

Modified: trunk/reactos/dll/win32/mshtml/htmldoc3.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/htmldoc3.c?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/htmldoc3.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/htmldoc3.c [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -182,7 +182,7 @@
 
     TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
 
-    return attach_event(&This->doc_node->node.event_target, This, event, pDisp, pfResult);
+    return attach_event(&This->doc_node->node.event_target, This->doc_node->node.nsnode, This, event, pDisp, pfResult);
 }
 
 static HRESULT WINAPI HTMLDocument3_detachEvent(IHTMLDocument3 *iface, BSTR event,

Modified: trunk/reactos/dll/win32/mshtml/htmlelem2.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/htmlelem2.c?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/htmlelem2.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/htmlelem2.c [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -649,7 +649,7 @@
 
     TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
 
-    return attach_event(get_node_event_target(&This->node), &This->node.doc->basedoc, event, pDisp, pfResult);
+    return attach_event(get_node_event_target(&This->node), This->node.nsnode, &This->node.doc->basedoc, event, pDisp, pfResult);
 }
 
 static HRESULT WINAPI HTMLElement2_detachEvent(IHTMLElement2 *iface, BSTR event, IDispatch *pDisp)

Modified: trunk/reactos/dll/win32/mshtml/htmlevent.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/htmlevent.c?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/htmlevent.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/htmlevent.c [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -40,6 +40,7 @@
 } handler_vector_t;
 
 struct event_target_t {
+    DWORD node_handlers_mask;
     handler_vector_t *event_table[EVENTID_LAST];
 };
 
@@ -129,6 +130,7 @@
 #define EVENT_DEFAULTLISTENER    0x0001
 #define EVENT_BUBBLE             0x0002
 #define EVENT_FORWARDBODY        0x0004
+#define EVENT_NODEHANDLER        0x0008
 
 static const event_info_t event_info[] = {
     {beforeunloadW,      onbeforeunloadW,      EVENTT_NONE,   DISPID_EVMETH_ONBEFOREUNLOAD,
@@ -152,7 +154,7 @@
     {keyupW,             onkeyupW,             EVENTT_KEY,    DISPID_EVMETH_ONKEYUP,
         EVENT_DEFAULTLISTENER|EVENT_BUBBLE},
     {loadW,              onloadW,              EVENTT_HTML,   DISPID_EVMETH_ONLOAD,
-        0},
+        EVENT_NODEHANDLER},
     {mousedownW,         onmousedownW,         EVENTT_MOUSE,  DISPID_EVMETH_ONMOUSEDOWN,
         EVENT_DEFAULTLISTENER|EVENT_BUBBLE},
     {mouseoutW,          onmouseoutW,          EVENTT_MOUSE,  DISPID_EVMETH_ONMOUSEOUT,
@@ -171,6 +173,8 @@
         0}
 };
 
+static const eventid_t node_handled_list[] = { EVENTID_LOAD };
+
 eventid_t str_to_eid(LPCWSTR str)
 {
     int i;
@@ -194,6 +198,19 @@
     }
 
     return EVENTID_LAST;
+}
+
+static DWORD get_node_handler_mask(eventid_t eid)
+{
+    DWORD i;
+
+    for(i=0; i<sizeof(node_handled_list)/sizeof(*node_handled_list); i++) {
+        if(node_handled_list[i] == eid)
+            return 1 << i;
+    }
+
+    ERR("Invalid eid %d\n", eid);
+    return ~0;
 }
 
 typedef struct {
@@ -882,7 +899,7 @@
     }
 }
 
-void fire_event(HTMLDocumentNode *doc, eventid_t eid, nsIDOMNode *target, nsIDOMEvent *nsevent)
+void fire_event(HTMLDocumentNode *doc, eventid_t eid, BOOL set_event, nsIDOMNode *target, nsIDOMEvent *nsevent)
 {
     IHTMLEventObj *prev_event, *event_obj = NULL;
     nsIDOMNode *parent, *nsnode;
@@ -892,7 +909,9 @@
     TRACE("(%p) %s\n", doc, debugstr_w(event_info[eid].name));
 
     prev_event = doc->basedoc.window->event;
-    event_obj = doc->basedoc.window->event = create_event(get_node(doc, target, TRUE), eid, nsevent);
+    if(set_event)
+        event_obj = create_event(get_node(doc, target, TRUE), eid, nsevent);
+    doc->basedoc.window->event = event_obj;
 
     nsIDOMNode_GetNodeType(target, &node_type);
     nsnode = target;
@@ -949,7 +968,8 @@
     if(nsnode)
         nsIDOMNode_Release(nsnode);
 
-    IHTMLEventObj_Release(event_obj);
+    if(event_obj)
+        IHTMLEventObj_Release(event_obj);
     doc->basedoc.window->event = prev_event;
 }
 
@@ -971,7 +991,7 @@
         return E_NOTIMPL;
     }
 
-    fire_event(node->doc, eid, node->nsnode, NULL);
+    fire_event(node->doc, eid, TRUE, node->nsnode, NULL);
 
     *cancelled = VARIANT_TRUE; /* FIXME */
     return S_OK;
@@ -989,7 +1009,7 @@
             return hres;
     }
 
-    fire_event(node->doc, eid, node->nsnode, NULL);
+    fire_event(node->doc, eid, TRUE, node->nsnode, NULL);
     return S_OK;
 }
 
@@ -1021,9 +1041,24 @@
     return TRUE;
 }
 
-static HRESULT ensure_nsevent_handler(HTMLDocumentNode *doc, eventid_t eid)
-{
-    if(!doc->nsdoc || !(event_info[eid].flags & EVENT_DEFAULTLISTENER))
+static HRESULT ensure_nsevent_handler(HTMLDocumentNode *doc, event_target_t *event_target, nsIDOMNode *nsnode, eventid_t eid)
+{
+    if(!doc->nsdoc)
+        return S_OK;
+
+    if(event_info[eid].flags & EVENT_NODEHANDLER) {
+        DWORD mask;
+
+        mask = get_node_handler_mask(eid);
+        if(event_target->node_handlers_mask & mask)
+            return S_OK;
+
+        add_nsevent_listener(doc, nsnode, event_info[eid].name);
+        event_target->node_handlers_mask |= mask;
+        return S_OK;
+    }
+
+    if(!(event_info[eid].flags & EVENT_DEFAULTLISTENER))
         return S_OK;
 
     if(!doc->event_vector) {
@@ -1034,16 +1069,29 @@
 
     if(!doc->event_vector[eid]) {
         doc->event_vector[eid] = TRUE;
-        add_nsevent_listener(doc, event_info[eid].name);
-    }
-
-    return S_OK;
-}
-
-static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, HTMLDocumentNode *doc,
+        add_nsevent_listener(doc, NULL, event_info[eid].name);
+    }
+
+    return S_OK;
+}
+
+static HRESULT remove_event_handler(event_target_t **event_target, eventid_t eid)
+{
+    if(*event_target && (*event_target)->event_table[eid]->handler_prop) {
+        IDispatch_Release((*event_target)->event_table[eid]->handler_prop);
+        (*event_target)->event_table[eid]->handler_prop = NULL;
+    }
+
+    return S_OK;
+}
+
+static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, nsIDOMNode *nsnode, HTMLDocumentNode *doc,
         eventid_t eid, IDispatch *disp)
 {
     event_target_t *event_target;
+
+    if(!disp)
+        return remove_event_handler(event_target_ptr, eid);
 
     event_target = get_event_target(event_target_ptr);
     if(!event_target)
@@ -1056,25 +1104,19 @@
         IDispatch_Release(event_target->event_table[eid]->handler_prop);
 
     event_target->event_table[eid]->handler_prop = disp;
-    if(!disp)
-        return S_OK;
     IDispatch_AddRef(disp);
 
-    return ensure_nsevent_handler(doc, eid);
-}
-
-HRESULT set_event_handler(event_target_t **event_target, HTMLDocumentNode *doc, eventid_t eid, VARIANT *var)
+    return ensure_nsevent_handler(doc, event_target, nsnode, eid);
+}
+
+HRESULT set_event_handler(event_target_t **event_target, nsIDOMNode *nsnode, HTMLDocumentNode *doc, eventid_t eid, VARIANT *var)
 {
     switch(V_VT(var)) {
     case VT_NULL:
-        if(*event_target && (*event_target)->event_table[eid] && (*event_target)->event_table[eid]->handler_prop) {
-            IDispatch_Release((*event_target)->event_table[eid]->handler_prop);
-            (*event_target)->event_table[eid]->handler_prop = NULL;
-        }
-        break;
+        return remove_event_handler(event_target, eid);
 
     case VT_DISPATCH:
-        return set_event_handler_disp(event_target, doc, eid, V_DISPATCH(var));
+        return set_event_handler_disp(event_target, nsnode, doc, eid, V_DISPATCH(var));
 
     default:
         FIXME("not supported vt=%d\n", V_VT(var));
@@ -1098,7 +1140,8 @@
     return S_OK;
 }
 
-HRESULT attach_event(event_target_t **event_target_ptr, HTMLDocument *doc, BSTR name, IDispatch *disp, VARIANT_BOOL *res)
+HRESULT attach_event(event_target_t **event_target_ptr, nsIDOMNode *nsnode, HTMLDocument *doc, BSTR name,
+        IDispatch *disp, VARIANT_BOOL *res)
 {
     event_target_t *event_target;
     eventid_t eid;
@@ -1128,7 +1171,7 @@
     event_target->event_table[eid]->handlers[i] = disp;
 
     *res = VARIANT_TRUE;
-    return ensure_nsevent_handler(doc->doc_node, eid);
+    return ensure_nsevent_handler(doc->doc_node, event_target, nsnode, eid);
 }
 
 HRESULT detach_event(event_target_t *event_target, HTMLDocument *doc, BSTR name, IDispatch *disp)
@@ -1159,13 +1202,18 @@
     return S_OK;
 }
 
-void update_cp_events(HTMLWindow *window, cp_static_data_t *cp)
-{
+void update_cp_events(HTMLWindow *window, event_target_t **event_target_ptr, cp_static_data_t *cp, nsIDOMNode *nsnode)
+{
+    event_target_t *event_target;
     int i;
+
+    event_target = get_event_target(event_target_ptr);
+    if(!event_target)
+        return; /* FIXME */
 
     for(i=0; i < EVENTID_LAST; i++) {
         if((event_info[i].flags & EVENT_DEFAULTLISTENER) && is_cp_event(cp, event_info[i].dispid))
-            ensure_nsevent_handler(window->doc, i);
+            ensure_nsevent_handler(window->doc, event_target, nsnode, i);
     }
 }
 
@@ -1194,7 +1242,7 @@
             disp = script_parse_event(doc->basedoc.window, attr_value);
             if(disp) {
                 node = get_node(doc, (nsIDOMNode*)nselem, TRUE);
-                set_event_handler_disp(get_node_event_target(node), node->doc, i, disp);
+                set_event_handler_disp(get_node_event_target(node), node->nsnode, node->doc, i, disp);
                 IDispatch_Release(disp);
             }
         }

Modified: trunk/reactos/dll/win32/mshtml/htmlevent.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/htmlevent.h?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/htmlevent.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/htmlevent.h [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -42,14 +42,14 @@
 eventid_t str_to_eid(LPCWSTR);
 void check_event_attr(HTMLDocumentNode*,nsIDOMElement*);
 void release_event_target(event_target_t*);
-void fire_event(HTMLDocumentNode*,eventid_t,nsIDOMNode*,nsIDOMEvent*);
-HRESULT set_event_handler(event_target_t**,HTMLDocumentNode*,eventid_t,VARIANT*);
+void fire_event(HTMLDocumentNode*,eventid_t,BOOL,nsIDOMNode*,nsIDOMEvent*);
+HRESULT set_event_handler(event_target_t**,nsIDOMNode*,HTMLDocumentNode*,eventid_t,VARIANT*);
 HRESULT get_event_handler(event_target_t**,eventid_t,VARIANT*);
-HRESULT attach_event(event_target_t**,HTMLDocument*,BSTR,IDispatch*,VARIANT_BOOL*);
+HRESULT attach_event(event_target_t**,nsIDOMNode*,HTMLDocument*,BSTR,IDispatch*,VARIANT_BOOL*);
 HRESULT detach_event(event_target_t*,HTMLDocument*,BSTR,IDispatch*);
 HRESULT dispatch_event(HTMLDOMNode*,const WCHAR*,VARIANT*,VARIANT_BOOL*);
 HRESULT call_event(HTMLDOMNode*,eventid_t);
-void update_cp_events(HTMLWindow*,cp_static_data_t*);
+void update_cp_events(HTMLWindow*,event_target_t**,cp_static_data_t*,nsIDOMNode*);
 
 static inline event_target_t **get_node_event_target(HTMLDOMNode *node)
 {
@@ -58,7 +58,7 @@
 
 static inline HRESULT set_node_event(HTMLDOMNode *node, eventid_t eid, VARIANT *var)
 {
-    return set_event_handler(get_node_event_target(node), node->doc, eid, var);
+    return set_event_handler(get_node_event_target(node), node->nsnode, node->doc, eid, var);
 }
 
 static inline HRESULT get_node_event(HTMLDOMNode *node, eventid_t eid, VARIANT *var)

Modified: trunk/reactos/dll/win32/mshtml/htmlimg.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/htmlimg.c?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/htmlimg.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/htmlimg.c [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -28,6 +28,7 @@
 #include "wine/debug.h"
 
 #include "mshtml_private.h"
+#include "htmlevent.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
@@ -388,15 +389,19 @@
 static HRESULT WINAPI HTMLImgElement_put_onload(IHTMLImgElement *iface, VARIANT v)
 {
     HTMLImgElement *This = HTMLIMG_THIS(iface);
-    FIXME("(%p)->()\n", This);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
+
+    return set_node_event(&This->element.node, EVENTID_LOAD, &v);
 }
 
 static HRESULT WINAPI HTMLImgElement_get_onload(IHTMLImgElement *iface, VARIANT *p)
 {
     HTMLImgElement *This = HTMLIMG_THIS(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    return get_node_event(&This->element.node, EVENTID_LOAD, p);
 }
 
 static HRESULT WINAPI HTMLImgElement_put_onerror(IHTMLImgElement *iface, VARIANT v)

Modified: trunk/reactos/dll/win32/mshtml/htmlwindow.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/htmlwindow.c?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/htmlwindow.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/htmlwindow.c [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -126,7 +126,7 @@
         return E_FAIL;
     }
 
-    return set_event_handler(&window->doc->body_event_target, window->doc, eid, var);
+    return set_event_handler(&window->doc->body_event_target, NULL, window->doc, eid, var);
 }
 
 static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
@@ -1419,7 +1419,7 @@
         return E_FAIL;
     }
 
-    return attach_event(&This->doc->body_event_target, &This->doc->basedoc, event, pDisp, pfResult);
+    return attach_event(&This->doc->body_event_target, NULL, &This->doc->basedoc, event, pDisp, pfResult);
 }
 
 static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp)

Modified: trunk/reactos/dll/win32/mshtml/mshtml_private.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/mshtml_private.h?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/mshtml_private.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/mshtml_private.h [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -736,7 +736,7 @@
 
 void init_nsevents(HTMLDocumentNode*);
 void release_nsevents(HTMLDocumentNode*);
-void add_nsevent_listener(HTMLDocumentNode*,LPCWSTR);
+void add_nsevent_listener(HTMLDocumentNode*,nsIDOMNode*,LPCWSTR);
 
 void set_window_bscallback(HTMLWindow*,nsChannelBSC*);
 void set_current_mon(HTMLWindow*,IMoniker*);

Modified: trunk/reactos/dll/win32/mshtml/mutation.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/mutation.c?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/mutation.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/mutation.c [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -337,6 +337,9 @@
     docobj_task_t *task;
 
     TRACE("\n");
+
+    if(!This->basedoc.doc_obj)
+        return;
 
     if(This != This->basedoc.doc_obj->basedoc.doc_node) {
         set_ready_state(This->basedoc.window, READYSTATE_INTERACTIVE);

Modified: trunk/reactos/dll/win32/mshtml/navigate.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/navigate.c?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/navigate.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/navigate.c [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -972,8 +972,11 @@
 
             on_start_nsrequest(This);
 
-            if(This->window)
+            if(This->window) {
                 update_window_doc(This->window);
+                if(This->window->readystate != READYSTATE_LOADING)
+                    set_ready_state(This->window, READYSTATE_LOADING);
+            }
         }
 
         This->bsc.readed += This->nsstream->buf_size;

Modified: trunk/reactos/dll/win32/mshtml/nsevents.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/nsevents.c?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/nsevents.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/nsevents.c [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -216,7 +216,7 @@
 
     TRACE("(%p)\n", doc);
 
-    if(!doc)
+    if(!doc || !doc->basedoc.window)
         return NS_ERROR_FAILURE;
     doc_obj = doc->basedoc.doc_obj;
 
@@ -254,7 +254,7 @@
 
     nsIDOMHTMLDocument_GetBody(doc->nsdoc, &nsbody);
     if(nsbody) {
-        fire_event(doc, EVENTID_LOAD, (nsIDOMNode*)nsbody, event);
+        fire_event(doc, EVENTID_LOAD, TRUE, (nsIDOMNode*)nsbody, event);
         nsIDOMHTMLElement_Release(nsbody);
     }
 
@@ -271,6 +271,8 @@
     eventid_t eid;
     nsresult nsres;
 
+    TRACE("\n");
+
     nsAString_Init(&type_str, NULL);
     nsIDOMEvent_GetType(event, &type_str);
     nsAString_GetData(&type_str, &type);
@@ -290,7 +292,7 @@
         return NS_OK;
     }
 
-    fire_event(doc, eid, nsnode, event);
+    fire_event(doc, eid, TRUE, nsnode, event);
 
     nsIDOMNode_Release(nsnode);
 
@@ -334,12 +336,15 @@
     This->This = listener;
 }
 
-void add_nsevent_listener(HTMLDocumentNode *doc, LPCWSTR type)
+void add_nsevent_listener(HTMLDocumentNode *doc, nsIDOMNode *nsnode, LPCWSTR type)
 {
     nsIDOMEventTarget *target;
     nsresult nsres;
 
-    nsres = nsIDOMWindow_QueryInterface(doc->basedoc.window->nswindow, &IID_nsIDOMEventTarget, (void**)&target);
+    if(nsnode)
+        nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMEventTarget, (void**)&target);
+    else
+        nsres = nsIDOMWindow_QueryInterface(doc->basedoc.window->nswindow, &IID_nsIDOMEventTarget, (void**)&target);
     if(NS_FAILED(nsres)) {
         ERR("Could not get nsIDOMEventTarget interface: %08x\n", nsres);
         return;

Modified: trunk/reactos/dll/win32/mshtml/nsio.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/nsio.c?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/nsio.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/nsio.c [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -904,7 +904,7 @@
 
             open = FALSE;
         }else {
-            open = before_async_open(This, window->doc_obj->nscontainer);
+            open = !before_async_open(This, window->doc_obj->nscontainer);
             if(!open) {
                 TRACE("canceled\n");
                 nsres = NS_ERROR_UNEXPECTED;

Modified: trunk/reactos/dll/win32/mshtml/omnavigator.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/omnavigator.c?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/omnavigator.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/omnavigator.c [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -160,19 +160,28 @@
 {
     OmNavigator *This = OMNAVIGATOR_THIS(iface);
 
-    /* FIXME: Should we return something smarter? */
-    static const WCHAR app_verW[] =
-        {'4','.','0',' ','(','c','o','m','p','a','t','i','b','l','e',';',
-         ' ','M','S','I','E',' ','7','.','0',';',
-         ' ','W','i','n','d','o','w','s',' ','N','T',' ','5','.','1',';',
-         ' ','M','o','z','i','l','l','a','/','4','.','0',')',0};
-
-    TRACE("(%p)->(%p)\n", This, p);
-
-    *p = SysAllocString(app_verW);
+    char user_agent[512];
+    DWORD size;
+    HRESULT hres;
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    size = sizeof(user_agent);
+    hres = ObtainUserAgentString(0, user_agent, &size);
+    if(FAILED(hres))
+        return hres;
+
+    if(strncmp(user_agent, "Mozilla/", 8)) {
+        FIXME("Unsupported user agent\n");
+        return E_FAIL;
+    }
+
+    size = MultiByteToWideChar(CP_ACP, 0, user_agent+8, -1, NULL, 0);
+    *p = SysAllocStringLen(NULL, size-1);
     if(!*p)
         return E_OUTOFMEMORY;
 
+    MultiByteToWideChar(CP_ACP, 0, user_agent+8, -1, *p, size);
     return S_OK;
 }
 

Modified: trunk/reactos/dll/win32/mshtml/persist.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mshtml/persist.c?rev=46303&r1=46302&r2=46303&view=diff
==============================================================================
--- trunk/reactos/dll/win32/mshtml/persist.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mshtml/persist.c [iso-8859-1] Sun Mar 21 16:12:30 2010
@@ -108,6 +108,7 @@
         V_I4(&progress) = 0; /* FIXME */
         IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER,
                                &progress, NULL);
+        IOleCommandTarget_Release(olecmd);
     }
 
     if(doc->usermode == EDITMODE && doc->hostui) {
@@ -282,11 +283,15 @@
 void set_ready_state(HTMLWindow *window, READYSTATE readystate)
 {
     window->readystate = readystate;
+
     if(window->doc_obj && window->doc_obj->basedoc.window == window)
         call_property_onchanged(&window->doc_obj->basedoc.cp_propnotif, DISPID_READYSTATE);
+
+    fire_event(window->doc, EVENTID_READYSTATECHANGE, FALSE, window->doc->node.nsnode, NULL);
+
     if(window->frame_element)
         fire_event(window->frame_element->element.node.doc, EVENTID_READYSTATECHANGE,
-                   window->frame_element->element.node.nsnode, NULL);
+                   TRUE, window->frame_element->element.node.nsnode, NULL);
 }
 
 static HRESULT get_doc_string(HTMLDocumentNode *This, char **str)




More information about the Ros-diffs mailing list