Index: remoting/client/pepper/fake_browser.cc |
=================================================================== |
--- remoting/client/pepper/fake_browser.cc (revision 0) |
+++ remoting/client/pepper/fake_browser.cc (revision 0) |
@@ -0,0 +1,157 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <stdlib.h> |
+ |
+#include "remoting/client/pepper/fake_browser.h" |
+ |
+// Constant value for browser window. |
+static const int kWindowWidth = 100; |
+static const int kWindowHeight = 100; |
+ |
+// ---------------------------------------------------------------------------- |
+// Browser callback routines |
+// These are simple implementations of the routines that the browser provides |
+// to the plugin as callbacks. |
+// ---------------------------------------------------------------------------- |
+ |
+// Handler for getvalue. |
+// Must be of type NPN_GetValueProcPtr. |
+NPError Browser_GetValue(NPP instance, NPNVariable variable, void *ret_value) { |
+ if (variable == NPNVPepperExtensions) { |
+ NPNExtensions** ret = static_cast<NPNExtensions**>(ret_value); |
+ *ret = Singleton<FakeBrowser>()->GetExtensions(); |
+ return NPERR_NO_ERROR; |
+ } |
+ return NPERR_GENERIC_ERROR; |
+} |
+ |
+// Extension handler for acquireDevice. |
+// Must be of type NPAcquireDevicePtr. |
+NPDevice* Extension_AcquireDevice(NPP instance, NPDeviceID device) { |
+ if (device == NPPepper2DDevice) { |
+ return Singleton<FakeBrowser>()->GetDevice2d(); |
+ } |
+ // TODO(garykac): Add support for NPPepper3DDevice. |
+ return NULL; |
+} |
+ |
+// Initialize 2D device context. |
+NPError Device_InitializeContext2D(NPP instance, |
+ NPDeviceContext2D* context, |
+ int extra_bytes) { |
+ FakeBrowser* browser = Singleton<FakeBrowser>::get(); |
+ NPDeviceContext2D* context2d = static_cast<NPDeviceContext2D*>(context); |
+ int width, height; |
+ browser->GetWindowInfo(&width, &height); |
+ int stride = (width * ARGB_PIXEL_SIZE) + extra_bytes; |
+ context2d->region = browser->AllocPixelBuffer(stride); |
+ context2d->stride = stride; |
+ |
+ return NPERR_NO_ERROR; |
+} |
+ |
+// Device handler for initializeContext |
+// This initializes a 2D context where the stride == width. |
+// Must be of type NPDeviceInitializeContextPtr. |
+NPError Device_InitializeContext2D_NoExtraBytes(NPP instance, |
+ const NPDeviceConfig* config, |
+ NPDeviceContext* context) { |
+ return Device_InitializeContext2D(instance, |
+ static_cast<NPDeviceContext2D*>(context), |
+ 0); |
+} |
+ |
+// Device handler for initializeContext |
+// This initializes a 2D context where the stride > width. |
+// Must be of type NPDeviceInitializeContextPtr. |
+NPError Device_InitializeContext2D_ExtraBytes(NPP instance, |
+ const NPDeviceConfig* config, |
+ NPDeviceContext* context) { |
+ return Device_InitializeContext2D(instance, |
+ static_cast<NPDeviceContext2D*>(context), |
+ 8 /* extra_bytes */); |
+} |
+ |
+// Device handler for flushContext |
+// Must be of type NPDeviceFlushContextPtr. |
+NPError Device_FlushContext(NPP instance, NPDeviceContext* context, |
+ NPDeviceFlushContextCallbackPtr callback, |
+ void* userData) { |
+ return NPERR_NO_ERROR; |
+} |
+ |
+// ---------------------------------------------------------------------------- |
+// FakeBrowserFuncs |
+// Singleton class for creating/managing the NPNetscapeFuncs struct that we |
+// need to provide to the Pepper plugin. |
+// ---------------------------------------------------------------------------- |
+ |
+FakeBrowser::FakeBrowser() { |
+ // Setup fake versions of the browser funcs needed by the unit tests. |
+ // There are dozens of browser funcs that can be set up, but we only worry |
+ // about the ones needed for our unittests. |
+ browser_funcs_.reset(new NPNetscapeFuncs()); |
+ browser_funcs_->getvalue = &Browser_GetValue; |
+ |
+ // Setup fake extension funcs structure. |
+ extensions_.reset(new NPNExtensions()); |
+ extensions_->acquireDevice = &Extension_AcquireDevice; |
+ |
+ // Setup fake device funcs structure. |
+ device2d_.reset(new NPDevice()); |
+ device2d_->initializeContext = &Device_InitializeContext2D_NoExtraBytes; |
+ device2d_->flushContext = &Device_FlushContext; |
+ |
+ // Fake browser window. |
+ window_.reset(new NPWindow()); |
+ window_->x = 0; |
+ window_->y = 0; |
+ window_->width = kWindowWidth; |
+ window_->height = kWindowHeight; |
+ |
+ width_ = kWindowWidth; |
+ height_ = kWindowHeight; |
+ |
+ stride_ = 0; |
+ pixel_buffer_.reset(); |
+} |
+ |
+FakeBrowser::~FakeBrowser() { |
+ FreePixelBuffer(); |
+} |
+ |
+// Normally in our tests, the stride (ie, the number of bytes between the |
+// start of a row and the start of the next row) is equal to the number of |
+// bytes used to store the pixels for the row. |
+// Passing true to this routine sets things up so that there are a few extra |
+// padding bytes to the end of each row so that the stride is not the same |
+// as the row width. |
+void FakeBrowser::ForceStrideInDeviceContext(bool extra_bytes) { |
+ if (extra_bytes) { |
+ device2d_->initializeContext = &Device_InitializeContext2D_ExtraBytes; |
+ } else { |
+ device2d_->initializeContext = &Device_InitializeContext2D_NoExtraBytes; |
+ } |
+} |
+ |
+// Allocate a pixel buffer for the plugin to use. |
+// The height and width of the buffer come from the window size. |
+// The stride value is used to force each row to be |stride| bytes in size. |
+// This is typically done to add extra padding bytes to the end of each row. |
+uint32* FakeBrowser::AllocPixelBuffer(int stride) { |
+ // Don't allow the stride to be less than the window width. |
+ if (stride < width_) { |
+ stride = width_; |
+ } |
+ stride_ = stride; |
+ pixel_buffer_.reset(new uint32[height_ * stride]); |
+ |
+ return pixel_buffer_.get(); |
+} |
+ |
+void FakeBrowser::FreePixelBuffer() { |
+ stride_ = 0; |
+ pixel_buffer_.reset(); |
+} |
Property changes on: remoting/client/pepper/fake_browser.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |