Bug 1340039 - Set contentPolicyType when copying image, and pass it between processes. r?smaug
MozReview-Commit-ID: CJj1a1Lj699
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -7980,16 +7980,17 @@ nsContentUtils::SetKeyboardIndicatorsOnR
CallOnAllRemoteChildren(aWindow, SetKeyboardIndicatorsChild,
(void *)&stateInfo);
}
nsresult
nsContentUtils::IPCTransferableToTransferable(const IPCDataTransfer& aDataTransfer,
const bool& aIsPrivateData,
nsIPrincipal* aRequestingPrincipal,
+ const nsContentPolicyType& aContentPolicyType,
nsITransferable* aTransferable,
mozilla::dom::nsIContentParent* aContentParent,
mozilla::dom::TabChild* aTabChild)
{
nsresult rv;
const nsTArray<IPCDataTransferItem>& items = aDataTransfer.items();
for (const auto& item : items) {
@@ -8045,16 +8046,17 @@ nsContentUtils::IPCTransferableToTransfe
} else if (aTabChild) {
Unused << aTabChild->DeallocShmem(item.data().get_Shmem());
}
}
}
aTransferable->SetIsPrivateData(aIsPrivateData);
aTransferable->SetRequestingPrincipal(aRequestingPrincipal);
+ aTransferable->SetContentPolicyType(aContentPolicyType);
return NS_OK;
}
void
nsContentUtils::TransferablesToIPCTransferables(nsIArray* aTransferables,
nsTArray<IPCDataTransfer>& aIPC,
bool aInSyncMessage,
mozilla::dom::nsIContentChild* aChild,
--- a/dom/base/nsContentUtils.h
+++ b/dom/base/nsContentUtils.h
@@ -2833,16 +2833,17 @@ public:
* Given a flavor obtained from an IPCDataTransferItem or nsITransferable,
* returns true if we should treat the data as an image.
*/
static bool IsFlavorImage(const nsACString& aFlavor);
static nsresult IPCTransferableToTransferable(const mozilla::dom::IPCDataTransfer& aDataTransfer,
const bool& aIsPrivateData,
nsIPrincipal* aRequestingPrincipal,
+ const nsContentPolicyType& aContentPolicyType,
nsITransferable* aTransferable,
mozilla::dom::nsIContentParent* aContentParent,
mozilla::dom::TabChild* aTabChild);
static void TransferablesToIPCTransferables(nsIArray* aTransferables,
nsTArray<mozilla::dom::IPCDataTransfer>& aIPC,
bool aInSyncMessage,
mozilla::dom::nsIContentChild* aChild,
--- a/dom/base/nsCopySupport.cpp
+++ b/dom/base/nsCopySupport.cpp
@@ -675,16 +675,17 @@ static nsresult AppendImagePromise(nsITr
rv = AppendString(aTransferable, imageSourceString, kFilePromiseURLMime);
NS_ENSURE_SUCCESS(rv, rv);
rv = AppendString(aTransferable, imageDestFileName, kFilePromiseDestFilename);
NS_ENSURE_SUCCESS(rv, rv);
aTransferable->SetRequestingPrincipal(node->NodePrincipal());
+ aTransferable->SetContentPolicyType(nsIContentPolicy::TYPE_INTERNAL_IMAGE);
// add the dataless file promise flavor
return aTransferable->AddDataFlavor(kFilePromiseMime);
}
#endif // XP_WIN
nsIContent*
nsCopySupport::GetSelectionForCopy(nsIDocument* aDocument, nsISelection** aSelection)
--- a/dom/events/EventStateManager.cpp
+++ b/dom/events/EventStateManager.cpp
@@ -5464,18 +5464,21 @@ EventStateManager::DoContentCommandEvent
nsContentUtils::TransferableToIPCTransferable(transferable,
&ipcDataTransfer,
false, nullptr,
cp);
bool isPrivateData = false;
transferable->GetIsPrivateData(&isPrivateData);
nsCOMPtr<nsIPrincipal> requestingPrincipal;
transferable->GetRequestingPrincipal(getter_AddRefs(requestingPrincipal));
+ nsContentPolicyType contentPolicyType = nsIContentPolicy::TYPE_OTHER;
+ transferable->GetContentPolicyType(&contentPolicyType);
remote->SendPasteTransferable(ipcDataTransfer, isPrivateData,
- IPC::Principal(requestingPrincipal));
+ IPC::Principal(requestingPrincipal),
+ contentPolicyType);
rv = NS_OK;
} else {
nsCOMPtr<nsICommandController> commandController = do_QueryInterface(controller);
NS_ENSURE_STATE(commandController);
nsCOMPtr<nsICommandParams> params = do_CreateInstance("@mozilla.org/embedcomp/command-params;1", &rv);
NS_ENSURE_SUCCESS(rv, rv);
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -2597,30 +2597,32 @@ ContentParent::RecvReadFontList(Infallib
#endif
return IPC_OK();
}
mozilla::ipc::IPCResult
ContentParent::RecvSetClipboard(const IPCDataTransfer& aDataTransfer,
const bool& aIsPrivateData,
const IPC::Principal& aRequestingPrincipal,
+ const uint32_t& aContentPolicyType,
const int32_t& aWhichClipboard)
{
nsresult rv;
nsCOMPtr<nsIClipboard> clipboard(do_GetService(kCClipboardCID, &rv));
NS_ENSURE_SUCCESS(rv, IPC_OK());
nsCOMPtr<nsITransferable> trans =
do_CreateInstance("@mozilla.org/widget/transferable;1", &rv);
NS_ENSURE_SUCCESS(rv, IPC_OK());
trans->Init(nullptr);
rv = nsContentUtils::IPCTransferableToTransferable(aDataTransfer,
aIsPrivateData,
aRequestingPrincipal,
+ aContentPolicyType,
trans, this, nullptr);
NS_ENSURE_SUCCESS(rv, IPC_OK());
clipboard->SetData(trans, nullptr, aWhichClipboard);
return IPC_OK();
}
mozilla::ipc::IPCResult
--- a/dom/ipc/ContentParent.h
+++ b/dom/ipc/ContentParent.h
@@ -971,16 +971,17 @@ private:
virtual mozilla::ipc::IPCResult RecvGetGfxVars(InfallibleTArray<GfxVarUpdate>* aVars) override;
virtual mozilla::ipc::IPCResult RecvReadFontList(InfallibleTArray<FontListEntry>* retValue) override;
virtual mozilla::ipc::IPCResult RecvSetClipboard(const IPCDataTransfer& aDataTransfer,
const bool& aIsPrivateData,
const IPC::Principal& aRequestingPrincipal,
+ const uint32_t& aContentPolicyType,
const int32_t& aWhichClipboard) override;
virtual mozilla::ipc::IPCResult RecvGetClipboard(nsTArray<nsCString>&& aTypes,
const int32_t& aWhichClipboard,
IPCDataTransfer* aDataTransfer) override;
virtual mozilla::ipc::IPCResult RecvEmptyClipboard(const int32_t& aWhichClipboard) override;
--- a/dom/ipc/PBrowser.ipdl
+++ b/dom/ipc/PBrowser.ipdl
@@ -715,17 +715,18 @@ child:
async NormalPrioritySelectionEvent(WidgetSelectionEvent event);
/**
* Call PasteTransferable via a controller on the content process
* to handle the command content event, "pasteTransferable".
*/
async PasteTransferable(IPCDataTransfer aDataTransfer,
bool aIsPrivateData,
- Principal aRequestingPrincipal);
+ Principal aRequestingPrincipal,
+ uint32_t aContentPolicyType);
/**
* Activate event forwarding from client to parent.
*/
async ActivateFrameEvent(nsString aType, bool capture);
async LoadRemoteScript(nsString aURL, bool aRunInGlobalScope);
--- a/dom/ipc/PContent.ipdl
+++ b/dom/ipc/PContent.ipdl
@@ -833,16 +833,17 @@ parent:
uint32_t lineNumber, uint32_t colNumber, uint32_t flags,
nsCString category, bool privateWindow,
ClonedMessageData stack);
// Places the items within dataTransfer on the clipboard.
async SetClipboard(IPCDataTransfer aDataTransfer,
bool aIsPrivateData,
Principal aRequestingPrincipal,
+ uint32_t aContentPolicyType,
int32_t aWhichClipboard);
// Given a list of supported types, returns the clipboard data for the
// first type that matches.
sync GetClipboard(nsCString[] aTypes, int32_t aWhichClipboard)
returns (IPCDataTransfer dataTransfer);
// Clears the clipboard.
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -2159,27 +2159,29 @@ mozilla::ipc::IPCResult
TabChild::RecvNormalPrioritySelectionEvent(const WidgetSelectionEvent& aEvent)
{
return RecvSelectionEvent(aEvent);
}
mozilla::ipc::IPCResult
TabChild::RecvPasteTransferable(const IPCDataTransfer& aDataTransfer,
const bool& aIsPrivateData,
- const IPC::Principal& aRequestingPrincipal)
+ const IPC::Principal& aRequestingPrincipal,
+ const uint32_t& aContentPolicyType)
{
nsresult rv;
nsCOMPtr<nsITransferable> trans =
do_CreateInstance("@mozilla.org/widget/transferable;1", &rv);
NS_ENSURE_SUCCESS(rv, IPC_OK());
trans->Init(nullptr);
rv = nsContentUtils::IPCTransferableToTransferable(aDataTransfer,
aIsPrivateData,
aRequestingPrincipal,
+ aContentPolicyType,
trans, nullptr, this);
NS_ENSURE_SUCCESS(rv, IPC_OK());
nsCOMPtr<nsIDocShell> ourDocShell = do_GetInterface(WebNavigation());
if (NS_WARN_IF(!ourDocShell)) {
return IPC_OK();
}
--- a/dom/ipc/TabChild.h
+++ b/dom/ipc/TabChild.h
@@ -449,17 +449,18 @@ public:
virtual mozilla::ipc::IPCResult
RecvNormalPrioritySelectionEvent(
const mozilla::WidgetSelectionEvent& aEvent) override;
virtual mozilla::ipc::IPCResult
RecvPasteTransferable(const IPCDataTransfer& aDataTransfer,
const bool& aIsPrivateData,
- const IPC::Principal& aRequestingPrincipal) override;
+ const IPC::Principal& aRequestingPrincipal,
+ const uint32_t& aContentPolicyType) override;
virtual mozilla::ipc::IPCResult
RecvActivateFrameEvent(const nsString& aType, const bool& aCapture) override;
virtual mozilla::ipc::IPCResult RecvLoadRemoteScript(const nsString& aURL,
const bool& aRunInGlobalScope) override;
virtual mozilla::ipc::IPCResult RecvAsyncMessage(const nsString& aMessage,
--- a/dom/ipc/TabParent.cpp
+++ b/dom/ipc/TabParent.cpp
@@ -2307,21 +2307,23 @@ TabParent::SendSelectionEvent(WidgetSele
MOZ_ASSERT(aEvent.HasBeenPostedToRemoteProcess());
aEvent.mSucceeded = true;
return true;
}
bool
TabParent::SendPasteTransferable(const IPCDataTransfer& aDataTransfer,
const bool& aIsPrivateData,
- const IPC::Principal& aRequestingPrincipal)
+ const IPC::Principal& aRequestingPrincipal,
+ const uint32_t& aContentPolicyType)
{
return PBrowserParent::SendPasteTransferable(aDataTransfer,
aIsPrivateData,
- aRequestingPrincipal);
+ aRequestingPrincipal,
+ aContentPolicyType);
}
/*static*/ TabParent*
TabParent::GetFrom(nsFrameLoader* aFrameLoader)
{
if (!aFrameLoader) {
return nullptr;
}
--- a/dom/ipc/TabParent.h
+++ b/dom/ipc/TabParent.h
@@ -492,17 +492,18 @@ public:
NS_DECL_NSIAUTHPROMPTPROVIDER
NS_DECL_NSISECUREBROWSERUI
NS_DECL_NSIWEBBROWSERPERSISTABLE
bool HandleQueryContentEvent(mozilla::WidgetQueryContentEvent& aEvent);
bool SendPasteTransferable(const IPCDataTransfer& aDataTransfer,
const bool& aIsPrivateData,
- const IPC::Principal& aRequestingPrincipal);
+ const IPC::Principal& aRequestingPrincipal,
+ const uint32_t& aContentPolicyType);
static TabParent* GetFrom(nsFrameLoader* aFrameLoader);
static TabParent* GetFrom(nsIFrameLoader* aFrameLoader);
static TabParent* GetFrom(nsITabParent* aTabParent);
static TabParent* GetFrom(PBrowserParent* aTabParent);
--- a/widget/nsClipboardProxy.cpp
+++ b/widget/nsClipboardProxy.cpp
@@ -32,18 +32,21 @@ nsClipboardProxy::SetData(nsITransferabl
IPCDataTransfer ipcDataTransfer;
nsContentUtils::TransferableToIPCTransferable(aTransferable, &ipcDataTransfer,
false, child, nullptr);
bool isPrivateData = false;
aTransferable->GetIsPrivateData(&isPrivateData);
nsCOMPtr<nsIPrincipal> requestingPrincipal;
aTransferable->GetRequestingPrincipal(getter_AddRefs(requestingPrincipal));
+ nsContentPolicyType contentPolicyType = nsIContentPolicy::TYPE_OTHER;
+ aTransferable->GetContentPolicyType(&contentPolicyType);
child->SendSetClipboard(ipcDataTransfer, isPrivateData,
- IPC::Principal(requestingPrincipal), aWhichClipboard);
+ IPC::Principal(requestingPrincipal),
+ contentPolicyType, aWhichClipboard);
return NS_OK;
}
NS_IMETHODIMP
nsClipboardProxy::GetData(nsITransferable *aTransferable, int32_t aWhichClipboard)
{
nsTArray<nsCString> types;