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

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

Issue 2005593002: Initial ResizeObserver implementation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Observe content box, not clientWidth Created 4 years, 6 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "core/observer/ResizeObserver.h"
6
7 #include "core/observer/ResizeObservation.h"
8 #include "core/observer/ResizeObserverCallback.h"
9 #include "core/observer/ResizeObserverController.h"
10
11 namespace blink {
12
13 ResizeObserver* ResizeObserver::create(Document& document, ResizeObserverCallbac k* callback)
14 {
15 auto observer = new ResizeObserver(callback);
16 document.ensureResizeObserverController().addObserver(*observer);
17 return observer;
18 }
19
20 ResizeObserver::ResizeObserver(ResizeObserverCallback* callback)
21 : m_callback(callback)
22 {
23 }
24
25 void ResizeObserver::observe(Element* target)
26 {
27 auto observerMap = target ? target->resizeObserverData() : nullptr;
28 if (observerMap && observerMap->find(this) != observerMap->end())
szager1 2016/06/02 20:52:41 if (observerMap && observerMap->contains(this))
atotic1 2016/06/08 18:59:21 Done.
29 return; // Already registered.
30 m_observations.add(new ResizeObservation(target, this));
31 }
32
33 void ResizeObserver::unobserve(Element* target)
34 {
35 auto observerMap = target ? target->resizeObserverData() : nullptr;
36 if (!observerMap)
37 return;
38 auto observation = observerMap->find(this);
39 if (observation != observerMap->end()) {
40 m_observations.remove(m_observations.find((*observation).value));
szager1 2016/06/02 20:52:41 m_observations.remove(observation->value)
atotic1 2016/06/08 18:59:21 Done.
41 observerMap->remove(observation);
42 }
43 }
44
45 void ResizeObserver::disconnect()
46 {
47 while (!m_observations.isEmpty()) {
szager1 2016/06/02 20:52:41 Vector<ResizeObservation> observations; copyToVect
atotic1 2016/06/08 18:59:21 Done.
48 auto observation = m_observations.first();
49 m_observations.remove(observation);
50 auto observerMap = observation->target()->resizeObserverData();
51 auto observationIt = observerMap->find(this);
52 observerMap->remove(observationIt);
53 }
54 m_activeObservations.clear();
55 }
56
57 bool ResizeObserver::gatherObservations()
58 {
59 m_activeObservations.clear();
szager1 2016/06/02 20:52:41 See previous comment; this should ASSERT(m_activeO
atotic1 2016/06/08 18:59:22 Done. Accomplished by calling clearObservations()
60
61 for (auto& observation : m_observations) {
62 if (observation->hasResized())
63 m_activeObservations.append(*observation);
64 }
65
66 return !m_activeObservations.isEmpty();
67 }
68
69 void ResizeObserver::deliverObservations()
70 {
71 if (m_activeObservations.size() == 0)
72 return;
73
74 HeapVector<Member<ResizeObserverEntry>> entries;
75
76 for (auto& observation : m_activeObservations) {
77 auto entry = new ResizeObserverEntry(observation->target());
78 entries.append(entry);
79 observation->setBroadcastSize(entry->contentSize());
80 }
81 m_callback->handleEvent(entries, this);
82 m_activeObservations.clear();
83 }
84
85 DEFINE_TRACE(ResizeObserver)
86 {
87 visitor->trace(m_callback);
88 visitor->trace(m_observations);
89 visitor->trace(m_activeObservations);
90 }
91
92 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698