Chromium Code Reviews| Index: third_party/WebKit/Source/core/frame/FrameView.cpp |
| diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp |
| index 4784dd7466c71d63bfc859a221047804fdb73f04..7515b37b48ab0c50e5ef2ef92a2587b529fa3485 100644 |
| --- a/third_party/WebKit/Source/core/frame/FrameView.cpp |
| +++ b/third_party/WebKit/Source/core/frame/FrameView.cpp |
| @@ -38,6 +38,7 @@ |
| #include "core/editing/FrameSelection.h" |
| #include "core/editing/RenderedPosition.h" |
| #include "core/editing/markers/DocumentMarkerController.h" |
| +#include "core/events/ErrorEvent.h" |
| #include "core/fetch/ResourceFetcher.h" |
| #include "core/frame/EventHandlerRegistry.h" |
| #include "core/frame/FrameHost.h" |
| @@ -75,6 +76,7 @@ |
| #include "core/loader/DocumentLoader.h" |
| #include "core/loader/FrameLoader.h" |
| #include "core/loader/FrameLoaderClient.h" |
| +#include "core/observer/ResizeObserverController.h" |
| #include "core/page/AutoscrollController.h" |
| #include "core/page/ChromeClient.h" |
| #include "core/page/FocusController.h" |
| @@ -2515,6 +2517,36 @@ void FrameView::scheduleVisualUpdateForPaintInvalidationIfNeeded() |
| // Otherwise the paint invalidation will be handled in paint invalidation phase of this cycle. |
| } |
| +void FrameView::notifyResizeObserver() |
|
esprehn
2016/08/10 04:27:09
Observers() I think you want plural?
atotic1
2016/08/10 18:25:33
Done.
I usually keep everything singular for simp
|
| +{ |
| + // Controller exists only if ResizeObserver was created. |
| + if (!frame().document()->resizeObserverController()) |
| + return; |
| + |
| + ResizeObserverController& resizeController = m_frame->document()->ensureResizeObserverController(); |
| + |
| + DCHECK(lifecycle().state() >= DocumentLifecycle::LayoutClean); |
| + |
| + size_t minDepth = 0; |
| + for (minDepth = resizeController.gatherObservations(0); |
| + minDepth != ResizeObserverController::kDepthBottom; |
| + minDepth = resizeController.gatherObservations(minDepth)) { |
| + resizeController.deliverObservations(); |
| + frame().document()->updateStyleAndLayout(); |
| + } |
| + |
| + if (resizeController.skippedObservations()) { |
| + resizeController.clearObservations(); |
|
esprehn
2016/08/10 04:27:09
Hmm, if we clear the observations how does schedul
atotic1
2016/08/10 18:25:33
This is non-obvious.
ResizeObserver has a set of
|
| + ErrorEvent * error = ErrorEvent::create("ResizeObserver loop limit exceeded", SourceLocation::capture(m_frame->document()), nullptr); |
| + m_frame->document()->reportException(error, NotSharableCrossOrigin); |
| + // Ensure notifications will get delivered in next cycle. |
| + if (FrameView* frameView = m_frame->view()) |
| + frameView->scheduleAnimation(); |
| + } |
| + |
| + DCHECK(!layoutView()->needsLayout()); |
| +} |
| + |
| // TODO(leviw): We don't assert lifecycle information from documents in child PluginViews. |
| void FrameView::updateLifecyclePhasesInternal(DocumentLifecycle::LifecycleState targetState) |
| { |
| @@ -2546,6 +2578,10 @@ void FrameView::updateLifecyclePhasesInternal(DocumentLifecycle::LifecycleState |
| return; |
| } |
| + forAllNonThrottledFrameViews([](FrameView& frameView) { |
| + frameView.notifyResizeObserver(); |
|
esprehn
2016/08/10 04:27:09
Did you add some iframe tests where the new Resize
atotic1
2016/08/10 18:25:33
observer.html, test6()
|
| + }); |
| + |
| if (LayoutViewItem view = layoutViewItem()) { |
| forAllNonThrottledFrameViews([](FrameView& frameView) { |
| frameView.checkDoesNotNeedLayout(); |