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

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: Review fixes 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) {
ikilpatrick 2016/07/29 23:18:38 auto& ?
atotic1 2016/07/30 03:16:29 Done.
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)
ikilpatrick 2016/07/28 21:48:40 Ok, so we should store the m_observations in an or
atotic1 2016/07/29 20:04:16 TBD: wrote a lenghty reply.
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();
ikilpatrick 2016/07/28 21:48:40 This is currently O(n*m*o) which we'll want to fix
atotic1 2016/07/29 20:04:16 TBD: wrote a lenghty reply.
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 m_elementSizeChanged = m_skippedObservations;
ikilpatrick 2016/07/29 23:18:38 Why does this flag get set here & like this? Poten
atotic1 2016/07/30 03:16:29 Added: // We can only clear this flag after all ob
93 if (m_activeObservations.size() == 0)
94 return;
95
96 HeapVector<Member<ResizeObserverEntry>> entries;
97
98 for (auto& observation : m_activeObservations) {
99 auto entry = new ResizeObserverEntry(observation->target());
100 entries.append(entry);
101 observation->setObservationSize(entry->contentSize());
102 }
103 m_callback->handleEvent(entries, this);
104 clearObservations();
105 }
106
107 void ResizeObserver::clearObservations()
108 {
109 m_activeObservations.clear();
110 m_skippedObservations = false;
111 }
112
113 void ResizeObserver::elementSizeChanged()
114 {
115 m_elementSizeChanged = true;
116 if (m_controller)
117 m_controller->observerChanged();
64 } 118 }
65 119
66 DEFINE_TRACE(ResizeObserver) 120 DEFINE_TRACE(ResizeObserver)
67 { 121 {
68 visitor->trace(m_callback); 122 visitor->trace(m_callback);
69 visitor->trace(m_observations); 123 visitor->trace(m_observations);
124 visitor->trace(m_activeObservations);
70 visitor->trace(m_controller); 125 visitor->trace(m_controller);
71 } 126 }
72 127
73 } // namespace blink 128 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698