From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- widget/nsDragServiceProxy.cpp | 96 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 widget/nsDragServiceProxy.cpp (limited to 'widget/nsDragServiceProxy.cpp') diff --git a/widget/nsDragServiceProxy.cpp b/widget/nsDragServiceProxy.cpp new file mode 100644 index 0000000000..cb273a89fa --- /dev/null +++ b/widget/nsDragServiceProxy.cpp @@ -0,0 +1,96 @@ +/* -*- Mode: C++; tab-width: 4; 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 "nsDragServiceProxy.h" +#include "mozilla/dom/Document.h" +#include "mozilla/dom/BrowserChild.h" +#include "mozilla/gfx/2D.h" +#include "mozilla/net/CookieJarSettings.h" +#include "mozilla/UniquePtr.h" +#include "mozilla/Unused.h" +#include "nsContentUtils.h" + +using mozilla::CSSIntRegion; +using mozilla::LayoutDeviceIntRect; +using mozilla::Maybe; +using mozilla::Nothing; +using mozilla::Some; +using mozilla::dom::BrowserChild; +using mozilla::gfx::DataSourceSurface; +using mozilla::gfx::SourceSurface; +using mozilla::gfx::SurfaceFormat; +using mozilla::ipc::Shmem; + +nsDragServiceProxy::nsDragServiceProxy() = default; + +nsDragServiceProxy::~nsDragServiceProxy() = default; + +nsresult nsDragServiceProxy::InvokeDragSessionImpl( + nsIArray* aArrayTransferables, const Maybe& aRegion, + uint32_t aActionType) { + NS_ENSURE_STATE(mSourceDocument->GetDocShell()); + BrowserChild* child = BrowserChild::GetFrom(mSourceDocument->GetDocShell()); + NS_ENSURE_STATE(child); + nsTArray transferables; + nsContentUtils::TransferablesToIPCTransferableDatas( + aArrayTransferables, transferables, false, nullptr); + + nsCOMPtr principal; + if (mSourceNode) { + principal = mSourceNode->NodePrincipal(); + } + + nsCOMPtr csp; + if (mSourceDocument) { + csp = mSourceDocument->GetCsp(); + // XXX why do we need this here? Shouldn't they be set properly in + // nsBaseDragService already? + mSourceWindowContext = mSourceDocument->GetWindowContext(); + mSourceTopWindowContext = mSourceWindowContext + ? mSourceWindowContext->TopWindowContext() + : nullptr; + } + + nsCOMPtr cookieJarSettings; + cookieJarSettings = mSourceDocument->CookieJarSettings(); + mozilla::net::CookieJarSettingsArgs csArgs; + mozilla::net::CookieJarSettings::Cast(cookieJarSettings)->Serialize(csArgs); + + LayoutDeviceIntRect dragRect; + if (mHasImage || mSelection) { + nsPresContext* pc; + RefPtr surface; + DrawDrag(mSourceNode, aRegion, mScreenPosition, &dragRect, &surface, &pc); + + if (surface) { + RefPtr dataSurface = surface->GetDataSurface(); + if (dataSurface) { + size_t length; + int32_t stride; + auto surfaceData = + nsContentUtils::GetSurfaceData(*dataSurface, &length, &stride); + if (surfaceData.isNothing()) { + NS_WARNING("Failed to create shared memory for drag session."); + return NS_ERROR_FAILURE; + } + + mozilla::Unused << child->SendInvokeDragSession( + std::move(transferables), aActionType, std::move(surfaceData), + stride, dataSurface->GetFormat(), dragRect, principal, csp, csArgs, + mSourceWindowContext, mSourceTopWindowContext); + StartDragSession(); + return NS_OK; + } + } + } + + mozilla::Unused << child->SendInvokeDragSession( + std::move(transferables), aActionType, Nothing(), 0, + static_cast(0), dragRect, principal, csp, csArgs, + mSourceWindowContext, mSourceTopWindowContext); + StartDragSession(); + return NS_OK; +} -- cgit v1.2.3