Jacek Caban : mshtml: Added exec_refresh implementation.

Alexandre Julliard julliard at winehq.org
Mon Nov 12 14:14:40 CST 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Nov 12 12:58:41 2012 +0100

mshtml: Added exec_refresh implementation.

---

 dlls/mshtml/binding.h        |    1 +
 dlls/mshtml/mshtml_private.h |    1 +
 dlls/mshtml/mutation.c       |    3 +-
 dlls/mshtml/navigate.c       |   20 +++++++------
 dlls/mshtml/nsevents.c       |    4 ++-
 dlls/mshtml/olecmd.c         |   64 ++++++++++++++++++++++++++++++++++++++++-
 dlls/mshtml/persist.c        |    3 +-
 7 files changed, 82 insertions(+), 14 deletions(-)

diff --git a/dlls/mshtml/binding.h b/dlls/mshtml/binding.h
index 7934c90..42560ea 100644
--- a/dlls/mshtml/binding.h
+++ b/dlls/mshtml/binding.h
@@ -101,6 +101,7 @@ typedef struct {
 #define BINDING_NAVIGATED    0x0001
 #define BINDING_REPLACE      0x0002
 #define BINDING_FROMHIST     0x0004
+#define BINDING_REFRESH      0x0008
 
 HRESULT set_http_header(struct list*,const WCHAR*,int,const WCHAR*,int) DECLSPEC_HIDDEN;
 HRESULT create_redirect_nschannel(const WCHAR*,nsChannel*,nsChannel**) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 3a02416..6c7662e 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -374,6 +374,7 @@ struct HTMLOuterWindow {
     IUri *uri;
     IUri *uri_nofrag;
     BSTR url;
+    DWORD load_flags;
 
     SCRIPTMODE scriptmode;
 
diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c
index fcae9ff..4b07c3f 100644
--- a/dlls/mshtml/mutation.c
+++ b/dlls/mshtml/mutation.c
@@ -32,6 +32,7 @@
 #include "mshtml_private.h"
 #include "htmlscript.h"
 #include "htmlevent.h"
+#include "binding.h"
 
 #include "wine/debug.h"
 
@@ -267,7 +268,7 @@ static void parse_complete(HTMLDocumentObj *doc)
     call_property_onchanged(&doc->basedoc.cp_propnotif, 1005);
     call_explorer_69(doc);
 
-    if(doc->is_webbrowser && doc->usermode != EDITMODE)
+    if(doc->is_webbrowser && doc->usermode != EDITMODE && !(doc->basedoc.window->load_flags & BINDING_REFRESH))
         IDocObjectService_FireNavigateComplete2(doc->doc_object_service, &doc->basedoc.window->base.IHTMLWindow2_iface, 0);
 
     /* FIXME: IE7 calls EnableModelless(TRUE), EnableModelless(FALSE) and sets interactive state here */
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 1c6b80c..346524d 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -2052,7 +2052,7 @@ HRESULT super_navigate(HTMLOuterWindow *window, IUri *uri, DWORD flags, const WC
     if(!uri_nofrag)
         return E_FAIL;
 
-    if(window->doc_obj->client) {
+    if(window->doc_obj->client && !(flags & BINDING_REFRESH)) {
         IOleCommandTarget *cmdtrg;
 
         hres = IOleClientSite_QueryInterface(window->doc_obj->client, &IID_IOleCommandTarget, (void**)&cmdtrg);
@@ -2075,7 +2075,7 @@ HRESULT super_navigate(HTMLOuterWindow *window, IUri *uri, DWORD flags, const WC
         }
     }
 
-    if(window->uri_nofrag && !post_data_size) {
+    if(!(flags & BINDING_REFRESH) && window->uri_nofrag && !post_data_size) {
         BOOL eq;
 
         hres = IUri_IsEqual(uri_nofrag, window->uri_nofrag, &eq);
@@ -2115,7 +2115,7 @@ HRESULT super_navigate(HTMLOuterWindow *window, IUri *uri, DWORD flags, const WC
 
         /* Silently and repeated when real loading starts? */
         window->readystate = READYSTATE_LOADING;
-        if(!(flags & BINDING_FROMHIST))
+        if(!(flags & (BINDING_FROMHIST|BINDING_REFRESH)))
             call_docview_84(window->doc_obj);
 
         task->window = window;
@@ -2266,13 +2266,15 @@ static HRESULT navigate_uri(HTMLOuterWindow *window, IUri *uri, const WCHAR *dis
     HRESULT hres;
 
     if(window->doc_obj && window->doc_obj->is_webbrowser && window == window->doc_obj->basedoc.window) {
-        BOOL cancel = FALSE;
+        if(!(flags & BINDING_REFRESH)) {
+            BOOL cancel = FALSE;
 
-        hres = IDocObjectService_FireBeforeNavigate2(window->doc_obj->doc_object_service, NULL, display_uri, 0x40,
-                NULL, NULL, 0, NULL, TRUE, &cancel);
-        if(SUCCEEDED(hres) && cancel) {
-            TRACE("Navigation canceled\n");
-            return S_OK;
+            hres = IDocObjectService_FireBeforeNavigate2(window->doc_obj->doc_object_service, NULL, display_uri, 0x40,
+                    NULL, NULL, 0, NULL, TRUE, &cancel);
+            if(SUCCEEDED(hres) && cancel) {
+                TRACE("Navigation canceled\n");
+                return S_OK;
+            }
         }
 
         return super_navigate(window, uri, flags, NULL, NULL, 0);
diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c
index 5f23e08..297ef8c 100644
--- a/dlls/mshtml/nsevents.c
+++ b/dlls/mshtml/nsevents.c
@@ -34,6 +34,7 @@
 #include "mshtml_private.h"
 #include "htmlscript.h"
 #include "htmlevent.h"
+#include "binding.h"
 #include "resource.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
@@ -258,7 +259,8 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event
         update_title(doc_obj);
     }
 
-    if(doc_obj && doc_obj->usermode!=EDITMODE && doc_obj->doc_object_service)
+    if(doc_obj && doc_obj->usermode!=EDITMODE && doc_obj->doc_object_service
+       && !(doc->basedoc.window->load_flags & BINDING_REFRESH))
         IDocObjectService_FireDocumentComplete(doc_obj->doc_object_service,
                 &doc->basedoc.window->base.IHTMLWindow2_iface, 0);
 
diff --git a/dlls/mshtml/olecmd.c b/dlls/mshtml/olecmd.c
index 8932843..bda06b5 100644
--- a/dlls/mshtml/olecmd.c
+++ b/dlls/mshtml/olecmd.c
@@ -32,6 +32,7 @@
 #include "wine/debug.h"
 
 #include "mshtml_private.h"
+#include "binding.h"
 #include "resource.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
@@ -384,10 +385,69 @@ static HRESULT exec_get_zoom_range(HTMLDocument *This, DWORD nCmdexecopt, VARIAN
     return E_NOTIMPL;
 }
 
+typedef struct {
+    task_t header;
+    HTMLOuterWindow *window;
+}refresh_task_t;
+
+static void refresh_proc(task_t *_task)
+{
+    refresh_task_t *task = (refresh_task_t*)_task;
+    HTMLOuterWindow *window = task->window;
+
+    TRACE("%p\n", window);
+
+    window->readystate = READYSTATE_UNINITIALIZED;
+
+    if(window->doc_obj && window->doc_obj->client_cmdtrg) {
+        VARIANT var;
+
+        V_VT(&var) = VT_I4;
+        V_I4(&var) = 0;
+        IOleCommandTarget_Exec(window->doc_obj->client_cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL);
+    }
+
+    load_uri(task->window, task->window->uri, BINDING_REFRESH);
+}
+
+static void refresh_destr(task_t *_task)
+{
+    refresh_task_t *task = (refresh_task_t*)_task;
+
+    IHTMLWindow2_Release(&task->window->base.IHTMLWindow2_iface);
+    heap_free(task);
+}
+
 static HRESULT exec_refresh(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
 {
-    FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
-    return E_NOTIMPL;
+    refresh_task_t *task;
+    HRESULT hres;
+
+    TRACE("(%p)->(%d %s %p)\n", This, nCmdexecopt, debugstr_variant(pvaIn), pvaOut);
+
+    if(This->doc_obj->client) {
+        IOleCommandTarget *olecmd;
+
+        hres = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget, (void**)&olecmd);
+        if(SUCCEEDED(hres)) {
+            hres = IOleCommandTarget_Exec(olecmd, &CGID_DocHostCommandHandler, 2300, nCmdexecopt, pvaIn, pvaOut);
+            IOleCommandTarget_Release(olecmd);
+            if(SUCCEEDED(hres))
+                return S_OK;
+        }
+    }
+
+    if(!This->window)
+        return E_UNEXPECTED;
+
+    task = heap_alloc(sizeof(*task));
+    if(!task)
+        return E_OUTOFMEMORY;
+
+    IHTMLWindow2_AddRef(&This->window->base.IHTMLWindow2_iface);
+    task->window = This->window;
+
+    return push_task(&task->header, refresh_proc, refresh_destr, This->window->task_magic);
 }
 
 static HRESULT exec_stop(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index 210fab0..430786f 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -130,12 +130,13 @@ void set_current_mon(HTMLOuterWindow *This, IMoniker *mon, DWORD flags)
     HRESULT hres;
 
     if(This->mon) {
-        if(This->doc_obj && !(flags & BINDING_REPLACE))
+        if(This->doc_obj && !(flags & (BINDING_REPLACE|BINDING_REFRESH)))
             notify_travellog_update(This->doc_obj);
         IMoniker_Release(This->mon);
         This->mon = NULL;
     }
 
+    This->load_flags = flags;
     if(!mon)
         return;
 




More information about the wine-cvs mailing list