Merge last green changeset of mozilla-inbound to mozilla-central

This commit is contained in:
Ed Morley 2011-10-06 11:14:24 +01:00
commit 34974bebcb
58 changed files with 1173 additions and 197 deletions

View File

@ -52,13 +52,14 @@
#include "AudioChild.h" #include "AudioChild.h"
#endif #endif
#include "mozilla/dom/ExternalHelperAppChild.h"
#include "mozilla/dom/PCrashReporterChild.h"
#include "mozilla/dom/StorageChild.h"
#include "mozilla/hal_sandbox/PHalChild.h"
#include "mozilla/ipc/TestShellChild.h" #include "mozilla/ipc/TestShellChild.h"
#include "mozilla/net/NeckoChild.h"
#include "mozilla/ipc/XPCShellEnvironment.h" #include "mozilla/ipc/XPCShellEnvironment.h"
#include "mozilla/jsipc/PContextWrapperChild.h" #include "mozilla/jsipc/PContextWrapperChild.h"
#include "mozilla/dom/ExternalHelperAppChild.h" #include "mozilla/net/NeckoChild.h"
#include "mozilla/dom/StorageChild.h"
#include "mozilla/dom/PCrashReporterChild.h"
#if defined(MOZ_SYDNEYAUDIO) #if defined(MOZ_SYDNEYAUDIO)
#include "nsAudioStream.h" #include "nsAudioStream.h"
@ -74,6 +75,7 @@
#include "nsIScriptError.h" #include "nsIScriptError.h"
#include "nsIConsoleService.h" #include "nsIConsoleService.h"
#include "nsJSEnvironment.h" #include "nsJSEnvironment.h"
#include "SandboxHal.h"
#include "History.h" #include "History.h"
#include "nsDocShellCID.h" #include "nsDocShellCID.h"
@ -109,6 +111,7 @@
#include "nsIAccessibilityService.h" #include "nsIAccessibilityService.h"
#endif #endif
using namespace mozilla::hal_sandbox;
using namespace mozilla::ipc; using namespace mozilla::ipc;
using namespace mozilla::net; using namespace mozilla::net;
using namespace mozilla::places; using namespace mozilla::places;
@ -440,6 +443,19 @@ ContentChild::DeallocPCrashReporter(PCrashReporterChild* crashreporter)
return true; return true;
} }
PHalChild*
ContentChild::AllocPHal()
{
return CreateHalChild();
}
bool
ContentChild::DeallocPHal(PHalChild* aHal)
{
delete aHal;
return true;
}
PTestShellChild* PTestShellChild*
ContentChild::AllocPTestShell() ContentChild::AllocPTestShell()
{ {
@ -789,5 +805,13 @@ ContentChild::RecvCycleCollect()
return true; return true;
} }
bool
ContentChild::RecvAppInfo(const nsCString& version, const nsCString& buildID)
{
mAppInfo.version.Assign(version);
mAppInfo.buildID.Assign(buildID);
return true;
}
} // namespace dom } // namespace dom
} // namespace mozilla } // namespace mozilla

View File

@ -64,6 +64,12 @@ public:
ContentChild(); ContentChild();
virtual ~ContentChild(); virtual ~ContentChild();
struct AppInfo
{
nsCString version;
nsCString buildID;
};
bool Init(MessageLoop* aIOLoop, bool Init(MessageLoop* aIOLoop,
base::ProcessHandle aParentHandle, base::ProcessHandle aParentHandle,
IPC::Channel* aChannel); IPC::Channel* aChannel);
@ -74,6 +80,10 @@ public:
return sSingleton; return sSingleton;
} }
const AppInfo& GetAppInfo() {
return mAppInfo;
}
/* if you remove this, please talk to cjones or dougt */ /* if you remove this, please talk to cjones or dougt */
virtual bool RecvDummy(Shmem& foo) { return true; } virtual bool RecvDummy(Shmem& foo) { return true; }
@ -86,6 +96,9 @@ public:
virtual bool virtual bool
DeallocPCrashReporter(PCrashReporterChild*); DeallocPCrashReporter(PCrashReporterChild*);
NS_OVERRIDE virtual PHalChild* AllocPHal();
NS_OVERRIDE virtual bool DeallocPHal(PHalChild*);
virtual PMemoryReportRequestChild* virtual PMemoryReportRequestChild*
AllocPMemoryReportRequest(); AllocPMemoryReportRequest();
@ -154,6 +167,8 @@ public:
virtual bool RecvGarbageCollect(); virtual bool RecvGarbageCollect();
virtual bool RecvCycleCollect(); virtual bool RecvCycleCollect();
virtual bool RecvAppInfo(const nsCString& version, const nsCString& buildID);
#ifdef ANDROID #ifdef ANDROID
gfxIntSize GetScreenSize() { return mScreenSize; } gfxIntSize GetScreenSize() { return mScreenSize; }
#endif #endif
@ -181,6 +196,8 @@ private:
gfxIntSize mScreenSize; gfxIntSize mScreenSize;
#endif #endif
AppInfo mAppInfo;
static ContentChild* sSingleton; static ContentChild* sSingleton;
DISALLOW_EVIL_CONSTRUCTORS(ContentChild); DISALLOW_EVIL_CONSTRUCTORS(ContentChild);

View File

@ -71,10 +71,12 @@
#include "nsIScriptError.h" #include "nsIScriptError.h"
#include "nsConsoleMessage.h" #include "nsConsoleMessage.h"
#include "nsAppDirectoryServiceDefs.h" #include "nsAppDirectoryServiceDefs.h"
#include "nsAppRunner.h"
#include "IDBFactory.h" #include "IDBFactory.h"
#if defined(MOZ_SYDNEYAUDIO) #if defined(MOZ_SYDNEYAUDIO)
#include "AudioParent.h" #include "AudioParent.h"
#endif #endif
#include "SandboxHal.h"
#if defined(ANDROID) || defined(LINUX) #if defined(ANDROID) || defined(LINUX)
#include <sys/time.h> #include <sys/time.h>
@ -93,6 +95,7 @@
#include "mozilla/dom/ExternalHelperAppParent.h" #include "mozilla/dom/ExternalHelperAppParent.h"
#include "mozilla/dom/StorageParent.h" #include "mozilla/dom/StorageParent.h"
#include "mozilla/hal_sandbox/PHalParent.h"
#include "mozilla/Services.h" #include "mozilla/Services.h"
#include "mozilla/unused.h" #include "mozilla/unused.h"
#include "nsDeviceMotion.h" #include "nsDeviceMotion.h"
@ -115,6 +118,7 @@ static const char* sClipboardTextFlavors[] = { kUnicodeMime };
using mozilla::Preferences; using mozilla::Preferences;
using namespace mozilla::ipc; using namespace mozilla::ipc;
using namespace mozilla::hal_sandbox;
using namespace mozilla::net; using namespace mozilla::net;
using namespace mozilla::places; using namespace mozilla::places;
using mozilla::unused; // heh using mozilla::unused; // heh
@ -427,6 +431,14 @@ ContentParent::ContentParent()
static_cast<nsChromeRegistryChrome*>(registrySvc.get()); static_cast<nsChromeRegistryChrome*>(registrySvc.get());
chromeRegistry->SendRegisteredChrome(this); chromeRegistry->SendRegisteredChrome(this);
mMessageManager = nsFrameMessageManager::NewProcessMessageManager(this); mMessageManager = nsFrameMessageManager::NewProcessMessageManager(this);
if (gAppData) {
nsCString version(gAppData->version);
nsCString buildID(gAppData->buildID);
//Sending all information to content process
SendAppInfo(version, buildID);
}
} }
ContentParent::~ContentParent() ContentParent::~ContentParent()
@ -811,6 +823,19 @@ ContentParent::DeallocPCrashReporter(PCrashReporterParent* crashreporter)
return true; return true;
} }
PHalParent*
ContentParent::AllocPHal()
{
return CreateHalParent();
}
bool
ContentParent::DeallocPHal(PHalParent* aHal)
{
delete aHal;
return true;
}
PMemoryReportRequestParent* PMemoryReportRequestParent*
ContentParent::AllocPMemoryReportRequest() ContentParent::AllocPMemoryReportRequest()
{ {

View File

@ -135,6 +135,9 @@ private:
const NativeThreadId& tid, const NativeThreadId& tid,
const PRUint32& processType); const PRUint32& processType);
NS_OVERRIDE virtual PHalParent* AllocPHal();
NS_OVERRIDE virtual bool DeallocPHal(PHalParent*);
virtual PMemoryReportRequestParent* AllocPMemoryReportRequest(); virtual PMemoryReportRequestParent* AllocPMemoryReportRequest();
virtual bool DeallocPMemoryReportRequest(PMemoryReportRequestParent* actor); virtual bool DeallocPMemoryReportRequest(PMemoryReportRequestParent* actor);

View File

@ -107,6 +107,8 @@ LOCAL_INCLUDES += \
-I$(srcdir)/../indexedDB \ -I$(srcdir)/../indexedDB \
-I$(topsrcdir)/extensions/cookie \ -I$(topsrcdir)/extensions/cookie \
-I$(topsrcdir)/dom/base \ -I$(topsrcdir)/dom/base \
-I$(topsrcdir)/toolkit/xre \
-I$(topsrcdir)/hal/sandbox \
$(NULL) $(NULL)
DEFINES += -DBIN_SUFFIX='"$(BIN_SUFFIX)"' DEFINES += -DBIN_SUFFIX='"$(BIN_SUFFIX)"'

View File

@ -39,11 +39,12 @@
include protocol PAudio; include protocol PAudio;
include protocol PBrowser; include protocol PBrowser;
include protocol PCrashReporter; include protocol PCrashReporter;
include protocol PTestShell;
include protocol PNecko;
include protocol PExternalHelperApp; include protocol PExternalHelperApp;
include protocol PStorage; include protocol PHal;
include protocol PMemoryReportRequest; include protocol PMemoryReportRequest;
include protocol PNecko;
include protocol PStorage;
include protocol PTestShell;
include "mozilla/chrome/RegistryMessageUtils.h"; include "mozilla/chrome/RegistryMessageUtils.h";
include "mozilla/net/NeckoMessageUtils.h"; include "mozilla/net/NeckoMessageUtils.h";
@ -99,11 +100,12 @@ rpc protocol PContent
manages PAudio; manages PAudio;
manages PBrowser; manages PBrowser;
manages PCrashReporter; manages PCrashReporter;
manages PTestShell;
manages PNecko;
manages PExternalHelperApp; manages PExternalHelperApp;
manages PStorage; manages PHal;
manages PMemoryReportRequest; manages PMemoryReportRequest;
manages PNecko;
manages PStorage;
manages PTestShell;
child: child:
PBrowser(PRUint32 chromeFlags); PBrowser(PRUint32 chromeFlags);
@ -143,15 +145,19 @@ child:
*/ */
ActivateA11y(); ActivateA11y();
parent: AppInfo(nsCString version, nsCString buildID);
PNecko();
PStorage(StorageConstructData data);
parent:
PAudio(PRInt32 aNumChannels, PRInt32 aRate, PRInt32 aFormat); PAudio(PRInt32 aNumChannels, PRInt32 aRate, PRInt32 aFormat);
sync PCrashReporter(NativeThreadId tid, PRUint32 processType); sync PCrashReporter(NativeThreadId tid, PRUint32 processType);
PHal();
PNecko();
PStorage(StorageConstructData data);
// Services remoting // Services remoting
async StartVisitedQuery(URI uri); async StartVisitedQuery(URI uri);

View File

@ -642,6 +642,8 @@ DrawTargetD2D::DrawSurfaceWithShadow(SourceSurface *aSurface,
void void
DrawTargetD2D::ClearRect(const Rect &aRect) DrawTargetD2D::ClearRect(const Rect &aRect)
{ {
MarkChanged();
mRT->SetTransform(D2DMatrix(mTransform)); mRT->SetTransform(D2DMatrix(mTransform));
PopAllClips(); PopAllClips();
@ -670,6 +672,8 @@ DrawTargetD2D::CopySurface(SourceSurface *aSurface,
const IntRect &aSourceRect, const IntRect &aSourceRect,
const IntPoint &aDestination) const IntPoint &aDestination)
{ {
MarkChanged();
Rect srcRect(Float(aSourceRect.x), Float(aSourceRect.y), Rect srcRect(Float(aSourceRect.x), Float(aSourceRect.y),
Float(aSourceRect.width), Float(aSourceRect.height)); Float(aSourceRect.width), Float(aSourceRect.height));
Rect dstRect(Float(aDestination.x), Float(aDestination.y), Rect dstRect(Float(aDestination.x), Float(aDestination.y),

View File

@ -261,7 +261,7 @@ CanvasLayerOGL::RenderLayer(int aPreviousDestination,
} }
#endif #endif
ApplyFilter(mFilter); gl()->ApplyFilterToBoundTexture(mFilter);
program->Activate(); program->Activate();
program->SetLayerQuadRect(drawRect); program->SetLayerQuadRect(drawRect);
@ -366,7 +366,7 @@ ShadowCanvasLayerOGL::RenderLayer(int aPreviousFrameBuffer,
ColorTextureLayerProgram *program = ColorTextureLayerProgram *program =
mOGLManager->GetColorTextureLayerProgram(mTexImage->GetShaderProgramType()); mOGLManager->GetColorTextureLayerProgram(mTexImage->GetShaderProgramType());
ApplyFilter(mFilter); mTexImage->SetFilter(mFilter);
program->Activate(); program->Activate();
program->SetLayerTransform(GetEffectiveTransform()); program->SetLayerTransform(GetEffectiveTransform());
@ -376,7 +376,7 @@ ShadowCanvasLayerOGL::RenderLayer(int aPreviousFrameBuffer,
mTexImage->BeginTileIteration(); mTexImage->BeginTileIteration();
do { do {
TextureImage::ScopedBindTexture texBind(mTexImage, LOCAL_GL_TEXTURE0); TextureImage::ScopedBindTextureAndApplyFilter texBind(mTexImage, LOCAL_GL_TEXTURE0);
program->SetLayerQuadRect(mTexImage->GetTileRect()); program->SetLayerQuadRect(mTexImage->GetTileRect());
mOGLManager->BindAndDrawQuad(program, mNeedsYFlip); // FIXME flip order of tiles? mOGLManager->BindAndDrawQuad(program, mNeedsYFlip); // FIXME flip order of tiles?
} while (mTexImage->NextTile()); } while (mTexImage->NextTile());

View File

@ -428,13 +428,13 @@ ImageLayerOGL::RenderLayer(int,
gl()->fActiveTexture(LOCAL_GL_TEXTURE0); gl()->fActiveTexture(LOCAL_GL_TEXTURE0);
gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, yuvImage->mTextures[0].GetTextureID()); gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, yuvImage->mTextures[0].GetTextureID());
ApplyFilter(mFilter); gl()->ApplyFilterToBoundTexture(mFilter);
gl()->fActiveTexture(LOCAL_GL_TEXTURE1); gl()->fActiveTexture(LOCAL_GL_TEXTURE1);
gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, yuvImage->mTextures[1].GetTextureID()); gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, yuvImage->mTextures[1].GetTextureID());
ApplyFilter(mFilter); gl()->ApplyFilterToBoundTexture(mFilter);
gl()->fActiveTexture(LOCAL_GL_TEXTURE2); gl()->fActiveTexture(LOCAL_GL_TEXTURE2);
gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, yuvImage->mTextures[2].GetTextureID()); gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, yuvImage->mTextures[2].GetTextureID());
ApplyFilter(mFilter); gl()->ApplyFilterToBoundTexture(mFilter);
YCbCrTextureLayerProgram *program = mOGLManager->GetYCbCrLayerProgram(); YCbCrTextureLayerProgram *program = mOGLManager->GetYCbCrLayerProgram();
@ -482,7 +482,7 @@ ImageLayerOGL::RenderLayer(int,
ColorTextureLayerProgram *program = ColorTextureLayerProgram *program =
mOGLManager->GetColorTextureLayerProgram(cairoImage->mLayerProgram); mOGLManager->GetColorTextureLayerProgram(cairoImage->mLayerProgram);
ApplyFilter(mFilter); gl()->ApplyFilterToBoundTexture(mFilter);
program->Activate(); program->Activate();
// The following uniform controls the scaling of the vertex coords. // The following uniform controls the scaling of the vertex coords.
@ -957,23 +957,23 @@ ShadowImageLayerOGL::RenderLayer(int aPreviousFrameBuffer,
colorProgram->SetLayerOpacity(GetEffectiveOpacity()); colorProgram->SetLayerOpacity(GetEffectiveOpacity());
colorProgram->SetRenderOffset(aOffset); colorProgram->SetRenderOffset(aOffset);
mTexImage->SetFilter(mFilter);
mTexImage->BeginTileIteration(); mTexImage->BeginTileIteration();
do { do {
TextureImage::ScopedBindTexture texBind(mTexImage, LOCAL_GL_TEXTURE0); TextureImage::ScopedBindTextureAndApplyFilter texBind(mTexImage, LOCAL_GL_TEXTURE0);
ApplyFilter(mFilter);
colorProgram->SetLayerQuadRect(mTexImage->GetTileRect()); colorProgram->SetLayerQuadRect(mTexImage->GetTileRect());
mOGLManager->BindAndDrawQuad(colorProgram); mOGLManager->BindAndDrawQuad(colorProgram);
} while (mTexImage->NextTile()); } while (mTexImage->NextTile());
} else { } else {
gl()->fActiveTexture(LOCAL_GL_TEXTURE0); gl()->fActiveTexture(LOCAL_GL_TEXTURE0);
gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, mYUVTexture[0].GetTextureID()); gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, mYUVTexture[0].GetTextureID());
ApplyFilter(mFilter); gl()->ApplyFilterToBoundTexture(mFilter);
gl()->fActiveTexture(LOCAL_GL_TEXTURE1); gl()->fActiveTexture(LOCAL_GL_TEXTURE1);
gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, mYUVTexture[1].GetTextureID()); gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, mYUVTexture[1].GetTextureID());
ApplyFilter(mFilter); gl()->ApplyFilterToBoundTexture(mFilter);
gl()->fActiveTexture(LOCAL_GL_TEXTURE2); gl()->fActiveTexture(LOCAL_GL_TEXTURE2);
gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, mYUVTexture[2].GetTextureID()); gl()->fBindTexture(LOCAL_GL_TEXTURE_2D, mYUVTexture[2].GetTextureID());
ApplyFilter(mFilter); gl()->ApplyFilterToBoundTexture(mFilter);
YCbCrTextureLayerProgram *yuvProgram = mOGLManager->GetYCbCrLayerProgram(); YCbCrTextureLayerProgram *yuvProgram = mOGLManager->GetYCbCrLayerProgram();

View File

@ -1166,21 +1166,6 @@ LayerManagerOGL::CreateFBOWithTexture(const nsIntRect& aRect, InitMode aInit,
*aTexture = tex; *aTexture = tex;
} }
void
LayerOGL::ApplyFilter(gfxPattern::GraphicsFilter aFilter)
{
if (aFilter == gfxPattern::FILTER_NEAREST) {
gl()->fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_MIN_FILTER, LOCAL_GL_NEAREST);
gl()->fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_MAG_FILTER, LOCAL_GL_NEAREST);
} else {
if (aFilter != gfxPattern::FILTER_GOOD) {
NS_WARNING("Unsupported filter type!");
}
gl()->fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_MIN_FILTER, LOCAL_GL_LINEAR);
gl()->fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_MAG_FILTER, LOCAL_GL_LINEAR);
}
}
already_AddRefed<ShadowThebesLayer> already_AddRefed<ShadowThebesLayer>
LayerManagerOGL::CreateShadowThebesLayer() LayerManagerOGL::CreateShadowThebesLayer()
{ {

View File

@ -540,7 +540,6 @@ public:
LayerManagerOGL* OGLManager() const { return mOGLManager; } LayerManagerOGL* OGLManager() const { return mOGLManager; }
GLContext *gl() const { return mOGLManager->gl(); } GLContext *gl() const { return mOGLManager->gl(); }
void ApplyFilter(gfxPattern::GraphicsFilter aFilter);
protected: protected:
LayerManagerOGL *mOGLManager; LayerManagerOGL *mOGLManager;
bool mDestroyed; bool mDestroyed;

View File

@ -554,6 +554,20 @@ GLContext::CreateTextureImage(const nsIntSize& aSize,
return CreateBasicTextureImage(texture, aSize, aWrapMode, aContentType, this); return CreateBasicTextureImage(texture, aSize, aWrapMode, aContentType, this);
} }
void GLContext::ApplyFilterToBoundTexture(gfxPattern::GraphicsFilter aFilter)
{
if (aFilter == gfxPattern::FILTER_NEAREST) {
fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_MIN_FILTER, LOCAL_GL_NEAREST);
fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_MAG_FILTER, LOCAL_GL_NEAREST);
} else {
if (aFilter != gfxPattern::FILTER_GOOD) {
NS_WARNING("Unsupported filter type!");
}
fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_MIN_FILTER, LOCAL_GL_LINEAR);
fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_MAG_FILTER, LOCAL_GL_LINEAR);
}
}
BasicTextureImage::~BasicTextureImage() BasicTextureImage::~BasicTextureImage()
{ {
GLContext *ctx = mGLContext; GLContext *ctx = mGLContext;
@ -646,6 +660,13 @@ BasicTextureImage::BindTexture(GLenum aTextureUnit)
mGLContext->fActiveTexture(LOCAL_GL_TEXTURE0); mGLContext->fActiveTexture(LOCAL_GL_TEXTURE0);
} }
void
BasicTextureImage::ApplyFilter()
{
mGLContext->ApplyFilterToBoundTexture(mFilter);
}
already_AddRefed<gfxASurface> already_AddRefed<gfxASurface>
BasicTextureImage::GetSurfaceForUpdate(const gfxIntSize& aSize, ImageFormat aFmt) BasicTextureImage::GetSurfaceForUpdate(const gfxIntSize& aSize, ImageFormat aFmt)
{ {
@ -928,6 +949,12 @@ TiledTextureImage::BindTexture(GLenum aTextureUnit)
mImages[mCurrentImage]->BindTexture(aTextureUnit); mImages[mCurrentImage]->BindTexture(aTextureUnit);
} }
void
TiledTextureImage::ApplyFilter()
{
mGL->ApplyFilterToBoundTexture(mFilter);
}
/* /*
* simple resize, just discards everything. we can be more clever just * simple resize, just discards everything. we can be more clever just
* adding or discarding tiles, but do we want this? * adding or discarding tiles, but do we want this?

View File

@ -257,6 +257,11 @@ public:
virtual void BindTexture(GLenum aTextureUnit) = 0; virtual void BindTexture(GLenum aTextureUnit) = 0;
virtual void ReleaseTexture() {}; virtual void ReleaseTexture() {};
void BindTextureAndApplyFilter(GLenum aTextureUnit) {
BindTexture(aTextureUnit);
ApplyFilter();
}
class ScopedBindTexture class ScopedBindTexture
{ {
public: public:
@ -275,10 +280,22 @@ public:
} }
} }
private: protected:
TextureImage *mTexture; TextureImage *mTexture;
}; };
class ScopedBindTextureAndApplyFilter
: public ScopedBindTexture
{
public:
ScopedBindTextureAndApplyFilter(TextureImage *aTexture, GLenum aTextureUnit) :
ScopedBindTexture(aTexture, aTextureUnit)
{
if (mTexture) {
mTexture->ApplyFilter();
}
}
};
/** /**
* Returns the shader program type that should be used to render * Returns the shader program type that should be used to render
@ -306,6 +323,8 @@ public:
bool IsRGB() const { return mIsRGBFormat; } bool IsRGB() const { return mIsRGBFormat; }
void SetFilter(gfxPattern::GraphicsFilter aFilter) { mFilter = aFilter; }
protected: protected:
friend class GLContext; friend class GLContext;
@ -324,11 +343,18 @@ protected:
, mIsRGBFormat(aIsRGB) , mIsRGBFormat(aIsRGB)
{} {}
/**
* Applies this TextureImage's filter, assuming that its texture is
* the currently bound texture.
*/
virtual void ApplyFilter() = 0;
nsIntSize mSize; nsIntSize mSize;
GLenum mWrapMode; GLenum mWrapMode;
ContentType mContentType; ContentType mContentType;
bool mIsRGBFormat; bool mIsRGBFormat;
ShaderProgramType mShaderType; ShaderProgramType mShaderType;
gfxPattern::GraphicsFilter mFilter;
}; };
/** /**
@ -391,6 +417,8 @@ protected:
// The offset into the update surface at which the update rect is located. // The offset into the update surface at which the update rect is located.
nsIntPoint mUpdateOffset; nsIntPoint mUpdateOffset;
virtual void ApplyFilter();
}; };
/** /**
@ -434,6 +462,8 @@ protected:
// The region of update requested // The region of update requested
nsIntRegion mUpdateRegion; nsIntRegion mUpdateRegion;
TextureState mTextureState; TextureState mTextureState;
virtual void ApplyFilter();
}; };
struct THEBES_API ContextFormat struct THEBES_API ContextFormat
@ -660,6 +690,12 @@ public:
*/ */
virtual bool ReleaseTexImage() { return false; } virtual bool ReleaseTexImage() { return false; }
/**
* Applies aFilter to the texture currently bound to GL_TEXTURE_2D.
*/
void ApplyFilterToBoundTexture(gfxPattern::GraphicsFilter aFilter);
/* /*
* Offscreen support API * Offscreen support API
*/ */

View File

@ -1669,6 +1669,11 @@ protected:
bool mBound; bool mBound;
bool mIsLocked; bool mIsLocked;
virtual void ApplyFilter()
{
mGLContext->ApplyFilterToBoundTexture(mFilter);
}
}; };
already_AddRefed<TextureImage> already_AddRefed<TextureImage>

View File

@ -916,6 +916,11 @@ private:
GLXPixmap mPixmap; GLXPixmap mPixmap;
bool mInUpdate; bool mInUpdate;
GLuint mTexture; GLuint mTexture;
virtual void ApplyFilter()
{
mGLContext->ApplyFilterToBoundTexture(mFilter);
}
}; };
already_AddRefed<TextureImage> already_AddRefed<TextureImage>

77
hal/Hal.cpp Normal file
View File

@ -0,0 +1,77 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "Hal.h"
#include "mozilla/Util.h"
#include "nsThreadUtils.h"
#include "nsXULAppAPI.h"
#define PROXY_IF_SANDBOXED(_call) \
do { \
if (InSandbox()) { \
hal_sandbox::_call; \
} else { \
hal_impl::_call; \
} \
} while (0)
namespace mozilla {
namespace hal {
static void
AssertMainThread()
{
MOZ_ASSERT(NS_IsMainThread());
}
static bool
InSandbox()
{
return GeckoProcessType_Content == XRE_GetProcessType();
}
void
Vibrate(const nsTArray<uint32>& pattern)
{
AssertMainThread();
PROXY_IF_SANDBOXED(Vibrate(pattern));
}
} // namespace hal
} // namespace mozilla

86
hal/Hal.h Normal file
View File

@ -0,0 +1,86 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef mozilla_Hal_h
#define mozilla_Hal_h 1
#include "base/basictypes.h"
#include "mozilla/Types.h"
#include "nsTArray.h"
#ifndef MOZ_HAL_NAMESPACE
// This goop plays some cpp tricks to ensure a uniform API across the
// API entry point, "sandbox" implementations (for content processes),
// and "impl" backends where the real work happens. After this runs
// through cpp, there will be three sets of identical APIs
// hal_impl:: --- the platform-specific implementation of an API.
// hal_sandbox:: --- forwards calls up to the parent process
// hal:: --- invokes sandboxed impl if in a sandboxed process,
// otherwise forwards to hal_impl
//
// External code should never invoke hal_impl:: or hal_sandbox:: code
// directly.
# include "HalImpl.h"
# include "HalSandbox.h"
# define MOZ_HAL_NAMESPACE hal
# define MOZ_DEFINED_HAL_NAMESPACE 1
#endif
namespace mozilla {
namespace MOZ_HAL_NAMESPACE /*hal*/ {
/**
* Turn the default vibrator device on/off per the pattern specified
* by |pattern|. Each element in the pattern is the number of
* milliseconds to turn the vibrator on or off. The first element in
* |pattern| is an "on" element, the next is "off", and so on.
*
* If |pattern| is empty, any in-progress vibration is canceled.
*/
void Vibrate(const nsTArray<uint32>& pattern);
}
}
#ifdef MOZ_DEFINED_HAL_NAMESPACE
# undef MOZ_DEFINED_HAL_NAMESPACE
# undef MOZ_HAL_NAMESPACE
#endif
#endif // mozilla_Hal_h

48
hal/HalImpl.h Normal file
View File

@ -0,0 +1,48 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef mozilla_Hal_h
# error "This is an internal file, don't include it"
#endif
#undef mozilla_Hal_h
#define MOZ_HAL_NAMESPACE hal_impl
#include "Hal.h"
#undef MOZ_HAL_NAMESPACE

47
hal/HalSandbox.h Normal file
View File

@ -0,0 +1,47 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef mozilla_Hal_h
# error "This is an internal file, don't include it"
#endif
#undef mozilla_Hal_h
#define MOZ_HAL_NAMESPACE hal_sandbox
#include "Hal.h"
#undef MOZ_HAL_NAMESPACE

71
hal/Makefile.in Normal file
View File

@ -0,0 +1,71 @@
#
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is Mozilla Corporation code.
#
# The Initial Developer of the Original Code is Mozilla Foundation.
# Portions created by the Initial Developer are Copyright (C) 2011
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Chris Jones <jones.chris.g@gmail.com>
#
# Alternatively, the contents of this file may be used under the terms of
# either of the GNU General Public License Version 2 or later (the "GPL"),
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
DEPTH = ..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = \
$(srcdir) \
$(srcdir)/fallback \
$(srcdir)/sandbox \
$(NULL)
include $(DEPTH)/config/autoconf.mk
MODULE = hal
LIBRARY_NAME = hal_s
FORCE_STATIC_LIB = 1
LIBXUL_LIBRARY = 1
EXPORT_LIBRARY = 1
EXPORTS_NAMESPACES = mozilla
EXPORTS_mozilla = \
Hal.h \
HalImpl.h \
HalSandbox.h \
$(NULL)
CPPSRCS = \
Hal.cpp \
SandboxHal.cpp \
$(NULL)
CPPSRCS += FallbackHal.cpp
include $(topsrcdir)/config/config.mk
include $(topsrcdir)/ipc/chromium/chromium-config.mk
include $(topsrcdir)/config/rules.mk

View File

@ -0,0 +1,50 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "Hal.h"
namespace mozilla {
namespace hal_impl {
void
Vibrate(const nsTArray<uint32>& pattern)
{}
} // hal_impl
} // namespace mozilla

55
hal/sandbox/PHal.ipdl Normal file
View File

@ -0,0 +1,55 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
include protocol PContent;
namespace mozilla {
namespace hal_sandbox {
protocol PHal {
manager PContent;
parent:
Vibrate(uint32[] pattern);
__delete__();
};
} // namespace hal
} // namespace mozilla

View File

@ -0,0 +1,94 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "Hal.h"
#include "mozilla/dom/ContentChild.h"
#include "mozilla/hal_sandbox/PHalChild.h"
#include "mozilla/hal_sandbox/PHalParent.h"
using namespace mozilla;
using namespace mozilla::dom;
using namespace mozilla::hal;
namespace mozilla {
namespace hal_sandbox {
static PHalChild* sHal;
static PHalChild*
Hal()
{
if (!sHal) {
sHal = ContentChild::GetSingleton()->SendPHalConstructor();
}
return sHal;
}
void
Vibrate(const nsTArray<uint32>& pattern)
{
AutoInfallibleTArray<uint32, 8> p(pattern);
Hal()->SendVibrate(p);
}
class HalParent : public PHalParent {
public:
NS_OVERRIDE virtual bool
RecvVibrate(const InfallibleTArray<unsigned int>& pattern) {
// Forward to hal::, not hal_impl::, because we might be a
// subprocess of another sandboxed process. The hal:: entry point
// will do the right thing.
hal::Vibrate(pattern);
return true;
}
};
class HalChild : public PHalChild {
public:
};
PHalChild* CreateHalChild() {
return new HalChild();
}
PHalParent* CreateHalParent() {
return new HalParent();
}
} // namespace hal_sandbox
} // namespace mozilla

56
hal/sandbox/SandboxHal.h Normal file
View File

@ -0,0 +1,56 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef mozilla_SandboxHal_h
#define mozilla_SandboxHal_h
namespace mozilla {
namespace hal_sandbox {
class PHalChild;
class PHalParent;
PHalChild* CreateHalChild();
PHalParent* CreateHalParent();
}
}
#endif // mozilla_SandboxHal_h

39
hal/sandbox/ipdl.mk Normal file
View File

@ -0,0 +1,39 @@
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is Mozilla Content App.
#
# The Initial Developer of the Original Code is
# The Mozilla Foundation.
# Portions created by the Initial Developer are Copyright (C) 2011
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
IPDLSRCS = \
PHal.ipdl \
$(NULL)

View File

@ -59,6 +59,7 @@ IPDLDIRS = \
dom/ipc \ dom/ipc \
dom/src/storage \ dom/src/storage \
gfx/layers/ipc \ gfx/layers/ipc \
hal/sandbox \
ipc/testshell \ ipc/testshell \
js/ipc \ js/ipc \
js/jetpack \ js/jetpack \

View File

@ -75,7 +75,19 @@ Types = (
'nsresult', 'nsresult',
'nsString', 'nsString',
'nsCString', 'nsCString',
'mozilla::ipc::Shmem' 'mozilla::ipc::Shmem',
# quasi-stdint types used by "public" Gecko headers
'int8',
'uint8',
'int16',
'uint16',
'int32',
'uint32',
'int64',
'uint64',
'intptr',
'uintptr',
) )

View File

@ -0,0 +1,4 @@
gczeal(2);
string=""
for (var i = 0; i < 100; i++ )
hex=newGlobal('same-compartment');

View File

@ -1595,15 +1595,14 @@ js_XDRFunctionObject(JSXDRState *xdr, JSObject **objp)
* Don't directly store into fun->u.i.script because we want this to happen * Don't directly store into fun->u.i.script because we want this to happen
* at the same time as we set the script's owner. * at the same time as we set the script's owner.
*/ */
JSScript *script = fun->u.i.script; JSScript *script = fun->script();
if (!js_XDRScript(xdr, &script)) if (!js_XDRScript(xdr, &script))
return false; return false;
fun->u.i.script = script;
if (xdr->mode == JSXDR_DECODE) { if (xdr->mode == JSXDR_DECODE) {
*objp = fun; *objp = fun;
fun->u.i.script->setOwnerObject(fun); fun->setScript(script);
if (!fun->u.i.script->typeSetFunction(cx, fun)) if (!fun->script()->typeSetFunction(cx, fun))
return false; return false;
JS_ASSERT(fun->nargs == fun->script()->bindings.countArgs()); JS_ASSERT(fun->nargs == fun->script()->bindings.countArgs());
js_CallNewScriptHook(cx, fun->script(), fun); js_CallNewScriptHook(cx, fun->script(), fun);
@ -2352,7 +2351,7 @@ js_NewFunction(JSContext *cx, JSObject *funobj, Native native, uintN nargs,
JS_ASSERT(!native); JS_ASSERT(!native);
JS_ASSERT(nargs == 0); JS_ASSERT(nargs == 0);
fun->u.i.skipmin = 0; fun->u.i.skipmin = 0;
fun->u.i.script = NULL; fun->u.i.script_ = NULL;
} else { } else {
fun->u.n.clasp = NULL; fun->u.n.clasp = NULL;
if (flags & JSFUN_TRCINFO) { if (flags & JSFUN_TRCINFO) {
@ -2421,22 +2420,21 @@ js_CloneFunctionObject(JSContext *cx, JSFunction *fun, JSObject *parent,
cfun->atom = fun->atom; cfun->atom = fun->atom;
clone->setPrivate(cfun); clone->setPrivate(cfun);
if (cfun->isInterpreted()) { if (cfun->isInterpreted()) {
JSScript *script = cfun->script(); JSScript *script = fun->script();
JS_ASSERT(script); JS_ASSERT(script);
JS_ASSERT(script->compartment() == fun->compartment()); JS_ASSERT(script->compartment() == fun->compartment());
JS_ASSERT(script->compartment() != cx->compartment); JS_ASSERT(script->compartment() != cx->compartment);
JS_OPT_ASSERT(script->ownerObject == fun); JS_OPT_ASSERT(script->ownerObject == fun);
cfun->u.i.script = NULL; cfun->u.i.script_ = NULL;
JSScript *cscript = js_CloneScript(cx, script); JSScript *cscript = js_CloneScript(cx, script);
if (!cscript) if (!cscript)
return NULL; return NULL;
cfun->u.i.script = cscript; cfun->setScript(cscript);
if (!cfun->u.i.script->typeSetFunction(cx, cfun)) if (!cfun->script()->typeSetFunction(cx, cfun))
return NULL; return NULL;
cfun->script()->setOwnerObject(cfun);
js_CallNewScriptHook(cx, cfun->script(), cfun); js_CallNewScriptHook(cx, cfun->script(), cfun);
Debugger::onNewScript(cx, cfun->script(), cfun, Debugger::NewHeldScript); Debugger::onNewScript(cx, cfun->script(), cfun, Debugger::NewHeldScript);
} }

View File

@ -115,9 +115,10 @@ struct JSFunction : public JSObject_Slots2
JSNativeTraceInfo *trcinfo; JSNativeTraceInfo *trcinfo;
} n; } n;
struct Scripted { struct Scripted {
JSScript *script; /* interpreted bytecode descriptor or null */ JSScript *script_; /* interpreted bytecode descriptor or null;
use the setter! */
uint16 skipmin; /* net skip amount up (toward zero) from uint16 skipmin; /* net skip amount up (toward zero) from
script->staticLevel to nearest upvar, script_->staticLevel to nearest upvar,
including upvars in nested functions */ including upvars in nested functions */
js::Shape *names; /* argument and variable names */ js::Shape *names; /* argument and variable names */
} i; } i;
@ -196,7 +197,13 @@ struct JSFunction : public JSObject_Slots2
JSScript *script() const { JSScript *script() const {
JS_ASSERT(isInterpreted()); JS_ASSERT(isInterpreted());
return u.i.script; return u.i.script_;
}
void setScript(JSScript *script) {
JS_ASSERT(isInterpreted());
u.i.script_ = script;
script->setOwnerObject(this);
} }
JSScript * maybeScript() const { JSScript * maybeScript() const {
@ -213,7 +220,7 @@ struct JSFunction : public JSObject_Slots2
} }
static uintN offsetOfNativeOrScript() { static uintN offsetOfNativeOrScript() {
JS_STATIC_ASSERT(offsetof(U, n.native) == offsetof(U, i.script)); JS_STATIC_ASSERT(offsetof(U, n.native) == offsetof(U, i.script_));
JS_STATIC_ASSERT(offsetof(U, n.native) == offsetof(U, nativeOrScript)); JS_STATIC_ASSERT(offsetof(U, n.native) == offsetof(U, nativeOrScript));
return offsetof(JSFunction, u.nativeOrScript); return offsetof(JSFunction, u.nativeOrScript);
} }

View File

@ -888,8 +888,26 @@ MarkThreadDataConservatively(JSTracer *trc, ThreadData *td)
void void
MarkStackRangeConservatively(JSTracer *trc, Value *beginv, Value *endv) MarkStackRangeConservatively(JSTracer *trc, Value *beginv, Value *endv)
{ {
/*
* Normally, the drainMarkStack phase of marking will never trace outside
* of the compartment currently being collected. However, conservative
* scanning during drainMarkStack (as is done for generators) can break
* this invariant. So we disable the compartment assertions in this
* situation.
*/
struct AutoSkipChecking {
JSRuntime *runtime;
JSCompartment *savedCompartment;
AutoSkipChecking(JSRuntime *rt)
: runtime(rt), savedCompartment(rt->gcCheckCompartment) {
rt->gcCheckCompartment = NULL;
}
~AutoSkipChecking() { runtime->gcCheckCompartment = savedCompartment; }
} as(trc->context->runtime);
const jsuword *begin = beginv->payloadWord(); const jsuword *begin = beginv->payloadWord();
const jsuword *end = endv->payloadWord();; const jsuword *end = endv->payloadWord();
#ifdef JS_NUNBOX32 #ifdef JS_NUNBOX32
/* /*
* With 64-bit jsvals on 32-bit systems, we can optimize a bit by * With 64-bit jsvals on 32-bit systems, we can optimize a bit by

View File

@ -388,30 +388,31 @@ TypeSet::add(JSContext *cx, TypeConstraint *constraint, bool callExisting)
if (!callExisting) if (!callExisting)
return; return;
/* If any type is possible, there's no need to worry about specifics. */
if (flags & TYPE_FLAG_UNKNOWN) { if (flags & TYPE_FLAG_UNKNOWN) {
cx->compartment->types.addPending(cx, constraint, this, Type::UnknownType()); cx->compartment->types.addPending(cx, constraint, this, Type::UnknownType());
cx->compartment->types.resolvePending(cx); } else {
return; /* Enqueue type set members stored as bits. */
} for (TypeFlags flag = 1; flag < TYPE_FLAG_ANYOBJECT; flag <<= 1) {
if (flags & flag) {
for (TypeFlags flag = 1; flag < TYPE_FLAG_ANYOBJECT; flag <<= 1) { Type type = Type::PrimitiveType(TypeFlagPrimitive(flag));
if (flags & flag) { cx->compartment->types.addPending(cx, constraint, this, type);
Type type = Type::PrimitiveType(TypeFlagPrimitive(flag)); }
cx->compartment->types.addPending(cx, constraint, this, type);
} }
}
if (flags & TYPE_FLAG_ANYOBJECT) { /* If any object is possible, skip specifics. */
cx->compartment->types.addPending(cx, constraint, this, Type::AnyObjectType()); if (flags & TYPE_FLAG_ANYOBJECT) {
cx->compartment->types.resolvePending(cx); cx->compartment->types.addPending(cx, constraint, this, Type::AnyObjectType());
return; } else {
} /* Enqueue specific object types. */
unsigned count = getObjectCount();
unsigned count = getObjectCount(); for (unsigned i = 0; i < count; i++) {
for (unsigned i = 0; i < count; i++) { TypeObjectKey *object = getObject(i);
TypeObjectKey *object = getObject(i); if (object)
if (object) cx->compartment->types.addPending(cx, constraint, this,
cx->compartment->types.addPending(cx, constraint, this, Type::ObjectType(object)); Type::ObjectType(object));
}
}
} }
cx->compartment->types.resolvePending(cx); cx->compartment->types.resolvePending(cx);

View File

@ -3803,6 +3803,7 @@ BEGIN_CASE(JSOP_GETELEM)
{ {
Value &lref = regs.sp[-2]; Value &lref = regs.sp[-2];
Value &rref = regs.sp[-1]; Value &rref = regs.sp[-1];
Value &rval = regs.sp[-2];
if (lref.isString() && rref.isInt32()) { if (lref.isString() && rref.isInt32()) {
JSString *str = lref.toString(); JSString *str = lref.toString();
int32_t i = rref.toInt32(); int32_t i = rref.toInt32();
@ -3810,9 +3811,9 @@ BEGIN_CASE(JSOP_GETELEM)
str = cx->runtime->staticStrings.getUnitStringForElement(cx, str, size_t(i)); str = cx->runtime->staticStrings.getUnitStringForElement(cx, str, size_t(i));
if (!str) if (!str)
goto error; goto error;
rval.setString(str);
TypeScript::Monitor(cx, script, regs.pc, rval);
regs.sp--; regs.sp--;
regs.sp[-1].setString(str);
TypeScript::Monitor(cx, script, regs.pc, regs.sp[-1]);
len = JSOP_GETELEM_LENGTH; len = JSOP_GETELEM_LENGTH;
DO_NEXT_OP(len); DO_NEXT_OP(len);
} }
@ -3820,9 +3821,9 @@ BEGIN_CASE(JSOP_GETELEM)
if (lref.isMagic(JS_LAZY_ARGUMENTS)) { if (lref.isMagic(JS_LAZY_ARGUMENTS)) {
if (rref.isInt32() && size_t(rref.toInt32()) < regs.fp()->numActualArgs()) { if (rref.isInt32() && size_t(rref.toInt32()) < regs.fp()->numActualArgs()) {
rval = regs.fp()->canonicalActualArg(rref.toInt32());
TypeScript::Monitor(cx, script, regs.pc, rval);
regs.sp--; regs.sp--;
regs.sp[-1] = regs.fp()->canonicalActualArg(rref.toInt32());
TypeScript::Monitor(cx, script, regs.pc, regs.sp[-1]);
len = JSOP_GETELEM_LENGTH; len = JSOP_GETELEM_LENGTH;
DO_NEXT_OP(len); DO_NEXT_OP(len);
} }
@ -3833,58 +3834,48 @@ BEGIN_CASE(JSOP_GETELEM)
JSObject *obj; JSObject *obj;
VALUE_TO_OBJECT(cx, &lref, obj); VALUE_TO_OBJECT(cx, &lref, obj);
const Value *copyFrom; uint32 index;
Value rval; if (IsDefinitelyIndex(rref, &index)) {
jsid id;
if (rref.isInt32()) {
int32_t i = rref.toInt32();
if (obj->isDenseArray()) { if (obj->isDenseArray()) {
jsuint idx = jsuint(i); if (index < obj->getDenseArrayInitializedLength()) {
if (idx < obj->getDenseArrayInitializedLength()) { rval = obj->getDenseArrayElement(index);
copyFrom = &obj->getDenseArrayElement(idx); if (!rval.isMagic())
if (!copyFrom->isMagic())
goto end_getelem; goto end_getelem;
} }
} else if (obj->isArguments()) { } else if (obj->isArguments()) {
uint32 arg = uint32(i); if (obj->asArguments()->getElement(index, &rval))
ArgumentsObject *argsobj = obj->asArguments(); goto end_getelem;
if (arg < argsobj->initialLength()) {
copyFrom = &argsobj->element(arg);
if (!copyFrom->isMagic(JS_ARGS_HOLE)) {
if (StackFrame *afp = argsobj->maybeStackFrame())
copyFrom = &afp->canonicalActualArg(arg);
goto end_getelem;
}
}
} }
if (JS_LIKELY(INT_FITS_IN_JSID(i)))
id = INT_TO_JSID(i); if (!obj->getElement(cx, index, &rval))
else goto error;
goto intern_big_int;
} else { } else {
int32_t i; if (script->hasAnalysis() && !regs.fp()->hasImacropc())
if (ValueFitsInInt32(rref, &i) && INT_FITS_IN_JSID(i)) { script->analysis()->getCode(regs.pc).getStringElement = true;
id = INT_TO_JSID(i);
} else { SpecialId special;
intern_big_int: if (ValueIsSpecial(obj, &rref, &special, cx)) {
if (!js_InternNonIntElementId(cx, obj, rref, &id)) if (!obj->getSpecial(cx, special, &rval))
goto error; goto error;
} else {
JSAtom *name;
if (!js_ValueToAtom(cx, rref, &name))
goto error;
if (name->isIndex(&index)) {
if (!obj->getElement(cx, index, &rval))
goto error;
} else {
if (!obj->getProperty(cx, name->asPropertyName(), &rval))
goto error;
}
} }
} }
if (JSID_IS_STRING(id) && script->hasAnalysis() && !regs.fp()->hasImacropc())
script->analysis()->getCode(regs.pc).getStringElement = true;
if (!obj->getGeneric(cx, id, &rval))
goto error;
copyFrom = &rval;
end_getelem: end_getelem:
assertSameCompartment(cx, rval);
TypeScript::Monitor(cx, script, regs.pc, rval);
regs.sp--; regs.sp--;
regs.sp[-1] = *copyFrom;
assertSameCompartment(cx, regs.sp[-1]);
TypeScript::Monitor(cx, script, regs.pc, regs.sp[-1]);
} }
END_CASE(JSOP_GETELEM) END_CASE(JSOP_GETELEM)

View File

@ -613,6 +613,32 @@ ValueFitsInInt32(const Value &v, int32_t *pi)
return v.isDouble() && JSDOUBLE_IS_INT32(v.toDouble(), pi); return v.isDouble() && JSDOUBLE_IS_INT32(v.toDouble(), pi);
} }
/*
* Returns true if the given value is definitely an index: that is, the value
* is a number that's an unsigned 32-bit integer.
*
* This method prioritizes common-case speed over accuracy in every case. It
* can produce false negatives (but not false positives): some values which are
* indexes will be reported not to be indexes by this method. Users must
* consider this possibility when using this method.
*/
static JS_ALWAYS_INLINE bool
IsDefinitelyIndex(const Value &v, uint32 *indexp)
{
if (v.isInt32() && v.toInt32() >= 0) {
*indexp = v.toInt32();
return true;
}
int32 i;
if (v.isDouble() && JSDOUBLE_IS_INT32(v.toDouble(), &i) && i >= 0) {
*indexp = uint32(i);
return true;
}
return false;
}
/* ES5 9.4 ToInteger. */ /* ES5 9.4 ToInteger. */
static inline bool static inline bool
ToInteger(JSContext *cx, const js::Value &v, jsdouble *dp) ToInteger(JSContext *cx, const js::Value &v, jsdouble *dp)

View File

@ -1784,6 +1784,29 @@ ObjectClassIs(JSObject &obj, ESClassValue classValue, JSContext *cx)
return false; return false;
} }
static JS_ALWAYS_INLINE bool
ValueIsSpecial(JSObject *obj, Value *propval, SpecialId *sidp, JSContext *cx)
{
if (!propval->isObject())
return false;
#if JS_HAS_XML_SUPPORT
if (obj->isXML()) {
*sidp = SpecialId(propval->toObject());
return true;
}
JSObject &propobj = propval->toObject();
JSAtom *name;
if (propobj.isQName() && GetLocalNameFromFunctionQName(&propobj, &name, cx)) {
propval->setString(name);
return false;
}
#endif
return false;
}
} /* namespace js */ } /* namespace js */
inline JSObject * inline JSObject *

View File

@ -1215,7 +1215,7 @@ JSScript::NewScriptFromCG(JSContext *cx, JSCodeGenerator *cg)
fun = NULL; fun = NULL;
if (cg->inFunction()) { if (cg->inFunction()) {
/* /*
* We initialize fun->u.i.script to be the script constructed above * We initialize fun->script() to be the script constructed above
* so that the debugger has a valid fun->script(). * so that the debugger has a valid fun->script().
*/ */
fun = cg->fun(); fun = cg->fun();
@ -1238,8 +1238,7 @@ JSScript::NewScriptFromCG(JSContext *cx, JSCodeGenerator *cg)
if (!script->typeSetFunction(cx, fun, singleton)) if (!script->typeSetFunction(cx, fun, singleton))
return NULL; return NULL;
fun->u.i.script = script; fun->setScript(script);
script->setOwnerObject(fun);
} else { } else {
/* /*
* Initialize script->object, if necessary, so that the debugger has a * Initialize script->object, if necessary, so that the debugger has a

View File

@ -2808,24 +2808,33 @@ ReportBadXMLName(JSContext *cx, const Value &idval)
js_ReportValueError(cx, JSMSG_BAD_XML_NAME, JSDVG_IGNORE_STACK, idval, NULL); js_ReportValueError(cx, JSMSG_BAD_XML_NAME, JSDVG_IGNORE_STACK, idval, NULL);
} }
static bool namespace js {
GetLocalNameFromFunctionQName(JSObject *qn, jsid *funidp, JSContext *cx)
bool
GetLocalNameFromFunctionQName(JSObject *qn, JSAtom **namep, JSContext *cx)
{ {
JSAtom *atom = cx->runtime->atomState.functionNamespaceURIAtom; JSAtom *atom = cx->runtime->atomState.functionNamespaceURIAtom;
JSLinearString *uri = qn->getNameURI(); JSLinearString *uri = qn->getNameURI();
if (uri && (uri == atom || EqualStrings(uri, atom))) { if (uri && (uri == atom || EqualStrings(uri, atom))) {
*funidp = ATOM_TO_JSID(qn->getQNameLocalName()); *namep = qn->getQNameLocalName();
return true; return true;
} }
return false; return false;
} }
} /* namespace js */
bool bool
js_GetLocalNameFromFunctionQName(JSObject *obj, jsid *funidp, JSContext *cx) js_GetLocalNameFromFunctionQName(JSObject *obj, jsid *funidp, JSContext *cx)
{ {
if (!obj->isQName()) if (!obj->isQName())
return false; return false;
return GetLocalNameFromFunctionQName(obj, funidp, cx); JSAtom *name;
if (GetLocalNameFromFunctionQName(obj, &name, cx)) {
*funidp = ATOM_TO_JSID(name);
return true;
}
return false;
} }
static JSObject * static JSObject *
@ -2893,8 +2902,10 @@ construct:
return NULL; return NULL;
out: out:
if (!GetLocalNameFromFunctionQName(obj, funidp, cx)) JSAtom *localName;
*funidp = JSID_VOID; *funidp = GetLocalNameFromFunctionQName(obj, &localName, cx)
? ATOM_TO_JSID(localName)
: JSID_VOID;
return obj; return obj;
bad: bad:
@ -7618,8 +7629,11 @@ js_FindXMLProperty(JSContext *cx, const Value &nameval, JSObject **objp, jsid *i
} }
qn = nameobj; qn = nameobj;
if (!GetLocalNameFromFunctionQName(qn, &funid, cx))
funid = JSID_VOID; JSAtom *name;
funid = GetLocalNameFromFunctionQName(qn, &name, cx)
? ATOM_TO_JSID(name)
: JSID_VOID;
obj = cx->stack.currentScriptedScopeChain(); obj = cx->stack.currentScriptedScopeChain();
do { do {

View File

@ -332,4 +332,11 @@ js_TestXMLEquality(JSContext *cx, const js::Value &v1, const js::Value &v2,
extern JSBool extern JSBool
js_ConcatenateXML(JSContext *cx, JSObject *obj1, JSObject *obj2, js::Value *vp); js_ConcatenateXML(JSContext *cx, JSObject *obj1, JSObject *obj2, js::Value *vp);
namespace js {
extern bool
GetLocalNameFromFunctionQName(JSObject *qn, JSAtom **namep, JSContext *cx);
} /* namespace js */
#endif /* jsxml_h___ */ #endif /* jsxml_h___ */

View File

@ -734,7 +734,7 @@ class CallCompiler : public BaseCompiler
/* funPtrReg is still valid. Check if a compilation is needed. */ /* funPtrReg is still valid. Check if a compilation is needed. */
Address scriptAddr(ic.funPtrReg, offsetof(JSFunction, u) + Address scriptAddr(ic.funPtrReg, offsetof(JSFunction, u) +
offsetof(JSFunction::U::Scripted, script)); offsetof(JSFunction::U::Scripted, script_));
masm.loadPtr(scriptAddr, t0); masm.loadPtr(scriptAddr, t0);
/* /*

View File

@ -433,6 +433,7 @@ stubs::GetElem(VMFrame &f)
Value &lref = regs.sp[-2]; Value &lref = regs.sp[-2];
Value &rref = regs.sp[-1]; Value &rref = regs.sp[-1];
Value &rval = regs.sp[-2];
if (lref.isString() && rref.isInt32()) { if (lref.isString() && rref.isInt32()) {
JSString *str = lref.toString(); JSString *str = lref.toString();
int32_t i = rref.toInt32(); int32_t i = rref.toInt32();
@ -440,14 +441,14 @@ stubs::GetElem(VMFrame &f)
str = f.cx->runtime->staticStrings.getUnitStringForElement(cx, str, (size_t)i); str = f.cx->runtime->staticStrings.getUnitStringForElement(cx, str, (size_t)i);
if (!str) if (!str)
THROW(); THROW();
f.regs.sp[-2].setString(str); rval.setString(str);
return; return;
} }
} }
if (lref.isMagic(JS_LAZY_ARGUMENTS)) { if (lref.isMagic(JS_LAZY_ARGUMENTS)) {
if (rref.isInt32() && size_t(rref.toInt32()) < regs.fp()->numActualArgs()) { if (rref.isInt32() && size_t(rref.toInt32()) < regs.fp()->numActualArgs()) {
regs.sp[-2] = regs.fp()->canonicalActualArg(rref.toInt32()); rval = regs.fp()->canonicalActualArg(rref.toInt32());
return; return;
} }
MarkArgumentsCreated(cx, f.script()); MarkArgumentsCreated(cx, f.script());
@ -458,54 +459,40 @@ stubs::GetElem(VMFrame &f)
if (!obj) if (!obj)
THROW(); THROW();
const Value *copyFrom; uint32 index;
Value rval; if (IsDefinitelyIndex(rref, &index)) {
jsid id;
if (rref.isInt32()) {
int32_t i = rref.toInt32();
if (obj->isDenseArray()) { if (obj->isDenseArray()) {
jsuint idx = jsuint(i); if (index < obj->getDenseArrayInitializedLength()) {
rval = obj->getDenseArrayElement(index);
if (idx < obj->getDenseArrayInitializedLength()) { if (!rval.isMagic())
copyFrom = &obj->getDenseArrayElement(idx); return;
if (!copyFrom->isMagic())
goto end_getelem;
} }
} else if (obj->isArguments()) { } else if (obj->isArguments()) {
uint32 arg = uint32(i); if (obj->asArguments()->getElement(index, &rval))
ArgumentsObject *argsobj = obj->asArguments(); return;
}
if (arg < argsobj->initialLength()) { if (!obj->getElement(cx, index, &rval))
copyFrom = &argsobj->element(arg); THROW();
if (!copyFrom->isMagic()) { } else {
if (StackFrame *afp = argsobj->maybeStackFrame()) SpecialId special;
copyFrom = &afp->canonicalActualArg(arg); if (ValueIsSpecial(obj, &rref, &special, cx)) {
goto end_getelem; if (!obj->getSpecial(cx, special, &rval))
} THROW();
} else {
JSAtom *name;
if (!js_ValueToAtom(cx, rref, &name))
THROW();
if (name->isIndex(&index)) {
if (!obj->getElement(cx, index, &rval))
THROW();
} else {
if (!obj->getProperty(cx, name->asPropertyName(), &rval))
THROW();
} }
} }
if (JS_LIKELY(INT_FITS_IN_JSID(i)))
id = INT_TO_JSID(i);
else
goto intern_big_int;
} else {
int32_t i;
if (ValueFitsInInt32(rref, &i) && INT_FITS_IN_JSID(i)) {
id = INT_TO_JSID(i);
} else {
intern_big_int:
if (!js_InternNonIntElementId(cx, obj, rref, &id))
THROW();
}
} }
if (!obj->getGeneric(cx, id, &rval))
THROW();
copyFrom = &rval;
end_getelem:
f.regs.sp[-2] = *copyFrom;
} }
static inline bool static inline bool

View File

@ -2736,7 +2736,7 @@ Clone(JSContext *cx, uintN argc, jsval *vp)
} }
if (funobj->compartment() != cx->compartment) { if (funobj->compartment() != cx->compartment) {
JSFunction *fun = funobj->getFunctionPrivate(); JSFunction *fun = funobj->getFunctionPrivate();
if (fun->isInterpreted() && fun->u.i.script->compileAndGo) { if (fun->isInterpreted() && fun->script()->compileAndGo) {
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_UNEXPECTED_TYPE, JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_UNEXPECTED_TYPE,
"function", "compile-and-go"); "function", "compile-and-go");
return JS_FALSE; return JS_FALSE;

View File

@ -141,10 +141,9 @@ GlobalObject::initFunctionAndObjectClasses(JSContext *cx)
script->noScriptRval = true; script->noScriptRval = true;
script->code[0] = JSOP_STOP; script->code[0] = JSOP_STOP;
script->code[1] = SRC_NULL; script->code[1] = SRC_NULL;
functionProto->u.i.script = script; functionProto->setScript(script);
functionProto->getType(cx)->interpretedFunction = functionProto; functionProto->getType(cx)->interpretedFunction = functionProto;
script->hasFunction = true; script->hasFunction = true;
script->setOwnerObject(functionProto);
} }
/* Create the Object function now that we have a [[Prototype]] for it. */ /* Create the Object function now that we have a [[Prototype]] for it. */

View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<body>
<canvas id="A" width=200 height=50></canvas><br />
<canvas id="B" width=200 height=50></canvas>
<script>
var canvasA = document.getElementById("A"),
ctxA = canvasA.getContext('2d'),
canvasB = document.getElementById("B"),
ctxB = canvasB.getContext('2d'),
width = canvasA.width,
height = canvasA.height;
ctxB.fillStyle = 'red';
ctxB.fillRect(0, 0, width, height);
</script>
</body>
</html>

View File

@ -0,0 +1,24 @@
<!DOCTYPE html>
<html>
<body>
<canvas id="A" width=200 height=50></canvas><br />
<canvas id="B" width=200 height=50></canvas>
<script>
var canvasA = document.getElementById("A"),
ctxA = canvasA.getContext('2d'),
canvasB = document.getElementById("B"),
ctxB = canvasB.getContext('2d'),
width = canvasA.width,
height = canvasA.height;
ctxA.fillStyle = 'red';
ctxA.fillRect(0, 0, width, height);
var pat = ctxB.createPattern(canvasA, "repeat");
ctxA.clearRect(0, 0, width, height);
ctxB.fillStyle = pat;
ctxB.fillRect(0, 0, width, height);
</script>
</body>
</html>

View File

@ -1666,3 +1666,4 @@ fails-if(layersGPUAccelerated&&cocoaWidget) == 654950-1.html 654950-1-ref.html #
== 670467-1.html 670467-1-ref.html == 670467-1.html 670467-1-ref.html
== 670467-2.html 670467-2-ref.html == 670467-2.html 670467-2-ref.html
!= 691087-1.html 691087-1-ref.html != 691087-1.html 691087-1-ref.html
== 691571-1.html 691571-1-ref.html

View File

@ -82,6 +82,10 @@
* | | ... | * | | ... |
* |=====================================| * |=====================================|
* *
* NOTE: Due to Mozilla bug 691003, we cannot reserve less than one word for an
* allocation on Linux or Mac. So on 32-bit *nix, the smallest bucket size is
* 4 bytes, and on 64-bit, the smallest bucket size is 8 bytes.
*
* A different mechanism is used for each category: * A different mechanism is used for each category:
* *
* Small : Each size class is segregated into its own set of runs. Each run * Small : Each size class is segregated into its own set of runs. Each run
@ -426,7 +430,7 @@ static const bool __isthreaded = true;
/* Size of stack-allocated buffer passed to strerror_r(). */ /* Size of stack-allocated buffer passed to strerror_r(). */
#define STRERROR_BUF 64 #define STRERROR_BUF 64
/* Minimum alignment of allocations is 2^QUANTUM_2POW_MIN bytes. */ /* Minimum alignment of non-tiny allocations is 2^QUANTUM_2POW_MIN bytes. */
# define QUANTUM_2POW_MIN 4 # define QUANTUM_2POW_MIN 4
#ifdef MOZ_MEMORY_SIZEOF_PTR_2POW #ifdef MOZ_MEMORY_SIZEOF_PTR_2POW
# define SIZEOF_PTR_2POW MOZ_MEMORY_SIZEOF_PTR_2POW # define SIZEOF_PTR_2POW MOZ_MEMORY_SIZEOF_PTR_2POW
@ -515,8 +519,15 @@ static const bool __isthreaded = true;
#define CACHELINE_2POW 6 #define CACHELINE_2POW 6
#define CACHELINE ((size_t)(1U << CACHELINE_2POW)) #define CACHELINE ((size_t)(1U << CACHELINE_2POW))
/* Smallest size class to support. */ /*
* Smallest size class to support. On Linux and Mac, even malloc(1) must
* reserve a word's worth of memory (see Mozilla bug 691003).
*/
#ifdef MOZ_MEMORY_WINDOWS
#define TINY_MIN_2POW 1 #define TINY_MIN_2POW 1
#else
#define TINY_MIN_2POW (sizeof(void*) == 8 ? 3 : 2)
#endif
/* /*
* Maximum size class that is a multiple of the quantum, but not (necessarily) * Maximum size class that is a multiple of the quantum, but not (necessarily)

View File

@ -63,6 +63,7 @@ let Elements = {};
[ [
["contentShowing", "bcast_contentShowing"], ["contentShowing", "bcast_contentShowing"],
["urlbarState", "bcast_urlbarState"], ["urlbarState", "bcast_urlbarState"],
["mainKeyset", "mainKeyset"],
["stack", "stack"], ["stack", "stack"],
["tabList", "tabs"], ["tabList", "tabs"],
["tabs", "tabs-container"], ["tabs", "tabs-container"],
@ -945,9 +946,9 @@ var BrowserUI = {
break; break;
// Window events // Window events
case "keypress": case "keypress":
// Ignore events headed toward the browser; they will be // Ignore events re-dispatched from content; we already
// re-dispatched after content has a chance to handle them. // handled them when they were originally fired.
if (aEvent.target.localName == "browser") if (aEvent.target == Elements.mainKeyset)
break; break;
if (aEvent.keyCode == aEvent.DOM_VK_ESCAPE) if (aEvent.keyCode == aEvent.DOM_VK_ESCAPE)
this.handleEscape(aEvent); this.handleEscape(aEvent);

View File

@ -1236,7 +1236,7 @@ var Browser = {
} }
case "Browser:KeyPress": { case "Browser:KeyPress": {
let keyset = document.getElementById("mainKeyset"); let keyset = Elements.mainKeyset;
keyset.setAttribute("disabled", "false"); keyset.setAttribute("disabled", "false");
if (json.preventDefault) if (json.preventDefault)
break; break;

View File

@ -101,6 +101,20 @@ function testReturnToOwner() {
EventUtils.sendKey("ESCAPE", window); EventUtils.sendKey("ESCAPE", window);
is(Browser.selectedTab, tab1, "tab1 is selected"); is(Browser.selectedTab, tab1, "tab1 is selected");
closeTabs(); closeTabs();
testContextMenu();
}
function testContextMenu() {
ContextHelper.showPopup({
json: {
types: ['link']
},
target: Browser.selectedBrowser
});
ok(ContextHelper.popupState, "Context menu is shown");
Browser.selectedBrowser.focus();
EventUtils.synthesizeKey("VK_ESCAPE", {type: "keypress"}, window);
ok(!ContextHelper.popupState, "Context menu is dismissed");
finish(); finish();
} }

View File

@ -791,6 +791,15 @@
<method name="_init"> <method name="_init">
<body> <body>
<![CDATA[ <![CDATA[
// We'll default to YYYY/MM/DD to start.
var yfield = "input-one";
var mfield = "input-two";
var dfield = "input-three";
var twoDigitYear = false;
this.yearLeadingZero = true;
this.monthLeadingZero = true;
this.dateLeadingZero = true;
var numberOrder = /^(\D*)\s*(\d+)(\D*)(\d+)(\D*)(\d+)\s*(\D*)$/; var numberOrder = /^(\D*)\s*(\d+)(\D*)(\d+)(\D*)(\d+)\s*(\D*)$/;
var dt = new Date(2002,9,4).toLocaleFormat("%x"); var dt = new Date(2002,9,4).toLocaleFormat("%x");
@ -799,11 +808,8 @@
this._separatorFirst.value = numberFields[3]; this._separatorFirst.value = numberFields[3];
this._separatorSecond.value = numberFields[5]; this._separatorSecond.value = numberFields[5];
var twoDigitYear = false;
var yfield = "input-one";
var mfield = "input-two";
var dfield = "input-three";
var yi = 2, mi = 4, di = 6; var yi = 2, mi = 4, di = 6;
for (var i = 1; i < numberFields.length; i++) { for (var i = 1; i < numberFields.length; i++) {
switch (Number(numberFields[i])) { switch (Number(numberFields[i])) {
case 2: case 2:
@ -825,6 +831,10 @@
break; break;
} }
} }
this.yearLeadingZero = (numberFields[yi].length > 1);
this.monthLeadingZero = (numberFields[mi].length > 1);
this.dateLeadingZero = (numberFields[di].length > 1);
} }
this.yearField = document.getAnonymousElementByAttribute(this, "anonid", yfield); this.yearField = document.getAnonymousElementByAttribute(this, "anonid", yfield);
@ -834,10 +844,6 @@
this.monthField = document.getAnonymousElementByAttribute(this, "anonid", mfield); this.monthField = document.getAnonymousElementByAttribute(this, "anonid", mfield);
this.dateField = document.getAnonymousElementByAttribute(this, "anonid", dfield); this.dateField = document.getAnonymousElementByAttribute(this, "anonid", dfield);
this.yearLeadingZero = (numberFields[yi].length > 1);
this.monthLeadingZero = (numberFields[mi].length > 1);
this.dateLeadingZero = (numberFields[di].length > 1);
this._fieldAMPM.parentNode.collapsed = true; this._fieldAMPM.parentNode.collapsed = true;
this.yearField.size = twoDigitYear ? 2 : 4; this.yearField.size = twoDigitYear ? 2 : 4;
this.yearField.maxLength = twoDigitYear ? 2 : 4; this.yearField.maxLength = twoDigitYear ? 2 : 4;

View File

@ -12,7 +12,8 @@
<binding id="notificationbox"> <binding id="notificationbox">
<content> <content>
<xul:stack xbl:inherits="hidden=notificationshidden"> <xul:stack xbl:inherits="hidden=notificationshidden"
class="notificationbox-stack">
<xul:spacer/> <xul:spacer/>
<children includes="notification"/> <children includes="notification"/>
</xul:stack> </xul:stack>

View File

@ -191,6 +191,10 @@ notificationbox {
-moz-box-orient: vertical; -moz-box-orient: vertical;
} }
.notificationbox-stack {
overflow: -moz-hidden-unscrollable;
}
notification { notification {
-moz-binding: url("chrome://global/content/bindings/notification.xml#notification"); -moz-binding: url("chrome://global/content/bindings/notification.xml#notification");
-moz-transition: margin-top 300ms, opacity 300ms; -moz-transition: margin-top 300ms, opacity 300ms;

View File

@ -96,6 +96,7 @@ STATIC_LIBS += \
ipcshell_s \ ipcshell_s \
gfx2d \ gfx2d \
gfxipc_s \ gfxipc_s \
hal_s \
$(NULL) $(NULL)
ifdef MOZ_IPDL_TESTS ifdef MOZ_IPDL_TESTS

View File

@ -734,6 +734,10 @@ MAKEFILES_startupcache="
startupcache/Makefile startupcache/Makefile
" "
MAKEFILES_hal="
hal/Makefile
"
add_makefiles " add_makefiles "
$MAKEFILES_db $MAKEFILES_db
$MAKEFILES_dom $MAKEFILES_dom
@ -775,6 +779,7 @@ add_makefiles "
$MAKEFILES_libmar $MAKEFILES_libmar
$MAKEFILES_extensions $MAKEFILES_extensions
$MAKEFILES_startupcache $MAKEFILES_startupcache
$MAKEFILES_hal
" "
# #

View File

@ -94,6 +94,7 @@ tier_platform_dirs += gfx/qcms
tier_platform_dirs += ipc js/ipc js/jetpack tier_platform_dirs += ipc js/ipc js/jetpack
tier_platform_dirs += \ tier_platform_dirs += \
hal \
js/src/xpconnect \ js/src/xpconnect \
intl/chardet \ intl/chardet \
$(NULL) $(NULL)

View File

@ -60,6 +60,7 @@
#endif // MOZ_WIDGET_QT #endif // MOZ_WIDGET_QT
#include "mozilla/dom/ContentParent.h" #include "mozilla/dom/ContentParent.h"
#include "mozilla/dom/ContentChild.h"
#include "nsAppRunner.h" #include "nsAppRunner.h"
#include "nsUpdateDriver.h" #include "nsUpdateDriver.h"
@ -253,6 +254,7 @@ static char **gQtOnlyArgv;
#include "BinaryPath.h" #include "BinaryPath.h"
using mozilla::dom::ContentParent; using mozilla::dom::ContentParent;
using mozilla::dom::ContentChild;
// Save literal putenv string to environment variable. // Save literal putenv string to environment variable.
static void static void
@ -607,7 +609,8 @@ NS_INTERFACE_MAP_BEGIN(nsXULAppInfo)
#ifdef MOZ_CRASHREPORTER #ifdef MOZ_CRASHREPORTER
NS_INTERFACE_MAP_ENTRY(nsICrashReporter) NS_INTERFACE_MAP_ENTRY(nsICrashReporter)
#endif #endif
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIXULAppInfo, gAppData) NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIXULAppInfo, gAppData ||
XRE_GetProcessType() == GeckoProcessType_Content)
NS_INTERFACE_MAP_END NS_INTERFACE_MAP_END
NS_IMETHODIMP_(nsrefcnt) NS_IMETHODIMP_(nsrefcnt)
@ -625,6 +628,10 @@ nsXULAppInfo::Release()
NS_IMETHODIMP NS_IMETHODIMP
nsXULAppInfo::GetVendor(nsACString& aResult) nsXULAppInfo::GetVendor(nsACString& aResult)
{ {
if (XRE_GetProcessType() == GeckoProcessType_Content) {
NS_WARNING("Attempt to get unavailable information in content process.");
return NS_ERROR_NOT_AVAILABLE;
}
aResult.Assign(gAppData->vendor); aResult.Assign(gAppData->vendor);
return NS_OK; return NS_OK;
@ -633,6 +640,10 @@ nsXULAppInfo::GetVendor(nsACString& aResult)
NS_IMETHODIMP NS_IMETHODIMP
nsXULAppInfo::GetName(nsACString& aResult) nsXULAppInfo::GetName(nsACString& aResult)
{ {
if (XRE_GetProcessType() == GeckoProcessType_Content) {
NS_WARNING("Attempt to get unavailable information in content process.");
return NS_ERROR_NOT_AVAILABLE;
}
aResult.Assign(gAppData->name); aResult.Assign(gAppData->name);
return NS_OK; return NS_OK;
@ -641,6 +652,10 @@ nsXULAppInfo::GetName(nsACString& aResult)
NS_IMETHODIMP NS_IMETHODIMP
nsXULAppInfo::GetID(nsACString& aResult) nsXULAppInfo::GetID(nsACString& aResult)
{ {
if (XRE_GetProcessType() == GeckoProcessType_Content) {
NS_WARNING("Attempt to get unavailable information in content process.");
return NS_ERROR_NOT_AVAILABLE;
}
aResult.Assign(gAppData->ID); aResult.Assign(gAppData->ID);
return NS_OK; return NS_OK;
@ -649,6 +664,11 @@ nsXULAppInfo::GetID(nsACString& aResult)
NS_IMETHODIMP NS_IMETHODIMP
nsXULAppInfo::GetVersion(nsACString& aResult) nsXULAppInfo::GetVersion(nsACString& aResult)
{ {
if (XRE_GetProcessType() == GeckoProcessType_Content) {
ContentChild* cc = ContentChild::GetSingleton();
aResult = cc->GetAppInfo().version;
return NS_OK;
}
aResult.Assign(gAppData->version); aResult.Assign(gAppData->version);
return NS_OK; return NS_OK;
@ -665,6 +685,11 @@ nsXULAppInfo::GetPlatformVersion(nsACString& aResult)
NS_IMETHODIMP NS_IMETHODIMP
nsXULAppInfo::GetAppBuildID(nsACString& aResult) nsXULAppInfo::GetAppBuildID(nsACString& aResult)
{ {
if (XRE_GetProcessType() == GeckoProcessType_Content) {
ContentChild* cc = ContentChild::GetSingleton();
aResult = cc->GetAppInfo().buildID;
return NS_OK;
}
aResult.Assign(gAppData->buildID); aResult.Assign(gAppData->buildID);
return NS_OK; return NS_OK;

View File

@ -56,6 +56,7 @@ CPPSRCS = \
$(NULL) $(NULL)
OS_LIBS = \ OS_LIBS = \
-ldl \
-lbfd \ -lbfd \
-liberty \ -liberty \
$(NULL) $(NULL)

View File

@ -1284,6 +1284,11 @@ class nsAutoTArray : public nsAutoArrayBase<nsTArray<E, Alloc>, N>
{ {
public: public:
nsAutoTArray() {} nsAutoTArray() {}
template<typename Allocator>
nsAutoTArray(const nsTArray<E, Allocator>& other) {
AppendElements(other);
}
}; };
template<class E, PRUint32 N> template<class E, PRUint32 N>
@ -1291,6 +1296,11 @@ class AutoFallibleTArray : public nsAutoArrayBase<FallibleTArray<E>, N>
{ {
public: public:
AutoFallibleTArray() {} AutoFallibleTArray() {}
template<typename Allocator>
AutoFallibleTArray(const nsTArray<E, Allocator>& other) {
AppendElements(other);
}
}; };
#if defined(MOZALLOC_HAVE_XMALLOC) #if defined(MOZALLOC_HAVE_XMALLOC)
@ -1299,6 +1309,11 @@ class AutoInfallibleTArray : public nsAutoArrayBase<InfallibleTArray<E>, N>
{ {
public: public:
AutoInfallibleTArray() {} AutoInfallibleTArray() {}
template<typename Allocator>
AutoInfallibleTArray(const nsTArray<E, Allocator>& other) {
AppendElements(other);
}
}; };
#endif #endif