# HG changeset patch
# User Ehsan Akhgari <ehsan@mozilla.com>
# Date 1259813319 18000
# Node ID f145c7bfeb44c884d3a0d4666017ec6cf4c9377d
# Parent  c76bdccb63c9c95c8314e69230dcb13c47e0cfc5
Bug 518412 - clipboard data added in Private Browsing Mode causes Windows Explorer to crash when accessing menus which include Paste after closing firefox; r=roc a=blocking-firefox3.6+

diff --git a/widget/src/xpwidgets/nsClipboardPrivacyHandler.cpp b/widget/src/xpwidgets/nsClipboardPrivacyHandler.cpp
--- a/widget/src/xpwidgets/nsClipboardPrivacyHandler.cpp
+++ b/widget/src/xpwidgets/nsClipboardPrivacyHandler.cpp
@@ -42,16 +42,20 @@
 #include "nsIObserverService.h"
 #include "nsIClipboard.h"
 #include "nsComponentManagerUtils.h"
 #include "nsServiceManagerUtils.h"
 #include "nsLiteralString.h"
 #include "nsNetCID.h"
 #include "nsXPCOM.h"
 
+#if defined(XP_WIN) && !defined(WINCE)
+#include <ole2.h>
+#endif
+
 #define NS_MOZ_DATA_FROM_PRIVATEBROWSING "application/x-moz-private-browsing"
 
 NS_IMPL_ISUPPORTS2(nsClipboardPrivacyHandler, nsIObserver, nsISupportsWeakReference)
 
 nsresult
 nsClipboardPrivacyHandler::Init()
 {
   nsresult rv;
@@ -100,23 +104,32 @@ nsClipboardPrivacyHandler::Observe(nsISu
 
     const char * flavors[] = { NS_MOZ_DATA_FROM_PRIVATEBROWSING };
     PRBool haveFlavors;
     rv = clipboard->HasDataMatchingFlavors(flavors,
                                            NS_ARRAY_LENGTH(flavors),
                                            nsIClipboard::kGlobalClipboard,
                                            &haveFlavors);
     if (NS_SUCCEEDED(rv) && haveFlavors) {
+#if defined(XP_WIN) && !defined(WINCE)
+      // Workaround for bug 518412.  On Windows 7 x64, there is a bug
+      // in handling clipboard data without any formats between
+      // 32-bit/64-bit boundaries, which could lead Explorer to crash.
+      // We work around the problem by clearing the clipboard using
+      // the usual Win32 API.
+      NS_ENSURE_TRUE(SUCCEEDED(::OleSetClipboard(NULL)), NS_ERROR_FAILURE);
+#else
       // Empty the native clipboard by copying an empty transferable
       nsCOMPtr<nsITransferable> nullData =
         do_CreateInstance("@mozilla.org/widget/transferable;1", &rv);
       NS_ENSURE_SUCCESS(rv, rv);
       rv = clipboard->SetData(nullData, nsnull,
                               nsIClipboard::kGlobalClipboard);
       NS_ENSURE_SUCCESS(rv, rv);
+#endif
     }
   }
 
   return NS_OK;
 }
 
 PRBool
 nsClipboardPrivacyHandler::InPrivateBrowsing()
