зеркало из https://github.com/mozilla/gecko-dev.git
More plugin crash fixes: failure from NPP_Write doesn't actually destroy the stream, it just tells the browser to destroy the stream. NPP_NewStream resulting from NPN_GetURLNotify didn't have the notifyData field set correctly. Other minor logging and cleanup.
--HG-- extra : rebase_source : 932c0290a7c1779275266607d5e853d5c1994396
This commit is contained in:
Родитель
9914a675f3
Коммит
b30e208aa5
|
@ -37,6 +37,7 @@
|
||||||
|
|
||||||
#include "BrowserStreamChild.h"
|
#include "BrowserStreamChild.h"
|
||||||
#include "PluginInstanceChild.h"
|
#include "PluginInstanceChild.h"
|
||||||
|
#include "StreamNotifyChild.h"
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace plugins {
|
namespace plugins {
|
||||||
|
@ -45,6 +46,7 @@ BrowserStreamChild::BrowserStreamChild(PluginInstanceChild* instance,
|
||||||
const nsCString& url,
|
const nsCString& url,
|
||||||
const uint32_t& length,
|
const uint32_t& length,
|
||||||
const uint32_t& lastmodified,
|
const uint32_t& lastmodified,
|
||||||
|
const PStreamNotifyChild* notifyData,
|
||||||
const nsCString& headers,
|
const nsCString& headers,
|
||||||
const nsCString& mimeType,
|
const nsCString& mimeType,
|
||||||
const bool& seekable,
|
const bool& seekable,
|
||||||
|
@ -61,6 +63,9 @@ BrowserStreamChild::BrowserStreamChild(PluginInstanceChild* instance,
|
||||||
mStream.url = mURL.get();
|
mStream.url = mURL.get();
|
||||||
mStream.end = length;
|
mStream.end = length;
|
||||||
mStream.lastmodified = lastmodified;
|
mStream.lastmodified = lastmodified;
|
||||||
|
if (notifyData)
|
||||||
|
mStream.notifyData =
|
||||||
|
static_cast<const StreamNotifyChild*>(notifyData)->mClosure;
|
||||||
if (!mHeaders.IsEmpty())
|
if (!mHeaders.IsEmpty())
|
||||||
mStream.headers = mHeaders.get();
|
mStream.headers = mHeaders.get();
|
||||||
|
|
||||||
|
@ -99,9 +104,6 @@ BrowserStreamChild::AnswerNPP_Write(const int32_t& offset,
|
||||||
*consumed = mInstance->mPluginIface->write(&mInstance->mData, &mStream,
|
*consumed = mInstance->mPluginIface->write(&mInstance->mData, &mStream,
|
||||||
offset, data.Length(),
|
offset, data.Length(),
|
||||||
const_cast<char*>(data.get()));
|
const_cast<char*>(data.get()));
|
||||||
if (*consumed < 0)
|
|
||||||
mClosed = true;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@ namespace mozilla {
|
||||||
namespace plugins {
|
namespace plugins {
|
||||||
|
|
||||||
class PluginInstanceChild;
|
class PluginInstanceChild;
|
||||||
|
class PStreamNotifyChild;
|
||||||
|
|
||||||
class BrowserStreamChild : public PBrowserStreamChild, public AStream
|
class BrowserStreamChild : public PBrowserStreamChild, public AStream
|
||||||
{
|
{
|
||||||
|
@ -53,6 +54,7 @@ public:
|
||||||
const nsCString& url,
|
const nsCString& url,
|
||||||
const uint32_t& length,
|
const uint32_t& length,
|
||||||
const uint32_t& lastmodified,
|
const uint32_t& lastmodified,
|
||||||
|
const PStreamNotifyChild* notifyData,
|
||||||
const nsCString& headers,
|
const nsCString& headers,
|
||||||
const nsCString& mimeType,
|
const nsCString& mimeType,
|
||||||
const bool& seekable,
|
const bool& seekable,
|
||||||
|
|
|
@ -11,9 +11,15 @@ BrowserStreamParent::BrowserStreamParent(PluginInstanceParent* npp,
|
||||||
: mNPP(npp)
|
: mNPP(npp)
|
||||||
, mStream(stream)
|
, mStream(stream)
|
||||||
{
|
{
|
||||||
|
printf("BrowserStreamParent::BrowserStreamParent<%p>\n", (void*) this);
|
||||||
mStream->pdata = static_cast<AStream*>(this);
|
mStream->pdata = static_cast<AStream*>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BrowserStreamParent::~BrowserStreamParent()
|
||||||
|
{
|
||||||
|
printf("BrowserStreamParent::~BrowserStreamParent<%p>\n", (void*) this);
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
BrowserStreamParent::AnswerNPN_RequestRead(const IPCByteRanges& ranges,
|
BrowserStreamParent::AnswerNPN_RequestRead(const IPCByteRanges& ranges,
|
||||||
NPError* result)
|
NPError* result)
|
||||||
|
@ -64,12 +70,9 @@ BrowserStreamParent::Write(int32_t offset,
|
||||||
int32_t result;
|
int32_t result;
|
||||||
if (!CallNPP_Write(offset,
|
if (!CallNPP_Write(offset,
|
||||||
nsCString(static_cast<char*>(buffer), len),
|
nsCString(static_cast<char*>(buffer), len),
|
||||||
&result)) {
|
&result))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
if (result == -1)
|
|
||||||
mNPP->CallPBrowserStreamDestructor(this, NPRES_USER_BREAK, true);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ class BrowserStreamParent : public PBrowserStreamParent, public AStream
|
||||||
public:
|
public:
|
||||||
BrowserStreamParent(PluginInstanceParent* npp,
|
BrowserStreamParent(PluginInstanceParent* npp,
|
||||||
NPStream* stream);
|
NPStream* stream);
|
||||||
virtual ~BrowserStreamParent() { }
|
virtual ~BrowserStreamParent();
|
||||||
|
|
||||||
NS_OVERRIDE virtual bool IsBrowserStream() { return true; }
|
NS_OVERRIDE virtual bool IsBrowserStream() { return true; }
|
||||||
|
|
||||||
|
|
|
@ -462,8 +462,8 @@ PluginInstanceChild::AllocPBrowserStream(const nsCString& url,
|
||||||
NPError* rv,
|
NPError* rv,
|
||||||
uint16_t *stype)
|
uint16_t *stype)
|
||||||
{
|
{
|
||||||
return new BrowserStreamChild(this, url, length, lastmodified, headers,
|
return new BrowserStreamChild(this, url, length, lastmodified, notifyData,
|
||||||
mimeType, seekable, rv, stype);
|
headers, mimeType, seekable, rv, stype);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -47,6 +47,7 @@ namespace plugins {
|
||||||
class StreamNotifyChild : public PStreamNotifyChild
|
class StreamNotifyChild : public PStreamNotifyChild
|
||||||
{
|
{
|
||||||
friend class PluginInstanceChild;
|
friend class PluginInstanceChild;
|
||||||
|
friend class BrowserStreamChild;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
StreamNotifyChild(const nsCString& aURL, void* aClosure)
|
StreamNotifyChild(const nsCString& aURL, void* aClosure)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче