dom/plugins/ipc/PluginMessageUtils.h

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     2  * vim: sw=4 ts=4 et :
     3  * This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 #ifndef DOM_PLUGINS_PLUGINMESSAGEUTILS_H
     8 #define DOM_PLUGINS_PLUGINMESSAGEUTILS_H
    10 #include "ipc/IPCMessageUtils.h"
    11 #include "base/message_loop.h"
    13 #include "mozilla/ipc/MessageChannel.h"
    14 #include "mozilla/ipc/CrossProcessMutex.h"
    15 #include "gfxipc/ShadowLayerUtils.h"
    17 #include "npapi.h"
    18 #include "npruntime.h"
    19 #include "npfunctions.h"
    20 #include "nsAutoPtr.h"
    21 #include "nsString.h"
    22 #include "nsTArray.h"
    23 #include "prlog.h"
    24 #include "nsHashKeys.h"
    25 #ifdef MOZ_CRASHREPORTER
    26 #  include "nsExceptionHandler.h"
    27 #endif
    28 #ifdef XP_MACOSX
    29 #include "PluginInterposeOSX.h"
    30 #else
    31 namespace mac_plugin_interposing { class NSCursorInfo { }; }
    32 #endif
    33 using mac_plugin_interposing::NSCursorInfo;
    35 namespace mozilla {
    36 namespace plugins {
    38 using layers::SurfaceDescriptorX11;
    40 enum ScriptableObjectType
    41 {
    42   LocalObject,
    43   Proxy
    44 };
    46 mozilla::ipc::RacyInterruptPolicy
    47 MediateRace(const mozilla::ipc::MessageChannel::Message& parent,
    48             const mozilla::ipc::MessageChannel::Message& child);
    50 std::string
    51 MungePluginDsoPath(const std::string& path);
    52 std::string
    53 UnmungePluginDsoPath(const std::string& munged);
    55 extern PRLogModuleInfo* GetPluginLog();
    57 const uint32_t kAllowAsyncDrawing = 0x1;
    59 inline bool IsDrawingModelAsync(int16_t aModel) {
    60   return aModel == NPDrawingModelAsyncBitmapSurface
    61 #ifdef XP_WIN
    62          || aModel == NPDrawingModelAsyncWindowsDXGISurface
    63 #endif
    64          ;
    65 }
    67 #if defined(_MSC_VER)
    68 #define FULLFUNCTION __FUNCSIG__
    69 #elif defined(__GNUC__)
    70 #define FULLFUNCTION __PRETTY_FUNCTION__
    71 #else
    72 #define FULLFUNCTION __FUNCTION__
    73 #endif
    75 #define PLUGIN_LOG_DEBUG(args) PR_LOG(GetPluginLog(), PR_LOG_DEBUG, args)
    76 #define PLUGIN_LOG_DEBUG_FUNCTION PR_LOG(GetPluginLog(), PR_LOG_DEBUG, ("%s", FULLFUNCTION))
    77 #define PLUGIN_LOG_DEBUG_METHOD PR_LOG(GetPluginLog(), PR_LOG_DEBUG, ("%s [%p]", FULLFUNCTION, (void*) this))
    79 /**
    80  * This is NPByteRange without the linked list.
    81  */
    82 struct IPCByteRange
    83 {
    84   int32_t offset;
    85   uint32_t length;
    86 };  
    88 typedef std::vector<IPCByteRange> IPCByteRanges;
    90 typedef nsCString Buffer;
    92 struct NPRemoteWindow
    93 {
    94   NPRemoteWindow();
    95   uint64_t window;
    96   int32_t x;
    97   int32_t y;
    98   uint32_t width;
    99   uint32_t height;
   100   NPRect clipRect;
   101   NPWindowType type;
   102 #if defined(MOZ_X11) && defined(XP_UNIX) && !defined(XP_MACOSX)
   103   VisualID visualID;
   104   Colormap colormap;
   105 #endif /* XP_UNIX */
   106 #if defined(XP_WIN)
   107   base::SharedMemoryHandle surfaceHandle;
   108 #endif
   109 #if defined(XP_MACOSX)
   110   double contentsScaleFactor;
   111 #endif
   112 };
   114 #ifdef XP_WIN
   115 typedef HWND NativeWindowHandle;
   116 #elif defined(MOZ_X11)
   117 typedef XID NativeWindowHandle;
   118 #elif defined(XP_MACOSX) || defined(ANDROID) || defined(MOZ_WIDGET_QT)
   119 typedef intptr_t NativeWindowHandle; // never actually used, will always be 0
   120 #else
   121 #error Need NativeWindowHandle for this platform
   122 #endif
   124 #ifdef XP_WIN
   125 typedef base::SharedMemoryHandle WindowsSharedMemoryHandle;
   126 typedef HANDLE DXGISharedSurfaceHandle;
   127 #else
   128 typedef mozilla::null_t WindowsSharedMemoryHandle;
   129 typedef mozilla::null_t DXGISharedSurfaceHandle;
   130 #endif
   132 // XXX maybe not the best place for these. better one?
   134 #define VARSTR(v_)  case v_: return #v_
   135 inline const char* const
   136 NPPVariableToString(NPPVariable aVar)
   137 {
   138     switch (aVar) {
   139         VARSTR(NPPVpluginNameString);
   140         VARSTR(NPPVpluginDescriptionString);
   141         VARSTR(NPPVpluginWindowBool);
   142         VARSTR(NPPVpluginTransparentBool);
   143         VARSTR(NPPVjavaClass);
   144         VARSTR(NPPVpluginWindowSize);
   145         VARSTR(NPPVpluginTimerInterval);
   147         VARSTR(NPPVpluginScriptableInstance);
   148         VARSTR(NPPVpluginScriptableIID);
   150         VARSTR(NPPVjavascriptPushCallerBool);
   152         VARSTR(NPPVpluginKeepLibraryInMemory);
   153         VARSTR(NPPVpluginNeedsXEmbed);
   155         VARSTR(NPPVpluginScriptableNPObject);
   157         VARSTR(NPPVformValue);
   159         VARSTR(NPPVpluginUrlRequestsDisplayedBool);
   161         VARSTR(NPPVpluginWantsAllNetworkStreams);
   163 #ifdef XP_MACOSX
   164         VARSTR(NPPVpluginDrawingModel);
   165         VARSTR(NPPVpluginEventModel);
   166 #endif
   168     default: return "???";
   169     }
   170 }
   172 inline const char*
   173 NPNVariableToString(NPNVariable aVar)
   174 {
   175     switch(aVar) {
   176         VARSTR(NPNVxDisplay);
   177         VARSTR(NPNVxtAppContext);
   178         VARSTR(NPNVnetscapeWindow);
   179         VARSTR(NPNVjavascriptEnabledBool);
   180         VARSTR(NPNVasdEnabledBool);
   181         VARSTR(NPNVisOfflineBool);
   183         VARSTR(NPNVserviceManager);
   184         VARSTR(NPNVDOMElement);
   185         VARSTR(NPNVDOMWindow);
   186         VARSTR(NPNVToolkit);
   187         VARSTR(NPNVSupportsXEmbedBool);
   189         VARSTR(NPNVWindowNPObject);
   191         VARSTR(NPNVPluginElementNPObject);
   193         VARSTR(NPNVSupportsWindowless);
   195         VARSTR(NPNVprivateModeBool);
   196         VARSTR(NPNVdocumentOrigin);
   198     default: return "???";
   199     }
   200 }
   201 #undef VARSTR
   203 inline bool IsPluginThread()
   204 {
   205   MessageLoop* loop = MessageLoop::current();
   206   if (!loop)
   207       return false;
   208   return (loop->type() == MessageLoop::TYPE_UI);
   209 }
   211 inline void AssertPluginThread()
   212 {
   213   NS_ASSERTION(IsPluginThread(), "Should be on the plugin's main thread!");
   214 }
   216 #define ENSURE_PLUGIN_THREAD(retval) \
   217   PR_BEGIN_MACRO \
   218     if (!IsPluginThread()) { \
   219       NS_WARNING("Not running on the plugin's main thread!"); \
   220       return (retval); \
   221     } \
   222   PR_END_MACRO
   224 #define ENSURE_PLUGIN_THREAD_VOID() \
   225   PR_BEGIN_MACRO \
   226     if (!IsPluginThread()) { \
   227       NS_WARNING("Not running on the plugin's main thread!"); \
   228       return; \
   229     } \
   230   PR_END_MACRO
   232 void DeferNPObjectLastRelease(const NPNetscapeFuncs* f, NPObject* o);
   233 void DeferNPVariantLastRelease(const NPNetscapeFuncs* f, NPVariant* v);
   235 // in NPAPI, char* == nullptr is sometimes meaningful.  the following is
   236 // helper code for dealing with nullable nsCString's
   237 inline nsCString
   238 NullableString(const char* aString)
   239 {
   240     if (!aString) {
   241         nsCString str;
   242         str.SetIsVoid(true);
   243         return str;
   244     }
   245     return nsCString(aString);
   246 }
   248 inline const char*
   249 NullableStringGet(const nsCString& str)
   250 {
   251   if (str.IsVoid())
   252     return nullptr;
   254   return str.get();
   255 }
   257 struct DeletingObjectEntry : public nsPtrHashKey<NPObject>
   258 {
   259   DeletingObjectEntry(const NPObject* key)
   260     : nsPtrHashKey<NPObject>(key)
   261     , mDeleted(false)
   262   { }
   264   bool mDeleted;
   265 };
   267 #ifdef XP_WIN
   268 // The private event used for double-pass widgetless plugin rendering.
   269 UINT DoublePassRenderingEvent();
   270 #endif
   272 } /* namespace plugins */
   274 } /* namespace mozilla */
   276 namespace IPC {
   278 template <>
   279 struct ParamTraits<NPRect>
   280 {
   281   typedef NPRect paramType;
   283   static void Write(Message* aMsg, const paramType& aParam)
   284   {
   285     WriteParam(aMsg, aParam.top);
   286     WriteParam(aMsg, aParam.left);
   287     WriteParam(aMsg, aParam.bottom);
   288     WriteParam(aMsg, aParam.right);
   289   }
   291   static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
   292   {
   293     uint16_t top, left, bottom, right;
   294     if (ReadParam(aMsg, aIter, &top) &&
   295         ReadParam(aMsg, aIter, &left) &&
   296         ReadParam(aMsg, aIter, &bottom) &&
   297         ReadParam(aMsg, aIter, &right)) {
   298       aResult->top = top;
   299       aResult->left = left;
   300       aResult->bottom = bottom;
   301       aResult->right = right;
   302       return true;
   303     }
   304     return false;
   305   }
   307   static void Log(const paramType& aParam, std::wstring* aLog)
   308   {
   309     aLog->append(StringPrintf(L"[%u, %u, %u, %u]", aParam.top, aParam.left,
   310                               aParam.bottom, aParam.right));
   311   }
   312 };
   314 template <>
   315 struct ParamTraits<NPWindowType>
   316 {
   317   typedef NPWindowType paramType;
   319   static void Write(Message* aMsg, const paramType& aParam)
   320   {
   321     aMsg->WriteInt16(int16_t(aParam));
   322   }
   324   static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
   325   {
   326     int16_t result;
   327     if (aMsg->ReadInt16(aIter, &result)) {
   328       *aResult = paramType(result);
   329       return true;
   330     }
   331     return false;
   332   }
   334   static void Log(const paramType& aParam, std::wstring* aLog)
   335   {
   336     aLog->append(StringPrintf(L"%d", int16_t(aParam)));
   337   }
   338 };
   340 template <>
   341 struct ParamTraits<NPImageFormat>
   342 {
   343   typedef NPImageFormat paramType;
   345   static void Write(Message* aMsg, const paramType& aParam)
   346   {
   347     aMsg->WriteInt16(int16_t(aParam));
   348   }
   350   static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
   351   {
   352     int16_t result;
   353     if (aMsg->ReadInt16(aIter, &result)) {
   354       *aResult = paramType(result);
   355       return true;
   356     }
   357     return false;
   358   }
   360   static void Log(const paramType& aParam, std::wstring* aLog)
   361   {
   362     aLog->append(StringPrintf(L"%d", int16_t(aParam)));
   363   }
   364 };
   366 template <>
   367 struct ParamTraits<mozilla::plugins::NPRemoteWindow>
   368 {
   369   typedef mozilla::plugins::NPRemoteWindow paramType;
   371   static void Write(Message* aMsg, const paramType& aParam)
   372   {
   373     aMsg->WriteUInt64(aParam.window);
   374     WriteParam(aMsg, aParam.x);
   375     WriteParam(aMsg, aParam.y);
   376     WriteParam(aMsg, aParam.width);
   377     WriteParam(aMsg, aParam.height);
   378     WriteParam(aMsg, aParam.clipRect);
   379     WriteParam(aMsg, aParam.type);
   380 #if defined(MOZ_X11) && defined(XP_UNIX) && !defined(XP_MACOSX)
   381     aMsg->WriteULong(aParam.visualID);
   382     aMsg->WriteULong(aParam.colormap);
   383 #endif
   384 #if defined(XP_WIN)
   385     WriteParam(aMsg, aParam.surfaceHandle);
   386 #endif
   387 #if defined(XP_MACOSX)
   388     aMsg->WriteDouble(aParam.contentsScaleFactor);
   389 #endif
   390   }
   392   static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
   393   {
   394     uint64_t window;
   395     int32_t x, y;
   396     uint32_t width, height;
   397     NPRect clipRect;
   398     NPWindowType type;
   399     if (!(aMsg->ReadUInt64(aIter, &window) &&
   400           ReadParam(aMsg, aIter, &x) &&
   401           ReadParam(aMsg, aIter, &y) &&
   402           ReadParam(aMsg, aIter, &width) &&
   403           ReadParam(aMsg, aIter, &height) &&
   404           ReadParam(aMsg, aIter, &clipRect) &&
   405           ReadParam(aMsg, aIter, &type)))
   406       return false;
   408 #if defined(MOZ_X11) && defined(XP_UNIX) && !defined(XP_MACOSX)
   409     unsigned long visualID;
   410     unsigned long colormap;
   411     if (!(aMsg->ReadULong(aIter, &visualID) &&
   412           aMsg->ReadULong(aIter, &colormap)))
   413       return false;
   414 #endif
   416 #if defined(XP_WIN)
   417     base::SharedMemoryHandle surfaceHandle;
   418     if (!ReadParam(aMsg, aIter, &surfaceHandle))
   419       return false;
   420 #endif
   422 #if defined(XP_MACOSX)
   423     double contentsScaleFactor;
   424     if (!aMsg->ReadDouble(aIter, &contentsScaleFactor))
   425       return false;
   426 #endif
   428     aResult->window = window;
   429     aResult->x = x;
   430     aResult->y = y;
   431     aResult->width = width;
   432     aResult->height = height;
   433     aResult->clipRect = clipRect;
   434     aResult->type = type;
   435 #if defined(MOZ_X11) && defined(XP_UNIX) && !defined(XP_MACOSX)
   436     aResult->visualID = visualID;
   437     aResult->colormap = colormap;
   438 #endif
   439 #if defined(XP_WIN)
   440     aResult->surfaceHandle = surfaceHandle;
   441 #endif
   442 #if defined(XP_MACOSX)
   443     aResult->contentsScaleFactor = contentsScaleFactor;
   444 #endif
   445     return true;
   446   }
   448   static void Log(const paramType& aParam, std::wstring* aLog)
   449   {
   450     aLog->append(StringPrintf(L"[%u, %d, %d, %u, %u, %d",
   451                               (unsigned long)aParam.window,
   452                               aParam.x, aParam.y, aParam.width,
   453                               aParam.height, (long)aParam.type));
   454   }
   455 };
   457 template <>
   458 struct ParamTraits<NPString>
   459 {
   460   typedef NPString paramType;
   462   static void Write(Message* aMsg, const paramType& aParam)
   463   {
   464     WriteParam(aMsg, aParam.UTF8Length);
   465     aMsg->WriteBytes(aParam.UTF8Characters,
   466                      aParam.UTF8Length * sizeof(NPUTF8));
   467   }
   469   static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
   470   {
   471     if (ReadParam(aMsg, aIter, &aResult->UTF8Length)) {
   472       int byteCount = aResult->UTF8Length * sizeof(NPUTF8);
   473       if (!byteCount) {
   474         aResult->UTF8Characters = "\0";
   475         return true;
   476       }
   478       const char* messageBuffer = nullptr;
   479       nsAutoArrayPtr<char> newBuffer(new char[byteCount]);
   480       if (newBuffer && aMsg->ReadBytes(aIter, &messageBuffer, byteCount )) {
   481         memcpy((void*)messageBuffer, newBuffer.get(), byteCount);
   482         aResult->UTF8Characters = newBuffer.forget();
   483         return true;
   484       }
   485     }
   486     return false;
   487   }
   489   static void Log(const paramType& aParam, std::wstring* aLog)
   490   {
   491     aLog->append(StringPrintf(L"%s", aParam.UTF8Characters));
   492   }
   493 };
   495 #ifdef XP_MACOSX
   496 template <>
   497 struct ParamTraits<NPNSString*>
   498 {
   499   typedef NPNSString* paramType;
   501   // Empty string writes a length of 0 and no buffer.
   502   // We don't write a nullptr terminating character in buffers.
   503   static void Write(Message* aMsg, const paramType& aParam)
   504   {
   505     CFStringRef cfString = (CFStringRef)aParam;
   507     // Write true if we have a string, false represents nullptr.
   508     aMsg->WriteBool(!!cfString);
   509     if (!cfString) {
   510       return;
   511     }
   513     long length = ::CFStringGetLength(cfString);
   514     WriteParam(aMsg, length);
   515     if (length == 0) {
   516       return;
   517     }
   519     // Attempt to get characters without any allocation/conversion.
   520     if (::CFStringGetCharactersPtr(cfString)) {
   521       aMsg->WriteBytes(::CFStringGetCharactersPtr(cfString), length * sizeof(UniChar));
   522     } else {
   523       UniChar *buffer = (UniChar*)moz_xmalloc(length * sizeof(UniChar));
   524       ::CFStringGetCharacters(cfString, ::CFRangeMake(0, length), buffer);
   525       aMsg->WriteBytes(buffer, length * sizeof(UniChar));
   526       free(buffer);
   527     }
   528   }
   530   static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
   531   {
   532     bool haveString = false;
   533     if (!aMsg->ReadBool(aIter, &haveString)) {
   534       return false;
   535     }
   536     if (!haveString) {
   537       *aResult = nullptr;
   538       return true;
   539     }
   541     long length;
   542     if (!ReadParam(aMsg, aIter, &length)) {
   543       return false;
   544     }
   546     UniChar* buffer = nullptr;
   547     if (length != 0) {
   548       if (!aMsg->ReadBytes(aIter, (const char**)&buffer, length * sizeof(UniChar)) ||
   549           !buffer) {
   550         return false;
   551       }
   552     }
   554     *aResult = (NPNSString*)::CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8*)buffer,
   555                                                       length * sizeof(UniChar),
   556                                                       kCFStringEncodingUTF16, false);
   557     if (!*aResult) {
   558       return false;
   559     }
   561     return true;
   562   }
   563 };
   564 #endif
   566 #ifdef XP_MACOSX
   567 template <>
   568 struct ParamTraits<NSCursorInfo>
   569 {
   570   typedef NSCursorInfo paramType;
   572   static void Write(Message* aMsg, const paramType& aParam)
   573   {
   574     NSCursorInfo::Type type = aParam.GetType();
   576     aMsg->WriteInt(type);
   578     nsPoint hotSpot = aParam.GetHotSpot();
   579     WriteParam(aMsg, hotSpot.x);
   580     WriteParam(aMsg, hotSpot.y);
   582     uint32_t dataLength = aParam.GetCustomImageDataLength();
   583     WriteParam(aMsg, dataLength);
   584     if (dataLength == 0) {
   585       return;
   586     }
   588     uint8_t* buffer = (uint8_t*)moz_xmalloc(dataLength);
   589     memcpy(buffer, aParam.GetCustomImageData(), dataLength);
   590     aMsg->WriteBytes(buffer, dataLength);
   591     free(buffer);
   592   }
   594   static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
   595   {
   596     NSCursorInfo::Type type;
   597     if (!aMsg->ReadInt(aIter, (int*)&type)) {
   598       return false;
   599     }
   601     nscoord hotSpotX, hotSpotY;
   602     if (!ReadParam(aMsg, aIter, &hotSpotX) ||
   603         !ReadParam(aMsg, aIter, &hotSpotY)) {
   604       return false;
   605     }
   607     uint32_t dataLength;
   608     if (!ReadParam(aMsg, aIter, &dataLength)) {
   609       return false;
   610     }
   612     uint8_t* data = nullptr;
   613     if (dataLength != 0) {
   614       if (!aMsg->ReadBytes(aIter, (const char**)&data, dataLength) || !data) {
   615         return false;
   616       }
   617     }
   619     aResult->SetType(type);
   620     aResult->SetHotSpot(nsPoint(hotSpotX, hotSpotY));
   621     aResult->SetCustomImageData(data, dataLength);
   623     return true;
   624   }
   626   static void Log(const paramType& aParam, std::wstring* aLog)
   627   {
   628     const char* typeName = aParam.GetTypeName();
   629     nsPoint hotSpot = aParam.GetHotSpot();
   630     int hotSpotX, hotSpotY;
   631 #ifdef NS_COORD_IS_FLOAT
   632     hotSpotX = rint(hotSpot.x);
   633     hotSpotY = rint(hotSpot.y);
   634 #else
   635     hotSpotX = hotSpot.x;
   636     hotSpotY = hotSpot.y;
   637 #endif
   638     uint32_t dataLength = aParam.GetCustomImageDataLength();
   639     uint8_t* data = aParam.GetCustomImageData();
   641     aLog->append(StringPrintf(L"[%s, (%i %i), %u, %p]",
   642                               typeName, hotSpotX, hotSpotY, dataLength, data));
   643   }
   644 };
   645 #else
   646 template<>
   647 struct ParamTraits<NSCursorInfo>
   648 {
   649   typedef NSCursorInfo paramType;
   650   static void Write(Message* aMsg, const paramType& aParam) {
   651     NS_RUNTIMEABORT("NSCursorInfo isn't meaningful on this platform");
   652   }
   653   static bool Read(const Message* aMsg, void** aIter, paramType* aResult) {
   654     NS_RUNTIMEABORT("NSCursorInfo isn't meaningful on this platform");
   655     return false;
   656   }
   657 };
   658 #endif // #ifdef XP_MACOSX
   660 template <>
   661 struct ParamTraits<NPVariant>
   662 {
   663   typedef NPVariant paramType;
   665   static void Write(Message* aMsg, const paramType& aParam)
   666   {
   667     if (NPVARIANT_IS_VOID(aParam)) {
   668       aMsg->WriteInt(0);
   669       return;
   670     }
   672     if (NPVARIANT_IS_NULL(aParam)) {
   673       aMsg->WriteInt(1);
   674       return;
   675     }
   677     if (NPVARIANT_IS_BOOLEAN(aParam)) {
   678       aMsg->WriteInt(2);
   679       WriteParam(aMsg, NPVARIANT_TO_BOOLEAN(aParam));
   680       return;
   681     }
   683     if (NPVARIANT_IS_INT32(aParam)) {
   684       aMsg->WriteInt(3);
   685       WriteParam(aMsg, NPVARIANT_TO_INT32(aParam));
   686       return;
   687     }
   689     if (NPVARIANT_IS_DOUBLE(aParam)) {
   690       aMsg->WriteInt(4);
   691       WriteParam(aMsg, NPVARIANT_TO_DOUBLE(aParam));
   692       return;
   693     }
   695     if (NPVARIANT_IS_STRING(aParam)) {
   696       aMsg->WriteInt(5);
   697       WriteParam(aMsg, NPVARIANT_TO_STRING(aParam));
   698       return;
   699     }
   701     NS_ERROR("Unsupported type!");
   702   }
   704   static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
   705   {
   706     int type;
   707     if (!aMsg->ReadInt(aIter, &type)) {
   708       return false;
   709     }
   711     switch (type) {
   712       case 0:
   713         VOID_TO_NPVARIANT(*aResult);
   714         return true;
   716       case 1:
   717         NULL_TO_NPVARIANT(*aResult);
   718         return true;
   720       case 2: {
   721         bool value;
   722         if (ReadParam(aMsg, aIter, &value)) {
   723           BOOLEAN_TO_NPVARIANT(value, *aResult);
   724           return true;
   725         }
   726       } break;
   728       case 3: {
   729         int32_t value;
   730         if (ReadParam(aMsg, aIter, &value)) {
   731           INT32_TO_NPVARIANT(value, *aResult);
   732           return true;
   733         }
   734       } break;
   736       case 4: {
   737         double value;
   738         if (ReadParam(aMsg, aIter, &value)) {
   739           DOUBLE_TO_NPVARIANT(value, *aResult);
   740           return true;
   741         }
   742       } break;
   744       case 5: {
   745         NPString value;
   746         if (ReadParam(aMsg, aIter, &value)) {
   747           STRINGN_TO_NPVARIANT(value.UTF8Characters, value.UTF8Length,
   748                                *aResult);
   749           return true;
   750         }
   751       } break;
   753       default:
   754         NS_ERROR("Unsupported type!");
   755     }
   757     return false;
   758   }
   760   static void Log(const paramType& aParam, std::wstring* aLog)
   761   {
   762     if (NPVARIANT_IS_VOID(aParam)) {
   763       aLog->append(L"[void]");
   764       return;
   765     }
   767     if (NPVARIANT_IS_NULL(aParam)) {
   768       aLog->append(L"[null]");
   769       return;
   770     }
   772     if (NPVARIANT_IS_BOOLEAN(aParam)) {
   773       LogParam(NPVARIANT_TO_BOOLEAN(aParam), aLog);
   774       return;
   775     }
   777     if (NPVARIANT_IS_INT32(aParam)) {
   778       LogParam(NPVARIANT_TO_INT32(aParam), aLog);
   779       return;
   780     }
   782     if (NPVARIANT_IS_DOUBLE(aParam)) {
   783       LogParam(NPVARIANT_TO_DOUBLE(aParam), aLog);
   784       return;
   785     }
   787     if (NPVARIANT_IS_STRING(aParam)) {
   788       LogParam(NPVARIANT_TO_STRING(aParam), aLog);
   789       return;
   790     }
   792     NS_ERROR("Unsupported type!");
   793   }
   794 };
   796 template <>
   797 struct ParamTraits<mozilla::plugins::IPCByteRange>
   798 {
   799   typedef mozilla::plugins::IPCByteRange paramType;
   801   static void Write(Message* aMsg, const paramType& aParam)
   802   {
   803     WriteParam(aMsg, aParam.offset);
   804     WriteParam(aMsg, aParam.length);
   805   }
   807   static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
   808   {
   809     paramType p;
   810     if (ReadParam(aMsg, aIter, &p.offset) &&
   811         ReadParam(aMsg, aIter, &p.length)) {
   812       *aResult = p;
   813       return true;
   814     }
   815     return false;
   816   }
   817 };
   819 template <>
   820 struct ParamTraits<NPNVariable>
   821 {
   822   typedef NPNVariable paramType;
   824   static void Write(Message* aMsg, const paramType& aParam)
   825   {
   826     WriteParam(aMsg, int(aParam));
   827   }
   829   static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
   830   {
   831     int intval;
   832     if (ReadParam(aMsg, aIter, &intval)) {
   833       *aResult = paramType(intval);
   834       return true;
   835     }
   836     return false;
   837   }
   838 };
   840 template<>
   841 struct ParamTraits<NPNURLVariable>
   842 {
   843   typedef NPNURLVariable paramType;
   845   static void Write(Message* aMsg, const paramType& aParam)
   846   {
   847     WriteParam(aMsg, int(aParam));
   848   }
   850   static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
   851   {
   852     int intval;
   853     if (ReadParam(aMsg, aIter, &intval)) {
   854       switch (intval) {
   855       case NPNURLVCookie:
   856       case NPNURLVProxy:
   857         *aResult = paramType(intval);
   858         return true;
   859       }
   860     }
   861     return false;
   862   }
   863 };
   866 template<>
   867 struct ParamTraits<NPCoordinateSpace>
   868 {
   869   typedef NPCoordinateSpace paramType;
   871   static void Write(Message* aMsg, const paramType& aParam)
   872   {
   873     WriteParam(aMsg, int32_t(aParam));
   874   }
   876   static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
   877   {
   878     int32_t intval;
   879     if (ReadParam(aMsg, aIter, &intval)) {
   880       switch (intval) {
   881       case NPCoordinateSpacePlugin:
   882       case NPCoordinateSpaceWindow:
   883       case NPCoordinateSpaceFlippedWindow:
   884       case NPCoordinateSpaceScreen:
   885       case NPCoordinateSpaceFlippedScreen:
   886         *aResult = paramType(intval);
   887         return true;
   888       }
   889     }
   890     return false;
   891   }
   892 };
   894 } /* namespace IPC */
   897 // Serializing NPEvents is completely platform-specific and can be rather
   898 // intricate depending on the platform.  So for readability we split it
   899 // into separate files and have the only macro crud live here.
   900 // 
   901 // NB: these guards are based on those where struct NPEvent is defined
   902 // in npapi.h.  They should be kept in sync.
   903 #if defined(XP_MACOSX)
   904 #  include "mozilla/plugins/NPEventOSX.h"
   905 #elif defined(XP_WIN)
   906 #  include "mozilla/plugins/NPEventWindows.h"
   907 #elif defined(ANDROID)
   908 #  include "mozilla/plugins/NPEventAndroid.h"
   909 #elif defined(XP_UNIX)
   910 #  include "mozilla/plugins/NPEventUnix.h"
   911 #else
   912 #  error Unsupported platform
   913 #endif
   915 #endif /* DOM_PLUGINS_PLUGINMESSAGEUTILS_H */

mercurial