Skip to content

Commit

Permalink
ResizeObserver pt4: IDL methods
Browse files Browse the repository at this point in the history
Implements ResizeObserver and ResizeObserverEntry IDL calls.

observe/unobserver connect ResizeObserver and Element through ElementRareData.
ElementRareData has a map (ResizeObserver->ResizeObservation)

Design doc at: https://docs.google.com/document/d/1G4OmqqlFY3H3erQAUmteKES02-bIECikDjWBrDKH9PA/edit?usp=sharing
BUG=612962

Review-Url: https://codereview.chromium.org/2185533004
Cr-Commit-Position: refs/heads/master@{#407973}
  • Loading branch information
atotic authored and Commit bot committed Jul 26, 2016
1 parent 04a768e commit a254bd8
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
28 changes: 28 additions & 0 deletions third_party/WebKit/Source/core/observer/ResizeObserver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
#include "core/observer/ResizeObserver.h"

#include "core/dom/Element.h"
#include "core/frame/FrameView.h"
#include "core/observer/ResizeObservation.h"
#include "core/observer/ResizeObserverCallback.h"
#include "core/observer/ResizeObserverController.h"
#include "core/observer/ResizeObserverEntry.h"

namespace blink {

Expand All @@ -25,14 +27,40 @@ ResizeObserver::ResizeObserver(ResizeObserverCallback* callback, Document& docum

void ResizeObserver::observe(Element* target)
{
auto& observerMap = target->ensureResizeObserverData();
if (observerMap.contains(this))
return; // Already registered.

auto observation = new ResizeObservation(target, this);
m_observations.add(observation);
observerMap.set(this, observation);

if (FrameView* frameView = target->document().view())
frameView->scheduleAnimation();
}

void ResizeObserver::unobserve(Element* target)
{
auto observerMap = target ? target->resizeObserverData() : nullptr;
if (!observerMap)
return;
auto observation = observerMap->find(this);
if (observation != observerMap->end()) {
m_observations.remove((*observation).value);
observerMap->remove(observation);
}
}

void ResizeObserver::disconnect()
{
ObservationList observations;
m_observations.swap(observations);

for (auto observation : observations) {
Element* target = (*observation).target();
if (target)
target->ensureResizeObserverData().remove(this);
}
}

DEFINE_TRACE(ResizeObserver)
Expand Down
13 changes: 12 additions & 1 deletion third_party/WebKit/Source/core/observer/ResizeObserverEntry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
#include "core/observer/ResizeObserverEntry.h"

#include "core/dom/ClientRect.h"
#include "core/dom/DOMRectReadOnly.h"
#include "core/dom/Element.h"
#include "core/layout/LayoutBox.h"
#include "core/observer/ResizeObservation.h"
Expand All @@ -17,6 +16,18 @@ class ResizeObservation;
ResizeObserverEntry::ResizeObserverEntry(Element* target)
: m_target(target)
{
FloatSize size = FloatSize(ResizeObservation::getTargetSize(m_target));
FloatPoint location;
LayoutBox* layout = m_target ? m_target->layoutBox() : nullptr;
if (layout) {
location = FloatPoint(layout->paddingLeft(), layout->paddingTop());
}
m_contentRect = ClientRect::create(FloatRect(location, size));
}

LayoutSize ResizeObserverEntry::contentSize() const
{
return LayoutSize(m_contentRect->width(), m_contentRect->height());
}

DEFINE_TRACE(ResizeObserverEntry)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
namespace blink {

class Element;
class DOMRectReadOnly;
class ClientRect;
class LayoutSize;

Expand All @@ -24,6 +23,7 @@ class ResizeObserverEntry final : public GarbageCollected<ResizeObserverEntry>,
Element* target() const { return m_target; }
// FIXME(atotic): should return DOMRectReadOnly once https://crbug.com/388780 lands
ClientRect* contentRect() const { return m_contentRect; }
LayoutSize contentSize() const;

DECLARE_VIRTUAL_TRACE();

Expand Down

0 comments on commit a254bd8

Please sign in to comment.