Jacek Caban : mshtml: Added support for IDM_PASTE command in browser mode.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Dec 10 15:34:08 CST 2014


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Dec 10 19:02:31 2014 +0100

mshtml: Added support for IDM_PASTE command in browser mode.

---

 dlls/mshtml/nsiface.idl | 23 +++++++++++++++++++++++
 dlls/mshtml/olecmd.c    | 39 +++++++++++++++++++++++++++++++++++++--
 2 files changed, 60 insertions(+), 2 deletions(-)

diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl
index 3bb5020..1d8e263 100644
--- a/dlls/mshtml/nsiface.idl
+++ b/dlls/mshtml/nsiface.idl
@@ -3548,6 +3548,29 @@ interface nsIHTMLEditor : nsISupports
 
 [
     object,
+    uuid(b8100c90-73be-11d2-92a5-00105a1b0d64),
+    local
+]
+interface nsIClipboardCommands : nsISupports
+{
+    nsresult CanCutSelection(bool *_retval);
+    nsresult CanCopySelection(bool *_retval);
+    nsresult CanCopyLinkLocation(bool *_retval);
+    nsresult CanCopyImageLocation(bool *_retval);
+    nsresult CanCopyImageContents(bool *_retval);
+    nsresult CanPaste(bool *_retval);
+    nsresult CutSelection();
+    nsresult CopySelection();
+    nsresult CopyLinkLocation();
+    nsresult CopyImageLocation();
+    nsresult CopyImageContents();
+    nsresult Paste();
+    nsresult SelectAll();
+    nsresult SelectNone();
+}
+
+[
+    object,
     uuid(edb99640-8378-4106-8673-e701a086eb1c),
     local
 ]
diff --git a/dlls/mshtml/olecmd.c b/dlls/mshtml/olecmd.c
index eea3aa2..a49949d 100644
--- a/dlls/mshtml/olecmd.c
+++ b/dlls/mshtml/olecmd.c
@@ -62,6 +62,28 @@ void do_ns_command(HTMLDocument *This, const char *cmd, nsICommandParams *nspara
     nsICommandManager_Release(cmdmgr);
 }
 
+static nsIClipboardCommands *get_clipboard_commands(HTMLDocument *doc)
+{
+    nsIClipboardCommands *clipboard_commands;
+    nsIDocShell *doc_shell;
+    nsresult nsres;
+
+    nsres = get_nsinterface((nsISupports*)doc->window->nswindow, &IID_nsIDocShell, (void**)&doc_shell);
+    if(NS_FAILED(nsres)) {
+        ERR("Could not get nsIDocShell interface\n");
+        return NULL;
+    }
+
+    nsres = nsIDocShell_QueryInterface(doc_shell, &IID_nsIClipboardCommands, (void**)&clipboard_commands);
+    nsIDocShell_Release(doc_shell);
+    if(NS_FAILED(nsres)) {
+        ERR("Could not get nsIClipboardCommands interface\n");
+        return NULL;
+    }
+
+    return clipboard_commands;
+}
+
 /**********************************************************
  * IOleCommandTarget implementation
  */
@@ -569,13 +591,26 @@ static HRESULT query_mshtml_paste(HTMLDocument *This, OLECMD *cmd)
 
 static HRESULT exec_mshtml_paste(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out)
 {
+    nsIClipboardCommands *clipboard_commands;
+    nsresult nsres;
+
     TRACE("(%p)->(%08x %p %p)\n", This, cmdexecopt, in, out);
 
     if(This->doc_obj->usermode == EDITMODE)
         return editor_exec_paste(This, cmdexecopt, in, out);
 
-    FIXME("Unimplemented in browse mode\n");
-    return E_NOTIMPL;
+    clipboard_commands = get_clipboard_commands(This);
+    if(!clipboard_commands)
+        return E_UNEXPECTED;
+
+    nsres = nsIClipboardCommands_Paste(clipboard_commands);
+    nsIClipboardCommands_Release(clipboard_commands);
+    if(NS_FAILED(nsres)) {
+        ERR("Paste failed: %08x\n", nsres);
+        return E_FAIL;
+    }
+
+    return S_OK;
 }
 
 static HRESULT exec_browsemode(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out)




More information about the wine-cvs mailing list