icecat: add release icecat-140.10.1-1gnu1 for ecne

This commit is contained in:
Ark74 2026-05-04 16:58:41 -06:00
parent a5f93cb214
commit ff85d7c623
1256 changed files with 63469 additions and 24141 deletions

View file

@ -142,20 +142,18 @@ class SourceSurfaceCanvasRecording final : public gfx::SourceSurface {
}
already_AddRefed<gfx::DataSourceSurface> GetDataSurface() final {
EnsureDataSurfaceOnMainThread();
MutexAutoLock lock(mDataSurfaceLock);
EnsureDataSurfaceOnMainThread(lock);
return do_AddRef(mDataSourceSurface);
}
void AttachSurface() { mDetached = false; }
void DetachSurface() { mDetached = true; }
void DetachSurface(bool aInvalidate = false) {
mDetached = true;
void InvalidateDataSurface() {
if (mDataSourceSurface && mMayInvalidate) {
// This must be the only reference to the data left.
MOZ_ASSERT(mDataSourceSurface->hasOneRef());
mDataSourceSurface =
gfx::Factory::CopyDataSourceSurface(mDataSourceSurface);
mMayInvalidate = false;
if (aInvalidate) {
MutexAutoLock lock(mDataSurfaceLock);
InvalidateDataSurface(lock);
}
}
@ -165,6 +163,10 @@ class SourceSurfaceCanvasRecording final : public gfx::SourceSurface {
}
bool GetSurfaceDescriptor(SurfaceDescriptor& aDesc) final {
if (!NS_IsMainThread()) {
// Only allow recording surface upload optimization on main thread.
return false;
}
static Atomic<uintptr_t> sNextExportID(0);
if (!mExportID) {
mExportID = gfx::ReferencePtr(++sNextExportID);
@ -177,11 +179,31 @@ class SourceSurfaceCanvasRecording final : public gfx::SourceSurface {
}
private:
void EnsureDataSurfaceOnMainThread() {
// The data can only be retrieved on the main thread.
if (!mDataSourceSurface && NS_IsMainThread()) {
mDataSourceSurface = mCanvasChild->GetDataSurface(
mTextureOwnerId, mRecordedSurface, mDetached, mMayInvalidate);
void InvalidateDataSurface(const MutexAutoLock& aProofOfLock)
MOZ_REQUIRES(mDataSurfaceLock) {
// The data is about to be invalidated and must be copied before it is
// modified.
if (mDataSourceSurface && mMayInvalidate) {
mDataSourceSurface =
gfx::Factory::CopyDataSourceSurface(mDataSourceSurface);
mMayInvalidate = false;
}
}
void EnsureDataSurfaceOnMainThread(const MutexAutoLock& aProofOfLock)
MOZ_REQUIRES(mDataSurfaceLock) {
if (NS_IsMainThread()) {
// The data can only be retrieved on the main thread.
if (!mDataSourceSurface) {
mDataSourceSurface = mCanvasChild->GetDataSurface(
mTextureOwnerId, mRecordedSurface, mDetached, mMayInvalidate);
}
} else {
// If data is going to be accessed on another thread, then copy the data
// if necessary before access. This avoids the main thread accidentally
// trying to invalidate the data surface while the other thread is still
// accessing it.
InvalidateDataSurface(aProofOfLock);
}
}
@ -207,9 +229,11 @@ class SourceSurfaceCanvasRecording final : public gfx::SourceSurface {
RefPtr<gfx::SourceSurface> mRecordedSurface;
RefPtr<CanvasChild> mCanvasChild;
RefPtr<CanvasDrawEventRecorder> mRecorder;
RefPtr<gfx::DataSourceSurface> mDataSourceSurface;
Mutex mDataSurfaceLock{"SourceSurfaceCanvasRecording::mDataSurfaceLock"};
RefPtr<gfx::DataSourceSurface> mDataSourceSurface
MOZ_GUARDED_BY(mDataSurfaceLock);
bool mMayInvalidate MOZ_GUARDED_BY(mDataSurfaceLock) = false;
bool mDetached = false;
bool mMayInvalidate = false;
ReferencePtr mExportID;
};
@ -679,10 +703,7 @@ void CanvasChild::DetachSurface(const RefPtr<gfx::SourceSurface>& aSurface,
bool aInvalidate) {
if (auto* surface =
static_cast<SourceSurfaceCanvasRecording*>(aSurface.get())) {
surface->DetachSurface();
if (aInvalidate) {
surface->InvalidateDataSurface();
}
surface->DetachSurface(aInvalidate);
}
}