Bug 1149987 - Part 1: Make it possible to send an ErrorResult that doesn't encode a JS exception through the IPDL layer; r=bzbarsky

This commit is contained in:
Ehsan Akhgari 2015-04-06 21:36:55 -04:00
Родитель 1e315792d4
Коммит 451e8342c1
4 изменённых файлов: 109 добавлений и 0 удалений

Просмотреть файл

@ -46,6 +46,7 @@
#include "mozilla/jsipc/CrossProcessObjectWrappers.h"
#include "WorkerPrivate.h"
#include "nsDOMClassInfo.h"
#include "ipc/ErrorIPCUtils.h"
namespace mozilla {
namespace dom {
@ -149,6 +150,31 @@ ErrorResult::ThrowErrorWithMessage(va_list ap, const dom::ErrNum errorNumber,
mMessage = message;
}
void
ErrorResult::SerializeMessage(IPC::Message* aMsg) const
{
using namespace IPC;
MOZ_ASSERT(mMessage);
WriteParam(aMsg, mMessage->mArgs);
WriteParam(aMsg, mMessage->mErrorNumber);
}
bool
ErrorResult::DeserializeMessage(const IPC::Message* aMsg, void** aIter)
{
using namespace IPC;
nsAutoPtr<Message> readMessage(new Message());
if (!ReadParam(aMsg, aIter, &readMessage->mArgs) ||
!ReadParam(aMsg, aIter, &readMessage->mErrorNumber)) {
return false;
}
if (mMessage) {
delete mMessage;
}
mMessage = readMessage.forget();
return true;
}
void
ErrorResult::ThrowTypeError(const dom::ErrNum errorNumber, ...)
{

Просмотреть файл

@ -0,0 +1,70 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
/* vim: set ts=2 sw=2 et tw=79: */
/* 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 "ipc/IPCMessageUtils.h"
#include "mozilla/ErrorResult.h"
#include "mozilla/Assertions.h"
#include "mozilla/Move.h"
#ifndef IPC_ErrorIPCUtils_h
#define IPC_ErrorIPCUtils_h
namespace IPC {
template<>
struct ParamTraits<mozilla::dom::ErrNum> :
public ContiguousEnumSerializer<mozilla::dom::ErrNum,
mozilla::dom::ErrNum(0),
mozilla::dom::ErrNum(mozilla::dom::Err_Limit)> {};
template<>
struct ParamTraits<mozilla::ErrorResult>
{
typedef mozilla::ErrorResult paramType;
static void Write(Message* aMsg, const paramType& aParam)
{
// It should be the case that mMightHaveUnreportedJSException can only be
// true when we're expecting a JS exception. We cannot send such messages
// over the IPC channel since there is no sane way of transferring the JS
// value over to the other side. Callers should never do that.
MOZ_ASSERT_IF(aParam.IsJSException(), aParam.mMightHaveUnreportedJSException);
if (aParam.IsJSException()
#ifdef DEBUG
|| aParam.mMightHaveUnreportedJSException
#endif
) {
MOZ_CRASH("Cannot encode an ErrorResult representing a Javascript exception");
}
WriteParam(aMsg, aParam.mResult);
WriteParam(aMsg, aParam.IsErrorWithMessage());
if (aParam.IsErrorWithMessage()) {
aParam.SerializeMessage(aMsg);
}
}
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
{
paramType readValue;
if (!ReadParam(aMsg, aIter, &readValue.mResult)) {
return false;
}
bool hasMessage = false;
if (!ReadParam(aMsg, aIter, &hasMessage)) {
return false;
}
if (hasMessage && !readValue.DeserializeMessage(aMsg, aIter)) {
return false;
}
*aResult = Move(readValue);
return true;
}
};
}
#endif

Просмотреть файл

@ -18,6 +18,11 @@
#include "nsStringGlue.h"
#include "mozilla/Assertions.h"
namespace IPC {
class Message;
template <typename> struct ParamTraits;
}
namespace mozilla {
namespace dom {
@ -161,6 +166,10 @@ private:
JS::Value mJSException; // valid when IsJSException()
};
friend struct IPC::ParamTraits<ErrorResult>;
void SerializeMessage(IPC::Message* aMsg) const;
bool DeserializeMessage(const IPC::Message* aMsg, void** aIter);
#ifdef DEBUG
// Used to keep track of codepaths that might throw JS exceptions,
// for assertion purposes.

Просмотреть файл

@ -6,6 +6,10 @@
TEST_DIRS += ['test']
EXPORTS.ipc += [
'ErrorIPCUtils.h',
]
EXPORTS.mozilla += [
'ErrorResult.h',
]