mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 815952 - Stop clearing clipboard data originating from a private window after closing private windows. r=ehsan
This reverts bug 462106.
This commit is contained in:
parent
124259226c
commit
15ce305024
@ -137,14 +137,6 @@ nsClipboard::SetData(nsITransferable *aTransferable,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult rv;
|
|
||||||
if (!mPrivacyHandler) {
|
|
||||||
rv = NS_NewClipboardPrivacyHandler(getter_AddRefs(mPrivacyHandler));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
}
|
|
||||||
rv = mPrivacyHandler->PrepareDataForClipboard(aTransferable);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
// Clear out the clipboard in order to set the new data
|
// Clear out the clipboard in order to set the new data
|
||||||
EmptyClipboard(aWhichClipboard);
|
EmptyClipboard(aWhichClipboard);
|
||||||
|
|
||||||
@ -154,7 +146,8 @@ nsClipboard::SetData(nsITransferable *aTransferable,
|
|||||||
// Get the types of supported flavors
|
// Get the types of supported flavors
|
||||||
nsCOMPtr<nsISupportsArray> flavors;
|
nsCOMPtr<nsISupportsArray> flavors;
|
||||||
|
|
||||||
rv = aTransferable->FlavorsTransferableCanExport(getter_AddRefs(flavors));
|
nsresult rv =
|
||||||
|
aTransferable->FlavorsTransferableCanExport(getter_AddRefs(flavors));
|
||||||
if (!flavors || NS_FAILED(rv))
|
if (!flavors || NS_FAILED(rv))
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
@ -9,8 +9,7 @@
|
|||||||
#define __nsClipboard_h_
|
#define __nsClipboard_h_
|
||||||
|
|
||||||
#include "nsIClipboard.h"
|
#include "nsIClipboard.h"
|
||||||
#include "nsClipboardPrivacyHandler.h"
|
#include "nsIObserver.h"
|
||||||
#include "nsAutoPtr.h"
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
class nsClipboard : public nsIClipboard,
|
class nsClipboard : public nsIClipboard,
|
||||||
@ -53,7 +52,6 @@ private:
|
|||||||
nsCOMPtr<nsIClipboardOwner> mGlobalOwner;
|
nsCOMPtr<nsIClipboardOwner> mGlobalOwner;
|
||||||
nsCOMPtr<nsITransferable> mSelectionTransferable;
|
nsCOMPtr<nsITransferable> mSelectionTransferable;
|
||||||
nsCOMPtr<nsITransferable> mGlobalTransferable;
|
nsCOMPtr<nsITransferable> mGlobalTransferable;
|
||||||
nsRefPtr<nsClipboardPrivacyHandler> mPrivacyHandler;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -468,14 +468,6 @@ nsClipboard::SetData(nsITransferable *aTransferable,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult rv;
|
|
||||||
if (!mPrivacyHandler) {
|
|
||||||
rv = NS_NewClipboardPrivacyHandler(getter_AddRefs(mPrivacyHandler));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
}
|
|
||||||
rv = mPrivacyHandler->PrepareDataForClipboard(aTransferable);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
EmptyClipboard(aWhichClipboard);
|
EmptyClipboard(aWhichClipboard);
|
||||||
|
|
||||||
QClipboard::Mode mode;
|
QClipboard::Mode mode;
|
||||||
|
@ -8,8 +8,6 @@
|
|||||||
#include "nsIClipboard.h"
|
#include "nsIClipboard.h"
|
||||||
#include "nsITransferable.h"
|
#include "nsITransferable.h"
|
||||||
#include "nsIClipboardOwner.h"
|
#include "nsIClipboardOwner.h"
|
||||||
#include "nsClipboardPrivacyHandler.h"
|
|
||||||
#include "nsAutoPtr.h"
|
|
||||||
#include "nsCOMPtr.h"
|
#include "nsCOMPtr.h"
|
||||||
|
|
||||||
#include <qclipboard.h>
|
#include <qclipboard.h>
|
||||||
|
@ -8,7 +8,6 @@ support-files = window_bug429954.xul
|
|||||||
[test_bug478536.xul]
|
[test_bug478536.xul]
|
||||||
skip-if = true # Bug 561929
|
skip-if = true # Bug 561929
|
||||||
support-files = window_bug478536.xul
|
support-files = window_bug478536.xul
|
||||||
[test_bug462106_perwindow.xul]
|
|
||||||
[test_bug517396.xul]
|
[test_bug517396.xul]
|
||||||
[test_bug538242.xul]
|
[test_bug538242.xul]
|
||||||
support-files = window_bug538242.xul
|
support-files = window_bug538242.xul
|
||||||
|
@ -1,136 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
|
|
||||||
<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
|
|
||||||
<!--
|
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=462106
|
|
||||||
-->
|
|
||||||
<window title="Mozilla Bug 462106"
|
|
||||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
|
||||||
onload="initAndRunTests()">
|
|
||||||
<script type="application/javascript"
|
|
||||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
|
||||||
|
|
||||||
<!-- test results are displayed in the html:body -->
|
|
||||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<p id="display"></p>
|
|
||||||
<div id="content" style="display: none"></div>
|
|
||||||
<pre id="test"></pre>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
<!-- test code goes here -->
|
|
||||||
<script class="testbody" type="application/javascript">
|
|
||||||
<![CDATA[
|
|
||||||
|
|
||||||
/** Test for Bug 462106 **/
|
|
||||||
|
|
||||||
const Cc = Components.classes;
|
|
||||||
const Ci = Components.interfaces;
|
|
||||||
const Cu = Components.utils;
|
|
||||||
Cu.import("resource://gre/modules/Services.jsm");
|
|
||||||
|
|
||||||
function copy(str, doc) {
|
|
||||||
if (!doc) {
|
|
||||||
doc = document;
|
|
||||||
}
|
|
||||||
Cc["@mozilla.org/widget/clipboardhelper;1"].
|
|
||||||
getService(Ci.nsIClipboardHelper).
|
|
||||||
copyString(str, doc);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getLoadContext() {
|
|
||||||
return window.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
||||||
.getInterface(Ci.nsIWebNavigation)
|
|
||||||
.QueryInterface(Ci.nsILoadContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
function paste() {
|
|
||||||
let trans = Cc["@mozilla.org/widget/transferable;1"].
|
|
||||||
createInstance(Ci.nsITransferable);
|
|
||||||
trans.init(getLoadContext());
|
|
||||||
trans.addDataFlavor("text/unicode");
|
|
||||||
let clip = Cc["@mozilla.org/widget/clipboard;1"].
|
|
||||||
getService(Ci.nsIClipboard);
|
|
||||||
clip.getData(trans, Ci.nsIClipboard.kGlobalClipboard);
|
|
||||||
let str = {}, length = {};
|
|
||||||
try {
|
|
||||||
trans.getTransferData("text/unicode", str, length);
|
|
||||||
} catch (e) {
|
|
||||||
str = null;
|
|
||||||
}
|
|
||||||
if (str) {
|
|
||||||
str = str.value.QueryInterface(Ci.nsISupportsString);
|
|
||||||
if (str)
|
|
||||||
str = str.data.substring(0, length.value / 2);
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
function whenDelayedStartupFinished(aWindow, aCallback) {
|
|
||||||
Services.obs.addObserver(function observer(aSubject, aTopic) {
|
|
||||||
if (aWindow == aSubject) {
|
|
||||||
Services.obs.removeObserver(observer, aTopic);
|
|
||||||
setTimeout(aCallback, 0);
|
|
||||||
}
|
|
||||||
}, "browser-delayed-startup-finished", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testOnWindow(options, callback) {
|
|
||||||
var mainWindow = window.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
||||||
.getInterface(Ci.nsIWebNavigation)
|
|
||||||
.QueryInterface(Ci.nsIDocShellTreeItem)
|
|
||||||
.rootTreeItem
|
|
||||||
.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
||||||
.getInterface(Ci.nsIDOMWindow);
|
|
||||||
|
|
||||||
let win = mainWindow.OpenBrowserWindow(options);
|
|
||||||
whenDelayedStartupFinished(win, function() {
|
|
||||||
callback(win);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
function initAndRunTests() {
|
|
||||||
SimpleTest.waitForExplicitFinish();
|
|
||||||
|
|
||||||
const data = "random number: " + Math.random();
|
|
||||||
copy(data);
|
|
||||||
is(data, paste(), "Data successfully copied before entering the private browsing mode");
|
|
||||||
testOnWindow({private: true}, function (aPrivateWindow) {
|
|
||||||
aPrivateWindow.close();
|
|
||||||
|
|
||||||
// the data should still be on the clipboard because it was copied before
|
|
||||||
// entering the private browsing mode
|
|
||||||
is(data, paste(), "Copied data persisted after leaving the private browsing mode");
|
|
||||||
|
|
||||||
const data2 = "another random number: " + Math.random();
|
|
||||||
|
|
||||||
testOnWindow({private: true}, function (aPrivateWindow) {
|
|
||||||
copy(data2, aPrivateWindow.document); // copy the data inside the private browsing mode
|
|
||||||
|
|
||||||
function insidePBPaste() {
|
|
||||||
if (data2 != paste()) {
|
|
||||||
setTimeout(insidePBPaste, 100);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// the data should be on the clipboard inside the private browsing mode
|
|
||||||
is(data2, paste(), "Data successfully copied inside the private browsing mode");
|
|
||||||
aPrivateWindow.close();
|
|
||||||
|
|
||||||
function afterClose() {
|
|
||||||
if (data2 == paste()) {
|
|
||||||
setTimeout(afterClose, 100);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// the data should no longer be on the clipboard at this stage
|
|
||||||
isnot(data2, paste(), "Data no longer available after leaving the private browsing mode");
|
|
||||||
SimpleTest.finish();
|
|
||||||
}
|
|
||||||
afterClose();
|
|
||||||
}
|
|
||||||
insidePBPaste();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
]]>
|
|
||||||
</script>
|
|
||||||
</window>
|
|
@ -7,6 +7,7 @@
|
|||||||
#define nsClipboard_h__
|
#define nsClipboard_h__
|
||||||
|
|
||||||
#include "nsBaseClipboard.h"
|
#include "nsBaseClipboard.h"
|
||||||
|
#include "nsIObserver.h"
|
||||||
#include "nsIURI.h"
|
#include "nsIURI.h"
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
|
@ -22,7 +22,6 @@ UNIFIED_SOURCES += [
|
|||||||
'nsBaseDragService.cpp',
|
'nsBaseDragService.cpp',
|
||||||
'nsBaseScreen.cpp',
|
'nsBaseScreen.cpp',
|
||||||
'nsClipboardHelper.cpp',
|
'nsClipboardHelper.cpp',
|
||||||
'nsClipboardPrivacyHandler.cpp',
|
|
||||||
'nsClipboardProxy.cpp',
|
'nsClipboardProxy.cpp',
|
||||||
'nsColorPickerProxy.cpp',
|
'nsColorPickerProxy.cpp',
|
||||||
'nsContentProcessWidgetFactory.cpp',
|
'nsContentProcessWidgetFactory.cpp',
|
||||||
|
@ -59,12 +59,6 @@ NS_IMETHODIMP nsBaseClipboard::SetData(nsITransferable * aTransferable, nsIClipb
|
|||||||
|
|
||||||
if ( mTransferable ) {
|
if ( mTransferable ) {
|
||||||
NS_ADDREF(mTransferable);
|
NS_ADDREF(mTransferable);
|
||||||
if (!mPrivacyHandler) {
|
|
||||||
rv = NS_NewClipboardPrivacyHandler(getter_AddRefs(mPrivacyHandler));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
}
|
|
||||||
rv = mPrivacyHandler->PrepareDataForClipboard(mTransferable);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
rv = SetNativeClipboardData(aWhichClipboard);
|
rv = SetNativeClipboardData(aWhichClipboard);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,8 +8,6 @@
|
|||||||
|
|
||||||
#include "nsIClipboard.h"
|
#include "nsIClipboard.h"
|
||||||
#include "nsITransferable.h"
|
#include "nsITransferable.h"
|
||||||
#include "nsClipboardPrivacyHandler.h"
|
|
||||||
#include "nsAutoPtr.h"
|
|
||||||
|
|
||||||
class nsITransferable;
|
class nsITransferable;
|
||||||
class nsDataObj;
|
class nsDataObj;
|
||||||
@ -42,7 +40,6 @@ protected:
|
|||||||
bool mIgnoreEmptyNotification;
|
bool mIgnoreEmptyNotification;
|
||||||
nsIClipboardOwner * mClipboardOwner;
|
nsIClipboardOwner * mClipboardOwner;
|
||||||
nsITransferable * mTransferable;
|
nsITransferable * mTransferable;
|
||||||
nsRefPtr<nsClipboardPrivacyHandler> mPrivacyHandler;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,124 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include "mozilla/ArrayUtils.h"
|
|
||||||
|
|
||||||
#include "nsClipboardPrivacyHandler.h"
|
|
||||||
#include "nsITransferable.h"
|
|
||||||
#include "nsISupportsPrimitives.h"
|
|
||||||
#include "nsIObserverService.h"
|
|
||||||
#include "nsIClipboard.h"
|
|
||||||
#include "nsComponentManagerUtils.h"
|
|
||||||
#include "nsServiceManagerUtils.h"
|
|
||||||
#include "nsLiteralString.h"
|
|
||||||
#include "nsNetCID.h"
|
|
||||||
#include "nsXPCOM.h"
|
|
||||||
#include "mozilla/Services.h"
|
|
||||||
|
|
||||||
#if defined(XP_WIN)
|
|
||||||
#include <ole2.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using namespace mozilla;
|
|
||||||
|
|
||||||
#define NS_MOZ_DATA_FROM_PRIVATEBROWSING "application/x-moz-private-browsing"
|
|
||||||
|
|
||||||
NS_IMPL_ISUPPORTS(nsClipboardPrivacyHandler, nsIObserver, nsISupportsWeakReference)
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsClipboardPrivacyHandler::Init()
|
|
||||||
{
|
|
||||||
nsCOMPtr<nsIObserverService> observerService =
|
|
||||||
mozilla::services::GetObserverService();
|
|
||||||
if (!observerService)
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
return observerService->AddObserver(this, "last-pb-context-exited", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepare the transferable object to be inserted into the clipboard
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
nsresult
|
|
||||||
nsClipboardPrivacyHandler::PrepareDataForClipboard(nsITransferable * aTransferable)
|
|
||||||
{
|
|
||||||
NS_ASSERTION(aTransferable, "clipboard given a null transferable");
|
|
||||||
|
|
||||||
bool isPrivateData = false;
|
|
||||||
aTransferable->GetIsPrivateData(&isPrivateData);
|
|
||||||
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
if (isPrivateData) {
|
|
||||||
nsCOMPtr<nsISupportsPRBool> data = do_CreateInstance(NS_SUPPORTS_PRBOOL_CONTRACTID);
|
|
||||||
if (data) {
|
|
||||||
rv = data->SetData(true);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
// Ignore the error code of AddDataFlavor, since we might have added
|
|
||||||
// this flavor before. If this call really fails, so will the next
|
|
||||||
// one (SetTransferData).
|
|
||||||
aTransferable->AddDataFlavor(NS_MOZ_DATA_FROM_PRIVATEBROWSING);
|
|
||||||
|
|
||||||
rv = aTransferable->SetTransferData(NS_MOZ_DATA_FROM_PRIVATEBROWSING, data, sizeof(bool));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsClipboardPrivacyHandler::Observe(nsISupports *aSubject, char const *aTopic, char16_t const *aData)
|
|
||||||
{
|
|
||||||
nsresult rv;
|
|
||||||
nsCOMPtr<nsIClipboard> clipboard =
|
|
||||||
do_GetService("@mozilla.org/widget/clipboard;1", &rv);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
const char * flavors[] = { NS_MOZ_DATA_FROM_PRIVATEBROWSING };
|
|
||||||
bool haveFlavors;
|
|
||||||
rv = clipboard->HasDataMatchingFlavors(flavors,
|
|
||||||
ArrayLength(flavors),
|
|
||||||
nsIClipboard::kGlobalClipboard,
|
|
||||||
&haveFlavors);
|
|
||||||
if (NS_SUCCEEDED(rv) && haveFlavors) {
|
|
||||||
#if defined(XP_WIN)
|
|
||||||
// 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(nullptr)), 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);
|
|
||||||
nullData->Init(nullptr);
|
|
||||||
rv = clipboard->SetData(nullData, nullptr,
|
|
||||||
nsIClipboard::kGlobalClipboard);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
NS_NewClipboardPrivacyHandler(nsClipboardPrivacyHandler ** aHandler)
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(aHandler != nullptr, "null ptr");
|
|
||||||
if (!aHandler)
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
|
|
||||||
*aHandler = new nsClipboardPrivacyHandler();
|
|
||||||
|
|
||||||
NS_ADDREF(*aHandler);
|
|
||||||
nsresult rv = (*aHandler)->Init();
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
NS_RELEASE(*aHandler);
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#ifndef nsClipboardPrivacyHandler_h__
|
|
||||||
#define nsClipboardPrivacyHandler_h__
|
|
||||||
|
|
||||||
#include "nsIObserver.h"
|
|
||||||
#include "nsWeakReference.h"
|
|
||||||
#include "nsCOMPtr.h"
|
|
||||||
#include "mozilla/Attributes.h"
|
|
||||||
|
|
||||||
class nsITransferable;
|
|
||||||
|
|
||||||
// nsClipboardPrivacyHandler makes sure that clipboard data copied during
|
|
||||||
// the private browsing mode does not leak after exiting this mode.
|
|
||||||
// In order to ensure this, callers should store an object of this class
|
|
||||||
// for their lifetime, and call PrepareDataForClipboard in their
|
|
||||||
// nsIClipboard::SetData implementation before starting to use the
|
|
||||||
// nsITransferable object in any way.
|
|
||||||
|
|
||||||
class nsClipboardPrivacyHandler MOZ_FINAL : public nsIObserver,
|
|
||||||
public nsSupportsWeakReference
|
|
||||||
{
|
|
||||||
~nsClipboardPrivacyHandler() {}
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
// nsISupports
|
|
||||||
NS_DECL_ISUPPORTS
|
|
||||||
|
|
||||||
// nsIObserver
|
|
||||||
NS_DECL_NSIOBSERVER
|
|
||||||
|
|
||||||
nsresult Init();
|
|
||||||
nsresult PrepareDataForClipboard(nsITransferable * aTransferable);
|
|
||||||
};
|
|
||||||
|
|
||||||
nsresult NS_NewClipboardPrivacyHandler(nsClipboardPrivacyHandler ** aHandler);
|
|
||||||
|
|
||||||
#endif // nsClipboardPrivacyHandler_h__
|
|
Loading…
Reference in New Issue
Block a user