Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2402)

Unified Diff: content/renderer/pepper/ppb_image_data_impl.cc

Issue 61813003: Allow PPB_ImageData_Impl to be created in a way that is compatible with unittests (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/pepper/ppb_image_data_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/pepper/ppb_image_data_impl.cc
diff --git a/content/renderer/pepper/ppb_image_data_impl.cc b/content/renderer/pepper/ppb_image_data_impl.cc
index 57cdc92bf28feac2a3b10bec6fd1160121868e38..80cc38dcd3dead824c9087574766442d7e1d8920 100644
--- a/content/renderer/pepper/ppb_image_data_impl.cc
+++ b/content/renderer/pepper/ppb_image_data_impl.cc
@@ -25,6 +25,19 @@ using ppapi::thunk::PPB_ImageData_API;
namespace content {
+namespace {
+// Returns true if the ImageData shared memory should be allocated in the
+// browser process for the current platform.
+bool IsBrowserAllocated() {
+#if defined(OS_POSIX) && !defined(TOOLKIT_GTK) && !defined(OS_ANDROID)
+ // On the Mac, shared memory has to be created in the browser in order to
+ // work in the sandbox.
+ return true;
+#endif
+ return false;
+}
+} // namespace
+
PPB_ImageData_Impl::PPB_ImageData_Impl(PP_Instance instance,
PPB_ImageData_Shared::ImageDataType type)
: Resource(ppapi::OBJECT_IS_IMPL, instance),
@@ -33,7 +46,7 @@ PPB_ImageData_Impl::PPB_ImageData_Impl(PP_Instance instance,
height_(0) {
switch (type) {
case PPB_ImageData_Shared::PLATFORM:
- backend_.reset(new ImageDataPlatformBackend);
+ backend_.reset(new ImageDataPlatformBackend(IsBrowserAllocated()));
return;
case PPB_ImageData_Shared::SIMPLE:
backend_.reset(new ImageDataSimpleBackend);
@@ -43,6 +56,15 @@ PPB_ImageData_Impl::PPB_ImageData_Impl(PP_Instance instance,
NOTREACHED();
}
+PPB_ImageData_Impl::PPB_ImageData_Impl(PP_Instance instance,
+ ForTest)
+ : Resource(ppapi::OBJECT_IS_IMPL, instance),
+ format_(PP_IMAGEDATAFORMAT_BGRA_PREMUL),
+ width_(0),
+ height_(0) {
+ backend_.reset(new ImageDataPlatformBackend(false));
+}
+
PPB_ImageData_Impl::~PPB_ImageData_Impl() {
}
@@ -127,19 +149,22 @@ const SkBitmap* PPB_ImageData_Impl::GetMappedBitmap() const {
// ImageDataPlatformBackend ----------------------------------------------------
-ImageDataPlatformBackend::ImageDataPlatformBackend()
+ImageDataPlatformBackend::ImageDataPlatformBackend(bool is_browser_allocated)
: width_(0),
- height_(0) {
+ height_(0),
+ is_browser_allocated_(is_browser_allocated) {
}
// On POSIX, we have to tell the browser to free the transport DIB.
ImageDataPlatformBackend::~ImageDataPlatformBackend() {
-#if defined(OS_POSIX) && !defined(TOOLKIT_GTK) && !defined(OS_ANDROID)
- if (dib_) {
- RenderThreadImpl::current()->Send(
- new ViewHostMsg_FreeTransportDIB(dib_->id()));
- }
+ if (is_browser_allocated_) {
+#if defined(OS_POSIX)
+ if (dib_) {
+ RenderThreadImpl::current()->Send(
+ new ViewHostMsg_FreeTransportDIB(dib_->id()));
+ }
#endif
+ }
}
bool ImageDataPlatformBackend::Init(PPB_ImageData_Impl* impl,
@@ -152,30 +177,32 @@ bool ImageDataPlatformBackend::Init(PPB_ImageData_Impl* impl,
uint32 buffer_size = width_ * height_ * 4;
// Allocate the transport DIB and the PlatformCanvas pointing to it.
-#if defined(OS_POSIX) && !defined(TOOLKIT_GTK) && !defined(OS_ANDROID)
- // On the Mac, shared memory has to be created in the browser in order to
- // work in the sandbox. Do this by sending a message to the browser
- // requesting a TransportDIB (see also
- // chrome/renderer/webplugin_delegate_proxy.cc, method
- // WebPluginDelegateProxy::CreateBitmap() for similar code). The TransportDIB
- // is cached in the browser, and is freed (in typical cases) by the
- // TransportDIB's destructor.
- TransportDIB::Handle dib_handle;
- IPC::Message* msg = new ViewHostMsg_AllocTransportDIB(buffer_size,
- true,
- &dib_handle);
- if (!RenderThreadImpl::current()->Send(msg))
- return false;
- if (!TransportDIB::is_valid_handle(dib_handle))
- return false;
-
- TransportDIB* dib = TransportDIB::CreateWithHandle(dib_handle);
-#else
- static int next_dib_id = 0;
- TransportDIB* dib = TransportDIB::Create(buffer_size, next_dib_id++);
- if (!dib)
- return false;
+ TransportDIB* dib = NULL;
+ if (is_browser_allocated_) {
+#if defined(OS_POSIX)
+ // Allocate the image data by sending a message to the browser requesting a
+ // TransportDIB (see also chrome/renderer/webplugin_delegate_proxy.cc,
+ // method WebPluginDelegateProxy::CreateBitmap() for similar code). The
+ // TransportDIB is cached in the browser, and is freed (in typical cases) by
+ // the TransportDIB's destructor.
+ TransportDIB::Handle dib_handle;
+ IPC::Message* msg = new ViewHostMsg_AllocTransportDIB(buffer_size,
+ true,
+ &dib_handle);
+ if (!RenderThreadImpl::current()->Send(msg))
+ return false;
+ if (!TransportDIB::is_valid_handle(dib_handle))
+ return false;
+
+ dib = TransportDIB::CreateWithHandle(dib_handle);
#endif
+ } else {
+ static int next_dib_id = 0;
+ dib = TransportDIB::Create(buffer_size, next_dib_id++);
+ if (!dib)
+ return false;
+ }
+ DCHECK(dib);
dib_.reset(dib);
return true;
}
« no previous file with comments | « content/renderer/pepper/ppb_image_data_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698