merge mozilla-inbound to mozilla-central a=merge

This commit is contained in:
Carsten "Tomcat" Book 2017-06-22 12:47:40 +02:00
commit 4f3bc4dba8
86 changed files with 790 additions and 488 deletions

View file

@ -237,7 +237,13 @@ LazyInstantiator::ShouldInstantiate(const DWORD aClientTid)
} }
nsCOMPtr<nsIFile> clientExe; nsCOMPtr<nsIFile> clientExe;
GetClientExecutableName(aClientTid, getter_AddRefs(clientExe)); if (!GetClientExecutableName(aClientTid, getter_AddRefs(clientExe))) {
#if defined(MOZ_TELEMETRY_REPORTING)
AccumulateTelemetry(NS_LITERAL_STRING("(Failed to retrieve client image name)"));
#endif // defined(MOZ_TELEMETRY_REPORTING)
// We should return true as a failsafe
return true;
}
// Blocklist checks should go here. return false if we should not instantiate. // Blocklist checks should go here. return false if we should not instantiate.
/* /*
@ -340,8 +346,10 @@ LazyInstantiator::AccumulateTelemetry(const nsString& aValue)
Telemetry::ScalarSet(Telemetry::ScalarID::A11Y_INSTANTIATORS, aValue); Telemetry::ScalarSet(Telemetry::ScalarID::A11Y_INSTANTIATORS, aValue);
} }
mTelemetryThread->Shutdown(); if (mTelemetryThread) {
mTelemetryThread = nullptr; mTelemetryThread->Shutdown();
mTelemetryThread = nullptr;
}
} }
#endif // defined(MOZ_TELEMETRY_REPORTING) #endif // defined(MOZ_TELEMETRY_REPORTING)

View file

@ -14,7 +14,7 @@ add_task(async function test_manifest_commands() {
}); });
let expectedError = ( let expectedError = (
String.raw`commands.toggle-feature.suggested_key.default: Value must either: ` + String.raw`commands.toggle-feature.suggested_key.default: Value "Shifty+Y" must either: ` +
String.raw`match the pattern /^\s*(Alt|Ctrl|Command|MacCtrl)\s*\+\s*(Shift\s*\+\s*)?([A-Z0-9]|Comma|Period|Home|End|PageUp|PageDown|Space|Insert|Delete|Up|Down|Left|Right)\s*$/, ` + String.raw`match the pattern /^\s*(Alt|Ctrl|Command|MacCtrl)\s*\+\s*(Shift\s*\+\s*)?([A-Z0-9]|Comma|Period|Home|End|PageUp|PageDown|Space|Insert|Delete|Up|Down|Left|Right)\s*$/, ` +
String.raw`match the pattern /^\s*((Alt|Ctrl|Command|MacCtrl)\s*\+\s*)?(Shift\s*\+\s*)?(F[1-9]|F1[0-2])\s*$/, or ` + String.raw`match the pattern /^\s*((Alt|Ctrl|Command|MacCtrl)\s*\+\s*)?(Shift\s*\+\s*)?(F[1-9]|F1[0-2])\s*$/, or ` +
String.raw`match the pattern /^(MediaNextTrack|MediaPlayPause|MediaPrevTrack|MediaStop)$/` String.raw`match the pattern /^(MediaNextTrack|MediaPlayPause|MediaPrevTrack|MediaStop)$/`

View file

@ -389,6 +389,14 @@ HistoryListener.prototype = {
// Cancel the load. // Cancel the load.
return false; return false;
}, },
OnLengthChanged(aCount) {
// Ignore, the method is implemented so that XPConnect doesn't throw!
},
OnIndexChanged(aIndex) {
// Ignore, the method is implemented so that XPConnect doesn't throw!
},
} }
/** /**

View file

@ -378,6 +378,14 @@ var SessionHistoryListener = {
this.collect(); this.collect();
}, },
OnLengthChanged(aCount) {
// Ignore, the method is implemented so that XPConnect doesn't throw!
},
OnIndexChanged(aIndex) {
// Ignore, the method is implemented so that XPConnect doesn't throw!
},
QueryInterface: XPCOMUtils.generateQI([ QueryInterface: XPCOMUtils.generateQI([
Ci.nsISHistoryListener, Ci.nsISHistoryListener,
Ci.nsISupportsWeakReference Ci.nsISupportsWeakReference

View file

@ -51,6 +51,8 @@ gyp_vars.update({
'use_x11': 1 if CONFIG['MOZ_X11'] else 0, 'use_x11': 1 if CONFIG['MOZ_X11'] else 0,
'use_glib': 1 if CONFIG['GLIB_LIBS'] else 0, 'use_glib': 1 if CONFIG['GLIB_LIBS'] else 0,
# bug 1373485 - avoid pkg-config for gtk2 in webrtc
'use_gtk': 0,
# turn off mandatory use of NEON and instead use NEON detection # turn off mandatory use of NEON and instead use NEON detection
'arm_neon': 0, 'arm_neon': 0,

View file

@ -367,6 +367,7 @@ private:
MOZ_ASSERT(mActorDestroyed); MOZ_ASSERT(mActorDestroyed);
} }
#ifdef DEBUG
bool bool
IsOnOwningThread() const IsOnOwningThread() const
{ {
@ -375,6 +376,7 @@ private:
bool current; bool current;
return NS_SUCCEEDED(mOwningEventTarget->IsOnCurrentThread(&current)) && current; return NS_SUCCEEDED(mOwningEventTarget->IsOnCurrentThread(&current)) && current;
} }
#endif
void void
AssertIsOnOwningThread() const AssertIsOnOwningThread() const

View file

@ -517,26 +517,6 @@ class SameOriginCheckerImpl final : public nsIChannelEventSink,
NS_DECL_NSIINTERFACEREQUESTOR NS_DECL_NSIINTERFACEREQUESTOR
}; };
class CharsetDetectionObserver final : public nsICharsetDetectionObserver
{
public:
NS_DECL_ISUPPORTS
NS_IMETHOD Notify(const char *aCharset, nsDetectionConfident aConf) override
{
mCharset = aCharset;
return NS_OK;
}
const nsACString& GetResult() const
{
return mCharset;
}
private:
nsCString mCharset;
};
} // namespace } // namespace
/** /**

View file

@ -300,7 +300,6 @@ typedef int32_t EntryId;
struct IdCount struct IdCount
{ {
IdCount() : mId(-1), mCount(0) { }
explicit IdCount(int32_t aId) : mId(aId), mCount(1) { } explicit IdCount(int32_t aId) : mId(aId), mCount(1) { }
int32_t mId; int32_t mId;
int32_t mCount; int32_t mCount;

View file

@ -416,7 +416,6 @@ RGBA4 : 0x8056,
RGB5_A1 : 0x8057, RGB5_A1 : 0x8057,
RGB565 : 0x8D62, RGB565 : 0x8D62,
DEPTH_COMPONENT16 : 0x81A5, DEPTH_COMPONENT16 : 0x81A5,
STENCIL_INDEX : 0x1901,
STENCIL_INDEX8 : 0x8D48, STENCIL_INDEX8 : 0x8D48,
DEPTH_STENCIL : 0x84F9, DEPTH_STENCIL : 0x84F9,
@ -473,6 +472,7 @@ canvas : "implementation-dependent"
// added in versions of the spec that are backward-compatible with // added in versions of the spec that are backward-compatible with
// this version // this version
var ignoredProperties = [ var ignoredProperties = [
'STENCIL_INDEX'
]; ];
// Constants removed from the WebGL spec compared to ES 2.0 // Constants removed from the WebGL spec compared to ES 2.0

View file

@ -304,7 +304,6 @@ RGBA4 : 0x8056,
RGB5_A1 : 0x8057, RGB5_A1 : 0x8057,
RGB565 : 0x8D62, RGB565 : 0x8D62,
DEPTH_COMPONENT16 : 0x81A5, DEPTH_COMPONENT16 : 0x81A5,
STENCIL_INDEX : 0x1901,
STENCIL_INDEX8 : 0x8D48, STENCIL_INDEX8 : 0x8D48,
DEPTH_STENCIL : 0x84F9, DEPTH_STENCIL : 0x84F9,
RENDERBUFFER_WIDTH : 0x8D42, RENDERBUFFER_WIDTH : 0x8D42,

View file

@ -412,7 +412,6 @@ RGBA4 : 0x8056,
RGB5_A1 : 0x8057, RGB5_A1 : 0x8057,
RGB565 : 0x8D62, RGB565 : 0x8D62,
DEPTH_COMPONENT16 : 0x81A5, DEPTH_COMPONENT16 : 0x81A5,
STENCIL_INDEX : 0x1901,
STENCIL_INDEX8 : 0x8D48, STENCIL_INDEX8 : 0x8D48,
DEPTH_STENCIL : 0x84F9, DEPTH_STENCIL : 0x84F9,
@ -739,6 +738,7 @@ canvas : "implementation-dependent"
// added in versions of the spec that are backward-compatible with // added in versions of the spec that are backward-compatible with
// this version // this version
var ignoredProperties = [ var ignoredProperties = [
'STENCIL_INDEX'
]; ];
// Constants removed from the WebGL spec compared to ES 3.0 // Constants removed from the WebGL spec compared to ES 3.0

View file

@ -23,10 +23,6 @@ namespace {
class ReleaseRunnable final : public Runnable class ReleaseRunnable final : public Runnable
{ {
public: public:
ReleaseRunnable()
: Runnable("ReleaseRunnable")
{}
static void static void
MaybeReleaseOnMainThread(nsTArray<RefPtr<Promise>>& aPromises, MaybeReleaseOnMainThread(nsTArray<RefPtr<Promise>>& aPromises,
nsTArray<RefPtr<GetFilesCallback>>& aCallbacks, nsTArray<RefPtr<GetFilesCallback>>& aCallbacks,
@ -61,6 +57,7 @@ private:
nsTArray<RefPtr<GetFilesCallback>>& aCallbacks, nsTArray<RefPtr<GetFilesCallback>>& aCallbacks,
Sequence<RefPtr<File>>& aFiles, Sequence<RefPtr<File>>& aFiles,
already_AddRefed<nsIGlobalObject> aGlobal) already_AddRefed<nsIGlobalObject> aGlobal)
: Runnable("ReleaseRunnable")
{ {
mPromises.SwapElements(aPromises); mPromises.SwapElements(aPromises);
mCallbacks.SwapElements(aCallbacks); mCallbacks.SwapElements(aCallbacks);

View file

@ -1365,11 +1365,6 @@ HTMLCanvasElement::OnVisibilityChange()
return NS_OK; return NS_OK;
} }
void Revoke()
{
mRenderer = nullptr;
}
private: private:
RefPtr<AsyncCanvasRenderer> mRenderer; RefPtr<AsyncCanvasRenderer> mRenderer;
}; };
@ -1407,11 +1402,6 @@ HTMLCanvasElement::OnMemoryPressure()
return NS_OK; return NS_OK;
} }
void Revoke()
{
mRenderer = nullptr;
}
private: private:
RefPtr<AsyncCanvasRenderer> mRenderer; RefPtr<AsyncCanvasRenderer> mRenderer;
}; };

View file

@ -2712,15 +2712,8 @@ private:
DoUpgradeInternal(mozIStorageConnection* aConnection, DoUpgradeInternal(mozIStorageConnection* aConnection,
const nsACString& aOrigin); const nsACString& aOrigin);
UpgradeSchemaFrom17_0To18_0Helper() UpgradeSchemaFrom17_0To18_0Helper() = delete;
{ ~UpgradeSchemaFrom17_0To18_0Helper() = delete;
MOZ_ASSERT_UNREACHABLE("Don't create instances of this class!");
}
~UpgradeSchemaFrom17_0To18_0Helper()
{
MOZ_ASSERT_UNREACHABLE("Don't create instances of this class!");
}
}; };
class UpgradeSchemaFrom17_0To18_0Helper::InsertIndexDataValuesFunction final class UpgradeSchemaFrom17_0To18_0Helper::InsertIndexDataValuesFunction final
@ -6454,12 +6447,6 @@ public:
void void
Invalidate(); Invalidate();
const PrincipalInfo&
GetPrincipalInfo() const
{
return mPrincipalInfo;
}
bool bool
IsOwnedByProcess(ContentParentId aContentParentId) const IsOwnedByProcess(ContentParentId aContentParentId) const
{ {
@ -6535,12 +6522,6 @@ public:
return mFactory->GetLoggingInfo(); return mFactory->GetLoggingInfo();
} }
void
ReleaseTransactionThreadObjects();
void
ReleaseBackgroundThreadObjects();
bool bool
RegisterTransaction(TransactionBase* aTransaction); RegisterTransaction(TransactionBase* aTransaction);
@ -7700,12 +7681,6 @@ struct FactoryOp::MaybeBlockedDatabaseInfo final
return mDatabase == aOther.mDatabase; return mDatabase == aOther.mDatabase;
} }
bool
operator<(const MaybeBlockedDatabaseInfo& aOther) const
{
return mDatabase < aOther.mDatabase;
}
Database* Database*
operator->() MOZ_NO_ADDREF_RELEASE_ON_RETURN operator->() MOZ_NO_ADDREF_RELEASE_ON_RETURN
{ {
@ -7743,12 +7718,6 @@ public:
already_AddRefed<ContentParent> aContentParent, already_AddRefed<ContentParent> aContentParent,
const CommonFactoryRequestParams& aParams); const CommonFactoryRequestParams& aParams);
bool
IsOtherProcessActor() const
{
return mOptionalContentParentId.isSome();
}
private: private:
~OpenDatabaseOp() override ~OpenDatabaseOp() override
{ {

View file

@ -309,12 +309,6 @@ public:
return nullptr; return nullptr;
} }
static bool
IsLoadModuleOnStack()
{
return sIsLoadModuleOnStack;
}
class MOZ_RAII NotifyLoadingModule class MOZ_RAII NotifyLoadingModule
{ {
public: public:

View file

@ -805,11 +805,13 @@ protected:
MOZ_ASSERT(mActorDestroyed); MOZ_ASSERT(mActorDestroyed);
} }
#ifdef DEBUG
State State
GetState() const GetState() const
{ {
return mState; return mState;
} }
#endif
void void
SetState(State aState) SetState(State aState)

View file

@ -72,12 +72,6 @@ public:
MOZ_ASSERT(aProxy); MOZ_ASSERT(aProxy);
} }
Type
GetType() const
{
return mType;
}
void void
ResolveOrReject(); ResolveOrReject();

View file

@ -255,7 +255,6 @@ WebBrowserPersistLocalDocument::GetBaseURI() const
return mDocument->GetBaseURI(); return mDocument->GetBaseURI();
} }
namespace { namespace {
// Helper class for ReadResources(). // Helper class for ReadResources().
@ -295,10 +294,6 @@ private:
const char* aNamespaceURI = ""); const char* aNamespaceURI = "");
nsresult OnWalkSubframe(nsIDOMNode* aNode); nsresult OnWalkSubframe(nsIDOMNode* aNode);
bool IsFlagSet(uint32_t aFlag) const {
return mParent->GetPersistFlags() & aFlag;
}
~ResourceReader(); ~ResourceReader();
using IWBP = nsIWebBrowserPersist; using IWBP = nsIWebBrowserPersist;

View file

@ -482,7 +482,6 @@ interface WebGLRenderingContextBase {
const GLenum RGB5_A1 = 0x8057; const GLenum RGB5_A1 = 0x8057;
const GLenum RGB565 = 0x8D62; const GLenum RGB565 = 0x8D62;
const GLenum DEPTH_COMPONENT16 = 0x81A5; const GLenum DEPTH_COMPONENT16 = 0x81A5;
const GLenum STENCIL_INDEX = 0x1901;
const GLenum STENCIL_INDEX8 = 0x8D48; const GLenum STENCIL_INDEX8 = 0x8D48;
const GLenum DEPTH_STENCIL = 0x84F9; const GLenum DEPTH_STENCIL = 0x84F9;

View file

@ -242,12 +242,6 @@ struct ScriptLoadInfo
} }
} }
bool
ReadyToExecute()
{
return !mChannel && NS_SUCCEEDED(mLoadResult) && !mExecutionScheduled;
}
nsString mURL; nsString mURL;
// This full URL string is populated only if this object is used in a // This full URL string is populated only if this object is used in a

View file

@ -198,12 +198,6 @@ public:
return mBuffer; return mBuffer;
} }
const nsString& URL() const
{
AssertIsOnMainThread();
return mURL;
}
private: private:
~CompareCache() ~CompareCache()
{ {

View file

@ -1545,44 +1545,6 @@ private:
} }
}; };
class DummyRunnable final
: public WorkerRunnable
{
public:
explicit
DummyRunnable(WorkerPrivate* aWorkerPrivate)
: WorkerRunnable(aWorkerPrivate, WorkerThreadUnchangedBusyCount)
{
aWorkerPrivate->AssertIsOnWorkerThread();
}
private:
~DummyRunnable()
{
mWorkerPrivate->AssertIsOnWorkerThread();
}
virtual bool
PreDispatch(WorkerPrivate* aWorkerPrivate) override
{
MOZ_ASSERT_UNREACHABLE("Should never call Dispatch on this!");
return true;
}
virtual void
PostDispatch(WorkerPrivate* aWorkerPrivate, bool aDispatchResult) override
{
MOZ_ASSERT_UNREACHABLE("Should never call Dispatch on this!");
}
virtual bool
WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override
{
// Do nothing.
return true;
}
};
PRThread* PRThread*
PRThreadFromThread(nsIThread* aThread) PRThreadFromThread(nsIThread* aThread)
{ {

View file

@ -128,6 +128,7 @@ if CONFIG['GNU_CXX']:
] ]
if CONFIG['CLANG_CXX']: if CONFIG['CLANG_CXX']:
CXXFLAGS += [ CXXFLAGS += [
'-Wno-implicit-fallthrough',
'-Wno-inconsistent-missing-override', '-Wno-inconsistent-missing-override',
'-Wno-unused-private-field', '-Wno-unused-private-field',
] ]

View file

@ -59,11 +59,6 @@ AsyncCanvasRenderer::NotifyElementAboutAttributesChanged()
return NS_OK; return NS_OK;
} }
void Revoke()
{
mRenderer = nullptr;
}
private: private:
RefPtr<AsyncCanvasRenderer> mRenderer; RefPtr<AsyncCanvasRenderer> mRenderer;
}; };
@ -94,11 +89,6 @@ AsyncCanvasRenderer::NotifyElementAboutInvalidation()
return NS_OK; return NS_OK;
} }
void Revoke()
{
mRenderer = nullptr;
}
private: private:
RefPtr<AsyncCanvasRenderer> mRenderer; RefPtr<AsyncCanvasRenderer> mRenderer;
}; };

View file

@ -242,7 +242,11 @@ void
LayerManagerComposite::PostProcessLayers(nsIntRegion& aOpaqueRegion) LayerManagerComposite::PostProcessLayers(nsIntRegion& aOpaqueRegion)
{ {
LayerIntRegion visible; LayerIntRegion visible;
PostProcessLayers(mRoot, aOpaqueRegion, visible, Nothing()); LayerComposite* rootComposite = static_cast<LayerComposite*>(mRoot->AsHostLayer());
PostProcessLayers(mRoot, aOpaqueRegion, visible,
ViewAs<RenderTargetPixel>(rootComposite->GetShadowClipRect(),
PixelCastJustification::RenderTargetIsParentLayerForRoot),
Nothing());
} }
// We want to skip directly through ContainerLayers that don't have an intermediate // We want to skip directly through ContainerLayers that don't have an intermediate
@ -251,8 +255,7 @@ LayerManagerComposite::PostProcessLayers(nsIntRegion& aOpaqueRegion)
// effective transform. // effective transform.
bool ShouldProcessLayer(Layer* aLayer) bool ShouldProcessLayer(Layer* aLayer)
{ {
if (!aLayer->GetParent() || if (!aLayer->AsContainerLayer()) {
!aLayer->AsContainerLayer()) {
return true; return true;
} }
@ -278,6 +281,7 @@ void
LayerManagerComposite::PostProcessLayers(Layer* aLayer, LayerManagerComposite::PostProcessLayers(Layer* aLayer,
nsIntRegion& aOpaqueRegion, nsIntRegion& aOpaqueRegion,
LayerIntRegion& aVisibleRegion, LayerIntRegion& aVisibleRegion,
const Maybe<RenderTargetIntRect>& aRenderTargetClip,
const Maybe<ParentLayerIntRect>& aClipFromAncestors) const Maybe<ParentLayerIntRect>& aClipFromAncestors)
{ {
@ -295,7 +299,9 @@ LayerManagerComposite::PostProcessLayers(Layer* aLayer,
if (aLayer->Extend3DContext()) { if (aLayer->Extend3DContext()) {
// If we're preserve-3d just pass the clip rect down directly, and we'll do the // If we're preserve-3d just pass the clip rect down directly, and we'll do the
// conversion at the preserve-3d leaf Layer. // conversion at the preserve-3d leaf Layer.
insideClip = Some(ViewAs<LayerPixel>(*outsideClip, PixelCastJustification::MovingDownToChildren)); if (outsideClip) {
insideClip = Some(ViewAs<LayerPixel>(*outsideClip, PixelCastJustification::MovingDownToChildren));
}
} else if (outsideClip) { } else if (outsideClip) {
// Convert the combined clip into our pre-transform coordinate space, so // Convert the combined clip into our pre-transform coordinate space, so
// that it can later be intersected with our visible region. // that it can later be intersected with our visible region.
@ -322,15 +328,25 @@ LayerManagerComposite::PostProcessLayers(Layer* aLayer,
} }
if (!ShouldProcessLayer(aLayer)) { if (!ShouldProcessLayer(aLayer)) {
MOZ_ASSERT(!aLayer->AsContainerLayer() || !aLayer->AsContainerLayer()->UseIntermediateSurface()); MOZ_ASSERT(aLayer->AsContainerLayer() && !aLayer->AsContainerLayer()->UseIntermediateSurface());
// For layers participating 3D rendering context, their visible // For layers participating 3D rendering context, their visible
// region should be empty (invisible), so we pass through them // region should be empty (invisible), so we pass through them
// without doing anything. // without doing anything.
for (Layer* child = aLayer->GetLastChild(); for (Layer* child = aLayer->GetLastChild();
child; child;
child = child->GetPrevSibling()) { child = child->GetPrevSibling()) {
LayerComposite* childComposite = static_cast<LayerComposite*>(child->AsHostLayer());
Maybe<RenderTargetIntRect> renderTargetClip = aRenderTargetClip;
if (childComposite->GetShadowClipRect()) {
RenderTargetIntRect clip = TransformBy(ViewAs<ParentLayerToRenderTargetMatrix4x4>(
aLayer->GetEffectiveTransform(),
PixelCastJustification::RenderTargetIsParentLayerForRoot),
*childComposite->GetShadowClipRect());
renderTargetClip = IntersectMaybeRects(renderTargetClip, Some(clip));
}
PostProcessLayers(child, aOpaqueRegion, aVisibleRegion, PostProcessLayers(child, aOpaqueRegion, aVisibleRegion,
ancestorClipForChildren); renderTargetClip, ancestorClipForChildren);
} }
return; return;
} }
@ -364,7 +380,12 @@ LayerManagerComposite::PostProcessLayers(Layer* aLayer,
bool hasPreserve3DChild = false; bool hasPreserve3DChild = false;
for (Layer* child = aLayer->GetLastChild(); child; child = child->GetPrevSibling()) { for (Layer* child = aLayer->GetLastChild(); child; child = child->GetPrevSibling()) {
PostProcessLayers(child, localOpaque, descendantsVisibleRegion, ancestorClipForChildren); MOZ_ASSERT(aLayer->AsContainerLayer()->UseIntermediateSurface());
LayerComposite* childComposite = static_cast<LayerComposite*>(child->AsHostLayer());
PostProcessLayers(child, localOpaque, descendantsVisibleRegion,
ViewAs<RenderTargetPixel>(childComposite->GetShadowClipRect(),
PixelCastJustification::RenderTargetIsParentLayerForRoot),
ancestorClipForChildren);
if (child->Extend3DContext()) { if (child->Extend3DContext()) {
hasPreserve3DChild = true; hasPreserve3DChild = true;
} }
@ -406,10 +427,10 @@ LayerManagerComposite::PostProcessLayers(Layer* aLayer,
if (aLayer->IsOpaque()) { if (aLayer->IsOpaque()) {
localOpaque.OrWith(composite->GetFullyRenderedRegion()); localOpaque.OrWith(composite->GetFullyRenderedRegion());
} }
if (insideClip) {
localOpaque.AndWith(insideClip->ToUnknownRect());
}
localOpaque.MoveBy(*integerTranslation); localOpaque.MoveBy(*integerTranslation);
if (aRenderTargetClip) {
localOpaque.AndWith(aRenderTargetClip->ToUnknownRect());
}
aOpaqueRegion.OrWith(localOpaque); aOpaqueRegion.OrWith(localOpaque);
} }
} }
@ -848,7 +869,7 @@ LayerManagerComposite::Render(const nsIntRegion& aInvalidRegion, const nsIntRegi
} else if (profiler_feature_active(ProfilerFeature::LayersDump)) { } else if (profiler_feature_active(ProfilerFeature::LayersDump)) {
std::stringstream ss; std::stringstream ss;
Dump(ss); Dump(ss);
profiler_log(ss.str().c_str()); profiler_tracing("log", ss.str().c_str());
} }
// Dump to LayerScope Viewer // Dump to LayerScope Viewer

View file

@ -328,11 +328,19 @@ public:
* - Recomputes visible regions to account for async transforms. * - Recomputes visible regions to account for async transforms.
* Each layer accumulates into |aVisibleRegion| its post-transform * Each layer accumulates into |aVisibleRegion| its post-transform
* (including async transforms) visible region. * (including async transforms) visible region.
*
* - aRenderTargetClip is the exact clip required for aLayer, in the coordinates
* of the nearest render target (the same as GetEffectiveTransform).
*
* - aClipFromAncestors is the approximate combined clip from all ancestors, in
* the coordinate space of our parent, but maybe be an overestimate in the
* presence of complex transforms.
*/ */
void PostProcessLayers(nsIntRegion& aOpaqueRegion); void PostProcessLayers(nsIntRegion& aOpaqueRegion);
void PostProcessLayers(Layer* aLayer, void PostProcessLayers(Layer* aLayer,
nsIntRegion& aOpaqueRegion, nsIntRegion& aOpaqueRegion,
LayerIntRegion& aVisibleRegion, LayerIntRegion& aVisibleRegion,
const Maybe<RenderTargetIntRect>& aRenderTargetClip,
const Maybe<ParentLayerIntRect>& aClipFromAncestors); const Maybe<ParentLayerIntRect>& aClipFromAncestors);
/** /**

View file

@ -61,7 +61,7 @@ WebRenderDisplayItemLayer::RenderLayer(wr::DisplayListBuilder& aBuilder,
} }
} }
aBuilder.PushBuiltDisplayList(Move(mBuiltDisplayList)); aBuilder.PushBuiltDisplayList(mBuiltDisplayList);
WrBridge()->AddWebRenderParentCommands(mParentCommands); WrBridge()->AddWebRenderParentCommands(mParentCommands);
} }

View file

@ -689,8 +689,8 @@ private:
DECL_GFX_PREF(Live, "webgl.allow-immediate-queries", WebGLImmediateQueries, bool, false); DECL_GFX_PREF(Live, "webgl.allow-immediate-queries", WebGLImmediateQueries, bool, false);
DECL_GFX_PREF(Live, "webgl.allow-fb-invalidation", WebGLFBInvalidation, bool, false); DECL_GFX_PREF(Live, "webgl.allow-fb-invalidation", WebGLFBInvalidation, bool, false);
DECL_GFX_PREF(Live, "webgl.max-perf-warnings", WebGLMaxPerfWarnings, int32_t, 0); DECL_GFX_PREF(Live, "webgl.perf.max-warnings", WebGLMaxPerfWarnings, int32_t, 0);
DECL_GFX_PREF(Live, "webgl.max-acceptable-fb-status-invals", WebGLMaxAcceptableFBStatusInvals, int32_t, 0); DECL_GFX_PREF(Live, "webgl.perf.max-acceptable-fb-status-invals", WebGLMaxAcceptableFBStatusInvals, int32_t, 0);
DECL_GFX_PREF(Live, "webgl.webgl2-compat-mode", WebGL2CompatMode, bool, false); DECL_GFX_PREF(Live, "webgl.webgl2-compat-mode", WebGL2CompatMode, bool, false);
DECL_GFX_PREF(Live, "webrender.blob-images", WebRenderBlobImages, bool, false); DECL_GFX_PREF(Live, "webrender.blob-images", WebRenderBlobImages, bool, false);

View file

@ -599,11 +599,11 @@ DisplayListBuilder::PopClip()
} }
void void
DisplayListBuilder::PushBuiltDisplayList(BuiltDisplayList dl) DisplayListBuilder::PushBuiltDisplayList(BuiltDisplayList &dl)
{ {
wr_dp_push_built_display_list(mWrState, wr_dp_push_built_display_list(mWrState,
dl.dl_desc, dl.dl_desc,
dl.dl.Extract()); &dl.dl.inner);
} }
void void

View file

@ -161,7 +161,7 @@ public:
const WrImageMask* aMask); const WrImageMask* aMask);
void PopClip(); void PopClip();
void PushBuiltDisplayList(wr::BuiltDisplayList dl); void PushBuiltDisplayList(wr::BuiltDisplayList &dl);
void PushScrollLayer(const layers::FrameMetrics::ViewID& aScrollId, void PushScrollLayer(const layers::FrameMetrics::ViewID& aScrollId,
const WrRect& aContentRect, // TODO: We should work with strongly typed rects const WrRect& aContentRect, // TODO: We should work with strongly typed rects

View file

@ -1803,14 +1803,16 @@ pub unsafe extern "C" fn wr_api_finalize_builder(state: &mut WrState,
} }
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn wr_dp_push_built_display_list(state: &mut WrState, pub extern "C" fn wr_dp_push_built_display_list(state: &mut WrState,
dl_descriptor: WrBuiltDisplayListDescriptor, dl_descriptor: WrBuiltDisplayListDescriptor,
dl_data: WrVecU8) { dl_data: &mut WrVecU8) {
let dl_vec = dl_data.to_vec(); let dl_vec = mem::replace(dl_data, WrVecU8::from_vec(Vec::new())).to_vec();
let dl = BuiltDisplayList::from_data(dl_vec, dl_descriptor); let dl = BuiltDisplayList::from_data(dl_vec, dl_descriptor);
state.frame_builder.dl_builder.push_nested_display_list(&dl); state.frame_builder.dl_builder.push_nested_display_list(&dl);
let (data, _) = dl.into_data();
mem::replace(dl_data, WrVecU8::from_vec(data));
} }
// TODO: nical // TODO: nical

View file

@ -732,7 +732,7 @@ WR_FUNC;
WR_INLINE WR_INLINE
void wr_dp_push_built_display_list(WrState *aState, void wr_dp_push_built_display_list(WrState *aState,
WrBuiltDisplayListDescriptor aDlDescriptor, WrBuiltDisplayListDescriptor aDlDescriptor,
WrVecU8 aDlData) WrVecU8 *aDlData)
WR_FUNC; WR_FUNC;
WR_INLINE WR_INLINE

View file

@ -19,12 +19,10 @@
class nsIContent; class nsIContent;
namespace { struct ScopedUNumberFormatTraits {
struct ScopedUNumberFormatTraits { typedef UNumberFormat* type;
typedef UNumberFormat* type; static type empty() { return nullptr; }
static type empty() { return nullptr; } static void release(type handle) { if (handle) unum_close(handle); }
static void release(type handle) { if (handle) unum_close(handle); }
};
}; };
typedef mozilla::Scoped<ScopedUNumberFormatTraits> AutoCloseUNumberFormat; typedef mozilla::Scoped<ScopedUNumberFormatTraits> AutoCloseUNumberFormat;
@ -111,4 +109,3 @@ public:
#endif /* MOZILLA_INTERNAL_API */ #endif /* MOZILLA_INTERNAL_API */
#endif /* mozilla_ICUUtils_h__ */ #endif /* mozilla_ICUUtils_h__ */

View file

@ -28,16 +28,6 @@
namespace { namespace {
// Force the singleton used by Empty[W]String[16] to be a unique type. This
// prevents other code that might accidentally use Singleton<string> from
// getting our internal one.
struct EmptyStrings {
EmptyStrings() {}
const std::string s;
const std::wstring ws;
const string16 s16;
};
// Hack to convert any char-like type to its unsigned counterpart. // Hack to convert any char-like type to its unsigned counterpart.
// For example, it will convert char, signed char and unsigned char to unsigned // For example, it will convert char, signed char and unsigned char to unsigned
// char. // char.

View file

@ -397,41 +397,6 @@ BackgroundParentImpl::DeallocPCamerasParent(camera::PCamerasParent *aActor)
return true; return true;
} }
namespace {
class InitUDPSocketParentCallback final : public Runnable
{
public:
InitUDPSocketParentCallback(UDPSocketParent* aActor,
const nsACString& aFilter)
: mActor(aActor)
, mFilter(aFilter)
{
AssertIsInMainProcess();
AssertIsOnBackgroundThread();
}
NS_IMETHOD
Run() override
{
AssertIsInMainProcess();
IPC::Principal principal;
if (!mActor->Init(principal, mFilter)) {
MOZ_CRASH("UDPSocketCallback - failed init");
}
return NS_OK;
}
private:
~InitUDPSocketParentCallback() override = default;
RefPtr<UDPSocketParent> mActor;
nsCString mFilter;
};
} // namespace
auto auto
BackgroundParentImpl::AllocPUDPSocketParent(const OptionalPrincipalInfo& /* unused */, BackgroundParentImpl::AllocPUDPSocketParent(const OptionalPrincipalInfo& /* unused */,
const nsCString& /* unused */) const nsCString& /* unused */)

View file

@ -537,7 +537,8 @@ MessageChannel::MessageChannel(const char* aName,
mNotifiedChannelDone(false), mNotifiedChannelDone(false),
mFlags(REQUIRE_DEFAULT), mFlags(REQUIRE_DEFAULT),
mPeerPidSet(false), mPeerPidSet(false),
mPeerPid(-1) mPeerPid(-1),
mIsPostponingSends(false)
{ {
MOZ_COUNT_CTOR(ipc::MessageChannel); MOZ_COUNT_CTOR(ipc::MessageChannel);
@ -901,10 +902,53 @@ MessageChannel::Send(Message* aMsg)
ReportConnectionError("MessageChannel", msg); ReportConnectionError("MessageChannel", msg);
return false; return false;
} }
mLink->SendMessage(msg.forget());
SendMessageToLink(msg.forget());
return true; return true;
} }
void
MessageChannel::SendMessageToLink(Message* aMsg)
{
if (mIsPostponingSends) {
UniquePtr<Message> msg(aMsg);
mPostponedSends.push_back(Move(msg));
return;
}
mLink->SendMessage(aMsg);
}
void
MessageChannel::BeginPostponingSends()
{
AssertWorkerThread();
mMonitor->AssertNotCurrentThreadOwns();
MonitorAutoLock lock(*mMonitor);
{
MOZ_ASSERT(!mIsPostponingSends);
mIsPostponingSends = true;
}
}
void
MessageChannel::StopPostponingSends()
{
// Note: this can be called from any thread.
MonitorAutoLock lock(*mMonitor);
MOZ_ASSERT(mIsPostponingSends);
for (UniquePtr<Message>& iter : mPostponedSends) {
mLink->SendMessage(iter.release());
}
// We unset this after SendMessage so we can make correct thread
// assertions in MessageLink.
mIsPostponingSends = false;
mPostponedSends.clear();
}
already_AddRefed<MozPromiseRefcountable> already_AddRefed<MozPromiseRefcountable>
MessageChannel::PopPromise(const Message& aMsg) MessageChannel::PopPromise(const Message& aMsg)
{ {
@ -1365,6 +1409,7 @@ MessageChannel::Send(Message* aMsg, Message* aReply)
msg->nested_level() < AwaitingSyncReplyNestedLevel()) msg->nested_level() < AwaitingSyncReplyNestedLevel())
{ {
MOZ_RELEASE_ASSERT(DispatchingSyncMessage() || DispatchingAsyncMessage()); MOZ_RELEASE_ASSERT(DispatchingSyncMessage() || DispatchingAsyncMessage());
MOZ_RELEASE_ASSERT(!mIsPostponingSends);
IPC_LOG("Cancel from Send"); IPC_LOG("Cancel from Send");
CancelMessage *cancel = new CancelMessage(CurrentNestedInsideSyncTransaction()); CancelMessage *cancel = new CancelMessage(CurrentNestedInsideSyncTransaction());
CancelTransaction(CurrentNestedInsideSyncTransaction()); CancelTransaction(CurrentNestedInsideSyncTransaction());
@ -1413,7 +1458,7 @@ MessageChannel::Send(Message* aMsg, Message* aReply)
// msg will be destroyed soon, but name() is not owned by msg. // msg will be destroyed soon, but name() is not owned by msg.
const char* msgName = msg->name(); const char* msgName = msg->name();
mLink->SendMessage(msg.forget()); SendMessageToLink(msg.forget());
while (true) { while (true) {
MOZ_RELEASE_ASSERT(!transact.IsCanceled()); MOZ_RELEASE_ASSERT(!transact.IsCanceled());
@ -1544,6 +1589,7 @@ MessageChannel::Call(Message* aMsg, Message* aReply)
IPC_ASSERT(!DispatchingSyncMessage(), IPC_ASSERT(!DispatchingSyncMessage(),
"violation of sync handler invariant"); "violation of sync handler invariant");
IPC_ASSERT(msg->is_interrupt(), "can only Call() Interrupt messages here"); IPC_ASSERT(msg->is_interrupt(), "can only Call() Interrupt messages here");
IPC_ASSERT(!mIsPostponingSends, "not postponing sends");
msg->set_seqno(NextSeqno()); msg->set_seqno(NextSeqno());
msg->set_interrupt_remote_stack_depth_guess(mRemoteStackDepthGuess); msg->set_interrupt_remote_stack_depth_guess(mRemoteStackDepthGuess);

View file

@ -33,6 +33,7 @@
#include <map> #include <map>
#include <math.h> #include <math.h>
#include <stack> #include <stack>
#include <vector>
namespace mozilla { namespace mozilla {
namespace ipc { namespace ipc {
@ -254,6 +255,22 @@ class MessageChannel : HasResultCodes, MessageLoop::DestructionObserver
bool IsInTransaction() const; bool IsInTransaction() const;
void CancelCurrentTransaction(); void CancelCurrentTransaction();
// Force all calls to Send to defer actually sending messages. This will
// cause sync messages to block until another thread calls
// StopPostponingSends.
//
// This must be called from the worker thread.
void BeginPostponingSends();
// Stop postponing sent messages, and immediately flush all postponed
// messages to the link. This may be called from any thread.
//
// Note that there are no ordering guarantees between two different
// MessageChannels. If channel B sends a message, then stops postponing
// channel A, messages from A may arrive before B. The easiest way to order
// this, if needed, is to make B send a sync message.
void StopPostponingSends();
/** /**
* This function is used by hang annotation code to determine which IPDL * This function is used by hang annotation code to determine which IPDL
* actor is highest in the call stack at the time of the hang. It should * actor is highest in the call stack at the time of the hang. It should
@ -491,6 +508,10 @@ class MessageChannel : HasResultCodes, MessageLoop::DestructionObserver
// depending on context. // depending on context.
static bool IsAlwaysDeferred(const Message& aMsg); static bool IsAlwaysDeferred(const Message& aMsg);
// Helper for sending a message via the link. This should only be used for
// non-special messages that might have to be postponed.
void SendMessageToLink(Message* aMsg);
bool WasTransactionCanceled(int transaction); bool WasTransactionCanceled(int transaction);
bool ShouldDeferMessage(const Message& aMsg); bool ShouldDeferMessage(const Message& aMsg);
bool ShouldDeferInterruptMessage(const Message& aMsg, size_t aStackDepth); bool ShouldDeferInterruptMessage(const Message& aMsg, size_t aStackDepth);
@ -797,6 +818,11 @@ class MessageChannel : HasResultCodes, MessageLoop::DestructionObserver
RefPtr<CancelableRunnable> mOnChannelConnectedTask; RefPtr<CancelableRunnable> mOnChannelConnectedTask;
bool mPeerPidSet; bool mPeerPidSet;
int32_t mPeerPid; int32_t mPeerPid;
// Channels can enter messages are not sent immediately; instead, they are
// held in a queue until another thread deems it is safe to send them.
bool mIsPostponingSends;
std::vector<UniquePtr<Message>> mPostponedSends;
}; };
void void

View file

@ -149,7 +149,9 @@ ProcessLink::SendMessage(Message *msg)
MOZ_CRASH("IPC message size is too large"); MOZ_CRASH("IPC message size is too large");
} }
mChan->AssertWorkerThread(); if (!mChan->mIsPostponingSends) {
mChan->AssertWorkerThread();
}
mChan->mMonitor->AssertCurrentThreadOwns(); mChan->mMonitor->AssertCurrentThreadOwns();
mIOLoop->PostTask(NewNonOwningRunnableMethod<Message*>(mTransport, &Transport::Send, msg)); mIOLoop->PostTask(NewNonOwningRunnableMethod<Message*>(mTransport, &Transport::Send, msg));
@ -212,7 +214,9 @@ ThreadLink::EchoMessage(Message *msg)
void void
ThreadLink::SendMessage(Message *msg) ThreadLink::SendMessage(Message *msg)
{ {
mChan->AssertWorkerThread(); if (!mChan->mIsPostponingSends) {
mChan->AssertWorkerThread();
}
mChan->mMonitor->AssertCurrentThreadOwns(); mChan->mMonitor->AssertCurrentThreadOwns();
if (mTargetChan) if (mTargetChan)

View file

@ -229,6 +229,10 @@ description =
description = description =
[PTestUrgentHangs::Test5_1] [PTestUrgentHangs::Test5_1]
description = description =
[PTestLayoutThread::SyncMessage]
description =
[PTestPaintThread::FinishedPaint]
description =
# A11y code # A11y code
[PDocAccessible::State] [PDocAccessible::State]

View file

@ -0,0 +1,19 @@
include protocol PTestPaintThread;
namespace mozilla {
namespace _ipdltest {
// This is supposed to be analagous to PLayerTransaction.
sync protocol PTestLayoutThread
{
parent:
async FinishedLayout(uint64_t aTxnId);
async AsyncMessage(uint64_t aTxnId);
sync SyncMessage(uint64_t aTxnId);
async EndTest();
child:
async StartTest(Endpoint<PTestPaintThreadChild> endpoint);
};
} // namespace mozilla
} // namespace _ipdltest

View file

@ -0,0 +1,13 @@
namespace mozilla {
namespace _ipdltest {
// This is supposed to be analagous to PPaintingBridge.
sync protocol PTestPaintThread
{
parent:
sync FinishedPaint(uint64_t aTxnId);
};
} // namespace mozilla
} // namespace _ipdltest

View file

@ -0,0 +1,290 @@
#include "TestOffMainThreadPainting.h"
#include "IPDLUnitTests.h" // fail etc.
#include "mozilla/Unused.h"
#include <prinrval.h>
#include <prthread.h>
namespace mozilla {
namespace _ipdltest {
TestOffMainThreadPaintingParent::TestOffMainThreadPaintingParent()
: mAsyncMessages(0),
mSyncMessages(0)
{
}
TestOffMainThreadPaintingParent::~TestOffMainThreadPaintingParent()
{
}
void
TestOffMainThreadPaintingParent::Main()
{
ipc::Endpoint<PTestPaintThreadParent> parentPipe;
ipc::Endpoint<PTestPaintThreadChild> childPipe;
nsresult rv = PTestPaintThread::CreateEndpoints(
base::GetCurrentProcId(),
OtherPid(),
&parentPipe,
&childPipe);
if (NS_FAILED(rv)) {
fail("create pipes");
}
mPaintActor = new TestPaintThreadParent(this);
if (!mPaintActor->Bind(Move(parentPipe))) {
fail("bind parent pipe");
}
if (!SendStartTest(Move(childPipe))) {
fail("sending Start");
}
}
ipc::IPCResult
TestOffMainThreadPaintingParent::RecvFinishedLayout(const uint64_t& aTxnId)
{
if (!mPaintedTxn || mPaintedTxn.value() != aTxnId) {
fail("received transaction before receiving paint");
}
mPaintedTxn = Nothing();
mCompletedTxn = Some(aTxnId);
return IPC_OK();
}
void
TestOffMainThreadPaintingParent::NotifyFinishedPaint(const uint64_t& aTxnId)
{
if (mCompletedTxn && mCompletedTxn.value() >= aTxnId) {
fail("received paint after receiving transaction");
}
if (mPaintedTxn) {
fail("painted again before completing previous transaction");
}
mPaintedTxn = Some(aTxnId);
}
ipc::IPCResult
TestOffMainThreadPaintingParent::RecvAsyncMessage(const uint64_t& aTxnId)
{
if (!mCompletedTxn || mCompletedTxn.value() != aTxnId) {
fail("sync message received out of order");
return IPC_FAIL_NO_REASON(this);
}
mAsyncMessages++;
return IPC_OK();
}
ipc::IPCResult
TestOffMainThreadPaintingParent::RecvSyncMessage(const uint64_t& aTxnId)
{
if (!mCompletedTxn || mCompletedTxn.value() != aTxnId) {
fail("sync message received out of order");
return IPC_FAIL_NO_REASON(this);
}
if (mSyncMessages >= mAsyncMessages) {
fail("sync message received before async message");
return IPC_FAIL_NO_REASON(this);
}
mSyncMessages++;
return IPC_OK();
}
ipc::IPCResult
TestOffMainThreadPaintingParent::RecvEndTest()
{
if (!mCompletedTxn || mCompletedTxn.value() != 1) {
fail("expected to complete a transaction");
}
if (mAsyncMessages != 1) {
fail("expected to get 1 async message");
}
if (mSyncMessages != 1) {
fail("expected to get 1 sync message");
}
passed("ok");
mPaintActor->Close();
Close();
return IPC_OK();
}
void
TestOffMainThreadPaintingParent::ActorDestroy(ActorDestroyReason aWhy)
{
if (aWhy != NormalShutdown) {
fail("child process aborted");
}
QuitParent();
}
/**************************
* PTestLayoutThreadChild *
**************************/
TestOffMainThreadPaintingChild::TestOffMainThreadPaintingChild()
: mNextTxnId(1)
{
}
TestOffMainThreadPaintingChild::~TestOffMainThreadPaintingChild()
{
}
ipc::IPCResult
TestOffMainThreadPaintingChild::RecvStartTest(ipc::Endpoint<PTestPaintThreadChild>&& aEndpoint)
{
mPaintThread = MakeUnique<base::Thread>("PaintThread");
if (!mPaintThread->Start()) {
return IPC_FAIL_NO_REASON(this);
}
mPaintActor = new TestPaintThreadChild(GetIPCChannel());
RefPtr<Runnable> task = NewRunnableMethod<ipc::Endpoint<PTestPaintThreadChild>&&>(
"TestPaintthreadChild::Bind", mPaintActor, &TestPaintThreadChild::Bind, Move(aEndpoint));
mPaintThread->message_loop()->PostTask(task.forget());
IssueTransaction();
return IPC_OK();
}
void
TestOffMainThreadPaintingChild::ActorDestroy(ActorDestroyReason aWhy)
{
RefPtr<Runnable> task = NewRunnableMethod(
"TestPaintThreadChild::Close", mPaintActor, &TestPaintThreadChild::Close);
mPaintThread->message_loop()->PostTask(task.forget());
mPaintThread = nullptr;
QuitChild();
}
void
TestOffMainThreadPaintingChild::ProcessingError(Result aCode, const char* aReason)
{
MOZ_CRASH("Aborting child due to IPC error");
}
void
TestOffMainThreadPaintingChild::IssueTransaction()
{
GetIPCChannel()->BeginPostponingSends();
uint64_t txnId = mNextTxnId++;
// Start painting before we send the message.
RefPtr<Runnable> task = NewRunnableMethod<uint64_t>(
"TestPaintThreadChild::BeginPaintingForTxn", mPaintActor, &TestPaintThreadChild::BeginPaintingForTxn, txnId);
mPaintThread->message_loop()->PostTask(task.forget());
// Simulate some gecko main thread stuff.
SendFinishedLayout(txnId);
SendAsyncMessage(txnId);
SendSyncMessage(txnId);
SendEndTest();
}
/**************************
* PTestPaintThreadParent *
**************************/
TestPaintThreadParent::TestPaintThreadParent(TestOffMainThreadPaintingParent* aMainBridge)
: mMainBridge(aMainBridge)
{
}
TestPaintThreadParent::~TestPaintThreadParent()
{
}
bool
TestPaintThreadParent::Bind(ipc::Endpoint<PTestPaintThreadParent>&& aEndpoint)
{
if (!aEndpoint.Bind(this)) {
return false;
}
AddRef();
return true;
}
ipc::IPCResult
TestPaintThreadParent::RecvFinishedPaint(const uint64_t& aTxnId)
{
mMainBridge->NotifyFinishedPaint(aTxnId);
return IPC_OK();
}
void
TestPaintThreadParent::ActorDestroy(ActorDestroyReason aWhy)
{
}
void
TestPaintThreadParent::DeallocPTestPaintThreadParent()
{
Release();
}
/*************************
* PTestPaintThreadChild *
*************************/
TestPaintThreadChild::TestPaintThreadChild(MessageChannel* aMainChannel)
: mCanSend(false),
mMainChannel(aMainChannel)
{
}
TestPaintThreadChild::~TestPaintThreadChild()
{
}
void
TestPaintThreadChild::Bind(ipc::Endpoint<PTestPaintThreadChild>&& aEndpoint)
{
if (!aEndpoint.Bind(this)) {
MOZ_CRASH("could not bind paint child endpoint");
}
AddRef();
mCanSend = true;
}
void
TestPaintThreadChild::BeginPaintingForTxn(uint64_t aTxnId)
{
MOZ_RELEASE_ASSERT(!NS_IsMainThread());
// Sleep for some time to simulate painting being slow.
PR_Sleep(PR_MillisecondsToInterval(500));
SendFinishedPaint(aTxnId);
mMainChannel->StopPostponingSends();
}
void
TestPaintThreadChild::ActorDestroy(ActorDestroyReason aWhy)
{
mCanSend = false;
}
void
TestPaintThreadChild::Close()
{
MOZ_RELEASE_ASSERT(!NS_IsMainThread());
if (mCanSend) {
PTestPaintThreadChild::Close();
}
}
void
TestPaintThreadChild::DeallocPTestPaintThreadChild()
{
Release();
}
} // namespace _ipdltest
} // namespace mozilla

View file

@ -0,0 +1,112 @@
#ifndef mozilla__ipdltest_TestOffMainThreadPainting_h
#define mozilla__ipdltest_TestOffMainThreadPainting_h
#include "mozilla/Maybe.h"
#include "mozilla/_ipdltest/IPDLUnitTests.h"
#include "mozilla/_ipdltest/PTestLayoutThreadChild.h"
#include "mozilla/_ipdltest/PTestLayoutThreadParent.h"
#include "mozilla/_ipdltest/PTestPaintThreadChild.h"
#include "mozilla/_ipdltest/PTestPaintThreadParent.h"
#include "base/thread.h"
namespace mozilla {
namespace _ipdltest {
class TestPaintThreadChild;
class TestPaintThreadParent;
// Analagous to LayerTransactionParent.
class TestOffMainThreadPaintingParent final : public PTestLayoutThreadParent
{
public:
static bool RunTestInThreads() { return false; }
static bool RunTestInProcesses() { return true; }
void Main();
MOZ_IMPLICIT TestOffMainThreadPaintingParent();
~TestOffMainThreadPaintingParent() override;
ipc::IPCResult RecvFinishedLayout(const uint64_t& aTxnId) override;
ipc::IPCResult RecvAsyncMessage(const uint64_t& aTxnId) override;
ipc::IPCResult RecvSyncMessage(const uint64_t& aTxnId) override;
ipc::IPCResult RecvEndTest() override;
void ActorDestroy(ActorDestroyReason aWhy) override;
void NotifyFinishedPaint(const uint64_t& aTxnId);
private:
RefPtr<TestPaintThreadParent> mPaintActor;
Maybe<uint64_t> mCompletedTxn;
Maybe<uint64_t> mPaintedTxn;
uint32_t mAsyncMessages;
uint32_t mSyncMessages;
};
// Analagous to LayerTransactionChild.
class TestOffMainThreadPaintingChild final : public PTestLayoutThreadChild
{
public:
TestOffMainThreadPaintingChild();
~TestOffMainThreadPaintingChild() override;
ipc::IPCResult RecvStartTest(ipc::Endpoint<PTestPaintThreadChild>&& aEndpoint) override;
void ActorDestroy(ActorDestroyReason aWhy) override;
void ProcessingError(Result aCode, const char* aReason) override;
private:
void IssueTransaction();
private:
UniquePtr<base::Thread> mPaintThread;
RefPtr<TestPaintThreadChild> mPaintActor;
uint64_t mNextTxnId;
};
/****************
* Paint Actors *
****************/
class TestPaintThreadParent final : public PTestPaintThreadParent
{
public:
explicit TestPaintThreadParent(TestOffMainThreadPaintingParent* aMainBridge);
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TestPaintThreadParent);
bool Bind(ipc::Endpoint<PTestPaintThreadParent>&& aEndpoint);
ipc::IPCResult RecvFinishedPaint(const uint64_t& aTxnId) override;
void ActorDestroy(ActorDestroyReason aWhy) override;
void DeallocPTestPaintThreadParent() override;
private:
~TestPaintThreadParent() override;
private:
TestOffMainThreadPaintingParent* mMainBridge;
};
class TestPaintThreadChild final : public PTestPaintThreadChild
{
public:
explicit TestPaintThreadChild(MessageChannel* aOtherChannel);
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TestPaintThreadChild);
void Bind(ipc::Endpoint<PTestPaintThreadChild>&& aEndpoint);
void BeginPaintingForTxn(uint64_t aTxnId);
void ActorDestroy(ActorDestroyReason aWhy) override;
void DeallocPTestPaintThreadChild() override;
void Close();
private:
~TestPaintThreadChild() override;
bool mCanSend;
MessageChannel* mMainChannel;
};
} // namespace _ipdltest
} // namespace mozilla
#endif // ifndef mozilla__ipdltest_TestOffMainThreadPainting_h

View file

@ -35,6 +35,7 @@ SOURCES += [
'TestManyChildAllocs.cpp', 'TestManyChildAllocs.cpp',
'TestMultiMgrs.cpp', 'TestMultiMgrs.cpp',
'TestNestedLoops.cpp', 'TestNestedLoops.cpp',
'TestOffMainThreadPainting.cpp',
'TestRaceDeadlock.cpp', 'TestRaceDeadlock.cpp',
'TestRaceDeferral.cpp', 'TestRaceDeferral.cpp',
'TestRacyInterruptReplies.cpp', 'TestRacyInterruptReplies.cpp',
@ -95,6 +96,7 @@ IPDL_SOURCES += [
'PTestInterruptShutdownRace.ipdl', 'PTestInterruptShutdownRace.ipdl',
'PTestJSON.ipdl', 'PTestJSON.ipdl',
'PTestLatency.ipdl', 'PTestLatency.ipdl',
'PTestLayoutThread.ipdl',
'PTestManyChildAllocs.ipdl', 'PTestManyChildAllocs.ipdl',
'PTestManyChildAllocsSub.ipdl', 'PTestManyChildAllocsSub.ipdl',
'PTestMultiMgrs.ipdl', 'PTestMultiMgrs.ipdl',
@ -102,6 +104,7 @@ IPDL_SOURCES += [
'PTestMultiMgrsLeft.ipdl', 'PTestMultiMgrsLeft.ipdl',
'PTestMultiMgrsRight.ipdl', 'PTestMultiMgrsRight.ipdl',
'PTestNestedLoops.ipdl', 'PTestNestedLoops.ipdl',
'PTestPaintThread.ipdl',
'PTestPriority.ipdl', 'PTestPriority.ipdl',
'PTestRaceDeadlock.ipdl', 'PTestRaceDeadlock.ipdl',
'PTestRaceDeferral.ipdl', 'PTestRaceDeferral.ipdl',

View file

@ -1178,12 +1178,6 @@ class FunctionCompiler
return numPushed; return numPushed;
} }
static MDefinition* peekPushedDef(MBasicBlock* block)
{
MOZ_ASSERT(hasPushed(block));
return block->getSlot(block->stackDepth() - 1);
}
public: public:
void pushDef(MDefinition* def) void pushDef(MDefinition* def)
{ {
@ -1550,7 +1544,9 @@ class FunctionCompiler
return iter_.lastOpcodeOffset(); return iter_.lastOpcodeOffset();
} }
#if DEBUG
bool done() const { return iter_.done(); } bool done() const { return iter_.done(); }
#endif
/*************************************************************************/ /*************************************************************************/
private: private:

View file

@ -606,12 +606,6 @@ class WasmTokenStream
return token.name(); return token.name();
return AstName(); return AstName();
} }
AstName getIfText() {
WasmToken token;
if (getIf(WasmToken::Text, &token))
return token.text();
return AstName();
}
bool getIfRef(AstRef* ref) { bool getIfRef(AstRef* ref) {
WasmToken token = peek(); WasmToken token = peek();
if (token.kind() == WasmToken::Name || token.kind() == WasmToken::Index) if (token.kind() == WasmToken::Name || token.kind() == WasmToken::Index)
@ -1483,10 +1477,6 @@ struct WasmParseContext
dtoaState(NewDtoaState()) dtoaState(NewDtoaState())
{} {}
bool fail(const char* message) {
error->reset(js_strdup(message));
return false;
}
~WasmParseContext() { ~WasmParseContext() {
DestroyDtoaState(dtoaState); DestroyDtoaState(dtoaState);
} }
@ -3391,14 +3381,6 @@ class Resolver
} }
return true; return true;
} }
bool resolveName(AstNameMap& map, AstName name, size_t* index) {
AstNameMap::Ptr p = map.lookup(name);
if (p) {
*index = p->value();
return true;
}
return false;
}
bool resolveRef(AstNameMap& map, AstRef& ref) { bool resolveRef(AstNameMap& map, AstRef& ref) {
AstNameMap::Ptr p = map.lookup(ref.name()); AstNameMap::Ptr p = map.lookup(ref.name());
if (p) { if (p) {
@ -3447,7 +3429,6 @@ class Resolver
REGISTER(Sig, sigMap_) REGISTER(Sig, sigMap_)
REGISTER(Func, funcMap_) REGISTER(Func, funcMap_)
REGISTER(Import, importMap_)
REGISTER(Var, varMap_) REGISTER(Var, varMap_)
REGISTER(Global, globalMap_) REGISTER(Global, globalMap_)
REGISTER(Table, tableMap_) REGISTER(Table, tableMap_)
@ -3473,7 +3454,6 @@ class Resolver
RESOLVE(sigMap_, Signature) RESOLVE(sigMap_, Signature)
RESOLVE(funcMap_, Function) RESOLVE(funcMap_, Function)
RESOLVE(importMap_, Import)
RESOLVE(varMap_, Local) RESOLVE(varMap_, Local)
RESOLVE(globalMap_, Global) RESOLVE(globalMap_, Global)
RESOLVE(tableMap_, Table) RESOLVE(tableMap_, Table)

View file

@ -109,6 +109,13 @@ gfx::ScaleFactor<SourceUnits, NewTargetUnits> ViewTargetAs(
PixelCastJustification) { PixelCastJustification) {
return gfx::ScaleFactor<SourceUnits, NewTargetUnits>(aScaleFactor.scale); return gfx::ScaleFactor<SourceUnits, NewTargetUnits>(aScaleFactor.scale);
} }
template <class TargetUnits, class SourceUnits>
Maybe<gfx::IntRectTyped<TargetUnits>> ViewAs(const Maybe<gfx::IntRectTyped<SourceUnits>>& aRect, PixelCastJustification aJustification) {
if (aRect.isSome()) {
return Some(ViewAs<TargetUnits>(aRect.value(), aJustification));
}
return Nothing();
}
// Unlike the other functions in this category, this function takes the // Unlike the other functions in this category, this function takes the
// target matrix type, rather than its source and target unit types, as // target matrix type, rather than its source and target unit types, as
// the explicit template argument, so an example invocation is: // the explicit template argument, so an example invocation is:

View file

@ -186,6 +186,7 @@ typedef gfx::Matrix4x4Typed<ScreenPixel, ParentLayerPixel> ScreenToParentLayerMa
typedef gfx::Matrix4x4Typed<ParentLayerPixel, LayerPixel> ParentLayerToLayerMatrix4x4; typedef gfx::Matrix4x4Typed<ParentLayerPixel, LayerPixel> ParentLayerToLayerMatrix4x4;
typedef gfx::Matrix4x4Typed<ParentLayerPixel, ScreenPixel> ParentLayerToScreenMatrix4x4; typedef gfx::Matrix4x4Typed<ParentLayerPixel, ScreenPixel> ParentLayerToScreenMatrix4x4;
typedef gfx::Matrix4x4Typed<ParentLayerPixel, ParentLayerPixel> ParentLayerToParentLayerMatrix4x4; typedef gfx::Matrix4x4Typed<ParentLayerPixel, ParentLayerPixel> ParentLayerToParentLayerMatrix4x4;
typedef gfx::Matrix4x4Typed<ParentLayerPixel, RenderTargetPixel> ParentLayerToRenderTargetMatrix4x4;
/* /*
* The pixels that content authors use to specify sizes in. * The pixels that content authors use to specify sizes in.

View file

@ -3662,7 +3662,7 @@ nsLayoutUtils::PaintFrame(gfxContext* aRenderingContext, nsIFrame* aFrame,
// Flush stream now to avoid reordering dump output relative to // Flush stream now to avoid reordering dump output relative to
// messages dumped by PaintRoot below. // messages dumped by PaintRoot below.
if (profilerNeedsDisplayList && !consoleNeedsDisplayList) { if (profilerNeedsDisplayList && !consoleNeedsDisplayList) {
profiler_log(ss->str().c_str()); profiler_tracing("log", ss->str().c_str());
} else { } else {
fprint_stderr(gfxUtils::sDumpPaintFile, *ss); fprint_stderr(gfxUtils::sDumpPaintFile, *ss);
} }
@ -3735,7 +3735,7 @@ nsLayoutUtils::PaintFrame(gfxContext* aRenderingContext, nsIFrame* aFrame,
} }
if (profilerNeedsDisplayList && !consoleNeedsDisplayList) { if (profilerNeedsDisplayList && !consoleNeedsDisplayList) {
profiler_log(ss->str().c_str()); profiler_tracing("log", ss->str().c_str());
} else { } else {
fprint_stderr(gfxUtils::sDumpPaintFile, *ss); fprint_stderr(gfxUtils::sDumpPaintFile, *ss);
} }

View file

@ -4127,8 +4127,10 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
// We haven't computed visibility at this point, so item->GetVisibleRect() // We haven't computed visibility at this point, so item->GetVisibleRect()
// is just the dirty rect that item was initialized with. We intersect it // is just the dirty rect that item was initialized with. We intersect it
// with the clipped item bounds to get a tighter visible rect. // with the clipped item bounds to get a tighter visible rect.
itemVisibleRect = itemVisibleRect.Intersect( if (!prerenderedTransform) {
ScaleToOutsidePixels(item->GetVisibleRect(), false)); itemVisibleRect = itemVisibleRect.Intersect(
ScaleToOutsidePixels(item->GetVisibleRect(), false));
}
if (maxLayers != -1 && layerCount >= maxLayers) { if (maxLayers != -1 && layerCount >= maxLayers) {
forceInactive = true; forceInactive = true;

View file

@ -0,0 +1,6 @@
<!DOCTYPE HTML>
<html>
<body>
<div style="width:100px; height:200px; background-color:green"></div>
</body>
</html>

View file

@ -0,0 +1,12 @@
<!DOCTYPE HTML>
<html>
<body>
<div style="width:100px; height:100px; background-color:green"></div>
<div style="width:100px; height:100px; overflow:hidden">
<div style="transform: translateY(-100px) perspective(1px); will-change:transform">
<div style="background-color:red; width:100px; height:100px"></div>
<div style="background-color:green; width:100px; height:100px"></div>
</div>
</div>
</body>
</html>

View file

@ -39,6 +39,7 @@ fuzzy-if(skiaContent,1,4) == matrix3d-1a.html matrix3d-1-ref.html
fuzzy-if(winWidget&&!layersGPUAccelerated,1,251) == backface-visibility-2.html backface-visibility-2-ref.html fuzzy-if(winWidget&&!layersGPUAccelerated,1,251) == backface-visibility-2.html backface-visibility-2-ref.html
fails-if(webrender) == backface-visibility-3.html backface-visibility-3-ref.html fails-if(webrender) == backface-visibility-3.html backface-visibility-3-ref.html
== perspective-clipping-1.html perspective-clipping-1-ref.html == perspective-clipping-1.html perspective-clipping-1-ref.html
== perspective-clipping-2.html perspective-clipping-2-ref.html
!= perspective-origin-1a.html rotatex-perspective-1a.html != perspective-origin-1a.html rotatex-perspective-1a.html
== perspective-origin-1b.html perspective-origin-1a.html == perspective-origin-1b.html perspective-origin-1a.html
fuzzy(3,99) random-if(Android&&!browserIsRemote) == perspective-origin-2a.html perspective-origin-2-ref.html # subpixel AA, bug 732568 fuzzy(3,99) random-if(Android&&!browserIsRemote) == perspective-origin-2a.html perspective-origin-2-ref.html # subpixel AA, bug 732568

View file

@ -504,101 +504,6 @@ protected:
nsIPrincipal* aSheetPrincipal); nsIPrincipal* aSheetPrincipal);
void ReleaseScanner(void); void ReleaseScanner(void);
/**
* This is a RAII class which behaves like an "AutoRestore<>" for our parser
* input state. When instantiated, this class saves the current parser input
* state (in a CSSParserInputState object), and it restores the parser to
* that state when destructed, unless "DoNotRestore()" has been called.
*/
class MOZ_RAII nsAutoCSSParserInputStateRestorer {
public:
explicit nsAutoCSSParserInputStateRestorer(CSSParserImpl* aParser
MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
: mParser(aParser),
mShouldRestore(true)
{
MOZ_GUARD_OBJECT_NOTIFIER_INIT;
mParser->SaveInputState(mSavedState);
}
void DoNotRestore()
{
mShouldRestore = false;
}
~nsAutoCSSParserInputStateRestorer()
{
if (mShouldRestore) {
mParser->RestoreSavedInputState(mSavedState);
}
}
private:
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
CSSParserImpl* mParser;
CSSParserInputState mSavedState;
bool mShouldRestore;
};
/**
* This is a RAII class which creates a temporary nsCSSScanner for the given
* string, and reconfigures aParser to use *that* scanner instead of its
* existing scanner, until we go out of scope. (This allows us to rewrite
* a portion of a stylesheet using a temporary string, and switch to parsing
* that rewritten section, and then resume parsing the original stylesheet.)
*
* aParser must have a non-null nsCSSScanner (which we'll be temporarily
* replacing) and ErrorReporter (which this class will co-opt for the
* temporary parser). While we're in scope, we also suppress error reporting,
* so it doesn't really matter which reporter we use. We suppress reporting
* because this class is only used with CSS that is synthesized & didn't
* come directly from an author, and it would be confusing if we reported
* syntax errors for CSS that an author didn't provide.
*
* XXXdholbert we could also change this & report errors, if needed. Might
* want to customize the error reporting somehow though.
*/
class MOZ_RAII nsAutoScannerChanger {
public:
nsAutoScannerChanger(CSSParserImpl* aParser,
const nsAString& aStringToScan
MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
: mParser(aParser),
mOriginalScanner(aParser->mScanner),
mStringScanner(aStringToScan, 0),
mParserStateRestorer(aParser),
mErrorSuppresser(aParser)
{
MOZ_ASSERT(mOriginalScanner,
"Shouldn't use nsAutoScannerChanger unless we already "
"have a scanner");
MOZ_GUARD_OBJECT_NOTIFIER_INIT;
// Set & setup the new scanner:
mParser->mScanner = &mStringScanner;
mStringScanner.SetErrorReporter(mParser->mReporter);
// We might've had push-back on our original scanner (and if we did,
// that fact is saved via mParserStateRestorer). But we don't have
// push-back in mStringScanner, so clear that flag.
mParser->mHavePushBack = false;
}
~nsAutoScannerChanger()
{
// Restore original scanner. All other cleanup is done by RAII members.
mParser->mScanner = mOriginalScanner;
}
private:
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
CSSParserImpl* mParser;
nsCSSScanner *mOriginalScanner;
nsCSSScanner mStringScanner;
nsAutoCSSParserInputStateRestorer mParserStateRestorer;
nsAutoSuppressErrors mErrorSuppresser;
};
/** /**
* Saves the current input state, which includes any currently pushed * Saves the current input state, which includes any currently pushed
* back token, and the current position of the scanner. * back token, and the current position of the scanner.
@ -1234,21 +1139,6 @@ protected:
MOZ_ASSERT(result != CSSParseResult::Error); MOZ_ASSERT(result != CSSParseResult::Error);
return result == CSSParseResult::Ok; return result == CSSParseResult::Ok;
} }
bool ParseSingleTokenVariantWithRestrictions(
nsCSSValue& aValue,
int32_t aVariantMask,
const KTableEntry aKeywordTable[],
uint32_t aRestrictions)
{
MOZ_ASSERT(!(aVariantMask & VARIANT_MULTIPLE_TOKENS),
"use ParseVariantWithRestrictions for variants in "
"VARIANT_MULTIPLE_TOKENS");
CSSParseResult result =
ParseVariantWithRestrictions(aValue, aVariantMask, aKeywordTable,
aRestrictions);
MOZ_ASSERT(result != CSSParseResult::Error);
return result == CSSParseResult::Ok;
}
bool ParseSingleTokenNonNegativeVariant(nsCSSValue& aValue, bool ParseSingleTokenNonNegativeVariant(nsCSSValue& aValue,
int32_t aVariantMask, int32_t aVariantMask,
const KTableEntry aKeywordTable[]) const KTableEntry aKeywordTable[])

View file

@ -350,10 +350,6 @@ class SchedulableTrickleCandidate {
return candidate_; return candidate_;
} }
size_t Stream() const {
return stream_;
}
bool IsHost() const { bool IsHost() const {
return candidate_.find("typ host") != std::string::npos; return candidate_.find("typ host") != std::string::npos;
} }
@ -407,7 +403,6 @@ class IceTestPeer : public sigslot::has_slots<> {
expected_local_transport_(kNrIceTransportUdp), expected_local_transport_(kNrIceTransportUdp),
expected_remote_type_(NrIceCandidate::ICE_HOST), expected_remote_type_(NrIceCandidate::ICE_HOST),
trickle_mode_(TRICKLE_NONE), trickle_mode_(TRICKLE_NONE),
trickled_(0),
simulate_ice_lite_(false), simulate_ice_lite_(false),
nat_(new TestNat), nat_(new TestNat),
test_utils_(utils) { test_utils_(utils) {
@ -1070,7 +1065,6 @@ class IceTestPeer : public sigslot::has_slots<> {
ASSERT_GT(ctx->GetStreamCount(), i); ASSERT_GT(ctx->GetStreamCount(), i);
nsresult res = ctx->GetStream(i)->ParseTrickleCandidate(candidate); nsresult res = ctx->GetStream(i)->ParseTrickleCandidate(candidate);
ASSERT_TRUE(NS_SUCCEEDED(res)); ASSERT_TRUE(NS_SUCCEEDED(res));
++trickled_;
return; return;
} }
} }
@ -1391,8 +1385,6 @@ class IceTestPeer : public sigslot::has_slots<> {
NS_DISPATCH_SYNC); NS_DISPATCH_SYNC);
} }
int trickled() { return trickled_; }
void SetControlling(NrIceCtx::Controlling controlling) { void SetControlling(NrIceCtx::Controlling controlling) {
nsresult res; nsresult res;
test_utils_->sts_target()->Dispatch( test_utils_->sts_target()->Dispatch(
@ -1466,7 +1458,6 @@ class IceTestPeer : public sigslot::has_slots<> {
NrIceCandidate::Type expected_remote_type_; NrIceCandidate::Type expected_remote_type_;
std::string expected_remote_addr_; std::string expected_remote_addr_;
TrickleMode trickle_mode_; TrickleMode trickle_mode_;
int trickled_;
bool simulate_ice_lite_; bool simulate_ice_lite_;
RefPtr<mozilla::TestNat> nat_; RefPtr<mozilla::TestNat> nat_;
MtransportTestUtils* test_utils_; MtransportTestUtils* test_utils_;
@ -1864,12 +1855,6 @@ class WebRtcIceConnectTest : public StunTest {
p2_->SetExpectedTypes(local, remote, transport); p2_->SetExpectedTypes(local, remote, transport);
} }
void SetExpectedTypes(NrIceCandidate::Type local1, NrIceCandidate::Type remote1,
NrIceCandidate::Type local2, NrIceCandidate::Type remote2) {
p1_->SetExpectedTypes(local1, remote1);
p2_->SetExpectedTypes(local2, remote2);
}
void SetExpectedRemoteCandidateAddr(const std::string& addr) { void SetExpectedRemoteCandidateAddr(const std::string& addr) {
p1_->SetExpectedRemoteCandidateAddr(addr); p1_->SetExpectedRemoteCandidateAddr(addr);
p2_->SetExpectedRemoteCandidateAddr(addr); p2_->SetExpectedRemoteCandidateAddr(addr);

View file

@ -914,11 +914,6 @@ class TransportTest : public MtransportTest {
ASSERT_EQ_WAIT(s2, p2_->state(), 10000); ASSERT_EQ_WAIT(s2, p2_->state(), 10000);
} }
void InitIce() {
p1_->InitIce();
p2_->InitIce();
}
void ConnectIce() { void ConnectIce() {
p1_->InitIce(); p1_->InitIce();
p2_->InitIce(); p2_->InitIce();

View file

@ -178,12 +178,12 @@ public:
MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(NS_IsMainThread());
} }
} }
operator JSErrorResult &() { return *mRv; }
operator ErrorResult &() { return *mRv; } operator ErrorResult &() { return *mRv; }
private: private:
mozilla::UniquePtr<JSErrorResult> mRv; mozilla::UniquePtr<JSErrorResult> mRv;
bool isCopy; bool isCopy;
}; };
} }
static nsresult InitNSSInContent() static nsresult InitNSSInContent()

View file

@ -563,6 +563,8 @@ if CONFIG['OS_TARGET'] in ['Darwin', 'Linux', 'WINNT']:
'-Wno-inconsistent-missing-override', '-Wno-inconsistent-missing-override',
'-Wno-overloaded-virtual', '-Wno-overloaded-virtual',
] ]
if CONFIG['CLANG_CXX']:
CXXFLAGS += ['-Wno-comma']
if CONFIG['_MSC_VER']: if CONFIG['_MSC_VER']:
# This is intended as a temporary workaround to enable warning free building # This is intended as a temporary workaround to enable warning free building

View file

@ -157,11 +157,16 @@ TestCustomAccessor()
listTwo.pushBack(&one); listTwo.pushBack(&one);
listTwo.pushBack(&two); listTwo.pushBack(&two);
{ unsigned int check[] { 1, 2 }; CheckListValues(listOne, check); }
{ unsigned int check[] { 1, 2 }; CheckListValues(listTwo, check); } { unsigned int check[] { 1, 2 }; CheckListValues(listTwo, check); }
(void)listTwo.popBack(); (void)listTwo.popBack();
{ unsigned int check[] { 1, 2 }; CheckListValues(listOne, check); } { unsigned int check[] { 1, 2 }; CheckListValues(listOne, check); }
{ unsigned int check[] { 1 }; CheckListValues(listTwo, check); } { unsigned int check[] { 1 }; CheckListValues(listTwo, check); }
(void)listOne.popBack();
{ unsigned int check[] { 1 }; CheckListValues(listOne, check); }
{ unsigned int check[] { 1 }; CheckListValues(listTwo, check); }
} }
int int

View file

@ -27,6 +27,13 @@ public class GeckoActivityMonitor implements Application.ActivityLifecycleCallba
private GeckoActivityMonitor() { } private GeckoActivityMonitor() { }
private void updateActivity(final Activity activity) {
if (currentActivity.get() == null) {
appContext.onApplicationForeground();
}
currentActivity = new WeakReference<>(activity);
}
public Activity getCurrentActivity() { public Activity getCurrentActivity() {
return currentActivity.get(); return currentActivity.get();
} }
@ -47,23 +54,23 @@ public class GeckoActivityMonitor implements Application.ActivityLifecycleCallba
@Override @Override
public void onActivityStarted(Activity activity) { public void onActivityStarted(Activity activity) {
if (currentActivity.get() == null) { updateActivity(activity);
appContext.onApplicationForeground();
}
currentActivity = new WeakReference<>(activity);
} }
@Override @Override
public void onActivityResumed(Activity activity) { } public void onActivityResumed(Activity activity) {
updateActivity(activity);
}
@Override @Override
public void onActivityPaused(Activity activity) { } public void onActivityPaused(Activity activity) { }
@Override @Override
public void onActivityStopped(Activity activity) { public void onActivityStopped(Activity activity) {
// onStop for the previous activity is called after onStart for the new activity, so if // onStop for the previous activity is called after onStart/onResume for
// we're switching activities within our app, currentActivity should already refer to the // the new/resumed activity, so if we're switching activities within our
// next activity at this point. // app, mCurrentActivity should already refer to the next activity at
// this point.
// If it doesn't, it means we've been backgrounded. // If it doesn't, it means we've been backgrounded.
if (currentActivity.get() == activity) { if (currentActivity.get() == activity) {
currentActivity.clear(); currentActivity.clear();

View file

@ -337,7 +337,7 @@ public final class IntentHelper implements BundleEventListener {
} }
final Uri data = intent.getData(); final Uri data = intent.getData();
if (data != null && "file".equals(data.normalizeScheme().getScheme())) { if (data != null && "file".equals(normalizeUriScheme(data).getScheme())) {
Log.w(LOGTAG, "Blocked intent with \"file://\" data scheme."); Log.w(LOGTAG, "Blocked intent with \"file://\" data scheme.");
return null; return null;
} }

View file

@ -4588,6 +4588,14 @@ Tab.prototype = {
Services.obs.notifyObservers(this.browser, "Content:HistoryChange"); Services.obs.notifyObservers(this.browser, "Content:HistoryChange");
}, },
OnLengthChanged: function(aCount) {
// Ignore, the method is implemented so that XPConnect doesn't throw!
},
OnIndexChanged: function(aIndex) {
// Ignore, the method is implemented so that XPConnect doesn't throw!
},
UpdateMediaPlaybackRelatedObserver: function(active) { UpdateMediaPlaybackRelatedObserver: function(active) {
// Media control is only used for the tab which has playing media, so we // Media control is only used for the tab which has playing media, so we
// only need to register observer after having the active media. And the // only need to register observer after having the active media. And the

View file

@ -4624,8 +4624,8 @@ pref("webgl.disable-DOM-blit-uploads", false);
pref("webgl.allow-fb-invalidation", false); pref("webgl.allow-fb-invalidation", false);
pref("webgl.webgl2-compat-mode", false); pref("webgl.webgl2-compat-mode", false);
pref("webgl.max-perf-warnings", 0); pref("webgl.perf.max-warnings", 0);
pref("webgl.max-acceptable-fb-status-invals", 0); pref("webgl.perf.max-acceptable-fb-status-invals", 0);
pref("webgl.enable-webgl2", true); pref("webgl.enable-webgl2", true);

View file

@ -28,14 +28,17 @@ using namespace mozilla;
// //
// Once the event is found, it is dispatched to the main thread to notify // Once the event is found, it is dispatched to the main thread to notify
// any window where window.crypto.enableSmartCardEvents is true. // any window where window.crypto.enableSmartCardEvents is true.
// Additionally, all observers of the topics "smartcard-insert" and // Additionally, all observers of the topics |kSmartcardInsert| and
// "smartcard-remove" are notified by the observer service of the appropriate // |kSmartcardRemove| are notified by the observer service of the appropriate
// event. // event.
// //
#define kSmartcardInsert "smartcard-insert"
#define kSmartcardRemove "smartcard-remove"
class nsTokenEventRunnable : public nsIRunnable { class nsTokenEventRunnable : public nsIRunnable {
public: public:
nsTokenEventRunnable(const nsAString& aType, const nsAString& aTokenName) nsTokenEventRunnable(const char* aType, const nsAString& aTokenName)
: mType(aType) : mType(aType)
, mTokenName(aTokenName) , mTokenName(aTokenName)
{ {
@ -47,7 +50,7 @@ public:
private: private:
virtual ~nsTokenEventRunnable() {} virtual ~nsTokenEventRunnable() {}
nsString mType; const char* mType;
nsString mTokenName; nsString mTokenName;
}; };
@ -63,11 +66,7 @@ nsTokenEventRunnable::Run()
if (!observerService) { if (!observerService) {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
// This conversion is safe because mType can only be "smartcard-insert" return observerService->NotifyObservers(nullptr, mType, mTokenName.get());
// or "smartcard-remove".
NS_ConvertUTF16toUTF8 eventTypeUTF8(mType);
return observerService->NotifyObservers(nullptr, eventTypeUTF8.get(),
mTokenName.get());
} }
// self linking and removing double linked entry // self linking and removing double linked entry
@ -299,7 +298,7 @@ SmartCardMonitoringThread::GetTokenSeries(CK_SLOT_ID slotid)
// helper function to pass the event off to nsNSSComponent. // helper function to pass the event off to nsNSSComponent.
// //
void void
SmartCardMonitoringThread::SendEvent(const nsAString& eventType, SmartCardMonitoringThread::SendEvent(const char* eventType,
const char* tokenName) const char* tokenName)
{ {
// The token name should be UTF8, but it's not clear that this is enforced // The token name should be UTF8, but it's not clear that this is enforced
@ -360,12 +359,12 @@ void SmartCardMonitoringThread::Execute()
// event for the previous token, do so now... // event for the previous token, do so now...
tokenName = GetTokenName(slotID); tokenName = GetTokenName(slotID);
if (tokenName) { if (tokenName) {
SendEvent(NS_LITERAL_STRING("smartcard-remove"), tokenName); SendEvent(kSmartcardRemove, tokenName);
} }
tokenName = PK11_GetTokenName(slot.get()); tokenName = PK11_GetTokenName(slot.get());
// save the token name and series // save the token name and series
SetTokenName(slotID, tokenName, series); SetTokenName(slotID, tokenName, series);
SendEvent(NS_LITERAL_STRING("smartcard-insert"), tokenName); SendEvent(kSmartcardInsert, tokenName);
} }
} else { } else {
// retrieve token name // retrieve token name
@ -374,7 +373,7 @@ void SmartCardMonitoringThread::Execute()
// if there's not a token name, then the software isn't expecting // if there's not a token name, then the software isn't expecting
// a (or another) remove event. // a (or another) remove event.
if (tokenName) { if (tokenName) {
SendEvent(NS_LITERAL_STRING("smartcard-remove"), tokenName); SendEvent(kSmartcardRemove, tokenName);
// clear the token name (after we send it) // clear the token name (after we send it)
SetTokenName(slotID, nullptr, 0); SetTokenName(slotID, nullptr, 0);
} }

View file

@ -52,7 +52,7 @@ class SmartCardMonitoringThread
void SetTokenName(CK_SLOT_ID slotid, const char* tokenName, uint32_t series); void SetTokenName(CK_SLOT_ID slotid, const char* tokenName, uint32_t series);
const char* GetTokenName(CK_SLOT_ID slotid); const char* GetTokenName(CK_SLOT_ID slotid);
uint32_t GetTokenSeries(CK_SLOT_ID slotid); uint32_t GetTokenSeries(CK_SLOT_ID slotid);
void SendEvent(const nsAString& type, const char* tokenName); void SendEvent(const char* type, const char* tokenName);
SECMODModule* mModule; SECMODModule* mModule;
PLHashTable* mHash; PLHashTable* mHash;

View file

@ -503,6 +503,7 @@ mochitest:
android.*: 20 android.*: 20
macosx.*: 5 macosx.*: 5
windows.*: 5 windows.*: 5
linux32/debug: 16
linux.*: 10 linux.*: 10
e10s: e10s:
by-test-platform: by-test-platform:

View file

@ -1003,6 +1003,7 @@ class TestInfoCommand(MachCommandBase):
# This function attempts to find appropriate names for different # This function attempts to find appropriate names for different
# queries based on the specified test name. # queries based on the specified test name.
import posixpath
import re import re
# full_test_name is full path to file in hg (or git) # full_test_name is full path to file in hg (or git)
@ -1023,6 +1024,7 @@ class TestInfoCommand(MachCommandBase):
for line in out: for line in out:
print(line) print(line)
if self.full_test_name: if self.full_test_name:
self.full_test_name.replace(os.sep, posixpath.sep)
print("Found %s in source control." % self.full_test_name) print("Found %s in source control." % self.full_test_name)
else: else:
print("Unable to validate test name '%s'!" % self.test_name) print("Unable to validate test name '%s'!" % self.test_name)

View file

@ -13,12 +13,12 @@
<script language="javascript" type="text/javascript"> <script language="javascript" type="text/javascript">
async function painted() { async function painted() {
window.removeEventListener("MozAfterPaint", painted, true);
await TalosContentProfiler.pause(); await TalosContentProfiler.pause();
await TalosContentProfiler.initFromURLQueryParams(location.search); await TalosContentProfiler.initFromURLQueryParams(location.search);
await TalosContentProfiler.finishStartupProfiling(); await TalosContentProfiler.finishStartupProfiling();
window.removeEventListener("MozAfterPaint", painted, true);
let startupInfo = await TalosPowersContent.getStartupInfo(); let startupInfo = await TalosPowersContent.getStartupInfo();
let startupTime = startupInfo['firstPaint'] - startupInfo['process']; let startupTime = startupInfo['firstPaint'] - startupInfo['process'];

View file

@ -1179,7 +1179,12 @@ class ChoiceType extends Type {
let n = choices.length - 1; let n = choices.length - 1;
choices[n] = `or ${choices[n]}`; choices[n] = `or ${choices[n]}`;
let message = `Value must either: ${choices.join(", ")}`; let message;
if (typeof value === "object") {
message = `Value must either: ${choices.join(", ")}`;
} else {
message = `Value ${JSON.stringify(value)} must either: ${choices.join(", ")}`;
}
return context.error(message, null); return context.error(message, null);
} }
@ -1719,7 +1724,7 @@ class ArrayType extends Type {
static parseSchema(schema, path, extraProperties = []) { static parseSchema(schema, path, extraProperties = []) {
this.checkSchemaProperties(schema, path, extraProperties); this.checkSchemaProperties(schema, path, extraProperties);
let items = Schemas.parseSchema(schema.items, path); let items = Schemas.parseSchema(schema.items, path, ["onError"]);
return new this(schema, items, schema.minItems || 0, schema.maxItems || Infinity); return new this(schema, items, schema.minItems || 0, schema.maxItems || Infinity);
} }
@ -1729,6 +1734,7 @@ class ArrayType extends Type {
this.itemType = itemType; this.itemType = itemType;
this.minItems = minItems; this.minItems = minItems;
this.maxItems = maxItems; this.maxItems = maxItems;
this.onError = schema.items.onError || null;
} }
normalize(value, context) { normalize(value, context) {
@ -1742,7 +1748,12 @@ class ArrayType extends Type {
for (let [i, element] of value.entries()) { for (let [i, element] of value.entries()) {
element = context.withPath(String(i), () => this.itemType.normalize(element, context)); element = context.withPath(String(i), () => this.itemType.normalize(element, context));
if (element.error) { if (element.error) {
return element; if (this.onError == "warn") {
context.logError(element.error);
} else if (this.onError != "ignore") {
return element;
}
continue;
} }
result.push(element.value); result.push(element.value);
} }

View file

@ -168,13 +168,8 @@
"type": "array", "type": "array",
"default": [], "default": [],
"items": { "items": {
"choices": [ "$ref": "Permission",
{ "$ref": "Permission" }, "onError": "warn"
{
"type": "string",
"deprecated": "Unknown permission ${value}"
}
]
}, },
"optional": true "optional": true
}, },

View file

@ -50,7 +50,7 @@ add_task(async function testUnknownProperties() {
}); });
let messages = [ let messages = [
{message: /processing permissions\.0: Unknown permission "unknownPermission"/}, {message: /processing permissions\.0: Value "unknownPermission"/},
{message: /processing unknown_property: An unexpected property was found in the WebExtension manifest/}, {message: /processing unknown_property: An unexpected property was found in the WebExtension manifest/},
]; ];

View file

@ -1091,7 +1091,7 @@ add_task(async function testChoices() {
talliedErrors.length = 0; talliedErrors.length = 0;
Assert.throws(() => root.choices.meh("frog"), Assert.throws(() => root.choices.meh("frog"),
/Value must either: be one of \["foo", "bar", "baz"\], match the pattern \/florg\.\*meh\/, or be an integer value/); /Value "frog" must either: be one of \["foo", "bar", "baz"\], match the pattern \/florg\.\*meh\/, or be an integer value/);
Assert.throws(() => root.choices.meh(4), Assert.throws(() => root.choices.meh(4),
/be a string value, or be at least 12/); /be a string value, or be at least 12/);

View file

@ -0,0 +1,30 @@
"use strict";
add_task(async function test_unknown_permissions() {
let extension = ExtensionTestUtils.loadExtension({
manifest: {
permissions: [
"activeTab",
"fooUnknownPermission",
"http://*/",
"chrome://favicon/",
],
},
});
let {messages} = await promiseConsoleOutput(
() => extension.startup());
const {WebExtensionPolicy} = Cu.import("resource://gre/modules/Extension.jsm", {});
let policy = WebExtensionPolicy.getByID(extension.id);
Assert.deepEqual(Array.from(policy.permissions).sort(), ["activeTab", "http://*/*"]);
ok(messages.some(message => /Error processing permissions\.1: Value "fooUnknownPermission" must/.test(message)),
'Got expected error for "fooUnknownPermission"');
ok(messages.some(message => /Error processing permissions\.3: Value "chrome:\/\/favicon\/" must/.test(message)),
'Got expected error for "chrome://favicon/"');
await extension.unload();
});

View file

@ -88,6 +88,7 @@ skip-if = os == "android"
[test_ext_themes_supported_properties.js] [test_ext_themes_supported_properties.js]
[test_ext_topSites.js] [test_ext_topSites.js]
skip-if = os == "android" skip-if = os == "android"
[test_ext_unknown_permissions.js]
[test_ext_legacy_extension_context.js] [test_ext_legacy_extension_context.js]
[test_ext_legacy_extension_embedding.js] [test_ext_legacy_extension_embedding.js]
[test_locale_converter.js] [test_locale_converter.js]

View file

@ -95,10 +95,7 @@ struct MOZ_NON_TEMPORARY_CLASS ScopedArrayBufferContents: public Scoped<ScopedAr
explicit ScopedArrayBufferContents(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM): explicit ScopedArrayBufferContents(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM):
Scoped<ScopedArrayBufferContentsTraits>(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM_TO_PARENT) Scoped<ScopedArrayBufferContentsTraits>(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM_TO_PARENT)
{ } { }
explicit ScopedArrayBufferContents(const ArrayBufferContents& v
MOZ_GUARD_OBJECT_NOTIFIER_PARAM):
Scoped<ScopedArrayBufferContentsTraits>(v MOZ_GUARD_OBJECT_NOTIFIER_PARAM_TO_PARENT)
{ }
ScopedArrayBufferContents& operator=(ArrayBufferContents ptr) { ScopedArrayBufferContents& operator=(ArrayBufferContents ptr) {
Scoped<ScopedArrayBufferContentsTraits>::operator=(ptr); Scoped<ScopedArrayBufferContentsTraits>::operator=(ptr);
return *this; return *this;
@ -918,4 +915,3 @@ NativeOSFileInternalsService::Read(const nsAString& aPath,
} }
} // namespace mozilla } // namespace mozilla

View file

@ -122,9 +122,12 @@ if CONFIG['GNU_CXX']:
CXXFLAGS += [ CXXFLAGS += [
'-Wno-return-type', '-Wno-return-type',
'-Wno-sign-compare', '-Wno-sign-compare',
'-Wno-unused-function',
'-Wno-unused-local-typedef',
] ]
if CONFIG['CLANG_CXX']: if CONFIG['CLANG_CXX']:
CXXFLAGS += [ CXXFLAGS += [
'-Wno-comma',
'-Wno-null-conversion', '-Wno-null-conversion',
] ]
elif CONFIG['_MSC_VER']: elif CONFIG['_MSC_VER']:

View file

@ -916,6 +916,12 @@ nsFormFillController::HandleEvent(nsIDOMEvent* aEvent)
return KeyPress(aEvent); return KeyPress(aEvent);
case eEditorInput: case eEditorInput:
{ {
nsCOMPtr<nsINode> input = do_QueryInterface(
aEvent->InternalDOMEvent()->GetTarget());
if (!IsTextControl(input)) {
return NS_OK;
}
bool unused = false; bool unused = false;
return (!mSuppressOnInput && mController && mFocusedInput) ? return (!mSuppressOnInput && mController && mFocusedInput) ?
mController->HandleText(&unused) : NS_OK; mController->HandleText(&unused) : NS_OK;
@ -996,6 +1002,14 @@ nsFormFillController::RemoveForDocument(nsIDocument* aDoc)
} }
} }
bool
nsFormFillController::IsTextControl(nsINode* aNode)
{
nsCOMPtr<nsIFormControl> formControl = do_QueryInterface(aNode);
return formControl &&
formControl->IsSingleLineTextControl(false);
}
void void
nsFormFillController::MaybeStartControllingInput(nsIDOMHTMLInputElement* aInput) nsFormFillController::MaybeStartControllingInput(nsIDOMHTMLInputElement* aInput)
{ {
@ -1004,8 +1018,7 @@ nsFormFillController::MaybeStartControllingInput(nsIDOMHTMLInputElement* aInput)
return; return;
} }
nsCOMPtr<nsIFormControl> formControl = do_QueryInterface(aInput); if (!IsTextControl(inputNode)) {
if (!formControl || !formControl->IsSingleLineTextControl(false)) {
return; return;
} }
@ -1022,6 +1035,8 @@ nsFormFillController::MaybeStartControllingInput(nsIDOMHTMLInputElement* aInput)
bool hasList = datalist != nullptr; bool hasList = datalist != nullptr;
bool isPwmgrInput = false; bool isPwmgrInput = false;
nsCOMPtr<nsIFormControl> formControl = do_QueryInterface(aInput);
MOZ_ASSERT(formControl, "If we have a text control, we have a form control!");
if (mPwmgrInputs.Get(inputNode) || if (mPwmgrInputs.Get(inputNode) ||
formControl->ControlType() == NS_FORM_INPUT_PASSWORD) { formControl->ControlType() == NS_FORM_INPUT_PASSWORD) {
isPwmgrInput = true; isPwmgrInput = true;
@ -1385,11 +1400,6 @@ nsFormFillController::StopControllingInput()
if (mFocusedInputNode) { if (mFocusedInputNode) {
MaybeRemoveMutationObserver(mFocusedInputNode); MaybeRemoveMutationObserver(mFocusedInputNode);
auto formAutoComplete = GetFormAutoComplete();
if (formAutoComplete) {
formAutoComplete->StopControllingInput(mFocusedInput);
}
mFocusedInputNode = nullptr; mFocusedInputNode = nullptr;
mFocusedInput = nullptr; mFocusedInput = nullptr;
} }

View file

@ -87,6 +87,8 @@ protected:
void RemoveForDocument(nsIDocument* aDoc); void RemoveForDocument(nsIDocument* aDoc);
bool IsEventTrusted(nsIDOMEvent *aEvent); bool IsEventTrusted(nsIDOMEvent *aEvent);
bool IsTextControl(nsINode* aNode);
// members ////////////////////////////////////////// // members //////////////////////////////////////////
nsCOMPtr<nsIAutoCompleteController> mController; nsCOMPtr<nsIAutoCompleteController> mController;

View file

@ -26,11 +26,6 @@ interface nsIFormAutoComplete: nsISupports {
* to cancel an existing search, for example, in preparation for a new search. * to cancel an existing search, for example, in preparation for a new search.
*/ */
void stopAutoCompleteSearch(); void stopAutoCompleteSearch();
/**
* Since the controller is disconnecting, any related data must be cleared.
*/
void stopControllingInput(in nsIDOMHTMLInputElement aField);
}; };
[scriptable, function, uuid(604419ab-55a0-4831-9eca-1b9e67cc4751)] [scriptable, function, uuid(604419ab-55a0-4831-9eca-1b9e67cc4751)]

View file

@ -115,11 +115,6 @@ class ScopedXPCOM : public nsIDirectoryServiceProvider2
printf("Finished running %s tests.\n", mTestName); printf("Finished running %s tests.\n", mTestName);
} }
bool failed()
{
return mServMgr == nullptr;
}
already_AddRefed<nsIFile> GetProfileDirectory() already_AddRefed<nsIFile> GetProfileDirectory()
{ {
if (mProfD) { if (mProfD) {

View file

@ -78,13 +78,13 @@ TracingMarkerPayload::StreamPayload(SpliceableJSONWriter& aWriter,
{ {
StreamCommonProps("tracing", aWriter, aProcessStartTime, aUniqueStacks); StreamCommonProps("tracing", aWriter, aProcessStartTime, aUniqueStacks);
if (GetCategory()) { if (mCategory) {
aWriter.StringProperty("category", GetCategory()); aWriter.StringProperty("category", mCategory);
} }
if (GetKind() == TRACING_INTERVAL_START) { if (mKind == TRACING_INTERVAL_START) {
aWriter.StringProperty("interval", "start"); aWriter.StringProperty("interval", "start");
} else if (GetKind() == TRACING_INTERVAL_END) { } else if (mKind == TRACING_INTERVAL_END) {
aWriter.StringProperty("interval", "end"); aWriter.StringProperty("interval", "end");
} }
} }

View file

@ -2126,6 +2126,9 @@ profiler_init(void* aStackTop)
PrintUsageThenExit(0); // terminates execution PrintUsageThenExit(0); // terminates execution
} }
int entries = PROFILER_DEFAULT_ENTRIES;
double interval = PROFILER_DEFAULT_INTERVAL;
{ {
PSAutoLock lock(gPSMutex); PSAutoLock lock(gPSMutex);
@ -2163,7 +2166,6 @@ profiler_init(void* aStackTop)
LOG("- MOZ_PROFILER_STARTUP is set"); LOG("- MOZ_PROFILER_STARTUP is set");
int entries = PROFILER_DEFAULT_ENTRIES;
const char* startupEntries = getenv("MOZ_PROFILER_STARTUP_ENTRIES"); const char* startupEntries = getenv("MOZ_PROFILER_STARTUP_ENTRIES");
if (startupEntries) { if (startupEntries) {
errno = 0; errno = 0;
@ -2175,7 +2177,6 @@ profiler_init(void* aStackTop)
} }
} }
double interval = PROFILER_DEFAULT_INTERVAL;
const char* startupInterval = getenv("MOZ_PROFILER_STARTUP_INTERVAL"); const char* startupInterval = getenv("MOZ_PROFILER_STARTUP_INTERVAL");
if (startupInterval) { if (startupInterval) {
errno = 0; errno = 0;
@ -2193,8 +2194,8 @@ profiler_init(void* aStackTop)
// We do this with gPSMutex unlocked. The comment in profiler_stop() explains // We do this with gPSMutex unlocked. The comment in profiler_stop() explains
// why. // why.
NotifyProfilerStarted(PROFILER_DEFAULT_ENTRIES, PROFILER_DEFAULT_INTERVAL, NotifyProfilerStarted(entries, interval, features, filters,
features, filters, MOZ_ARRAY_LENGTH(filters)); MOZ_ARRAY_LENGTH(filters));
} }
static void static void
@ -2827,7 +2828,8 @@ profiler_get_backtrace()
regs.Clear(); regs.Clear();
#endif #endif
auto buffer = MakeUnique<ProfileBuffer>(PROFILER_GET_BACKTRACE_ENTRIES); // 1000 should be plenty for a single backtrace.
auto buffer = MakeUnique<ProfileBuffer>(1000);
DoSyncSample(lock, *info, now, regs, buffer.get()); DoSyncSample(lock, *info, now, regs, buffer.get());
@ -2978,12 +2980,6 @@ profiler_tracing(const char* aCategory, const char* aMarkerName,
racy_profiler_add_marker(aMarkerName, Move(payload)); racy_profiler_add_marker(aMarkerName, Move(payload));
} }
void
profiler_log(const char* aStr)
{
profiler_tracing("log", aStr);
}
PseudoStack* PseudoStack*
profiler_get_pseudo_stack() profiler_get_pseudo_stack()
{ {

View file

@ -405,8 +405,6 @@ PROFILER_FUNC_VOID(profiler_js_interrupt_callback())
// whether the profiler is active or inactive. // whether the profiler is active or inactive.
PROFILER_FUNC(double profiler_time(), 0) PROFILER_FUNC(double profiler_time(), 0)
PROFILER_FUNC_VOID(profiler_log(const char* aStr))
PROFILER_FUNC(int profiler_current_thread_id(), 0) PROFILER_FUNC(int profiler_current_thread_id(), 0)
// This method suspends the thread identified by aThreadId, optionally samples // This method suspends the thread identified by aThreadId, optionally samples
@ -455,10 +453,6 @@ void profiler_add_marker(const char* aMarkerName,
# define PROFILER_DEFAULT_ENTRIES 100000 # define PROFILER_DEFAULT_ENTRIES 100000
#endif #endif
// In the case of profiler_get_backtrace we know that we only need enough space
// for a single backtrace.
#define PROFILER_GET_BACKTRACE_ENTRIES 1000
#define PROFILER_DEFAULT_INTERVAL 1 #define PROFILER_DEFAULT_INTERVAL 1
namespace mozilla { namespace mozilla {

View file

@ -71,9 +71,6 @@ public:
TracingMarkerPayload(const char* aCategory, TracingKind aKind, TracingMarkerPayload(const char* aCategory, TracingKind aKind,
UniqueProfilerBacktrace aCause); UniqueProfilerBacktrace aCause);
const char *GetCategory() const { return mCategory; }
TracingKind GetKind() const { return mKind; }
virtual void StreamPayload(SpliceableJSONWriter& aWriter, virtual void StreamPayload(SpliceableJSONWriter& aWriter,
const mozilla::TimeStamp& aProcessStartTime, const mozilla::TimeStamp& aProcessStartTime,
UniqueStacks& aUniqueStacks) override; UniqueStacks& aUniqueStacks) override;

View file

@ -376,8 +376,6 @@ TEST(GeckoProfiler, Markers)
{ {
AutoProfilerTracing tracing("C", "A"); AutoProfilerTracing tracing("C", "A");
profiler_log("X"); // Just a specialized form of profiler_tracing().
} }
profiler_add_marker("M1"); profiler_add_marker("M1");

View file

@ -37,6 +37,7 @@ FileDescriptorToHandle(int aFd)
using namespace mozilla; using namespace mozilla;
namespace { namespace {
struct DebugFilesAutoLockTraits struct DebugFilesAutoLockTraits
{ {
typedef PRLock* type; typedef PRLock* type;
@ -49,7 +50,6 @@ class DebugFilesAutoLock : public Scoped<DebugFilesAutoLockTraits>
{ {
static PRLock* Lock; static PRLock* Lock;
public: public:
static void Clear();
static PRLock* getDebugFileIDsLock() static PRLock* getDebugFileIDsLock()
{ {
// On windows this static is not thread safe, but we know that the first // On windows this static is not thread safe, but we know that the first
@ -75,12 +75,6 @@ public:
}; };
PRLock* DebugFilesAutoLock::Lock; PRLock* DebugFilesAutoLock::Lock;
void
DebugFilesAutoLock::Clear()
{
MOZ_ASSERT(Lock != nullptr);
Lock = nullptr;
}
// The ChunkedList<T> class implements, at the high level, a non-iterable // The ChunkedList<T> class implements, at the high level, a non-iterable
// list of instances of T. Its goal is to be somehow minimalist for the // list of instances of T. Its goal is to be somehow minimalist for the
@ -208,7 +202,6 @@ getDebugFileIDs()
return DebugFileIDs; return DebugFileIDs;
} }
} // namespace } // namespace
namespace mozilla { namespace mozilla {