Added fix for mozbz#1468911
This commit is contained in:
parent
c75c4e98de
commit
a99b4bf95a
11
firefox.spec
11
firefox.spec
@ -1,10 +1,10 @@
|
|||||||
# Set to true if it's going to be submitted as update.
|
# Set to true if it's going to be submitted as update.
|
||||||
%global release_build 1
|
%global release_build 0
|
||||||
|
|
||||||
# Disabled arm due to rhbz#1658940
|
# Disabled arm due to rhbz#1658940
|
||||||
ExcludeArch: armv7hl
|
ExcludeArch: armv7hl
|
||||||
# Disabled due to https://pagure.io/fedora-infrastructure/issue/7581
|
# Disabled due to https://pagure.io/fedora-infrastructure/issue/7581
|
||||||
# ExcludeArch: s390x
|
ExcludeArch: s390x
|
||||||
|
|
||||||
%global system_nss 1
|
%global system_nss 1
|
||||||
%global system_ffi 1
|
%global system_ffi 1
|
||||||
@ -95,7 +95,7 @@ ExcludeArch: armv7hl
|
|||||||
Summary: Mozilla Firefox Web browser
|
Summary: Mozilla Firefox Web browser
|
||||||
Name: firefox
|
Name: firefox
|
||||||
Version: 66.0
|
Version: 66.0
|
||||||
Release: 4%{?pre_tag}%{?dist}
|
Release: 5%{?pre_tag}%{?dist}
|
||||||
URL: https://www.mozilla.org/firefox/
|
URL: https://www.mozilla.org/firefox/
|
||||||
License: MPLv1.1 or GPLv2+ or LGPLv2+
|
License: MPLv1.1 or GPLv2+ or LGPLv2+
|
||||||
Source0: https://archive.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.xz
|
Source0: https://archive.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.xz
|
||||||
@ -156,6 +156,7 @@ Patch575: mozilla-1423598-popup.patch
|
|||||||
Patch576: mozilla-1532643-popup.patch
|
Patch576: mozilla-1532643-popup.patch
|
||||||
Patch577: mozilla-1535567.patch
|
Patch577: mozilla-1535567.patch
|
||||||
Patch578: mozilla-1431399.patch
|
Patch578: mozilla-1431399.patch
|
||||||
|
Patch579: mozilla-1468911.patch
|
||||||
|
|
||||||
# PGO/LTO patches
|
# PGO/LTO patches
|
||||||
Patch600: pgo.patch
|
Patch600: pgo.patch
|
||||||
@ -363,6 +364,7 @@ This package contains results of tests executed during build.
|
|||||||
%patch576 -p1 -b .mozilla-1532643-popup
|
%patch576 -p1 -b .mozilla-1532643-popup
|
||||||
%patch577 -p1 -b .mozilla-1535567
|
%patch577 -p1 -b .mozilla-1535567
|
||||||
%patch578 -p1 -b .mozilla-1431399
|
%patch578 -p1 -b .mozilla-1431399
|
||||||
|
%patch579 -p1 -b .mozilla-1468911
|
||||||
|
|
||||||
# PGO patches
|
# PGO patches
|
||||||
%patch600 -p1 -b .pgo
|
%patch600 -p1 -b .pgo
|
||||||
@ -910,6 +912,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
|
|||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Mar 18 2019 Martin Stransky <stransky@redhat.com> - 66.0-5
|
||||||
|
- Added fix for mozbz#1468911
|
||||||
|
|
||||||
* Mon Mar 18 2019 Martin Stransky <stransky@redhat.com> - 66.0-4
|
* Mon Mar 18 2019 Martin Stransky <stransky@redhat.com> - 66.0-4
|
||||||
- Release build
|
- Release build
|
||||||
|
|
||||||
|
300
mozilla-1468911.patch
Normal file
300
mozilla-1468911.patch
Normal file
@ -0,0 +1,300 @@
|
|||||||
|
changeset: 465236:be9a6c98a4a7
|
||||||
|
tag: tip
|
||||||
|
user: Martin Stransky <stransky@redhat.com>
|
||||||
|
date: Mon Mar 18 10:42:48 2019 +0100
|
||||||
|
summary: tearing
|
||||||
|
|
||||||
|
diff --git a/widget/gtk/WindowSurfaceWayland.cpp b/widget/gtk/WindowSurfaceWayland.cpp
|
||||||
|
--- a/widget/gtk/WindowSurfaceWayland.cpp
|
||||||
|
+++ b/widget/gtk/WindowSurfaceWayland.cpp
|
||||||
|
@@ -15,16 +15,32 @@
|
||||||
|
#include "nsTArray.h"
|
||||||
|
#include "base/message_loop.h" // for MessageLoop
|
||||||
|
#include "base/task.h" // for NewRunnableMethod, etc
|
||||||
|
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
+#undef LOG
|
||||||
|
+#ifdef MOZ_LOGGING
|
||||||
|
+
|
||||||
|
+# include "mozilla/Logging.h"
|
||||||
|
+# include "nsTArray.h"
|
||||||
|
+# include "Units.h"
|
||||||
|
+
|
||||||
|
+extern mozilla::LazyLogModule gWidgetWaylandLog;
|
||||||
|
+# define LOGWAYLAND(args) MOZ_LOG(gWidgetWaylandLog, mozilla::LogLevel::Debug, args)
|
||||||
|
+
|
||||||
|
+#else
|
||||||
|
+
|
||||||
|
+# define LOGWAYLAND(args)
|
||||||
|
+
|
||||||
|
+#endif /* MOZ_LOGGING */
|
||||||
|
+
|
||||||
|
namespace mozilla {
|
||||||
|
namespace widget {
|
||||||
|
|
||||||
|
/*
|
||||||
|
Wayland multi-thread rendering scheme
|
||||||
|
|
||||||
|
Every rendering thread (main thread, compositor thread) contains its own
|
||||||
|
nsWaylandDisplay object connected to Wayland compositor (Mutter, Weston, etc.)
|
||||||
|
@@ -283,23 +299,30 @@ WindowBackBuffer::WindowBackBuffer(nsWay
|
||||||
|
Create(aWidth, aHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
WindowBackBuffer::~WindowBackBuffer() { Release(); }
|
||||||
|
|
||||||
|
bool WindowBackBuffer::Resize(int aWidth, int aHeight) {
|
||||||
|
if (aWidth == mWidth && aHeight == mHeight) return true;
|
||||||
|
|
||||||
|
+ LOGWAYLAND(("WindowBackBuffer::Resize [%p] %d %d\n",
|
||||||
|
+ (void*)this, aWidth, aHeight));
|
||||||
|
+
|
||||||
|
Release();
|
||||||
|
Create(aWidth, aHeight);
|
||||||
|
+ Clear();
|
||||||
|
|
||||||
|
return (mWaylandBuffer != nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WindowBackBuffer::Attach(wl_surface* aSurface) {
|
||||||
|
+ LOGWAYLAND(("WindowBackBuffer::Attach [%p] wl_surface %p\n",
|
||||||
|
+ (void*)this, (void *)aSurface));
|
||||||
|
+
|
||||||
|
wl_surface_attach(aSurface, mWaylandBuffer, 0, 0);
|
||||||
|
wl_surface_commit(aSurface);
|
||||||
|
wl_display_flush(mWaylandDisplay->GetDisplay());
|
||||||
|
mAttached = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WindowBackBuffer::Detach() { mAttached = false; }
|
||||||
|
|
||||||
|
@@ -340,17 +363,18 @@ WindowSurfaceWayland::WindowSurfaceWayla
|
||||||
|
mFrameCallback(nullptr),
|
||||||
|
mLastCommittedSurface(nullptr),
|
||||||
|
mDisplayThreadMessageLoop(MessageLoop::current()),
|
||||||
|
mDelayedCommitHandle(nullptr),
|
||||||
|
mDrawToWaylandBufferDirectly(true),
|
||||||
|
mPendingCommit(false),
|
||||||
|
mWaylandBufferFullScreenDamage(false),
|
||||||
|
mIsMainThread(NS_IsMainThread()),
|
||||||
|
- mNeedScaleFactorUpdate(true) {
|
||||||
|
+ mNeedScaleFactorUpdate(true),
|
||||||
|
+ mNeedFullScreenUpdate(true) {
|
||||||
|
for (int i = 0; i < BACK_BUFFER_NUM; i++) mBackupBuffer[i] = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
WindowSurfaceWayland::~WindowSurfaceWayland() {
|
||||||
|
if (mPendingCommit) {
|
||||||
|
NS_WARNING("Deleted WindowSurfaceWayland with a pending commit!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -392,16 +416,17 @@ WindowBackBuffer* WindowSurfaceWayland::
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mWaylandBuffer->IsAttached()) {
|
||||||
|
if (!mWaylandBuffer->IsMatchingSize(aWidth, aHeight)) {
|
||||||
|
mWaylandBuffer->Resize(aWidth, aHeight);
|
||||||
|
// There's a chance that scale factor has been changed
|
||||||
|
// when buffer size changed
|
||||||
|
mNeedScaleFactorUpdate = true;
|
||||||
|
+ mNeedFullScreenUpdate = true;
|
||||||
|
}
|
||||||
|
return mWaylandBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
MOZ_ASSERT(!mPendingCommit,
|
||||||
|
"Uncommitted buffer switch, screen artifacts ahead.");
|
||||||
|
|
||||||
|
// Front buffer is used by compositor, select a back buffer
|
||||||
|
@@ -490,39 +515,36 @@ already_AddRefed<gfx::DrawTarget> Window
|
||||||
|
|
||||||
|
B) Lock() is requested for part(s) of screen. We need to provide temporary
|
||||||
|
surface to draw into and copy result (clipped) to target wl_surface.
|
||||||
|
*/
|
||||||
|
already_AddRefed<gfx::DrawTarget> WindowSurfaceWayland::Lock(
|
||||||
|
const LayoutDeviceIntRegion& aRegion) {
|
||||||
|
MOZ_ASSERT(mIsMainThread == NS_IsMainThread());
|
||||||
|
|
||||||
|
- LayoutDeviceIntRect screenRect = mWindow->GetBounds();
|
||||||
|
- gfx::IntRect bounds = aRegion.GetBounds().ToUnknownRect();
|
||||||
|
- gfx::IntSize lockSize(bounds.XMost(), bounds.YMost());
|
||||||
|
+ LOGWAYLAND(("WindowSurfaceWayland::Lock [%p]\n", (void*)this));
|
||||||
|
|
||||||
|
// Are we asked for entire nsWindow to draw?
|
||||||
|
- mDrawToWaylandBufferDirectly =
|
||||||
|
- (aRegion.GetNumRects() == 1 && bounds.x == 0 && bounds.y == 0 &&
|
||||||
|
- lockSize.width == screenRect.width &&
|
||||||
|
- lockSize.height == screenRect.height);
|
||||||
|
-
|
||||||
|
+ mDrawToWaylandBufferDirectly = IsFullScreenDraw(aRegion);
|
||||||
|
if (mDrawToWaylandBufferDirectly) {
|
||||||
|
+ LayoutDeviceIntRect screenRect = mWindow->GetBounds();
|
||||||
|
RefPtr<gfx::DrawTarget> dt =
|
||||||
|
LockWaylandBuffer(screenRect.width, screenRect.height,
|
||||||
|
mWindow->WaylandSurfaceNeedsClear());
|
||||||
|
if (dt) {
|
||||||
|
return dt.forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
// We don't have any front buffer available. Try indirect drawing
|
||||||
|
// to mImageSurface which is mirrored to front buffer at commit.
|
||||||
|
mDrawToWaylandBufferDirectly = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ gfx::IntRect bounds = aRegion.GetBounds().ToUnknownRect();
|
||||||
|
+ gfx::IntSize lockSize(bounds.XMost(), bounds.YMost());
|
||||||
|
return LockImageSurface(lockSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WindowSurfaceWayland::CommitImageSurfaceToWaylandBuffer(
|
||||||
|
const LayoutDeviceIntRegion& aRegion) {
|
||||||
|
MOZ_ASSERT(!mDrawToWaylandBufferDirectly);
|
||||||
|
|
||||||
|
LayoutDeviceIntRect screenRect = mWindow->GetBounds();
|
||||||
|
@@ -611,31 +633,42 @@ void WindowSurfaceWayland::CommitWayland
|
||||||
|
// If our stored wl_surface does not match the actual one it means the frame
|
||||||
|
// callback is no longer active and we should release it.
|
||||||
|
wl_callback_destroy(mFrameCallback);
|
||||||
|
mFrameCallback = nullptr;
|
||||||
|
mLastCommittedSurface = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mWaylandBufferFullScreenDamage) {
|
||||||
|
+ // We know we can safely redraw whole screen.
|
||||||
|
LayoutDeviceIntRect rect = mWindow->GetBounds();
|
||||||
|
wl_surface_damage(waylandSurface, 0, 0, rect.width, rect.height);
|
||||||
|
mWaylandBufferFullScreenDamage = false;
|
||||||
|
} else {
|
||||||
|
gint scaleFactor = mWindow->GdkScaleFactor();
|
||||||
|
for (auto iter = mWaylandBufferDamage.RectIter(); !iter.Done();
|
||||||
|
iter.Next()) {
|
||||||
|
const mozilla::LayoutDeviceIntRect& r = iter.Get();
|
||||||
|
// We need to remove the scale factor because the wl_surface_damage
|
||||||
|
// also multiplies by current scale factor.
|
||||||
|
wl_surface_damage(waylandSurface, r.x / scaleFactor, r.y / scaleFactor,
|
||||||
|
r.width / scaleFactor, r.height / scaleFactor);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ // We have to wait untill whole screen is drawn by Gecko, that happens
|
||||||
|
+ // when window is created or resized.
|
||||||
|
+ if (mNeedFullScreenUpdate) {
|
||||||
|
+ if (!IsFullScreenDraw(mWaylandBufferDamage)) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
+ mNeedFullScreenUpdate = false;
|
||||||
|
+
|
||||||
|
// Clear all back buffer damage as we're committing
|
||||||
|
// all requested regions.
|
||||||
|
mWaylandBufferDamage.SetEmpty();
|
||||||
|
|
||||||
|
mFrameCallback = wl_surface_frame(waylandSurface);
|
||||||
|
wl_callback_add_listener(mFrameCallback, &frame_listener, this);
|
||||||
|
|
||||||
|
if (mNeedScaleFactorUpdate || mLastCommittedSurface != waylandSurface) {
|
||||||
|
@@ -648,16 +681,18 @@ void WindowSurfaceWayland::CommitWayland
|
||||||
|
|
||||||
|
// There's no pending commit, all changes are sent to compositor.
|
||||||
|
mPendingCommit = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WindowSurfaceWayland::Commit(const LayoutDeviceIntRegion& aInvalidRegion) {
|
||||||
|
MOZ_ASSERT(mIsMainThread == NS_IsMainThread());
|
||||||
|
|
||||||
|
+ LOGWAYLAND(("WindowSurfaceWayland::Commit [%p]\n", (void*)this));
|
||||||
|
+
|
||||||
|
// We have new content at mImageSurface - copy data to mWaylandBuffer first.
|
||||||
|
if (!mDrawToWaylandBufferDirectly) {
|
||||||
|
CommitImageSurfaceToWaylandBuffer(aInvalidRegion);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we're not at fullscreen damage add drawing area from aInvalidRegion
|
||||||
|
if (!mWaylandBufferFullScreenDamage) {
|
||||||
|
mWaylandBufferDamage.OrWith(aInvalidRegion);
|
||||||
|
@@ -690,10 +725,22 @@ void WindowSurfaceWayland::DelayedCommit
|
||||||
|
free(mDelayedCommitHandle);
|
||||||
|
mDelayedCommitHandle = nullptr;
|
||||||
|
|
||||||
|
if (mPendingCommit) {
|
||||||
|
CommitWaylandBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+bool WindowSurfaceWayland::IsFullScreenDraw(
|
||||||
|
+ const LayoutDeviceIntRegion& aRegion) {
|
||||||
|
+ LayoutDeviceIntRect screenRect = mWindow->GetBounds();
|
||||||
|
+ gfx::IntRect bounds = aRegion.GetBounds().ToUnknownRect();
|
||||||
|
+ gfx::IntSize lockSize(bounds.XMost(), bounds.YMost());
|
||||||
|
+
|
||||||
|
+ // Are we asked to update entire nsWindow?
|
||||||
|
+ return (bounds.x == 0 && bounds.y == 0 &&
|
||||||
|
+ lockSize.width == screenRect.width &&
|
||||||
|
+ lockSize.height == screenRect.height);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
} // namespace widget
|
||||||
|
} // namespace mozilla
|
||||||
|
diff --git a/widget/gtk/WindowSurfaceWayland.h b/widget/gtk/WindowSurfaceWayland.h
|
||||||
|
--- a/widget/gtk/WindowSurfaceWayland.h
|
||||||
|
+++ b/widget/gtk/WindowSurfaceWayland.h
|
||||||
|
@@ -94,16 +94,17 @@ class WindowSurfaceWayland : public Wind
|
||||||
|
|
||||||
|
private:
|
||||||
|
WindowBackBuffer* GetWaylandBufferToDraw(int aWidth, int aHeight);
|
||||||
|
|
||||||
|
already_AddRefed<gfx::DrawTarget> LockWaylandBuffer(int aWidth, int aHeight,
|
||||||
|
bool aClearBuffer);
|
||||||
|
already_AddRefed<gfx::DrawTarget> LockImageSurface(
|
||||||
|
const gfx::IntSize& aLockSize);
|
||||||
|
+ bool IsFullScreenDraw(const LayoutDeviceIntRegion& aRegion);
|
||||||
|
bool CommitImageSurfaceToWaylandBuffer(const LayoutDeviceIntRegion& aRegion);
|
||||||
|
void CommitWaylandBuffer();
|
||||||
|
|
||||||
|
// TODO: Do we need to hold a reference to nsWindow object?
|
||||||
|
nsWindow* mWindow;
|
||||||
|
nsWaylandDisplay* mWaylandDisplay;
|
||||||
|
WindowBackBuffer* mWaylandBuffer;
|
||||||
|
LayoutDeviceIntRegion mWaylandBufferDamage;
|
||||||
|
@@ -113,14 +114,15 @@ class WindowSurfaceWayland : public Wind
|
||||||
|
wl_surface* mLastCommittedSurface;
|
||||||
|
MessageLoop* mDisplayThreadMessageLoop;
|
||||||
|
WindowSurfaceWayland** mDelayedCommitHandle;
|
||||||
|
bool mDrawToWaylandBufferDirectly;
|
||||||
|
bool mPendingCommit;
|
||||||
|
bool mWaylandBufferFullScreenDamage;
|
||||||
|
bool mIsMainThread;
|
||||||
|
bool mNeedScaleFactorUpdate;
|
||||||
|
+ bool mNeedFullScreenUpdate;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace widget
|
||||||
|
} // namespace mozilla
|
||||||
|
|
||||||
|
#endif // _MOZILLA_WIDGET_GTK_WINDOW_SURFACE_WAYLAND_H
|
||||||
|
diff --git a/widget/gtk/nsAppShell.cpp b/widget/gtk/nsAppShell.cpp
|
||||||
|
--- a/widget/gtk/nsAppShell.cpp
|
||||||
|
+++ b/widget/gtk/nsAppShell.cpp
|
||||||
|
@@ -35,16 +35,17 @@ using mozilla::widget::ScreenHelperGTK;
|
||||||
|
using mozilla::widget::ScreenManager;
|
||||||
|
|
||||||
|
#define NOTIFY_TOKEN 0xFA
|
||||||
|
|
||||||
|
LazyLogModule gWidgetLog("Widget");
|
||||||
|
LazyLogModule gWidgetFocusLog("WidgetFocus");
|
||||||
|
LazyLogModule gWidgetDragLog("WidgetDrag");
|
||||||
|
LazyLogModule gWidgetDrawLog("WidgetDraw");
|
||||||
|
+LazyLogModule gWidgetWaylandLog("WidgetWayland");
|
||||||
|
|
||||||
|
static GPollFunc sPollFunc;
|
||||||
|
|
||||||
|
// Wrapper function to disable hang monitoring while waiting in poll().
|
||||||
|
static gint PollWrapper(GPollFD* ufds, guint nfsd, gint timeout_) {
|
||||||
|
mozilla::BackgroundHangMonitor().NotifyWait();
|
||||||
|
gint result;
|
||||||
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user