зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1074401 - Ensure that the repaint request is always dispatched from the APZ on the main thread. r=botond
This commit is contained in:
Родитель
02b75fbdaf
Коммит
282f0f98b2
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче