Bug 1074401 - Ensure that the repaint request is always dispatched from the APZ on the main thread. r=botond

This commit is contained in:
Kartikaya Gupta 2014-10-03 13:39:37 -04:00
Родитель 02b75fbdaf
Коммит 282f0f98b2
7 изменённых файлов: 73 добавлений и 146 удалений

Просмотреть файл

@ -25,6 +25,7 @@ public:
/**
* Requests a paint of the given FrameMetrics |aFrameMetrics| from Gecko.
* Implementations per-platform are responsible for actually handling this.
* This method will always be called on the Gecko main thread.
*/
virtual void RequestContentRepaint(const FrameMetrics& aFrameMetrics) = 0;

Просмотреть файл

@ -2403,7 +2403,12 @@ AsyncPanZoomController::DispatchRepaintRequest(const FrameMetrics& aFrameMetrics
APZC_LOG_FM(aFrameMetrics, "%p requesting content repaint", this);
LogRendertraceRect(GetGuid(), "requested displayport", "yellow", GetDisplayPortRect(aFrameMetrics));
controller->RequestContentRepaint(aFrameMetrics);
if (NS_IsMainThread()) {
controller->RequestContentRepaint(aFrameMetrics);
} else {
NS_DispatchToMainThread(NS_NewRunnableMethodWithArg<FrameMetrics>(
controller, &GeckoContentController::RequestContentRepaint, aFrameMetrics));
}
mLastDispatchedPaintMetrics = aFrameMetrics;
}
}

Просмотреть файл

@ -86,12 +86,11 @@ public:
virtual void RequestContentRepaint(const FrameMetrics& aFrameMetrics) MOZ_OVERRIDE
{
// We always need to post requests into the "UI thread" otherwise the
// requests may get processed out of order.
mUILoop->PostTask(
FROM_HERE,
NewRunnableMethod(this, &RemoteContentController::DoRequestContentRepaint,
aFrameMetrics));
MOZ_ASSERT(NS_IsMainThread());
if (mRenderFrame) {
TabParent* browser = static_cast<TabParent*>(mRenderFrame->Manager());
browser->UpdateFrame(aFrameMetrics);
}
}
virtual void AcknowledgeScrollUpdate(const FrameMetrics::ViewID& aScrollId,
@ -261,14 +260,6 @@ public:
mTouchSensitiveRegion = aRegion;
}
private:
void DoRequestContentRepaint(const FrameMetrics& aFrameMetrics)
{
if (mRenderFrame) {
TabParent* browser = static_cast<TabParent*>(mRenderFrame->Manager());
browser->UpdateFrame(aFrameMetrics);
}
}
MessageLoop* mUILoop;
RenderFrameParent* mRenderFrame;

Просмотреть файл

@ -82,12 +82,6 @@ APZCCallbackHandler::GetDOMWindowUtils()
void
APZCCallbackHandler::RequestContentRepaint(const FrameMetrics& aFrameMetrics)
{
if (!NS_IsMainThread()) {
NS_DispatchToMainThread(NS_NewRunnableMethodWithArg<FrameMetrics>(
this, &APZCCallbackHandler::RequestContentRepaint, aFrameMetrics));
return;
}
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aFrameMetrics.GetScrollId() != FrameMetrics::NULL_SCROLL_ID);

Просмотреть файл

@ -402,38 +402,16 @@ class APZCTMController : public mozilla::layers::GeckoContentController
typedef mozilla::layers::FrameMetrics FrameMetrics;
typedef mozilla::layers::ScrollableLayerGuid ScrollableLayerGuid;
class RequestContentRepaintEvent : public nsRunnable
{
public:
explicit RequestContentRepaintEvent(const FrameMetrics& aFrameMetrics)
: mFrameMetrics(aFrameMetrics)
{
}
NS_IMETHOD Run()
{
MOZ_ASSERT(NS_IsMainThread());
nsCOMPtr<nsIContent> targetContent = nsLayoutUtils::FindContentFor(mFrameMetrics.GetScrollId());
if (targetContent) {
APZCCallbackHelper::UpdateSubFrame(targetContent, mFrameMetrics);
}
return NS_OK;
}
protected:
FrameMetrics mFrameMetrics;
};
public:
// GeckoContentController interface
virtual void RequestContentRepaint(const FrameMetrics& aFrameMetrics)
{
nsCOMPtr<nsIRunnable> r1 = new RequestContentRepaintEvent(aFrameMetrics);
if (!NS_IsMainThread()) {
NS_DispatchToMainThread(r1);
} else {
r1->Run();
MOZ_ASSERT(NS_IsMainThread());
nsCOMPtr<nsIContent> targetContent = nsLayoutUtils::FindContentFor(aFrameMetrics.GetScrollId());
if (targetContent) {
FrameMetrics metrics = aFrameMetrics;
APZCCallbackHelper::UpdateSubFrame(targetContent, metrics);
}
}

Просмотреть файл

@ -12,41 +12,19 @@
namespace mozilla {
namespace widget {
class RequestContentRepaintEvent : public nsRunnable
{
typedef mozilla::layers::FrameMetrics FrameMetrics;
public:
RequestContentRepaintEvent(const FrameMetrics& aFrameMetrics)
: mFrameMetrics(aFrameMetrics)
{
}
NS_IMETHOD Run() {
MOZ_ASSERT(NS_IsMainThread());
nsCOMPtr<nsIContent> content = nsLayoutUtils::FindContentFor(mFrameMetrics.GetScrollId());
if (content) {
mozilla::layers::APZCCallbackHelper::UpdateSubFrame(content, mFrameMetrics);
}
return NS_OK;
}
protected:
FrameMetrics mFrameMetrics;
};
void
ParentProcessController::RequestContentRepaint(const FrameMetrics& aFrameMetrics)
{
MOZ_ASSERT(NS_IsMainThread());
if (aFrameMetrics.GetScrollId() == FrameMetrics::NULL_SCROLL_ID) {
return;
}
nsCOMPtr<nsIRunnable> r = new RequestContentRepaintEvent(aFrameMetrics);
if (!NS_IsMainThread()) {
NS_DispatchToMainThread(r);
} else {
r->Run();
nsCOMPtr<nsIContent> content = nsLayoutUtils::FindContentFor(aFrameMetrics.GetScrollId());
if (content) {
FrameMetrics metrics = aFrameMetrics;
mozilla::layers::APZCCallbackHelper::UpdateSubFrame(content, metrics);
}
}

Просмотреть файл

@ -79,70 +79,6 @@ GetDOMTargets(uint64_t aScrollId,
return true;
}
class RequestContentRepaintEvent : public nsRunnable
{
typedef mozilla::layers::FrameMetrics FrameMetrics;
public:
RequestContentRepaintEvent(const FrameMetrics& aFrameMetrics) :
mFrameMetrics(aFrameMetrics)
{
}
NS_IMETHOD Run() {
// This must be on the gecko thread since we access the dom
MOZ_ASSERT(NS_IsMainThread());
#ifdef DEBUG_CONTROLLER
WinUtils::Log("APZController: mScrollOffset: %f %f", mFrameMetrics.mScrollOffset.x,
mFrameMetrics.mScrollOffset.y);
#endif
nsCOMPtr<nsIDocument> subDocument;
nsCOMPtr<nsIContent> targetContent;
if (!GetDOMTargets(mFrameMetrics.GetScrollId(),
subDocument, targetContent)) {
return NS_OK;
}
// If we're dealing with a sub frame or content editable element,
// call UpdateSubFrame.
if (targetContent) {
#ifdef DEBUG_CONTROLLER
WinUtils::Log("APZController: detected subframe or content editable");
#endif
mozilla::layers::APZCCallbackHelper::UpdateSubFrame(targetContent, mFrameMetrics);
return NS_OK;
}
#ifdef DEBUG_CONTROLLER
WinUtils::Log("APZController: detected tab");
#endif
// We're dealing with a tab, call UpdateRootFrame.
nsCOMPtr<nsIDOMWindowUtils> utils;
nsCOMPtr<nsIDOMWindow> window = subDocument->GetDefaultView();
if (window) {
utils = do_GetInterface(window);
if (utils) {
mozilla::layers::APZCCallbackHelper::UpdateRootFrame(utils, mFrameMetrics);
#ifdef DEBUG_CONTROLLER
WinUtils::Log("APZController: %I64d mDisplayPortMargins: %0.2f %0.2f %0.2f %0.2f",
mFrameMetrics.GetScrollId(),
mFrameMetrics.GetDisplayPortMargins().left,
mFrameMetrics.GetDisplayPortMargins().top,
mFrameMetrics.GetDisplayPortMargins().right,
mFrameMetrics.GetDisplayPortMargins().bottom);
#endif
}
}
return NS_OK;
}
protected:
FrameMetrics mFrameMetrics;
};
void
APZController::SetPendingResponseFlusher(APZPendingResponseFlusher* aFlusher)
{
@ -198,11 +134,55 @@ APZController::RequestContentRepaint(const FrameMetrics& aFrameMetrics)
WinUtils::Log("APZController::RequestContentRepaint scrollid=%I64d",
aFrameMetrics.GetScrollId());
#endif
nsCOMPtr<nsIRunnable> r1 = new RequestContentRepaintEvent(aFrameMetrics);
if (!NS_IsMainThread()) {
NS_DispatchToMainThread(r1);
} else {
r1->Run();
// This must be on the gecko thread since we access the dom
MOZ_ASSERT(NS_IsMainThread());
#ifdef DEBUG_CONTROLLER
WinUtils::Log("APZController: mScrollOffset: %f %f", aFrameMetrics.mScrollOffset.x,
aFrameMetrics.mScrollOffset.y);
#endif
nsCOMPtr<nsIDocument> subDocument;
nsCOMPtr<nsIContent> targetContent;
if (!GetDOMTargets(aFrameMetrics.GetScrollId(),
subDocument, targetContent)) {
return NS_OK;
}
// If we're dealing with a sub frame or content editable element,
// call UpdateSubFrame.
if (targetContent) {
#ifdef DEBUG_CONTROLLER
WinUtils::Log("APZController: detected subframe or content editable");
#endif
FrameMetrics metrics = aFrameMetrics;
mozilla::layers::APZCCallbackHelper::UpdateSubFrame(targetContent, metrics);
return NS_OK;
}
#ifdef DEBUG_CONTROLLER
WinUtils::Log("APZController: detected tab");
#endif
// We're dealing with a tab, call UpdateRootFrame.
nsCOMPtr<nsIDOMWindowUtils> utils;
nsCOMPtr<nsIDOMWindow> window = subDocument->GetDefaultView();
if (window) {
utils = do_GetInterface(window);
if (utils) {
FrameMetrics metrics = aFrameMetrics;
mozilla::layers::APZCCallbackHelper::UpdateRootFrame(utils, metrics);
#ifdef DEBUG_CONTROLLER
WinUtils::Log("APZController: %I64d mDisplayPortMargins: %0.2f %0.2f %0.2f %0.2f",
metrics.GetScrollId(),
metrics.GetDisplayPortMargins().left,
metrics.GetDisplayPortMargins().top,
metrics.GetDisplayPortMargins().right,
metrics.GetDisplayPortMargins().bottom);
#endif
}
}
}