Bug 1453016 - user safer enum serialization for gfx::SurfaceFormat in IPC; r?bas
MozReview-Commit-ID: Fhyg8e5lyW6
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -7987,17 +7987,17 @@ nsContentUtils::DataTransferItemToImage(
if (!size.width || !size.height) {
return NS_ERROR_FAILURE;
}
Shmem data = aItem.data().get_Shmem();
RefPtr<DataSourceSurface> image =
CreateDataSourceSurfaceFromData(size,
- static_cast<SurfaceFormat>(imageDetails.format()),
+ imageDetails.format(),
data.get<uint8_t>(),
imageDetails.stride());
RefPtr<gfxDrawable> drawable = new gfxSurfaceDrawable(image, size);
nsCOMPtr<imgIContainer> imageContainer =
image::ImageOps::CreateFromDrawable(drawable);
imageContainer.forget(aContainer);
@@ -8145,17 +8145,17 @@ nsContentUtils::TransferableToIPCTransfe
// Turn item->data() into an nsCString prior to accessing it.
item->data() = surfaceData.ref();
IPCDataTransferImage& imageDetails = item->imageDetails();
mozilla::gfx::IntSize size = dataSurface->GetSize();
imageDetails.width() = size.width;
imageDetails.height() = size.height;
imageDetails.stride() = stride;
- imageDetails.format() = static_cast<uint8_t>(dataSurface->GetFormat());
+ imageDetails.format() = dataSurface->GetFormat();
continue;
}
// Otherwise, handle this as a file.
nsCOMPtr<BlobImpl> blobImpl;
nsCOMPtr<nsIFile> file = do_QueryInterface(data);
if (file) {
--- a/dom/ipc/DOMTypes.ipdlh
+++ b/dom/ipc/DOMTypes.ipdlh
@@ -23,16 +23,18 @@ using DesktopToLayoutDeviceScale from "U
using CSSToLayoutDeviceScale from "Units.h";
using CSSRect from "Units.h";
using CSSSize from "Units.h";
using mozilla::LayoutDeviceIntPoint from "Units.h";
using mozilla::dom::ScreenOrientationInternal from "mozilla/dom/ScreenOrientation.h";
using struct mozilla::layers::TextureFactoryIdentifier from "mozilla/layers/CompositorTypes.h";
using mozilla::layers::CompositorOptions from "mozilla/layers/CompositorOptions.h";
using mozilla::layers::LayersId from "mozilla/layers/LayersTypes.h";
+using mozilla::gfx::SurfaceFormat from "mozilla/gfx/Types.h";
+
namespace mozilla {
namespace dom {
struct MessagePortIdentifier
{
nsID uuid;
nsID destinationUuid;
@@ -61,17 +63,17 @@ union IPCDataTransferData
IPCBlob; // files
};
struct IPCDataTransferImage
{
uint32_t width;
uint32_t height;
uint32_t stride;
- uint8_t format;
+ SurfaceFormat format;
};
struct IPCDataTransferItem
{
nsCString flavor;
// The image details are only used when transferring images.
IPCDataTransferImage imageDetails;
IPCDataTransferData data;
--- a/dom/ipc/PBrowser.ipdl
+++ b/dom/ipc/PBrowser.ipdl
@@ -28,16 +28,17 @@ include URIParams;
include PPrintingTypes;
include PTabContext;
include "mozilla/GfxMessageUtils.h";
include "mozilla/layers/LayersMessageUtils.h";
using class IPC::Principal from "mozilla/dom/PermissionMessageUtils.h";
using mozilla::gfx::Matrix from "mozilla/gfx/Matrix.h";
+using mozilla::gfx::SurfaceFormat from "mozilla/gfx/Types.h";
using mozilla::LayoutDeviceIntPoint from "Units.h";
using mozilla::LayoutDevicePoint from "Units.h";
using mozilla::ScreenIntPoint from "Units.h";
using ScreenIntSize from "Units.h";
using struct mozilla::layers::FrameMetrics from "FrameMetrics.h";
using struct mozilla::layers::ScrollableLayerGuid from "FrameMetrics.h";
using struct mozilla::layers::ZoomConstraints from "FrameMetrics.h";
using mozilla::layers::LayersId from "mozilla/layers/LayersTypes.h";
@@ -385,17 +386,17 @@ parent:
* Horizontal hotspot of the image, as specified by the css cursor property.
* @param hotspotY
* Vertical hotspot of the image, as specified by the css cursor property.
* @param force
* Invalidate any locally cached cursor settings and force an
* update.
*/
async SetCustomCursor(nsCString cursorData, uint32_t width, uint32_t height,
- uint32_t stride, uint8_t format,
+ uint32_t stride, SurfaceFormat format,
uint32_t hotspotX, uint32_t hotspotY, bool force);
/**
* Used to set the current text of the status tooltip.
* Nowadays this is mainly used for link locations on hover.
*/
async SetStatus(uint32_t type, nsString status);
@@ -559,17 +560,17 @@ parent:
async SetDimensions(uint32_t aFlags, int32_t aX, int32_t aY, int32_t aCx, int32_t aCy);
nested(inside_sync) sync DispatchWheelEvent(WidgetWheelEvent event);
nested(inside_sync) sync DispatchMouseEvent(WidgetMouseEvent event);
nested(inside_sync) sync DispatchKeyboardEvent(WidgetKeyboardEvent event);
async InvokeDragSession(IPCDataTransfer[] transfers, uint32_t action,
OptionalShmem visualData,
- uint32_t stride, uint8_t format,
+ uint32_t stride, SurfaceFormat format,
LayoutDeviceIntRect dragRect,
nsCString principalURISpec);
// After a compositor reset, it is necessary to reconnect each layers ID to
// the compositor of the widget that will render those layers. Note that
// this is sync so we can ensure that messages to the window compositor
// arrive before the TabChild attempts to use its cross-process compositor
// bridge.
--- a/dom/ipc/TabParent.cpp
+++ b/dom/ipc/TabParent.cpp
@@ -1738,17 +1738,17 @@ TabParent::RecvSetCursor(const nsCursor&
return IPC_OK();
}
mozilla::ipc::IPCResult
TabParent::RecvSetCustomCursor(const nsCString& aCursorData,
const uint32_t& aWidth,
const uint32_t& aHeight,
const uint32_t& aStride,
- const uint8_t& aFormat,
+ const gfx::SurfaceFormat& aFormat,
const uint32_t& aHotspotX,
const uint32_t& aHotspotY,
const bool& aForce)
{
mCursor = eCursorInvalid;
nsCOMPtr<nsIWidget> widget = GetWidget();
if (widget) {
@@ -1756,17 +1756,17 @@ TabParent::RecvSetCustomCursor(const nsC
widget->ClearCachedCursor();
}
if (mTabSetsCursor) {
const gfx::IntSize size(aWidth, aHeight);
RefPtr<gfx::DataSourceSurface> customCursor =
gfx::CreateDataSourceSurfaceFromData(size,
- static_cast<gfx::SurfaceFormat>(aFormat),
+ aFormat,
reinterpret_cast<const uint8_t*>(aCursorData.BeginReading()),
aStride);
RefPtr<gfxDrawable> drawable = new gfxSurfaceDrawable(customCursor, size);
nsCOMPtr<imgIContainer> cursorImage(image::ImageOps::CreateFromDrawable(drawable));
widget->SetCursor(cursorImage, aHotspotX, aHotspotY);
mCustomCursor = cursorImage;
mCustomCursorHotspotX = aHotspotX;
@@ -3291,17 +3291,17 @@ TabParent::RecvAsyncAuthPrompt(const nsC
}
return IPC_OK();
}
mozilla::ipc::IPCResult
TabParent::RecvInvokeDragSession(nsTArray<IPCDataTransfer>&& aTransfers,
const uint32_t& aAction,
const OptionalShmem& aVisualDnDData,
- const uint32_t& aStride, const uint8_t& aFormat,
+ const uint32_t& aStride, const gfx::SurfaceFormat& aFormat,
const LayoutDeviceIntRect& aDragRect,
const nsCString& aPrincipalURISpec)
{
mInitialDataTransferItems.Clear();
nsIPresShell* shell = mFrameElement->OwnerDoc()->GetShell();
if (!shell) {
if (Manager()->IsContentParent()) {
Unused << Manager()->AsContentParent()->SendEndDragSession(true, true,
@@ -3328,17 +3328,17 @@ TabParent::RecvInvokeDragSession(nsTArra
if (aVisualDnDData.type() == OptionalShmem::Tvoid_t ||
!aVisualDnDData.get_Shmem().IsReadable() ||
aVisualDnDData.get_Shmem().Size<char>() < aDragRect.height * aStride) {
mDnDVisualization = nullptr;
} else {
mDnDVisualization =
gfx::CreateDataSourceSurfaceFromData(gfx::IntSize(aDragRect.width, aDragRect.height),
- static_cast<gfx::SurfaceFormat>(aFormat),
+ aFormat,
aVisualDnDData.get_Shmem().get<uint8_t>(),
aStride);
}
mDragValid = true;
mDragRect = aDragRect;
mDragPrincipalURISpec = aPrincipalURISpec;
--- a/dom/ipc/TabParent.h
+++ b/dom/ipc/TabParent.h
@@ -274,17 +274,17 @@ public:
virtual mozilla::ipc::IPCResult RecvSetCursor(const nsCursor& aValue,
const bool& aForce) override;
virtual mozilla::ipc::IPCResult RecvSetCustomCursor(const nsCString& aUri,
const uint32_t& aWidth,
const uint32_t& aHeight,
const uint32_t& aStride,
- const uint8_t& aFormat,
+ const gfx::SurfaceFormat& aFormat,
const uint32_t& aHotspotX,
const uint32_t& aHotspotY,
const bool& aForce) override;
virtual mozilla::ipc::IPCResult RecvSetStatus(const uint32_t& aType,
const nsString& aStatus) override;
virtual mozilla::ipc::IPCResult RecvIsParentWindowMainWidgetVisible(bool* aIsVisible) override;
@@ -565,17 +565,17 @@ public:
const bool& aRunInGlobalScope);
void LayerTreeUpdate(uint64_t aEpoch, bool aActive);
virtual mozilla::ipc::IPCResult
RecvInvokeDragSession(nsTArray<IPCDataTransfer>&& aTransfers,
const uint32_t& aAction,
const OptionalShmem& aVisualDnDData,
- const uint32_t& aStride, const uint8_t& aFormat,
+ const uint32_t& aStride, const gfx::SurfaceFormat& aFormat,
const LayoutDeviceIntRect& aDragRect,
const nsCString& aPrincipalURISpec) override;
void AddInitialDnDDataTo(DataTransfer* aDataTransfer,
nsACString& aPrincipalURISpec);
bool TakeDragVisualization(RefPtr<mozilla::gfx::SourceSurface>& aSurface,
LayoutDeviceIntRect* aDragRect);
--- a/widget/PuppetWidget.cpp
+++ b/widget/PuppetWidget.cpp
@@ -1029,17 +1029,17 @@ PuppetWidget::SetCursor(imgIContainer* a
size_t length;
int32_t stride;
mozilla::UniquePtr<char[]> surfaceData =
nsContentUtils::GetSurfaceData(WrapNotNull(dataSurface), &length, &stride);
nsDependentCString cursorData(surfaceData.get(), length);
mozilla::gfx::IntSize size = dataSurface->GetSize();
if (!mTabChild->SendSetCustomCursor(cursorData, size.width, size.height, stride,
- static_cast<uint8_t>(dataSurface->GetFormat()),
+ dataSurface->GetFormat(),
aHotspotX, aHotspotY, mUpdateCursor)) {
return NS_ERROR_FAILURE;
}
mCursor = eCursorInvalid;
mCustomCursor = aCursor;
mCursorHotspotX = aHotspotX;
mCursorHotspotY = aHotspotY;
--- a/widget/nsDragServiceProxy.cpp
+++ b/widget/nsDragServiceProxy.cpp
@@ -90,22 +90,22 @@ nsDragServiceProxy::InvokeDragSessionImp
// Save the surface data to shared memory.
if (!surfaceData.IsReadable() || !surfaceData.get<char>()) {
NS_WARNING("Failed to create shared memory for drag session.");
return NS_ERROR_FAILURE;
}
mozilla::Unused <<
child->SendInvokeDragSession(dataTransfers, aActionType, surfaceData,
- stride, static_cast<uint8_t>(dataSurface->GetFormat()),
+ stride, dataSurface->GetFormat(),
dragRect, principalURISpec);
StartDragSession();
return NS_OK;
}
}
}
mozilla::Unused << child->SendInvokeDragSession(dataTransfers, aActionType,
- mozilla::void_t(), 0, 0, dragRect,
+ mozilla::void_t(), 0, static_cast<gfx::SurfaceFormat>(0), dragRect,
principalURISpec);
StartDragSession();
return NS_OK;
}