Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: third_party/WebKit/Source/core/observer/ResizeObserver.cpp

Issue 2188983003: ResizeObserver pt5: size change notification (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: All CR comments addressed Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/observer/ResizeObserver.h" 5 #include "core/observer/ResizeObserver.h"
6 6
7 #include "core/dom/Element.h" 7 #include "core/dom/Element.h"
8 #include "core/frame/FrameView.h" 8 #include "core/frame/FrameView.h"
9 #include "core/observer/ResizeObservation.h" 9 #include "core/observer/ResizeObservation.h"
10 #include "core/observer/ResizeObserverCallback.h" 10 #include "core/observer/ResizeObserverCallback.h"
11 #include "core/observer/ResizeObserverController.h" 11 #include "core/observer/ResizeObserverController.h"
12 #include "core/observer/ResizeObserverEntry.h" 12 #include "core/observer/ResizeObserverEntry.h"
13 13
14 namespace blink { 14 namespace blink {
15 15
16 ResizeObserver* ResizeObserver::create(Document& document, ResizeObserverCallbac k* callback) 16 ResizeObserver* ResizeObserver::create(Document& document, ResizeObserverCallbac k* callback)
17 { 17 {
18 return new ResizeObserver(callback, document); 18 return new ResizeObserver(callback, document);
19 } 19 }
20 20
21 ResizeObserver::ResizeObserver(ResizeObserverCallback* callback, Document& docum ent) 21 ResizeObserver::ResizeObserver(ResizeObserverCallback* callback, Document& docum ent)
22 : m_callback(callback) 22 : m_callback(callback)
23 , m_skippedObservations(false)
24 , m_elementSizeChanged(false)
23 { 25 {
24 m_controller = &document.ensureResizeObserverController(); 26 m_controller = &document.ensureResizeObserverController();
25 m_controller->addObserver(*this); 27 m_controller->addObserver(*this);
26 } 28 }
27 29
28 void ResizeObserver::observe(Element* target) 30 void ResizeObserver::observe(Element* target)
29 { 31 {
30 auto& observerMap = target->ensureResizeObserverData(); 32 auto& observerMap = target->ensureResizeObserverData();
31 if (observerMap.contains(this)) 33 if (observerMap.contains(this))
32 return; // Already registered. 34 return; // Already registered.
(...skipping 16 matching lines...) Expand all
49 m_observations.remove((*observation).value); 51 m_observations.remove((*observation).value);
50 observerMap->remove(observation); 52 observerMap->remove(observation);
51 } 53 }
52 } 54 }
53 55
54 void ResizeObserver::disconnect() 56 void ResizeObserver::disconnect()
55 { 57 {
56 ObservationList observations; 58 ObservationList observations;
57 m_observations.swap(observations); 59 m_observations.swap(observations);
58 60
59 for (auto observation : observations) { 61 for (auto& observation : observations) {
60 Element* target = (*observation).target(); 62 Element* target = (*observation).target();
61 if (target) 63 if (target)
62 target->ensureResizeObserverData().remove(this); 64 target->ensureResizeObserverData().remove(this);
63 } 65 }
66 clearObservations();
67 }
68
69 size_t ResizeObserver::gatherObservations(size_t deeperThan)
70 {
71 DCHECK(m_activeObservations.isEmpty());
72
73 size_t minObservedDepth = ResizeObserverController::kDepthBottom;
74 if (!m_elementSizeChanged)
75 return minObservedDepth;
76 for (auto& observation : m_observations) {
77 if (!observation->observationSizeOutOfSync())
78 continue;
79 auto depth = observation->targetDepth();
80 if (depth > deeperThan) {
81 m_activeObservations.append(*observation);
82 minObservedDepth = std::min(minObservedDepth, depth);
83 } else {
84 m_skippedObservations = true;
85 }
86 }
87 return minObservedDepth;
88 }
89
90 void ResizeObserver::deliverObservations()
91 {
92 // We can only clear this flag after all observations have been
93 // broadcast.
94 m_elementSizeChanged = m_skippedObservations;
95 if (m_activeObservations.size() == 0)
96 return;
97
98 HeapVector<Member<ResizeObserverEntry>> entries;
99
100 for (auto& observation : m_activeObservations) {
101 auto entry = new ResizeObserverEntry(observation->target());
102 entries.append(entry);
103 observation->setObservationSize(entry->contentSize());
104 }
105 m_callback->handleEvent(entries, this);
106 clearObservations();
107 }
108
109 void ResizeObserver::clearObservations()
110 {
111 m_activeObservations.clear();
112 m_skippedObservations = false;
113 }
114
115 void ResizeObserver::elementSizeChanged()
116 {
117 m_elementSizeChanged = true;
118 if (m_controller)
119 m_controller->observerChanged();
64 } 120 }
65 121
66 DEFINE_TRACE(ResizeObserver) 122 DEFINE_TRACE(ResizeObserver)
67 { 123 {
68 visitor->trace(m_callback); 124 visitor->trace(m_callback);
69 visitor->trace(m_observations); 125 visitor->trace(m_observations);
126 visitor->trace(m_activeObservations);
70 visitor->trace(m_controller); 127 visitor->trace(m_controller);
71 } 128 }
72 129
73 } // namespace blink 130 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698