diff --git a/sky/engine/core/animation/ActiveAnimations.cpp b/sky/engine/core/animation/ActiveAnimations.cpp
index 11e5c92..da8f274 100644
--- a/sky/engine/core/animation/ActiveAnimations.cpp
+++ b/sky/engine/core/animation/ActiveAnimations.cpp
@@ -74,8 +74,4 @@
         it->key->cancelAnimationOnCompositor();
 }
 
-void ActiveAnimations::trace(Visitor* visitor)
-{
-}
-
 } // namespace blink
diff --git a/sky/engine/core/animation/ActiveAnimations.h b/sky/engine/core/animation/ActiveAnimations.h
index 4955033..b411bb1 100644
--- a/sky/engine/core/animation/ActiveAnimations.h
+++ b/sky/engine/core/animation/ActiveAnimations.h
@@ -79,8 +79,6 @@
     void addAnimation(Animation* animation) { m_animations.append(animation); }
     void notifyAnimationDestroyed(Animation* animation) { m_animations.remove(m_animations.find(animation)); }
 
-    void trace(Visitor*);
-
 private:
     bool isAnimationStyleChange() const { return m_animationStyleChange; }
 
diff --git a/sky/engine/core/animation/Animation.cpp b/sky/engine/core/animation/Animation.cpp
index fa57474..3340b16 100644
--- a/sky/engine/core/animation/Animation.cpp
+++ b/sky/engine/core/animation/Animation.cpp
@@ -299,12 +299,4 @@
         CompositorAnimations::instance()->pauseAnimationForTestingOnCompositor(*m_target, m_compositorAnimationIds[i], pauseTime);
 }
 
-void Animation::trace(Visitor* visitor)
-{
-    visitor->trace(m_target);
-    visitor->trace(m_effect);
-    visitor->trace(m_sampledEffect);
-    AnimationNode::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/animation/Animation.h b/sky/engine/core/animation/Animation.h
index 40a64e5..97abbfa 100644
--- a/sky/engine/core/animation/Animation.h
+++ b/sky/engine/core/animation/Animation.h
@@ -80,8 +80,6 @@
     void cancelAnimationOnCompositor();
     void pauseAnimationForTestingOnCompositor(double pauseTime);
 
-    virtual void trace(Visitor*);
-
 protected:
     void applyEffects();
     void clearEffects();
diff --git a/sky/engine/core/animation/AnimationEffect.h b/sky/engine/core/animation/AnimationEffect.h
index cce544c..bfe4d6a 100644
--- a/sky/engine/core/animation/AnimationEffect.h
+++ b/sky/engine/core/animation/AnimationEffect.h
@@ -57,8 +57,6 @@
 
     virtual bool affects(CSSPropertyID) { return false; };
     virtual bool isKeyframeEffectModel() const { return false; }
-
-    virtual void trace(Visitor*) { }
 };
 
 } // namespace blink
diff --git a/sky/engine/core/animation/AnimationNode.cpp b/sky/engine/core/animation/AnimationNode.cpp
index 7d35ad0..d77de33 100644
--- a/sky/engine/core/animation/AnimationNode.cpp
+++ b/sky/engine/core/animation/AnimationNode.cpp
@@ -186,11 +186,4 @@
     return AnimationNodeTiming::create(this);
 }
 
-void AnimationNode::trace(Visitor* visitor)
-{
-    visitor->trace(m_parent);
-    visitor->trace(m_player);
-    visitor->trace(m_eventDelegate);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/animation/AnimationNode.h b/sky/engine/core/animation/AnimationNode.h
index 2b183ec..50f30da 100644
--- a/sky/engine/core/animation/AnimationNode.h
+++ b/sky/engine/core/animation/AnimationNode.h
@@ -75,7 +75,6 @@
     public:
         virtual ~EventDelegate() { }
         virtual void onEventCondition(const AnimationNode*) = 0;
-        virtual void trace(Visitor*) { }
     };
 
     virtual ~AnimationNode() { }
@@ -113,8 +112,6 @@
     double localTime(bool& isNull) const { isNull = !m_player; return ensureCalculated().localTime * 1000; }
     double currentIteration(bool& isNull) const { isNull = !ensureCalculated().isInEffect; return ensureCalculated().currentIteration; }
 
-    virtual void trace(Visitor*);
-
 protected:
     explicit AnimationNode(const Timing&, PassOwnPtr<EventDelegate> = nullptr);
 
diff --git a/sky/engine/core/animation/AnimationNodeTest.cpp b/sky/engine/core/animation/AnimationNodeTest.cpp
index 8e7ecbe..ffa276e 100644
--- a/sky/engine/core/animation/AnimationNodeTest.cpp
+++ b/sky/engine/core/animation/AnimationNodeTest.cpp
@@ -95,12 +95,6 @@
         return result;
     }
 
-    virtual void trace(Visitor* visitor) override
-    {
-        visitor->trace(m_eventDelegate);
-        AnimationNode::trace(visitor);
-    }
-
 private:
     TestAnimationNode(const Timing& specified, TestAnimationNodeEventDelegate* eventDelegate)
         : AnimationNode(specified, adoptPtr(eventDelegate))
diff --git a/sky/engine/core/animation/AnimationNodeTiming.cpp b/sky/engine/core/animation/AnimationNodeTiming.cpp
index 4e1727f..3209813 100644
--- a/sky/engine/core/animation/AnimationNodeTiming.cpp
+++ b/sky/engine/core/animation/AnimationNodeTiming.cpp
@@ -170,9 +170,4 @@
     m_parent->updateSpecifiedTiming(timing);
 }
 
-void AnimationNodeTiming::trace(Visitor* visitor)
-{
-    visitor->trace(m_parent);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/animation/AnimationNodeTiming.h b/sky/engine/core/animation/AnimationNodeTiming.h
index f8cfc45..3117d11 100644
--- a/sky/engine/core/animation/AnimationNodeTiming.h
+++ b/sky/engine/core/animation/AnimationNodeTiming.h
@@ -37,8 +37,6 @@
     void setDirection(String);
     void setEasing(String);
 
-    void trace(Visitor*);
-
 private:
     RefPtr<AnimationNode> m_parent;
     explicit AnimationNodeTiming(AnimationNode*);
diff --git a/sky/engine/core/animation/AnimationPlayer.cpp b/sky/engine/core/animation/AnimationPlayer.cpp
index 5df165d..4ccf52a 100644
--- a/sky/engine/core/animation/AnimationPlayer.cpp
+++ b/sky/engine/core/animation/AnimationPlayer.cpp
@@ -654,12 +654,4 @@
     pause();
 }
 
-void AnimationPlayer::trace(Visitor* visitor)
-{
-    visitor->trace(m_content);
-    visitor->trace(m_timeline);
-    visitor->trace(m_pendingFinishedEvent);
-    EventTargetWithInlineData::trace(visitor);
-}
-
 } // namespace
diff --git a/sky/engine/core/animation/AnimationPlayer.h b/sky/engine/core/animation/AnimationPlayer.h
index ed715cd..34a178e 100644
--- a/sky/engine/core/animation/AnimationPlayer.h
+++ b/sky/engine/core/animation/AnimationPlayer.h
@@ -146,8 +146,6 @@
 
     virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture = false) override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     AnimationPlayer(ExecutionContext*, AnimationTimeline&, AnimationNode*);
     double sourceEnd() const;
diff --git a/sky/engine/core/animation/AnimationStack.cpp b/sky/engine/core/animation/AnimationStack.cpp
index 1d510a9..6c70617 100644
--- a/sky/engine/core/animation/AnimationStack.cpp
+++ b/sky/engine/core/animation/AnimationStack.cpp
@@ -141,11 +141,6 @@
     m_effects.shrink(dest);
 }
 
-void AnimationStack::trace(Visitor* visitor)
-{
-    visitor->trace(m_effects);
-}
-
 bool AnimationStack::getAnimatedBoundingBox(FloatBox& box, CSSPropertyID property) const
 {
     FloatBox originalBox(box);
diff --git a/sky/engine/core/animation/AnimationStack.h b/sky/engine/core/animation/AnimationStack.h
index 0800bc0..6c49f77 100644
--- a/sky/engine/core/animation/AnimationStack.h
+++ b/sky/engine/core/animation/AnimationStack.h
@@ -56,7 +56,6 @@
     static HashMap<CSSPropertyID, RefPtr<Interpolation> > activeInterpolations(AnimationStack*, const Vector<RawPtr<InertAnimation> >* newAnimations, const HashSet<RawPtr<const AnimationPlayer> >* cancelledAnimationPlayers, Animation::Priority, double timelineCurrentTime);
 
     bool getAnimatedBoundingBox(FloatBox&, CSSPropertyID) const;
-    void trace(Visitor*);
 
 private:
     void simplifyEffects();
diff --git a/sky/engine/core/animation/AnimationTimeline.cpp b/sky/engine/core/animation/AnimationTimeline.cpp
index eb2c357..4888a2c 100644
--- a/sky/engine/core/animation/AnimationTimeline.cpp
+++ b/sky/engine/core/animation/AnimationTimeline.cpp
@@ -159,12 +159,6 @@
         m_timeline->m_document->view()->scheduleAnimation();
 }
 
-void AnimationTimeline::AnimationTimelineTiming::trace(Visitor* visitor)
-{
-    visitor->trace(m_timeline);
-    AnimationTimeline::PlatformTiming::trace(visitor);
-}
-
 double AnimationTimeline::currentTime(bool& isNull)
 {
     return currentTimeInternal(isNull) * 1000;
@@ -230,14 +224,4 @@
 }
 #endif
 
-void AnimationTimeline::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_document);
-    visitor->trace(m_timing);
-    visitor->trace(m_playersNeedingUpdate);
-    visitor->trace(m_players);
-#endif
-}
-
 } // namespace
diff --git a/sky/engine/core/animation/AnimationTimeline.h b/sky/engine/core/animation/AnimationTimeline.h
index 01dbe07..4e4de59 100644
--- a/sky/engine/core/animation/AnimationTimeline.h
+++ b/sky/engine/core/animation/AnimationTimeline.h
@@ -58,7 +58,6 @@
         virtual void cancelWake() = 0;
         virtual void serviceOnNextFrame() = 0;
         virtual ~PlatformTiming() { }
-        virtual void trace(Visitor*) { }
     };
 
     static PassRefPtr<AnimationTimeline> create(Document*, PassOwnPtr<PlatformTiming> = nullptr);
@@ -97,8 +96,6 @@
 #endif
     void wake();
 
-    void trace(Visitor*);
-
 protected:
     AnimationTimeline(Document*, PassOwnPtr<PlatformTiming>);
 
@@ -129,8 +126,6 @@
 
         void timerFired(Timer<AnimationTimelineTiming>*) { m_timeline->wake(); }
 
-        virtual void trace(Visitor*) override;
-
     private:
         RawPtr<AnimationTimeline> m_timeline;
         Timer<AnimationTimelineTiming> m_timer;
diff --git a/sky/engine/core/animation/AnimationTimelineTest.cpp b/sky/engine/core/animation/AnimationTimelineTest.cpp
index 7515208..0eaa292 100644
--- a/sky/engine/core/animation/AnimationTimelineTest.cpp
+++ b/sky/engine/core/animation/AnimationTimelineTest.cpp
@@ -77,11 +77,6 @@
         EXPECT_CALL(*this, cancelWake()).InSequence(sequence);
         EXPECT_CALL(*this, wakeAfter(when)).InSequence(sequence);
     }
-
-    void trace(Visitor* visitor)
-    {
-        AnimationTimeline::PlatformTiming::trace(visitor);
-    }
 };
 
 class AnimationAnimationTimelineTest : public ::testing::Test {
diff --git a/sky/engine/core/animation/CompositorPendingAnimations.cpp b/sky/engine/core/animation/CompositorPendingAnimations.cpp
index e9714eb..280d9d4 100644
--- a/sky/engine/core/animation/CompositorPendingAnimations.cpp
+++ b/sky/engine/core/animation/CompositorPendingAnimations.cpp
@@ -132,10 +132,4 @@
     m_waitingForCompositorAnimationStart.clear();
 }
 
-void CompositorPendingAnimations::trace(Visitor* visitor)
-{
-    visitor->trace(m_pending);
-    visitor->trace(m_waitingForCompositorAnimationStart);
-}
-
 } // namespace
diff --git a/sky/engine/core/animation/CompositorPendingAnimations.h b/sky/engine/core/animation/CompositorPendingAnimations.h
index 4a3adcb..fb823c4 100644
--- a/sky/engine/core/animation/CompositorPendingAnimations.h
+++ b/sky/engine/core/animation/CompositorPendingAnimations.h
@@ -57,8 +57,6 @@
     bool update(bool startOnCompositor = true);
     void notifyCompositorAnimationStarted(double monotonicAnimationStartTime);
 
-    void trace(Visitor*);
-
 private:
     void timerFired(Timer<CompositorPendingAnimations>*) { update(false); }
 
diff --git a/sky/engine/core/animation/DefaultStyleInterpolation.h b/sky/engine/core/animation/DefaultStyleInterpolation.h
index 775350c..3930417 100644
--- a/sky/engine/core/animation/DefaultStyleInterpolation.h
+++ b/sky/engine/core/animation/DefaultStyleInterpolation.h
@@ -22,13 +22,6 @@
         StyleBuilder::applyProperty(m_id, state, toInterpolableBool(m_cachedValue.get())->value() ? m_endCSSValue.get() : m_startCSSValue.get());
     }
 
-    virtual void trace(Visitor* visitor) override
-    {
-        StyleInterpolation::trace(visitor);
-        visitor->trace(m_startCSSValue);
-        visitor->trace(m_endCSSValue);
-    }
-
 private:
     DefaultStyleInterpolation(CSSValue* start, CSSValue* end, CSSPropertyID id)
         : StyleInterpolation(InterpolableBool::create(false), InterpolableBool::create(true), id)
diff --git a/sky/engine/core/animation/DeferredLegacyStyleInterpolation.cpp b/sky/engine/core/animation/DeferredLegacyStyleInterpolation.cpp
index 8b33cb2..9e62773 100644
--- a/sky/engine/core/animation/DeferredLegacyStyleInterpolation.cpp
+++ b/sky/engine/core/animation/DeferredLegacyStyleInterpolation.cpp
@@ -130,11 +130,4 @@
     return false;
 }
 
-void DeferredLegacyStyleInterpolation::trace(Visitor* visitor)
-{
-    visitor->trace(m_startCSSValue);
-    visitor->trace(m_endCSSValue);
-    StyleInterpolation::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/animation/DeferredLegacyStyleInterpolation.h b/sky/engine/core/animation/DeferredLegacyStyleInterpolation.h
index f1c93e6..50f50c8 100644
--- a/sky/engine/core/animation/DeferredLegacyStyleInterpolation.h
+++ b/sky/engine/core/animation/DeferredLegacyStyleInterpolation.h
@@ -25,8 +25,6 @@
 
     virtual void apply(StyleResolverState&) const override;
 
-    virtual void trace(Visitor*) override;
-
     static bool interpolationRequiresStyleResolve(const CSSValue&);
     static bool interpolationRequiresStyleResolve(const CSSPrimitiveValue&);
     static bool interpolationRequiresStyleResolve(const CSSImageValue&);
diff --git a/sky/engine/core/animation/InertAnimation.cpp b/sky/engine/core/animation/InertAnimation.cpp
index 18466fe..84540b2 100644
--- a/sky/engine/core/animation/InertAnimation.cpp
+++ b/sky/engine/core/animation/InertAnimation.cpp
@@ -63,10 +63,4 @@
     return std::numeric_limits<double>::infinity();
 }
 
-void InertAnimation::trace(Visitor* visitor)
-{
-    visitor->trace(m_effect);
-    AnimationNode::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/animation/InertAnimation.h b/sky/engine/core/animation/InertAnimation.h
index bcf95b1..10835a6 100644
--- a/sky/engine/core/animation/InertAnimation.h
+++ b/sky/engine/core/animation/InertAnimation.h
@@ -44,8 +44,6 @@
     AnimationEffect* effect() const { return m_effect.get(); }
     bool paused() const { return m_paused; }
 
-    virtual void trace(Visitor*);
-
 protected:
     virtual void updateChildrenAndEffects() const override { }
     virtual double calculateTimeToEffectChange(bool forwards, double inheritedTime, double timeToNextIteration) const override;
diff --git a/sky/engine/core/animation/InterpolableValue.cpp b/sky/engine/core/animation/InterpolableValue.cpp
index b276ef8..63be961 100644
--- a/sky/engine/core/animation/InterpolableValue.cpp
+++ b/sky/engine/core/animation/InterpolableValue.cpp
@@ -48,14 +48,6 @@
     return result.release();
 }
 
-void InterpolableList::trace(Visitor* visitor)
-{
-#if ENABLE_OILPAN
-    visitor->trace(m_values);
-#endif
-    InterpolableValue::trace(visitor);
-}
-
 PassOwnPtr<InterpolableValue> InterpolableAnimatableValue::interpolate(const InterpolableValue &other, const double percentage) const
 {
     const InterpolableAnimatableValue& otherValue = toInterpolableAnimatableValue(other);
@@ -66,10 +58,4 @@
     return create(AnimatableValue::interpolate(m_value.get(), otherValue.m_value.get(), percentage));
 }
 
-void InterpolableAnimatableValue::trace(Visitor* visitor)
-{
-    visitor->trace(m_value);
-    InterpolableValue::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/animation/InterpolableValue.h b/sky/engine/core/animation/InterpolableValue.h
index 3f97550..26809ec 100644
--- a/sky/engine/core/animation/InterpolableValue.h
+++ b/sky/engine/core/animation/InterpolableValue.h
@@ -22,8 +22,6 @@
 
     virtual PassOwnPtr<InterpolableValue> clone() const = 0;
 
-    virtual void trace(Visitor*) { }
-
 private:
     virtual PassOwnPtr<InterpolableValue> interpolate(const InterpolableValue &to, const double progress) const = 0;
 
@@ -48,8 +46,6 @@
     double value() const { return m_value; }
     virtual PassOwnPtr<InterpolableValue> clone() const override final { return create(m_value); }
 
-    virtual void trace(Visitor* visitor) override { InterpolableValue::trace(visitor); }
-
 private:
     virtual PassOwnPtr<InterpolableValue> interpolate(const InterpolableValue &to, const double progress) const override final;
     double m_value;
@@ -72,8 +68,6 @@
     bool value() const { return m_value; }
     virtual PassOwnPtr<InterpolableValue> clone() const override final { return create(m_value); }
 
-    virtual void trace(Visitor* visitor) override { InterpolableValue::trace(visitor); }
-
 private:
     virtual PassOwnPtr<InterpolableValue> interpolate(const InterpolableValue &to, const double progress) const override final;
     bool m_value;
@@ -111,8 +105,6 @@
     size_t length() const { return m_size; }
     virtual PassOwnPtr<InterpolableValue> clone() const override final { return create(*this); }
 
-    virtual void trace(Visitor*) override;
-
 private:
     virtual PassOwnPtr<InterpolableValue> interpolate(const InterpolableValue &other, const double progress) const override final;
     explicit InterpolableList(size_t size)
@@ -145,8 +137,6 @@
     AnimatableValue* value() const { return m_value.get(); }
     virtual PassOwnPtr<InterpolableValue> clone() const override final { return create(m_value); }
 
-    virtual void trace(Visitor*) override;
-
 private:
     virtual PassOwnPtr<InterpolableValue> interpolate(const InterpolableValue &other, const double progress) const override final;
     RefPtr<AnimatableValue> m_value;
diff --git a/sky/engine/core/animation/Interpolation.cpp b/sky/engine/core/animation/Interpolation.cpp
index 289c48b..416e3f0 100644
--- a/sky/engine/core/animation/Interpolation.cpp
+++ b/sky/engine/core/animation/Interpolation.cpp
@@ -53,11 +53,4 @@
     }
 }
 
-void Interpolation::trace(Visitor* visitor)
-{
-    visitor->trace(m_start);
-    visitor->trace(m_end);
-    visitor->trace(m_cachedValue);
-}
-
 }
diff --git a/sky/engine/core/animation/Interpolation.h b/sky/engine/core/animation/Interpolation.h
index a3b1908..89fc8d3 100644
--- a/sky/engine/core/animation/Interpolation.h
+++ b/sky/engine/core/animation/Interpolation.h
@@ -23,8 +23,6 @@
     virtual bool isStyleInterpolation() const { return false; }
     virtual bool isLegacyStyleInterpolation() const { return false; }
 
-    virtual void trace(Visitor*);
-
 protected:
     const OwnPtr<InterpolableValue> m_start;
     const OwnPtr<InterpolableValue> m_end;
diff --git a/sky/engine/core/animation/InterpolationEffect.cpp b/sky/engine/core/animation/InterpolationEffect.cpp
index 2831d2e..e63cfc1 100644
--- a/sky/engine/core/animation/InterpolationEffect.cpp
+++ b/sky/engine/core/animation/InterpolationEffect.cpp
@@ -27,16 +27,4 @@
     return adoptPtr(result);
 }
 
-void InterpolationEffect::InterpolationRecord::trace(Visitor* visitor)
-{
-    visitor->trace(m_interpolation);
-}
-
-void InterpolationEffect::trace(Visitor* visitor)
-{
-#if ENABLE_OILPAN
-    visitor->trace(m_interpolations);
-#endif
-}
-
 }
diff --git a/sky/engine/core/animation/InterpolationEffect.h b/sky/engine/core/animation/InterpolationEffect.h
index cd8631e..69a00b4 100644
--- a/sky/engine/core/animation/InterpolationEffect.h
+++ b/sky/engine/core/animation/InterpolationEffect.h
@@ -23,8 +23,6 @@
         m_interpolations.append(InterpolationRecord::create(interpolation, easing, start, end, applyFrom, applyTo));
     }
 
-    void trace(Visitor*);
-
 private:
     InterpolationEffect()
     {
@@ -44,8 +42,6 @@
             return adoptPtr(new InterpolationRecord(interpolation, easing, start, end, applyFrom, applyTo));
         }
 
-        void trace(Visitor*);
-
     private:
         InterpolationRecord(PassRefPtr<Interpolation> interpolation, PassRefPtr<TimingFunction> easing, double start, double end, double applyFrom, double applyTo)
             : m_interpolation(interpolation)
diff --git a/sky/engine/core/animation/Keyframe.h b/sky/engine/core/animation/Keyframe.h
index 38ee1c4..b54f4a3 100644
--- a/sky/engine/core/animation/Keyframe.h
+++ b/sky/engine/core/animation/Keyframe.h
@@ -48,8 +48,6 @@
     virtual bool isAnimatableValueKeyframe() const { return false; }
     virtual bool isStringKeyframe() const { return false; }
 
-    virtual void trace(Visitor*) { }
-
     class PropertySpecificKeyframe {
     public:
         virtual ~PropertySpecificKeyframe() { }
@@ -66,8 +64,6 @@
         virtual PassOwnPtr<PropertySpecificKeyframe> neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const = 0;
         virtual PassRefPtr<Interpolation> createInterpolation(CSSPropertyID, blink::Keyframe::PropertySpecificKeyframe* end, Element*) const = 0;
 
-        virtual void trace(Visitor*) { }
-
     protected:
         PropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, AnimationEffect::CompositeOperation);
 
diff --git a/sky/engine/core/animation/KeyframeEffectModel.cpp b/sky/engine/core/animation/KeyframeEffectModel.cpp
index afaf076..42d67f0 100644
--- a/sky/engine/core/animation/KeyframeEffectModel.cpp
+++ b/sky/engine/core/animation/KeyframeEffectModel.cpp
@@ -174,16 +174,6 @@
     return true;
 }
 
-void KeyframeEffectModelBase::trace(Visitor* visitor)
-{
-    visitor->trace(m_keyframes);
-    visitor->trace(m_interpolationEffect);
-#if ENABLE_OILPAN
-    visitor->trace(m_keyframeGroups);
-#endif
-    AnimationEffect::trace(visitor);
-}
-
 Keyframe::PropertySpecificKeyframe::PropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, AnimationEffect::CompositeOperation composite)
     : m_offset(offset)
     , m_easing(easing)
@@ -225,11 +215,4 @@
         appendKeyframe(m_keyframes.last()->neutralKeyframe(1, nullptr));
 }
 
-void KeyframeEffectModelBase::PropertySpecificKeyframeGroup::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_keyframes);
-#endif
-}
-
 } // namespace
diff --git a/sky/engine/core/animation/KeyframeEffectModel.h b/sky/engine/core/animation/KeyframeEffectModel.h
index 3a856fc..2ddf899 100644
--- a/sky/engine/core/animation/KeyframeEffectModel.h
+++ b/sky/engine/core/animation/KeyframeEffectModel.h
@@ -60,8 +60,6 @@
         void appendKeyframe(PassOwnPtr<Keyframe::PropertySpecificKeyframe>);
         const PropertySpecificKeyframeVector& keyframes() const { return m_keyframes; }
 
-        void trace(Visitor*);
-
     private:
         void removeRedundantKeyframes();
         void addSyntheticKeyframeIfRequired(const KeyframeEffectModelBase* context);
@@ -93,8 +91,6 @@
     virtual bool isAnimatableValueKeyframeEffectModel() const { return false; }
     virtual bool isStringKeyframeEffectModel() const { return false; }
 
-    virtual void trace(Visitor*) override;
-
     // FIXME: This is a hack used to resolve CSSValues to AnimatableValues while we have a valid handle on an element.
     // This should be removed once StringKeyframes no longer uses InterpolableAnimatableValues.
     void forceConversionsToAnimatableValues(Element* element)
diff --git a/sky/engine/core/animation/LegacyStyleInterpolation.h b/sky/engine/core/animation/LegacyStyleInterpolation.h
index cf49f34..162570a 100644
--- a/sky/engine/core/animation/LegacyStyleInterpolation.h
+++ b/sky/engine/core/animation/LegacyStyleInterpolation.h
@@ -28,11 +28,6 @@
         return toInterpolableAnimatableValue(m_cachedValue.get())->value();
     }
 
-    virtual void trace(Visitor* visitor) override
-    {
-        StyleInterpolation::trace(visitor);
-    }
-
 private:
     LegacyStyleInterpolation(PassOwnPtr<InterpolableValue> start, PassOwnPtr<InterpolableValue> end, CSSPropertyID id)
         : StyleInterpolation(start, end, id)
diff --git a/sky/engine/core/animation/LengthStyleInterpolation.cpp b/sky/engine/core/animation/LengthStyleInterpolation.cpp
index 174a4d1..d5bebfe 100644
--- a/sky/engine/core/animation/LengthStyleInterpolation.cpp
+++ b/sky/engine/core/animation/LengthStyleInterpolation.cpp
@@ -101,9 +101,4 @@
     StyleBuilder::applyProperty(m_id, state, interpolableValueToLength(m_cachedValue.get(), m_range).get());
 }
 
-void LengthStyleInterpolation::trace(Visitor* visitor)
-{
-    StyleInterpolation::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/animation/LengthStyleInterpolation.h b/sky/engine/core/animation/LengthStyleInterpolation.h
index 24cc707..55ed670 100644
--- a/sky/engine/core/animation/LengthStyleInterpolation.h
+++ b/sky/engine/core/animation/LengthStyleInterpolation.h
@@ -20,9 +20,6 @@
     static bool canCreateFrom(const CSSValue&);
 
     virtual void apply(StyleResolverState&) const override;
-
-    virtual void trace(Visitor*) override;
-
 private:
     LengthStyleInterpolation(PassOwnPtr<InterpolableValue> start, PassOwnPtr<InterpolableValue> end, CSSPropertyID id,  ValueRange range)
         : StyleInterpolation(start, end, id)
diff --git a/sky/engine/core/animation/SampledEffect.cpp b/sky/engine/core/animation/SampledEffect.cpp
index c8b82f0..977a11c 100644
--- a/sky/engine/core/animation/SampledEffect.cpp
+++ b/sky/engine/core/animation/SampledEffect.cpp
@@ -55,12 +55,4 @@
     m_interpolations->shrink(dest);
 }
 
-void SampledEffect::trace(Visitor* visitor)
-{
-    visitor->trace(m_animation);
-#if ENABLE(OILPAN)
-    visitor->trace(m_interpolations);
-#endif
-}
-
 } // namespace blink
diff --git a/sky/engine/core/animation/SampledEffect.h b/sky/engine/core/animation/SampledEffect.h
index 2834852..c42498e 100644
--- a/sky/engine/core/animation/SampledEffect.h
+++ b/sky/engine/core/animation/SampledEffect.h
@@ -32,8 +32,6 @@
 
     void removeReplacedInterpolationsIfNeeded(const BitArray<numCSSProperties>&);
 
-    void trace(Visitor*);
-
 private:
     SampledEffect(Animation*, PassOwnPtr<Vector<RefPtr<Interpolation> > >);
 
diff --git a/sky/engine/core/animation/StringKeyframe.cpp b/sky/engine/core/animation/StringKeyframe.cpp
index 9aec887..936ce65 100644
--- a/sky/engine/core/animation/StringKeyframe.cpp
+++ b/sky/engine/core/animation/StringKeyframe.cpp
@@ -48,12 +48,6 @@
     return adoptPtr(new PropertySpecificKeyframe(offset(), &easing(), propertyValue(property), composite()));
 }
 
-void StringKeyframe::trace(Visitor* visitor)
-{
-    visitor->trace(m_propertySet);
-    Keyframe::trace(visitor);
-}
-
 StringKeyframe::PropertySpecificKeyframe::PropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, CSSValue* value, AnimationEffect::CompositeOperation op)
     : Keyframe::PropertySpecificKeyframe(offset, easing, op)
     , m_value(value)
@@ -142,11 +136,4 @@
     return adoptPtr(theClone);
 }
 
-void StringKeyframe::PropertySpecificKeyframe::trace(Visitor* visitor)
-{
-    visitor->trace(m_value);
-    visitor->trace(m_animatableValueCache);
-    Keyframe::PropertySpecificKeyframe::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/animation/StringKeyframe.h b/sky/engine/core/animation/StringKeyframe.h
index 9dea079..9159825 100644
--- a/sky/engine/core/animation/StringKeyframe.h
+++ b/sky/engine/core/animation/StringKeyframe.h
@@ -28,8 +28,6 @@
     }
     virtual PropertySet properties() const override;
 
-    virtual void trace(Visitor*) override;
-
     class PropertySpecificKeyframe : public Keyframe::PropertySpecificKeyframe {
     public:
         PropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, CSSValue*, AnimationEffect::CompositeOperation);
@@ -42,8 +40,6 @@
         virtual PassOwnPtr<Keyframe::PropertySpecificKeyframe> neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const override final;
         virtual PassRefPtr<Interpolation> createInterpolation(CSSPropertyID, blink::Keyframe::PropertySpecificKeyframe* end, Element*) const override final;
 
-        virtual void trace(Visitor*) override;
-
     private:
         PropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, CSSValue*);
 
diff --git a/sky/engine/core/animation/StyleInterpolation.h b/sky/engine/core/animation/StyleInterpolation.h
index ce0a967..d3c6123 100644
--- a/sky/engine/core/animation/StyleInterpolation.h
+++ b/sky/engine/core/animation/StyleInterpolation.h
@@ -26,11 +26,6 @@
 
     CSSPropertyID id() const { return m_id; }
 
-    virtual void trace(Visitor* visitor) override
-    {
-        Interpolation::trace(visitor);
-    }
-
 protected:
     CSSPropertyID m_id;
 
diff --git a/sky/engine/core/animation/animatable/AnimatableClipPathOperation.h b/sky/engine/core/animation/animatable/AnimatableClipPathOperation.h
index 13a6298..cbc975b 100644
--- a/sky/engine/core/animation/animatable/AnimatableClipPathOperation.h
+++ b/sky/engine/core/animation/animatable/AnimatableClipPathOperation.h
@@ -45,8 +45,6 @@
     }
     ClipPathOperation* clipPathOperation() const { return m_operation.get(); }
 
-    virtual void trace(Visitor* visitor) override { AnimatableValue::trace(visitor); }
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
     virtual bool usesDefaultInterpolationWith(const AnimatableValue*) const override;
diff --git a/sky/engine/core/animation/animatable/AnimatableColor.h b/sky/engine/core/animation/animatable/AnimatableColor.h
index 0a680de..cc27118 100644
--- a/sky/engine/core/animation/animatable/AnimatableColor.h
+++ b/sky/engine/core/animation/animatable/AnimatableColor.h
@@ -61,8 +61,6 @@
     static PassRefPtr<AnimatableColor> create(const AnimatableColorImpl&);
     Color color() const { return m_color.toColor(); }
 
-    virtual void trace(Visitor* visitor) override { AnimatableValue::trace(visitor); }
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
 
diff --git a/sky/engine/core/animation/animatable/AnimatableDouble.h b/sky/engine/core/animation/animatable/AnimatableDouble.h
index cfc4b14..4b9b824 100644
--- a/sky/engine/core/animation/animatable/AnimatableDouble.h
+++ b/sky/engine/core/animation/animatable/AnimatableDouble.h
@@ -51,8 +51,6 @@
 
     double toDouble() const { return m_number; }
 
-    virtual void trace(Visitor* visitor) override { AnimatableValue::trace(visitor); }
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
     virtual bool usesDefaultInterpolationWith(const AnimatableValue*) const override;
diff --git a/sky/engine/core/animation/animatable/AnimatableFilterOperations.h b/sky/engine/core/animation/animatable/AnimatableFilterOperations.h
index 2e660a7..d685c3f 100644
--- a/sky/engine/core/animation/animatable/AnimatableFilterOperations.h
+++ b/sky/engine/core/animation/animatable/AnimatableFilterOperations.h
@@ -45,8 +45,6 @@
     }
     const FilterOperations& operations() const { return m_operations; }
 
-    virtual void trace(Visitor* visitor) override { AnimatableValue::trace(visitor); }
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
     virtual bool usesDefaultInterpolationWith(const AnimatableValue*) const override;
diff --git a/sky/engine/core/animation/animatable/AnimatableImage.h b/sky/engine/core/animation/animatable/AnimatableImage.h
index 383b046..1e7b588 100644
--- a/sky/engine/core/animation/animatable/AnimatableImage.h
+++ b/sky/engine/core/animation/animatable/AnimatableImage.h
@@ -46,12 +46,6 @@
     }
     CSSValue* toCSSValue() const { return m_value.get(); }
 
-    virtual void trace(Visitor* visitor) override
-    {
-        visitor->trace(m_value);
-        AnimatableValue::trace(visitor);
-    }
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
     virtual bool usesDefaultInterpolationWith(const AnimatableValue*) const override;
diff --git a/sky/engine/core/animation/animatable/AnimatableLength.h b/sky/engine/core/animation/animatable/AnimatableLength.h
index 827dd40..e275a72 100644
--- a/sky/engine/core/animation/animatable/AnimatableLength.h
+++ b/sky/engine/core/animation/animatable/AnimatableLength.h
@@ -64,8 +64,6 @@
     virtual AnimatableType type() const override { return TypeLength; }
     virtual bool equalTo(const AnimatableValue*) const override;
 
-    virtual void trace(Visitor* visitor) override { AnimatableValue::trace(visitor); }
-
     double m_pixels;
     double m_percent;
     bool m_hasPixels;
diff --git a/sky/engine/core/animation/animatable/AnimatableLengthBox.cpp b/sky/engine/core/animation/animatable/AnimatableLengthBox.cpp
index c96607b..20a0d00 100644
--- a/sky/engine/core/animation/animatable/AnimatableLengthBox.cpp
+++ b/sky/engine/core/animation/animatable/AnimatableLengthBox.cpp
@@ -52,13 +52,4 @@
         && bottom()->equals(lengthBox->bottom());
 }
 
-void AnimatableLengthBox::trace(Visitor* visitor)
-{
-    visitor->trace(m_left);
-    visitor->trace(m_right);
-    visitor->trace(m_top);
-    visitor->trace(m_bottom);
-    AnimatableValue::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/animation/animatable/AnimatableLengthBox.h b/sky/engine/core/animation/animatable/AnimatableLengthBox.h
index 3a65477..f4a6c13 100644
--- a/sky/engine/core/animation/animatable/AnimatableLengthBox.h
+++ b/sky/engine/core/animation/animatable/AnimatableLengthBox.h
@@ -47,8 +47,6 @@
     const AnimatableValue* top() const { return m_top.get(); }
     const AnimatableValue* bottom() const { return m_bottom.get(); }
 
-    virtual void trace(Visitor*) override;
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
 
diff --git a/sky/engine/core/animation/animatable/AnimatableLengthBoxAndBool.cpp b/sky/engine/core/animation/animatable/AnimatableLengthBoxAndBool.cpp
index 6263091..d027d14 100644
--- a/sky/engine/core/animation/animatable/AnimatableLengthBoxAndBool.cpp
+++ b/sky/engine/core/animation/animatable/AnimatableLengthBoxAndBool.cpp
@@ -58,10 +58,4 @@
     return box()->equals(lengthBox->box()) && flag() == lengthBox->flag();
 }
 
-void AnimatableLengthBoxAndBool::trace(Visitor* visitor)
-{
-    visitor->trace(m_box);
-    AnimatableValue::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/animation/animatable/AnimatableLengthBoxAndBool.h b/sky/engine/core/animation/animatable/AnimatableLengthBoxAndBool.h
index 229fd5f..6ad90b2 100644
--- a/sky/engine/core/animation/animatable/AnimatableLengthBoxAndBool.h
+++ b/sky/engine/core/animation/animatable/AnimatableLengthBoxAndBool.h
@@ -45,8 +45,6 @@
     const AnimatableValue* box() const { return m_box.get(); }
     bool flag() const { return m_flag; }
 
-    virtual void trace(Visitor*) override;
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
     virtual bool usesDefaultInterpolationWith(const AnimatableValue*) const override;
diff --git a/sky/engine/core/animation/animatable/AnimatableLengthPoint.cpp b/sky/engine/core/animation/animatable/AnimatableLengthPoint.cpp
index 01dc7e1..b66a412 100644
--- a/sky/engine/core/animation/animatable/AnimatableLengthPoint.cpp
+++ b/sky/engine/core/animation/animatable/AnimatableLengthPoint.cpp
@@ -47,11 +47,4 @@
     return x()->equals(lengthPoint->x()) && y()->equals(lengthPoint->y());
 }
 
-void AnimatableLengthPoint::trace(Visitor* visitor)
-{
-    visitor->trace(m_x);
-    visitor->trace(m_y);
-    AnimatableValue::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/animation/animatable/AnimatableLengthPoint.h b/sky/engine/core/animation/animatable/AnimatableLengthPoint.h
index 082b984..d18324c 100644
--- a/sky/engine/core/animation/animatable/AnimatableLengthPoint.h
+++ b/sky/engine/core/animation/animatable/AnimatableLengthPoint.h
@@ -45,8 +45,6 @@
     const AnimatableValue* x() const { return m_x.get(); }
     const AnimatableValue* y() const { return m_y.get(); }
 
-    virtual void trace(Visitor*) override;
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
 
diff --git a/sky/engine/core/animation/animatable/AnimatableLengthPoint3D.cpp b/sky/engine/core/animation/animatable/AnimatableLengthPoint3D.cpp
index 2aaf3ba..0d05ca9 100644
--- a/sky/engine/core/animation/animatable/AnimatableLengthPoint3D.cpp
+++ b/sky/engine/core/animation/animatable/AnimatableLengthPoint3D.cpp
@@ -48,12 +48,4 @@
     return x()->equals(lengthPoint->x()) && y()->equals(lengthPoint->y()) && z()->equals(lengthPoint->z());
 }
 
-void AnimatableLengthPoint3D::trace(Visitor* visitor)
-{
-    visitor->trace(m_x);
-    visitor->trace(m_y);
-    visitor->trace(m_z);
-    AnimatableValue::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/animation/animatable/AnimatableLengthPoint3D.h b/sky/engine/core/animation/animatable/AnimatableLengthPoint3D.h
index c2a5d7b..1be1a7f 100644
--- a/sky/engine/core/animation/animatable/AnimatableLengthPoint3D.h
+++ b/sky/engine/core/animation/animatable/AnimatableLengthPoint3D.h
@@ -46,8 +46,6 @@
     const AnimatableValue* y() const { return m_y.get(); }
     const AnimatableValue* z() const { return m_z.get(); }
 
-    virtual void trace(Visitor*) override;
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
 
diff --git a/sky/engine/core/animation/animatable/AnimatableLengthSize.cpp b/sky/engine/core/animation/animatable/AnimatableLengthSize.cpp
index 69d47fb..5fff41a 100644
--- a/sky/engine/core/animation/animatable/AnimatableLengthSize.cpp
+++ b/sky/engine/core/animation/animatable/AnimatableLengthSize.cpp
@@ -47,11 +47,4 @@
     return width()->equals(lengthSize->width()) && height()->equals(lengthSize->height());
 }
 
-void AnimatableLengthSize::trace(Visitor* visitor)
-{
-    visitor->trace(m_width);
-    visitor->trace(m_height);
-    AnimatableValue::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/animation/animatable/AnimatableLengthSize.h b/sky/engine/core/animation/animatable/AnimatableLengthSize.h
index 273cbce..c2a581a 100644
--- a/sky/engine/core/animation/animatable/AnimatableLengthSize.h
+++ b/sky/engine/core/animation/animatable/AnimatableLengthSize.h
@@ -45,8 +45,6 @@
     const AnimatableValue* width() const { return m_width.get(); }
     const AnimatableValue* height() const { return m_height.get(); }
 
-    virtual void trace(Visitor*) override;
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
 
diff --git a/sky/engine/core/animation/animatable/AnimatableNeutral.h b/sky/engine/core/animation/animatable/AnimatableNeutral.h
index 0d07df8..69237ba 100644
--- a/sky/engine/core/animation/animatable/AnimatableNeutral.h
+++ b/sky/engine/core/animation/animatable/AnimatableNeutral.h
@@ -39,8 +39,6 @@
 public:
     virtual ~AnimatableNeutral() { }
 
-    virtual void trace(Visitor* visitor) override { AnimatableValue::trace(visitor); }
-
 protected:
     static PassRefPtr<AnimatableNeutral> create() { return adoptRef(new AnimatableNeutral()); }
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue* value, double fraction) const override
diff --git a/sky/engine/core/animation/animatable/AnimatableRepeatable.cpp b/sky/engine/core/animation/animatable/AnimatableRepeatable.cpp
index e9cccd6..03c86e4 100644
--- a/sky/engine/core/animation/animatable/AnimatableRepeatable.cpp
+++ b/sky/engine/core/animation/animatable/AnimatableRepeatable.cpp
@@ -91,10 +91,4 @@
     return true;
 }
 
-void AnimatableRepeatable::trace(Visitor* visitor)
-{
-    visitor->trace(m_values);
-    AnimatableValue::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/animation/animatable/AnimatableRepeatable.h b/sky/engine/core/animation/animatable/AnimatableRepeatable.h
index 523e1c8..67c35c5 100644
--- a/sky/engine/core/animation/animatable/AnimatableRepeatable.h
+++ b/sky/engine/core/animation/animatable/AnimatableRepeatable.h
@@ -50,8 +50,6 @@
 
     const Vector<RefPtr<AnimatableValue> >& values() const { return m_values; }
 
-    virtual void trace(Visitor*) override;
-
 protected:
     AnimatableRepeatable()
     {
diff --git a/sky/engine/core/animation/animatable/AnimatableShadow.h b/sky/engine/core/animation/animatable/AnimatableShadow.h
index 60e8d2e..c50dc8f 100644
--- a/sky/engine/core/animation/animatable/AnimatableShadow.h
+++ b/sky/engine/core/animation/animatable/AnimatableShadow.h
@@ -45,8 +45,6 @@
     }
     ShadowList* shadowList() const { return m_shadowList.get(); }
 
-    virtual void trace(Visitor* visitor) override { AnimatableValue::trace(visitor); }
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
 
diff --git a/sky/engine/core/animation/animatable/AnimatableShapeValue.h b/sky/engine/core/animation/animatable/AnimatableShapeValue.h
index e6ac293..748a838 100644
--- a/sky/engine/core/animation/animatable/AnimatableShapeValue.h
+++ b/sky/engine/core/animation/animatable/AnimatableShapeValue.h
@@ -45,8 +45,6 @@
     }
     ShapeValue* shapeValue() const { return m_shape.get(); }
 
-    virtual void trace(Visitor* visitor) override { AnimatableValue::trace(visitor); }
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
     virtual bool usesDefaultInterpolationWith(const AnimatableValue*) const override;
diff --git a/sky/engine/core/animation/animatable/AnimatableTransform.h b/sky/engine/core/animation/animatable/AnimatableTransform.h
index 146571e..e785c08 100644
--- a/sky/engine/core/animation/animatable/AnimatableTransform.h
+++ b/sky/engine/core/animation/animatable/AnimatableTransform.h
@@ -45,8 +45,6 @@
         return m_transform;
     }
 
-    virtual void trace(Visitor* visitor) override { AnimatableValue::trace(visitor); }
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const override;
 
diff --git a/sky/engine/core/animation/animatable/AnimatableUnknown.h b/sky/engine/core/animation/animatable/AnimatableUnknown.h
index 063dc82..5df64ba 100644
--- a/sky/engine/core/animation/animatable/AnimatableUnknown.h
+++ b/sky/engine/core/animation/animatable/AnimatableUnknown.h
@@ -53,12 +53,6 @@
     PassRefPtr<CSSValue> toCSSValue() const { return m_value; }
     CSSValueID toCSSValueID() const { return toCSSPrimitiveValue(m_value.get())->getValueID(); }
 
-    virtual void trace(Visitor* visitor) override
-    {
-        visitor->trace(m_value);
-        AnimatableValue::trace(visitor);
-    }
-
 protected:
     virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue* value, double fraction) const override
     {
diff --git a/sky/engine/core/animation/animatable/AnimatableValue.h b/sky/engine/core/animation/animatable/AnimatableValue.h
index 85ae075..1bd2421 100644
--- a/sky/engine/core/animation/animatable/AnimatableValue.h
+++ b/sky/engine/core/animation/animatable/AnimatableValue.h
@@ -84,8 +84,6 @@
         return value->type() == type();
     }
 
-    virtual void trace(Visitor*) { }
-
 protected:
     enum AnimatableType {
         TypeClipPathOperation,
diff --git a/sky/engine/core/animation/animatable/AnimatableValueKeyframe.cpp b/sky/engine/core/animation/animatable/AnimatableValueKeyframe.cpp
index bae1357..50829b7 100644
--- a/sky/engine/core/animation/animatable/AnimatableValueKeyframe.cpp
+++ b/sky/engine/core/animation/animatable/AnimatableValueKeyframe.cpp
@@ -36,14 +36,6 @@
     return adoptPtr(new PropertySpecificKeyframe(offset(), &easing(), propertyValue(property), composite()));
 }
 
-void AnimatableValueKeyframe::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_propertyValues);
-#endif
-    Keyframe::trace(visitor);
-}
-
 AnimatableValueKeyframe::PropertySpecificKeyframe::PropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, const AnimatableValue* value, AnimationEffect::CompositeOperation op)
     : Keyframe::PropertySpecificKeyframe(offset, easing, op)
     , m_value(const_cast<AnimatableValue*>(value))
@@ -73,10 +65,4 @@
     return adoptPtr(new AnimatableValueKeyframe::PropertySpecificKeyframe(offset, easing, AnimatableValue::neutralValue(), AnimationEffect::CompositeAdd));
 }
 
-void AnimatableValueKeyframe::PropertySpecificKeyframe::trace(Visitor* visitor)
-{
-    visitor->trace(m_value);
-    Keyframe::PropertySpecificKeyframe::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/animation/animatable/AnimatableValueKeyframe.h b/sky/engine/core/animation/animatable/AnimatableValueKeyframe.h
index ced75f6..018916a 100644
--- a/sky/engine/core/animation/animatable/AnimatableValueKeyframe.h
+++ b/sky/engine/core/animation/animatable/AnimatableValueKeyframe.h
@@ -28,8 +28,6 @@
     }
     virtual PropertySet properties() const override;
 
-    virtual void trace(Visitor*) override;
-
     class PropertySpecificKeyframe : public Keyframe::PropertySpecificKeyframe {
     public:
         PropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, const AnimatableValue*, AnimationEffect::CompositeOperation);
@@ -40,8 +38,6 @@
         virtual PassOwnPtr<Keyframe::PropertySpecificKeyframe> neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const override final;
         virtual PassRefPtr<Interpolation> createInterpolation(CSSPropertyID, blink::Keyframe::PropertySpecificKeyframe* end, Element*) const override final;
 
-        virtual void trace(Visitor*) override;
-
     private:
         PropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, PassRefPtr<AnimatableValue>);
 
diff --git a/sky/engine/core/animation/css/CSSAnimations.cpp b/sky/engine/core/animation/css/CSSAnimations.cpp
index b967bf8..497c0b7 100644
--- a/sky/engine/core/animation/css/CSSAnimations.cpp
+++ b/sky/engine/core/animation/css/CSSAnimations.cpp
@@ -622,12 +622,6 @@
     m_previousIteration = currentIteration;
 }
 
-void CSSAnimations::AnimationEventDelegate::trace(Visitor* visitor)
-{
-    visitor->trace(m_target);
-    AnimationNode::EventDelegate::trace(visitor);
-}
-
 void CSSAnimations::TransitionEventDelegate::onEventCondition(const AnimationNode* animationNode)
 {
     const AnimationNode::Phase currentPhase = animationNode->phase();
@@ -644,12 +638,6 @@
     m_previousPhase = currentPhase;
 }
 
-void CSSAnimations::TransitionEventDelegate::trace(Visitor* visitor)
-{
-    visitor->trace(m_target);
-    AnimationNode::EventDelegate::trace(visitor);
-}
-
 const StylePropertyShorthand& CSSAnimations::animatableProperties()
 {
     DEFINE_STATIC_LOCAL(Vector<CSSPropertyID>, properties, ());
@@ -705,25 +693,4 @@
     }
 }
 
-void CSSAnimations::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_transitions);
-    visitor->trace(m_pendingUpdate);
-    visitor->trace(m_animations);
-    visitor->trace(m_previousActiveInterpolationsForAnimations);
-#endif
-}
-
-void CSSAnimationUpdate::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_newTransitions);
-    visitor->trace(m_activeInterpolationsForAnimations);
-    visitor->trace(m_activeInterpolationsForTransitions);
-    visitor->trace(m_newAnimations);
-    visitor->trace(m_cancelledAnimationPlayers);
-#endif
-}
-
 } // namespace blink
diff --git a/sky/engine/core/animation/css/CSSAnimations.h b/sky/engine/core/animation/css/CSSAnimations.h
index a46659d..f57e70b 100644
--- a/sky/engine/core/animation/css/CSSAnimations.h
+++ b/sky/engine/core/animation/css/CSSAnimations.h
@@ -89,11 +89,6 @@
     struct NewAnimation {
         ALLOW_ONLY_INLINE_ALLOCATION();
     public:
-        void trace(Visitor* visitor)
-        {
-            visitor->trace(animation);
-        }
-
         AtomicString name;
         RefPtr<InertAnimation> animation;
     };
@@ -105,13 +100,6 @@
     struct NewTransition {
         ALLOW_ONLY_INLINE_ALLOCATION();
     public:
-        void trace(Visitor* visitor)
-        {
-            visitor->trace(from);
-            visitor->trace(to);
-            visitor->trace(animation);
-        }
-
         CSSPropertyID id;
         CSSPropertyID eventId;
         RawPtr<const AnimatableValue> from;
@@ -140,8 +128,6 @@
             && m_activeInterpolationsForTransitions.isEmpty();
     }
 
-    void trace(Visitor*);
-
 private:
     // Order is significant since it defines the order in which new animations
     // will be started. Note that there may be multiple animations present
@@ -180,19 +166,10 @@
     bool isEmpty() const { return m_animations.isEmpty() && m_transitions.isEmpty() && !m_pendingUpdate; }
     void cancel();
 
-    void trace(Visitor*);
-
 private:
     struct RunningTransition {
         ALLOW_ONLY_INLINE_ALLOCATION();
     public:
-        void trace(Visitor* visitor)
-        {
-            visitor->trace(from);
-            visitor->trace(to);
-            visitor->trace(player);
-        }
-
         RefPtr<AnimationPlayer> player;
         RawPtr<const AnimatableValue> from;
         RawPtr<const AnimatableValue> to;
@@ -225,7 +202,6 @@
         {
         }
         virtual void onEventCondition(const AnimationNode*) override;
-        virtual void trace(Visitor*) override;
 
     private:
         void maybeDispatch(Document::ListenerType, const AtomicString& eventName, double elapsedTime);
@@ -244,7 +220,6 @@
         {
         }
         virtual void onEventCondition(const AnimationNode*) override;
-        virtual void trace(Visitor*) override;
 
     private:
         RawPtr<Element> m_target;
diff --git a/sky/engine/core/animation/css/CSSTimingData.h b/sky/engine/core/animation/css/CSSTimingData.h
index 00d890c..0ddf73a 100644
--- a/sky/engine/core/animation/css/CSSTimingData.h
+++ b/sky/engine/core/animation/css/CSSTimingData.h
@@ -17,8 +17,6 @@
 public:
     ~CSSTimingData() { }
 
-    void trace(Visitor*) { }
-
     const Vector<double>& delayList() const { return m_delayList; }
     const Vector<double>& durationList() const { return m_durationList; }
     const Vector<RefPtr<TimingFunction> >& timingFunctionList() const { return m_timingFunctionList; }
diff --git a/sky/engine/core/core.gni b/sky/engine/core/core.gni
index 48826fe..2ecf113 100644
--- a/sky/engine/core/core.gni
+++ b/sky/engine/core/core.gni
@@ -278,7 +278,6 @@
   "css/MediaValuesCached.h",
   "css/MediaValuesDynamic.cpp",
   "css/MediaValuesDynamic.h",
-  "css/Pair.cpp",
   "css/Pair.h",
   "css/parser/BisonCSSParser.h",
   "css/parser/CSSParserIdioms.h",
diff --git a/sky/engine/core/css/CSSAspectRatioValue.h b/sky/engine/core/css/CSSAspectRatioValue.h
index 80a0f8d..c887db1 100644
--- a/sky/engine/core/css/CSSAspectRatioValue.h
+++ b/sky/engine/core/css/CSSAspectRatioValue.h
@@ -47,8 +47,6 @@
 
     bool equals(const CSSAspectRatioValue&) const;
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
-
 private:
     CSSAspectRatioValue(float numeratorValue, float denominatorValue)
         : CSSValue(AspectRatioClass)
diff --git a/sky/engine/core/css/CSSBasicShapes.cpp b/sky/engine/core/css/CSSBasicShapes.cpp
index 7032c8d..50b13d6 100644
--- a/sky/engine/core/css/CSSBasicShapes.cpp
+++ b/sky/engine/core/css/CSSBasicShapes.cpp
@@ -136,14 +136,6 @@
         && compareCSSValuePtr(m_referenceBox, other.m_referenceBox);
 }
 
-void CSSBasicShapeCircle::trace(Visitor* visitor)
-{
-    visitor->trace(m_centerX);
-    visitor->trace(m_centerY);
-    visitor->trace(m_radius);
-    CSSBasicShape::trace(visitor);
-}
-
 static String buildEllipseString(const String& radiusX, const String& radiusY, const String& centerX, const String& centerY, const String& box)
 {
     char at[] = "at";
@@ -218,15 +210,6 @@
         && compareCSSValuePtr(m_referenceBox, other.m_referenceBox);
 }
 
-void CSSBasicShapeEllipse::trace(Visitor* visitor)
-{
-    visitor->trace(m_centerX);
-    visitor->trace(m_centerY);
-    visitor->trace(m_radiusX);
-    visitor->trace(m_radiusY);
-    CSSBasicShape::trace(visitor);
-}
-
 static String buildPolygonString(const WindRule& windRule, const Vector<String>& points, const String& box)
 {
     ASSERT(!(points.size() % 2));
@@ -296,12 +279,6 @@
     return compareCSSValueVector(m_values, rhs.m_values);
 }
 
-void CSSBasicShapePolygon::trace(Visitor* visitor)
-{
-    visitor->trace(m_values);
-    CSSBasicShape::trace(visitor);
-}
-
 static bool buildInsetRadii(Vector<String> &radii, const String& topLeftRadius, const String& topRightRadius, const String& bottomRightRadius, const String& bottomLeftRadius)
 {
     bool showBottomLeft = topRightRadius != bottomLeftRadius;
@@ -435,18 +412,5 @@
         && compareCSSValuePtr(m_bottomLeftRadius, other.m_bottomLeftRadius);
 }
 
-void CSSBasicShapeInset::trace(Visitor* visitor)
-{
-    visitor->trace(m_top);
-    visitor->trace(m_right);
-    visitor->trace(m_bottom);
-    visitor->trace(m_left);
-    visitor->trace(m_topLeftRadius);
-    visitor->trace(m_topRightRadius);
-    visitor->trace(m_bottomRightRadius);
-    visitor->trace(m_bottomLeftRadius);
-    CSSBasicShape::trace(visitor);
-}
-
 } // namespace blink
 
diff --git a/sky/engine/core/css/CSSBasicShapes.h b/sky/engine/core/css/CSSBasicShapes.h
index 4f395a9..0d50c5e 100644
--- a/sky/engine/core/css/CSSBasicShapes.h
+++ b/sky/engine/core/css/CSSBasicShapes.h
@@ -55,8 +55,6 @@
     CSSPrimitiveValue* referenceBox() const { return m_referenceBox.get(); }
     void setReferenceBox(PassRefPtr<CSSPrimitiveValue> referenceBox) { m_referenceBox = referenceBox; }
 
-    virtual void trace(Visitor* visitor) { visitor->trace(m_referenceBox); }
-
 protected:
     CSSBasicShape() { }
     RefPtr<CSSPrimitiveValue> m_referenceBox;
@@ -78,8 +76,6 @@
     void setCenterY(PassRefPtr<CSSPrimitiveValue> centerY) { m_centerY = centerY; }
     void setRadius(PassRefPtr<CSSPrimitiveValue> radius) { m_radius = radius; }
 
-    virtual void trace(Visitor*);
-
 private:
     CSSBasicShapeCircle() { }
 
@@ -106,8 +102,6 @@
     void setRadiusX(PassRefPtr<CSSPrimitiveValue> radiusX) { m_radiusX = radiusX; }
     void setRadiusY(PassRefPtr<CSSPrimitiveValue> radiusY) { m_radiusY = radiusY; }
 
-    virtual void trace(Visitor*);
-
 private:
     CSSBasicShapeEllipse() { }
 
@@ -138,8 +132,6 @@
     virtual String cssText() const override;
     virtual bool equals(const CSSBasicShape&) const override;
 
-    virtual void trace(Visitor*);
-
 private:
     CSSBasicShapePolygon()
         : m_windRule(RULE_NONZERO)
@@ -202,8 +194,6 @@
     virtual String cssText() const override;
     virtual bool equals(const CSSBasicShape&) const override;
 
-    virtual void trace(Visitor*);
-
 private:
     CSSBasicShapeInset() { }
 
diff --git a/sky/engine/core/css/CSSBorderImageSliceValue.cpp b/sky/engine/core/css/CSSBorderImageSliceValue.cpp
index 5331b9c..090bbcf 100644
--- a/sky/engine/core/css/CSSBorderImageSliceValue.cpp
+++ b/sky/engine/core/css/CSSBorderImageSliceValue.cpp
@@ -53,10 +53,4 @@
     return m_fill == other.m_fill && compareCSSValuePtr(m_slices, other.m_slices);
 }
 
-void CSSBorderImageSliceValue::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_slices);
-    CSSValue::traceAfterDispatch(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSBorderImageSliceValue.h b/sky/engine/core/css/CSSBorderImageSliceValue.h
index 1accd09..5688d7c 100644
--- a/sky/engine/core/css/CSSBorderImageSliceValue.h
+++ b/sky/engine/core/css/CSSBorderImageSliceValue.h
@@ -47,8 +47,6 @@
 
     bool equals(const CSSBorderImageSliceValue&) const;
 
-    void traceAfterDispatch(Visitor*);
-
     // These four values are used to make "cuts" in the border image. They can be numbers
     // or percentages.
     RefPtr<CSSPrimitiveValue> m_slices;
diff --git a/sky/engine/core/css/CSSCalculationValue.cpp b/sky/engine/core/css/CSSCalculationValue.cpp
index 144de04..2507bf1 100644
--- a/sky/engine/core/css/CSSCalculationValue.cpp
+++ b/sky/engine/core/css/CSSCalculationValue.cpp
@@ -271,13 +271,6 @@
         return m_value->primitiveType();
     }
 
-
-    virtual void trace(Visitor* visitor)
-    {
-        visitor->trace(m_value);
-        CSSCalcExpressionNode::trace(visitor);
-    }
-
 private:
     CSSCalcPrimitiveValue(PassRefPtr<CSSPrimitiveValue> value, bool isInteger)
         : CSSCalcExpressionNode(unitCategory(value->primitiveType()), isInteger)
@@ -538,13 +531,6 @@
         return CSSPrimitiveValue::CSS_UNKNOWN;
     }
 
-    virtual void trace(Visitor* visitor)
-    {
-        visitor->trace(m_leftSide);
-        visitor->trace(m_rightSide);
-        CSSCalcExpressionNode::trace(visitor);
-    }
-
 private:
     CSSCalcBinaryOperation(PassRefPtr<CSSCalcExpressionNode> leftSide, PassRefPtr<CSSCalcExpressionNode> rightSide, CalcOperator op, CalculationCategory category)
         : CSSCalcExpressionNode(category, isIntegerResult(leftSide.get(), rightSide.get(), op))
@@ -763,10 +749,4 @@
     return adoptRef(new CSSCalcValue(expression, range));
 }
 
-void CSSCalcValue::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_expression);
-    CSSValue::traceAfterDispatch(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSCalculationValue.h b/sky/engine/core/css/CSSCalculationValue.h
index 03bd291..5400f92 100644
--- a/sky/engine/core/css/CSSCalculationValue.h
+++ b/sky/engine/core/css/CSSCalculationValue.h
@@ -89,8 +89,6 @@
     virtual CSSPrimitiveValue::UnitType primitiveType() const = 0;
     bool isInteger() const { return m_isInteger; }
 
-    virtual void trace(Visitor*) { }
-
 protected:
     CSSCalcExpressionNode(CalculationCategory category, bool isInteger)
         : m_category(category)
@@ -130,8 +128,6 @@
     String customCSSText() const;
     bool equals(const CSSCalcValue&) const;
 
-    void traceAfterDispatch(Visitor*);
-
 private:
     CSSCalcValue(PassRefPtr<CSSCalcExpressionNode> expression, ValueRange range)
         : CSSValue(CalculationClass)
diff --git a/sky/engine/core/css/CSSComputedStyleDeclaration.cpp b/sky/engine/core/css/CSSComputedStyleDeclaration.cpp
index d01464e..cdbc960 100644
--- a/sky/engine/core/css/CSSComputedStyleDeclaration.cpp
+++ b/sky/engine/core/css/CSSComputedStyleDeclaration.cpp
@@ -2478,10 +2478,4 @@
     return list.release();
 }
 
-void CSSComputedStyleDeclaration::trace(Visitor* visitor)
-{
-    visitor->trace(m_node);
-    CSSStyleDeclaration::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSComputedStyleDeclaration.h b/sky/engine/core/css/CSSComputedStyleDeclaration.h
index 6dc3acf..411360c 100644
--- a/sky/engine/core/css/CSSComputedStyleDeclaration.h
+++ b/sky/engine/core/css/CSSComputedStyleDeclaration.h
@@ -71,8 +71,6 @@
 
     PassRefPtr<MutableStylePropertySet> copyPropertiesInSet(const Vector<CSSPropertyID>&) const;
 
-    virtual void trace(Visitor*) override;
-
 private:
     CSSComputedStyleDeclaration(PassRefPtr<Node>, bool allowVisitedStyle, const String&);
 
diff --git a/sky/engine/core/css/CSSCrossfadeValue.cpp b/sky/engine/core/css/CSSCrossfadeValue.cpp
index 1b41d7f..d298e41 100644
--- a/sky/engine/core/css/CSSCrossfadeValue.cpp
+++ b/sky/engine/core/css/CSSCrossfadeValue.cpp
@@ -218,12 +218,4 @@
         && compareCSSValuePtr(m_percentageValue, other.m_percentageValue);
 }
 
-void CSSCrossfadeValue::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_fromValue);
-    visitor->trace(m_toValue);
-    visitor->trace(m_percentageValue);
-    CSSImageGeneratorValue::traceAfterDispatch(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSCrossfadeValue.h b/sky/engine/core/css/CSSCrossfadeValue.h
index ebb6829..cf64300 100644
--- a/sky/engine/core/css/CSSCrossfadeValue.h
+++ b/sky/engine/core/css/CSSCrossfadeValue.h
@@ -67,8 +67,6 @@
 
     bool equals(const CSSCrossfadeValue&) const;
 
-    void traceAfterDispatch(Visitor*);
-
 private:
     CSSCrossfadeValue(PassRefPtr<CSSValue> fromValue, PassRefPtr<CSSValue> toValue)
         : CSSImageGeneratorValue(CrossfadeClass)
diff --git a/sky/engine/core/css/CSSCursorImageValue.cpp b/sky/engine/core/css/CSSCursorImageValue.cpp
index 6318b95..71f9679 100644
--- a/sky/engine/core/css/CSSCursorImageValue.cpp
+++ b/sky/engine/core/css/CSSCursorImageValue.cpp
@@ -124,10 +124,4 @@
         && compareCSSValuePtr(m_imageValue, other.m_imageValue);
 }
 
-void CSSCursorImageValue::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_imageValue);
-    CSSValue::traceAfterDispatch(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSCursorImageValue.h b/sky/engine/core/css/CSSCursorImageValue.h
index 2cf4fec..c015aa4 100644
--- a/sky/engine/core/css/CSSCursorImageValue.h
+++ b/sky/engine/core/css/CSSCursorImageValue.h
@@ -54,8 +54,6 @@
 
     bool equals(const CSSCursorImageValue&) const;
 
-    void traceAfterDispatch(Visitor*);
-
 private:
     CSSCursorImageValue(PassRefPtr<CSSValue> imageValue, bool hasHotSpot, const IntPoint& hotSpot);
 
diff --git a/sky/engine/core/css/CSSFilterRule.cpp b/sky/engine/core/css/CSSFilterRule.cpp
index f7948a5..5b6cfc5 100644
--- a/sky/engine/core/css/CSSFilterRule.cpp
+++ b/sky/engine/core/css/CSSFilterRule.cpp
@@ -84,12 +84,5 @@
         m_propertiesCSSOMWrapper->reattach(m_filterRule->mutableProperties());
 }
 
-void CSSFilterRule::trace(Visitor* visitor)
-{
-    visitor->trace(m_filterRule);
-    visitor->trace(m_propertiesCSSOMWrapper);
-    CSSRule::trace(visitor);
-}
-
 } // namespace blink
 
diff --git a/sky/engine/core/css/CSSFilterRule.h b/sky/engine/core/css/CSSFilterRule.h
index b94d638..f7bcb2e 100644
--- a/sky/engine/core/css/CSSFilterRule.h
+++ b/sky/engine/core/css/CSSFilterRule.h
@@ -54,8 +54,6 @@
 
     CSSStyleDeclaration* style() const;
 
-    virtual void trace(Visitor*) override;
-
 private:
     CSSFilterRule(StyleRuleFilter*, CSSStyleSheet* parent);
 
diff --git a/sky/engine/core/css/CSSFilterValue.h b/sky/engine/core/css/CSSFilterValue.h
index 6ef4cc5..8f53a47 100644
--- a/sky/engine/core/css/CSSFilterValue.h
+++ b/sky/engine/core/css/CSSFilterValue.h
@@ -64,8 +64,6 @@
 
     bool equals(const CSSFilterValue&) const;
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValueList::traceAfterDispatch(visitor); }
-
 private:
     explicit CSSFilterValue(FilterOperationType);
     explicit CSSFilterValue(const CSSFilterValue& cloneFrom);
diff --git a/sky/engine/core/css/CSSFontFace.cpp b/sky/engine/core/css/CSSFontFace.cpp
index 6ce24e2..2e33454 100644
--- a/sky/engine/core/css/CSSFontFace.cpp
+++ b/sky/engine/core/css/CSSFontFace.cpp
@@ -233,11 +233,4 @@
     return false;
 }
 
-void CSSFontFace::trace(Visitor* visitor)
-{
-    visitor->trace(m_segmentedFontFace);
-    visitor->trace(m_sources);
-    visitor->trace(m_fontFace);
-}
-
 }
diff --git a/sky/engine/core/css/CSSFontFace.h b/sky/engine/core/css/CSSFontFace.h
index 4284ffa..4e06417 100644
--- a/sky/engine/core/css/CSSFontFace.h
+++ b/sky/engine/core/css/CSSFontFace.h
@@ -110,8 +110,6 @@
 
     bool hadBlankText() { return isValid() && m_sources.first()->hadBlankText(); }
 
-    void trace(Visitor*);
-
 private:
     void setLoadStatus(FontFace::LoadStatus);
 
diff --git a/sky/engine/core/css/CSSFontFaceRule.cpp b/sky/engine/core/css/CSSFontFaceRule.cpp
index a5d48c5..65c9841 100644
--- a/sky/engine/core/css/CSSFontFaceRule.cpp
+++ b/sky/engine/core/css/CSSFontFaceRule.cpp
@@ -70,11 +70,4 @@
         m_propertiesCSSOMWrapper->reattach(m_fontFaceRule->mutableProperties());
 }
 
-void CSSFontFaceRule::trace(Visitor* visitor)
-{
-    visitor->trace(m_fontFaceRule);
-    visitor->trace(m_propertiesCSSOMWrapper);
-    CSSRule::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSFontFaceRule.h b/sky/engine/core/css/CSSFontFaceRule.h
index 0cef16b..1d1490e 100644
--- a/sky/engine/core/css/CSSFontFaceRule.h
+++ b/sky/engine/core/css/CSSFontFaceRule.h
@@ -48,8 +48,6 @@
 
     StyleRuleFontFace* styleRule() const { return m_fontFaceRule.get(); }
 
-    virtual void trace(Visitor*) override;
-
 private:
     CSSFontFaceRule(StyleRuleFontFace*, CSSStyleSheet* parent);
 
diff --git a/sky/engine/core/css/CSSFontFaceSource.cpp b/sky/engine/core/css/CSSFontFaceSource.cpp
index 5e599ff..bd943b4 100644
--- a/sky/engine/core/css/CSSFontFaceSource.cpp
+++ b/sky/engine/core/css/CSSFontFaceSource.cpp
@@ -63,9 +63,4 @@
     return fontData; // No release, because fontData is a reference to a RefPtr that is held in the m_fontDataTable.
 }
 
-void CSSFontFaceSource::trace(Visitor* visitor)
-{
-    visitor->trace(m_face);
-}
-
 }
diff --git a/sky/engine/core/css/CSSFontFaceSource.h b/sky/engine/core/css/CSSFontFaceSource.h
index 943fcd6..d82cd83 100644
--- a/sky/engine/core/css/CSSFontFaceSource.h
+++ b/sky/engine/core/css/CSSFontFaceSource.h
@@ -56,8 +56,6 @@
     // For UMA reporting
     virtual bool hadBlankText() { return false; }
 
-    virtual void trace(Visitor*);
-
 protected:
     CSSFontFaceSource();
     virtual PassRefPtr<SimpleFontData> createFontData(const FontDescription&) = 0;
diff --git a/sky/engine/core/css/CSSFontFaceSrcValue.h b/sky/engine/core/css/CSSFontFaceSrcValue.h
index 5622fe5..6d356b6 100644
--- a/sky/engine/core/css/CSSFontFaceSrcValue.h
+++ b/sky/engine/core/css/CSSFontFaceSrcValue.h
@@ -66,8 +66,6 @@
 
     bool equals(const CSSFontFaceSrcValue&) const;
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
-
 private:
     CSSFontFaceSrcValue(const String& resource, bool local)
         : CSSValue(FontFaceSrcClass)
diff --git a/sky/engine/core/css/CSSFontFeatureValue.h b/sky/engine/core/css/CSSFontFeatureValue.h
index 3bf31fa..3dacd5b 100644
--- a/sky/engine/core/css/CSSFontFeatureValue.h
+++ b/sky/engine/core/css/CSSFontFeatureValue.h
@@ -44,8 +44,6 @@
 
     bool equals(const CSSFontFeatureValue&) const;
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
-
 private:
     CSSFontFeatureValue(const AtomicString& tag, int value);
 
diff --git a/sky/engine/core/css/CSSFontSelector.cpp b/sky/engine/core/css/CSSFontSelector.cpp
index 2b81458..cd8faa2 100644
--- a/sky/engine/core/css/CSSFontSelector.cpp
+++ b/sky/engine/core/css/CSSFontSelector.cpp
@@ -172,15 +172,4 @@
     m_fontFaceCache.incrementVersion();
 }
 
-void CSSFontSelector::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_document);
-    visitor->trace(m_fontFaceCache);
-    visitor->trace(m_clients);
-    visitor->trace(m_fontLoader);
-#endif
-    FontSelector::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/css/CSSFontSelector.h b/sky/engine/core/css/CSSFontSelector.h
index ee7ea83..dd06855 100644
--- a/sky/engine/core/css/CSSFontSelector.h
+++ b/sky/engine/core/css/CSSFontSelector.h
@@ -80,8 +80,6 @@
     const GenericFontFamilySettings& genericFontFamilySettings() const { return m_genericFontFamilySettings; }
     void updateGenericFontFamilySettings(Document&);
 
-    virtual void trace(Visitor*);
-
 private:
     explicit CSSFontSelector(Document*);
 
diff --git a/sky/engine/core/css/CSSFontSelectorClient.h b/sky/engine/core/css/CSSFontSelectorClient.h
index ebb0d88..776079a 100644
--- a/sky/engine/core/css/CSSFontSelectorClient.h
+++ b/sky/engine/core/css/CSSFontSelectorClient.h
@@ -43,8 +43,6 @@
     virtual ~CSSFontSelectorClient() { }
 
     virtual void fontsNeedUpdate(CSSFontSelector*) = 0;
-
-    virtual void trace(Visitor*) { }
 };
 
 } // namespace blink
diff --git a/sky/engine/core/css/CSSFontValue.cpp b/sky/engine/core/css/CSSFontValue.cpp
index 2cfe53c..29d322a 100644
--- a/sky/engine/core/css/CSSFontValue.cpp
+++ b/sky/engine/core/css/CSSFontValue.cpp
@@ -80,16 +80,4 @@
         && compareCSSValuePtr(family, other.family);
 }
 
-void CSSFontValue::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(style);
-    visitor->trace(variant);
-    visitor->trace(weight);
-    visitor->trace(stretch);
-    visitor->trace(size);
-    visitor->trace(lineHeight);
-    visitor->trace(family);
-    CSSValue::traceAfterDispatch(visitor);
-}
-
 }
diff --git a/sky/engine/core/css/CSSFontValue.h b/sky/engine/core/css/CSSFontValue.h
index 917e3a0..40eaec2 100644
--- a/sky/engine/core/css/CSSFontValue.h
+++ b/sky/engine/core/css/CSSFontValue.h
@@ -41,8 +41,6 @@
 
     bool equals(const CSSFontValue&) const;
 
-    void traceAfterDispatch(Visitor*);
-
     RefPtr<CSSPrimitiveValue> style;
     RefPtr<CSSPrimitiveValue> variant;
     RefPtr<CSSPrimitiveValue> weight;
diff --git a/sky/engine/core/css/CSSFunctionValue.cpp b/sky/engine/core/css/CSSFunctionValue.cpp
index 00b142f..408ed9f 100644
--- a/sky/engine/core/css/CSSFunctionValue.cpp
+++ b/sky/engine/core/css/CSSFunctionValue.cpp
@@ -53,10 +53,4 @@
     return m_name == other.m_name && compareCSSValuePtr(m_args, other.m_args);
 }
 
-void CSSFunctionValue::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_args);
-    CSSValue::traceAfterDispatch(visitor);
-}
-
 }
diff --git a/sky/engine/core/css/CSSFunctionValue.h b/sky/engine/core/css/CSSFunctionValue.h
index caa8af8..fbb43a6 100644
--- a/sky/engine/core/css/CSSFunctionValue.h
+++ b/sky/engine/core/css/CSSFunctionValue.h
@@ -45,8 +45,6 @@
 
     CSSValueList* arguments() const { return m_args.get(); }
 
-    void traceAfterDispatch(Visitor*);
-
 private:
     CSSFunctionValue(String, PassRefPtr<CSSValueList>);
 
diff --git a/sky/engine/core/css/CSSGradientValue.cpp b/sky/engine/core/css/CSSGradientValue.cpp
index a5b32c1..c1d06f2 100644
--- a/sky/engine/core/css/CSSGradientValue.cpp
+++ b/sky/engine/core/css/CSSGradientValue.cpp
@@ -42,12 +42,6 @@
 
 namespace blink {
 
-void CSSGradientColorStop::trace(Visitor* visitor)
-{
-    visitor->trace(m_position);
-    visitor->trace(m_color);
-}
-
 PassRefPtr<Image> CSSGradientValue::image(RenderObject* renderer, const IntSize& size)
 {
     if (size.isEmpty())
@@ -476,16 +470,6 @@
     return true;
 }
 
-void CSSGradientValue::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_firstX);
-    visitor->trace(m_firstY);
-    visitor->trace(m_secondX);
-    visitor->trace(m_secondY);
-    visitor->trace(m_stops);
-    CSSImageGeneratorValue::traceAfterDispatch(visitor);
-}
-
 String CSSLinearGradientValue::customCSSText() const
 {
     StringBuilder result;
@@ -759,12 +743,6 @@
     return equalXandY && m_stops == other.m_stops;
 }
 
-void CSSLinearGradientValue::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_angle);
-    CSSGradientValue::traceAfterDispatch(visitor);
-}
-
 String CSSRadialGradientValue::customCSSText() const
 {
     StringBuilder result;
@@ -1193,15 +1171,4 @@
     return equalShape && equalSizingBehavior && equalHorizontalAndVerticalSize && m_stops == other.m_stops;
 }
 
-void CSSRadialGradientValue::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_firstRadius);
-    visitor->trace(m_secondRadius);
-    visitor->trace(m_shape);
-    visitor->trace(m_sizingBehavior);
-    visitor->trace(m_endHorizontalSize);
-    visitor->trace(m_endVerticalSize);
-    CSSGradientValue::traceAfterDispatch(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSGradientValue.h b/sky/engine/core/css/CSSGradientValue.h
index 3faf51e..b26e3e7 100644
--- a/sky/engine/core/css/CSSGradientValue.h
+++ b/sky/engine/core/css/CSSGradientValue.h
@@ -47,11 +47,6 @@
 };
 enum CSSGradientRepeat { NonRepeating, Repeating };
 
-// This struct is stack allocated and allocated as part of vectors.
-// When allocated on the stack its members are found by conservative
-// stack scanning. When allocated as part of Vectors in heap-allocated
-// objects its members are visited via the containing object's
-// (CSSGradientValue) traceAfterDispatch method.
 struct CSSGradientColorStop {
     ALLOW_ONLY_INLINE_ALLOCATION();
 public:
@@ -65,8 +60,6 @@
         return compareCSSValuePtr(m_color, other.m_color)
             && compareCSSValuePtr(m_position, other.m_position);
     }
-
-    void trace(Visitor*);
 };
 
 } // namespace blink
@@ -106,8 +99,6 @@
     void loadSubimages(ResourceFetcher*) { }
     PassRefPtr<CSSGradientValue> gradientWithStylesResolved(const TextLinkColors&, Color currentColor);
 
-    void traceAfterDispatch(Visitor*);
-
 protected:
     CSSGradientValue(ClassType classType, CSSGradientRepeat repeat, CSSGradientType gradientType)
         : CSSImageGeneratorValue(classType)
@@ -175,8 +166,6 @@
 
     bool equals(const CSSLinearGradientValue&) const;
 
-    void traceAfterDispatch(Visitor*);
-
 private:
     CSSLinearGradientValue(CSSGradientRepeat repeat, CSSGradientType gradientType = CSSLinearGradient)
         : CSSGradientValue(LinearGradientClass, repeat, gradientType)
@@ -222,8 +211,6 @@
 
     bool equals(const CSSRadialGradientValue&) const;
 
-    void traceAfterDispatch(Visitor*);
-
 private:
     CSSRadialGradientValue(CSSGradientRepeat repeat, CSSGradientType gradientType = CSSRadialGradient)
         : CSSGradientValue(RadialGradientClass, repeat, gradientType)
diff --git a/sky/engine/core/css/CSSGroupingRule.cpp b/sky/engine/core/css/CSSGroupingRule.cpp
index 88c2e90..a750956 100644
--- a/sky/engine/core/css/CSSGroupingRule.cpp
+++ b/sky/engine/core/css/CSSGroupingRule.cpp
@@ -146,14 +146,4 @@
     }
 }
 
-void CSSGroupingRule::trace(Visitor* visitor)
-{
-    CSSRule::trace(visitor);
-#if ENABLE(OILPAN)
-    visitor->trace(m_childRuleCSSOMWrappers);
-#endif
-    visitor->trace(m_groupRule);
-    visitor->trace(m_ruleListCSSOMWrapper);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSGroupingRule.h b/sky/engine/core/css/CSSGroupingRule.h
index 501f726..ab213d8 100644
--- a/sky/engine/core/css/CSSGroupingRule.h
+++ b/sky/engine/core/css/CSSGroupingRule.h
@@ -47,8 +47,6 @@
     unsigned length() const;
     CSSRule* item(unsigned index) const;
 
-    virtual void trace(Visitor*) override;
-
 protected:
     CSSGroupingRule(StyleRuleGroup* groupRule, CSSStyleSheet* parent);
 
diff --git a/sky/engine/core/css/CSSImageGeneratorValue.h b/sky/engine/core/css/CSSImageGeneratorValue.h
index c28e3ba..b586c54 100644
--- a/sky/engine/core/css/CSSImageGeneratorValue.h
+++ b/sky/engine/core/css/CSSImageGeneratorValue.h
@@ -67,8 +67,6 @@
 
     void loadSubimages(ResourceFetcher*);
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
-
 protected:
     explicit CSSImageGeneratorValue(ClassType);
 
diff --git a/sky/engine/core/css/CSSImageSetValue.h b/sky/engine/core/css/CSSImageSetValue.h
index 42cd8c3..d6757f1 100644
--- a/sky/engine/core/css/CSSImageSetValue.h
+++ b/sky/engine/core/css/CSSImageSetValue.h
@@ -65,8 +65,6 @@
 
     PassRefPtr<CSSImageSetValue> cloneForCSSOM() const;
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValueList::traceAfterDispatch(visitor); }
-
 protected:
     ImageWithScale bestImageForScaleFactor();
 
diff --git a/sky/engine/core/css/CSSImageValue.cpp b/sky/engine/core/css/CSSImageValue.cpp
index 3f8f674..374f032 100644
--- a/sky/engine/core/css/CSSImageValue.cpp
+++ b/sky/engine/core/css/CSSImageValue.cpp
@@ -117,11 +117,6 @@
     return m_image ? m_image->knownToBeOpaque(renderer) : false;
 }
 
-void CSSImageValue::traceAfterDispatch(Visitor* visitor)
-{
-    CSSValue::traceAfterDispatch(visitor);
-}
-
 void CSSImageValue::reResolveURL(const Document& document)
 {
     KURL url = document.completeURL(m_relativeURL);
diff --git a/sky/engine/core/css/CSSImageValue.h b/sky/engine/core/css/CSSImageValue.h
index d14c7de..13ed89a 100644
--- a/sky/engine/core/css/CSSImageValue.h
+++ b/sky/engine/core/css/CSSImageValue.h
@@ -70,8 +70,6 @@
     bool knownToBeOpaque(const RenderObject*) const;
 
     void setInitiator(const AtomicString& name) { m_initiatorName = name; }
-
-    void traceAfterDispatch(Visitor*);
     void restoreCachedResourceIfNeeded(Document&);
 
 private:
diff --git a/sky/engine/core/css/CSSInheritedValue.h b/sky/engine/core/css/CSSInheritedValue.h
index 1fdb9b8..bcc0973 100644
--- a/sky/engine/core/css/CSSInheritedValue.h
+++ b/sky/engine/core/css/CSSInheritedValue.h
@@ -37,8 +37,6 @@
 
     bool equals(const CSSInheritedValue&) const { return true; }
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
-
 private:
     CSSInheritedValue()
         : CSSValue(InheritedClass)
diff --git a/sky/engine/core/css/CSSInitialValue.h b/sky/engine/core/css/CSSInitialValue.h
index 3ee3293..db8844f 100644
--- a/sky/engine/core/css/CSSInitialValue.h
+++ b/sky/engine/core/css/CSSInitialValue.h
@@ -43,8 +43,6 @@
 
     bool equals(const CSSInitialValue&) const { return true; }
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
-
 private:
     explicit CSSInitialValue(bool implicit)
         : CSSValue(InitialClass)
diff --git a/sky/engine/core/css/CSSKeyframeRule.cpp b/sky/engine/core/css/CSSKeyframeRule.cpp
index d65fffc..ffe3905 100644
--- a/sky/engine/core/css/CSSKeyframeRule.cpp
+++ b/sky/engine/core/css/CSSKeyframeRule.cpp
@@ -136,11 +136,6 @@
     return keyVector.release();
 }
 
-void StyleKeyframe::trace(Visitor* visitor)
-{
-    visitor->trace(m_properties);
-}
-
 CSSKeyframeRule::CSSKeyframeRule(StyleKeyframe* keyframe, CSSKeyframesRule* parent)
     : CSSRule(0)
     , m_keyframe(keyframe)
@@ -169,11 +164,4 @@
     ASSERT_NOT_REACHED();
 }
 
-void CSSKeyframeRule::trace(Visitor* visitor)
-{
-    visitor->trace(m_keyframe);
-    visitor->trace(m_propertiesCSSOMWrapper);
-    CSSRule::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSKeyframeRule.h b/sky/engine/core/css/CSSKeyframeRule.h
index 46714c8..5b7c33b 100644
--- a/sky/engine/core/css/CSSKeyframeRule.h
+++ b/sky/engine/core/css/CSSKeyframeRule.h
@@ -61,8 +61,6 @@
 
     String cssText() const;
 
-    void trace(Visitor*);
-
     static PassOwnPtr<Vector<double> > createKeyList(CSSParserValueList*);
 
 private:
@@ -87,8 +85,6 @@
 
     CSSStyleDeclaration* style() const;
 
-    virtual void trace(Visitor*) override;
-
 private:
     CSSKeyframeRule(StyleKeyframe*, CSSKeyframesRule* parent);
 
diff --git a/sky/engine/core/css/CSSKeyframesRule.cpp b/sky/engine/core/css/CSSKeyframesRule.cpp
index e61f7a0..0a450eb 100644
--- a/sky/engine/core/css/CSSKeyframesRule.cpp
+++ b/sky/engine/core/css/CSSKeyframesRule.cpp
@@ -86,12 +86,6 @@
     return -1;
 }
 
-void StyleRuleKeyframes::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_keyframes);
-    StyleRuleBase::traceAfterDispatch(visitor);
-}
-
 CSSKeyframesRule::CSSKeyframesRule(StyleRuleKeyframes* keyframesRule, CSSStyleSheet* parent)
     : CSSRule(parent)
     , m_keyframesRule(keyframesRule)
@@ -210,14 +204,4 @@
     m_keyframesRule = toStyleRuleKeyframes(rule);
 }
 
-void CSSKeyframesRule::trace(Visitor* visitor)
-{
-    CSSRule::trace(visitor);
-#if ENABLE(OILPAN)
-    visitor->trace(m_childRuleCSSOMWrappers);
-#endif
-    visitor->trace(m_keyframesRule);
-    visitor->trace(m_ruleListCSSOMWrapper);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSKeyframesRule.h b/sky/engine/core/css/CSSKeyframesRule.h
index 13b4078..158959a 100644
--- a/sky/engine/core/css/CSSKeyframesRule.h
+++ b/sky/engine/core/css/CSSKeyframesRule.h
@@ -59,8 +59,6 @@
 
     PassRefPtr<StyleRuleKeyframes> copy() const { return adoptRef(new StyleRuleKeyframes(*this)); }
 
-    void traceAfterDispatch(Visitor*);
-
 private:
     StyleRuleKeyframes();
     explicit StyleRuleKeyframes(const StyleRuleKeyframes&);
@@ -101,8 +99,6 @@
     bool isVendorPrefixed() const { return m_isPrefixed; }
     void setVendorPrefixed(bool isPrefixed) { m_isPrefixed = isPrefixed; }
 
-    virtual void trace(Visitor*) override;
-
 private:
     CSSKeyframesRule(StyleRuleKeyframes*, CSSStyleSheet* parent);
 
diff --git a/sky/engine/core/css/CSSLineBoxContainValue.h b/sky/engine/core/css/CSSLineBoxContainValue.h
index d27d1a4..61bbd21 100644
--- a/sky/engine/core/css/CSSLineBoxContainValue.h
+++ b/sky/engine/core/css/CSSLineBoxContainValue.h
@@ -49,8 +49,6 @@
     bool equals(const CSSLineBoxContainValue& other) const { return m_value == other.m_value; }
     LineBoxContain value() const { return m_value; }
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
-
 private:
     LineBoxContain m_value;
 
diff --git a/sky/engine/core/css/CSSMatrix.h b/sky/engine/core/css/CSSMatrix.h
index 28b241d..c61bacb 100644
--- a/sky/engine/core/css/CSSMatrix.h
+++ b/sky/engine/core/css/CSSMatrix.h
@@ -148,8 +148,6 @@
 
     String toString() const;
 
-    void trace(Visitor*) { }
-
 protected:
     CSSMatrix(const TransformationMatrix&);
     CSSMatrix(const String&, ExceptionState&);
diff --git a/sky/engine/core/css/CSSMediaRule.cpp b/sky/engine/core/css/CSSMediaRule.cpp
index 5427e9a..d4db904 100644
--- a/sky/engine/core/css/CSSMediaRule.cpp
+++ b/sky/engine/core/css/CSSMediaRule.cpp
@@ -76,9 +76,4 @@
         m_mediaCSSOMWrapper->reattach(mediaQueries());
 }
 
-void CSSMediaRule::trace(Visitor* visitor)
-{
-    visitor->trace(m_mediaCSSOMWrapper);
-    CSSGroupingRule::trace(visitor);
-}
 } // namespace blink
diff --git a/sky/engine/core/css/CSSMediaRule.h b/sky/engine/core/css/CSSMediaRule.h
index 09c0146..f20b3e2 100644
--- a/sky/engine/core/css/CSSMediaRule.h
+++ b/sky/engine/core/css/CSSMediaRule.h
@@ -45,8 +45,6 @@
 
     MediaList* media() const;
 
-    virtual void trace(Visitor*) override;
-
 private:
     CSSMediaRule(StyleRuleMedia*, CSSStyleSheet*);
 
diff --git a/sky/engine/core/css/CSSPrimitiveValue.cpp b/sky/engine/core/css/CSSPrimitiveValue.cpp
index 24ef230..6810b60 100644
--- a/sky/engine/core/css/CSSPrimitiveValue.cpp
+++ b/sky/engine/core/css/CSSPrimitiveValue.cpp
@@ -1327,30 +1327,4 @@
     return false;
 }
 
-void CSSPrimitiveValue::traceAfterDispatch(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    switch (m_primitiveUnitType) {
-    case CSS_RECT:
-        visitor->trace(m_value.rect);
-        break;
-    case CSS_QUAD:
-        visitor->trace(m_value.quad);
-        break;
-    case CSS_PAIR:
-        visitor->trace(m_value.pair);
-        break;
-    case CSS_CALC:
-        visitor->trace(m_value.calc);
-        break;
-    case CSS_SHAPE:
-        visitor->trace(m_value.shape);
-        break;
-    default:
-        break;
-    }
-#endif
-    CSSValue::traceAfterDispatch(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSPrimitiveValue.h b/sky/engine/core/css/CSSPrimitiveValue.h
index 3cd8f03..e58bae8 100644
--- a/sky/engine/core/css/CSSPrimitiveValue.h
+++ b/sky/engine/core/css/CSSPrimitiveValue.h
@@ -327,8 +327,6 @@
 
     bool equals(const CSSPrimitiveValue&) const;
 
-    void traceAfterDispatch(Visitor*);
-
     static UnitType canonicalUnitTypeForCategory(UnitCategory);
     static double conversionToCanonicalUnitsScaleFactor(UnitType);
 
diff --git a/sky/engine/core/css/CSSProperty.h b/sky/engine/core/css/CSSProperty.h
index 3fa3b8a..93f3e89 100644
--- a/sky/engine/core/css/CSSProperty.h
+++ b/sky/engine/core/css/CSSProperty.h
@@ -82,8 +82,6 @@
 
     const StylePropertyMetadata& metadata() const { return m_metadata; }
 
-    void trace(Visitor* visitor) { visitor->trace(m_value); }
-
 private:
     StylePropertyMetadata m_metadata;
     RefPtr<CSSValue> m_value;
diff --git a/sky/engine/core/css/CSSPropertySourceData.cpp b/sky/engine/core/css/CSSPropertySourceData.cpp
index 9d832fd..a25a9df 100644
--- a/sky/engine/core/css/CSSPropertySourceData.cpp
+++ b/sky/engine/core/css/CSSPropertySourceData.cpp
@@ -110,13 +110,4 @@
     return StringHash::hash(name) + 3 * StringHash::hash(value) + 7 * important + 13 * parsedOk + 31;
 }
 
-void CSSRuleSourceData::trace(Visitor* visitor)
-{
-    visitor->trace(ruleHeaderRange);
-    visitor->trace(ruleBodyRange);
-    visitor->trace(selectorRanges);
-    visitor->trace(styleSourceData);
-    visitor->trace(childRules);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSPropertySourceData.h b/sky/engine/core/css/CSSPropertySourceData.h
index 9e8ad5e..6866dc0 100644
--- a/sky/engine/core/css/CSSPropertySourceData.h
+++ b/sky/engine/core/css/CSSPropertySourceData.h
@@ -48,8 +48,6 @@
     SourceRange(unsigned start, unsigned end);
     unsigned length() const;
 
-    void trace(Visitor*) { }
-
     unsigned start;
     unsigned end;
 };
@@ -64,8 +62,6 @@
     String toString() const;
     unsigned hash() const;
 
-    void trace(Visitor* visitor) { visitor->trace(range); }
-
     String name;
     String value;
     bool important;
@@ -80,8 +76,6 @@
         return adoptRef(new CSSStyleSourceData());
     }
 
-    void trace(Visitor* visitor) { visitor->trace(propertyData); }
-
     Vector<CSSPropertySourceData> propertyData;
 };
 
@@ -117,8 +111,6 @@
             styleSourceData = CSSStyleSourceData::create();
     }
 
-    void trace(Visitor*);
-
     Type type;
 
     // Range of the selector list in the enclosing source.
diff --git a/sky/engine/core/css/CSSRule.cpp b/sky/engine/core/css/CSSRule.cpp
index a80239c..995cc1e 100644
--- a/sky/engine/core/css/CSSRule.cpp
+++ b/sky/engine/core/css/CSSRule.cpp
@@ -60,8 +60,4 @@
     return styleSheet ? styleSheet->contents()->parserContext() : strictCSSParserContext();
 }
 
-void CSSRule::trace(Visitor* visitor)
-{
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSRule.h b/sky/engine/core/css/CSSRule.h
index 216e415..e272926 100644
--- a/sky/engine/core/css/CSSRule.h
+++ b/sky/engine/core/css/CSSRule.h
@@ -65,8 +65,6 @@
         m_parentRule = rule;
     }
 
-    virtual void trace(Visitor*);
-
     CSSStyleSheet* parentStyleSheet() const
     {
         if (m_parentIsRule)
diff --git a/sky/engine/core/css/CSSRuleList.cpp b/sky/engine/core/css/CSSRuleList.cpp
index 7f3a7f2..c670ed3 100644
--- a/sky/engine/core/css/CSSRuleList.cpp
+++ b/sky/engine/core/css/CSSRuleList.cpp
@@ -35,9 +35,7 @@
 }
 
 StaticCSSRuleList::StaticCSSRuleList()
-#if !ENABLE(OILPAN)
     : m_refCount(1)
-#endif
 {
 }
 
@@ -45,20 +43,11 @@
 {
 }
 
-#if !ENABLE(OILPAN)
 void StaticCSSRuleList::deref()
 {
     ASSERT(m_refCount);
     if (!--m_refCount)
         delete this;
 }
-#endif
-
-void StaticCSSRuleList::trace(Visitor* visitor)
-{
-    visitor->trace(m_rules);
-    CSSRuleList::trace(visitor);
-}
-
 
 } // namespace blink
diff --git a/sky/engine/core/css/CSSRuleList.h b/sky/engine/core/css/CSSRuleList.h
index e5da780..4c3031f 100644
--- a/sky/engine/core/css/CSSRuleList.h
+++ b/sky/engine/core/css/CSSRuleList.h
@@ -50,8 +50,6 @@
 
     virtual CSSStyleSheet* styleSheet() const = 0;
 
-    virtual void trace(Visitor*) { }
-
 protected:
     CSSRuleList();
 };
@@ -72,8 +70,6 @@
 
     virtual CSSStyleSheet* styleSheet() const override { return 0; }
 
-    virtual void trace(Visitor*) override;
-
 private:
     StaticCSSRuleList();
     virtual ~StaticCSSRuleList();
@@ -100,12 +96,6 @@
     virtual void deref() override { m_rule->deref(); }
 #endif
 
-    virtual void trace(Visitor* visitor) override
-    {
-        visitor->trace(m_rule);
-        CSSRuleList::trace(visitor);
-    }
-
 private:
     LiveCSSRuleList(Rule* rule) : m_rule(rule) { }
 
diff --git a/sky/engine/core/css/CSSSegmentedFontFace.cpp b/sky/engine/core/css/CSSSegmentedFontFace.cpp
index a6b65d1..59b9570 100644
--- a/sky/engine/core/css/CSSSegmentedFontFace.cpp
+++ b/sky/engine/core/css/CSSSegmentedFontFace.cpp
@@ -204,12 +204,4 @@
     }
 }
 
-void CSSSegmentedFontFace::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_fontSelector);
-    visitor->trace(m_fontFaces);
-#endif
-}
-
 }
diff --git a/sky/engine/core/css/CSSSegmentedFontFace.h b/sky/engine/core/css/CSSSegmentedFontFace.h
index 0f9ed4f..5eda28d 100644
--- a/sky/engine/core/css/CSSSegmentedFontFace.h
+++ b/sky/engine/core/css/CSSSegmentedFontFace.h
@@ -68,8 +68,6 @@
     void match(const String&, Vector<RefPtr<FontFace> >&) const;
     void willUseFontData(const FontDescription&, UChar32);
 
-    void trace(Visitor*);
-
 private:
     CSSSegmentedFontFace(CSSFontSelector*, FontTraits);
 
diff --git a/sky/engine/core/css/CSSShadowValue.cpp b/sky/engine/core/css/CSSShadowValue.cpp
index bf99cc9..ad4a461 100644
--- a/sky/engine/core/css/CSSShadowValue.cpp
+++ b/sky/engine/core/css/CSSShadowValue.cpp
@@ -88,15 +88,4 @@
         && compareCSSValuePtr(style, other.style);
 }
 
-void CSSShadowValue::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(x);
-    visitor->trace(y);
-    visitor->trace(blur);
-    visitor->trace(spread);
-    visitor->trace(style);
-    visitor->trace(color);
-    CSSValue::traceAfterDispatch(visitor);
-}
-
 }
diff --git a/sky/engine/core/css/CSSShadowValue.h b/sky/engine/core/css/CSSShadowValue.h
index 07a6deb..08f2ecd 100644
--- a/sky/engine/core/css/CSSShadowValue.h
+++ b/sky/engine/core/css/CSSShadowValue.h
@@ -53,8 +53,6 @@
     RefPtr<CSSPrimitiveValue> style;
     RefPtr<CSSPrimitiveValue> color;
 
-    void traceAfterDispatch(Visitor*);
-
 private:
     CSSShadowValue(PassRefPtr<CSSPrimitiveValue> x,
         PassRefPtr<CSSPrimitiveValue> y,
diff --git a/sky/engine/core/css/CSSStyleDeclaration.h b/sky/engine/core/css/CSSStyleDeclaration.h
index 55192e3..afb11ae 100644
--- a/sky/engine/core/css/CSSStyleDeclaration.h
+++ b/sky/engine/core/css/CSSStyleDeclaration.h
@@ -71,8 +71,6 @@
     virtual bool cssPropertyMatches(CSSPropertyID, const CSSValue*) const = 0;
     virtual CSSStyleSheet* parentStyleSheet() const { return 0; }
 
-    virtual void trace(Visitor*) { }
-
 protected:
     CSSStyleDeclaration()
     {
diff --git a/sky/engine/core/css/CSSStyleRule.cpp b/sky/engine/core/css/CSSStyleRule.cpp
index 947a2cb..4dea091 100644
--- a/sky/engine/core/css/CSSStyleRule.cpp
+++ b/sky/engine/core/css/CSSStyleRule.cpp
@@ -130,11 +130,4 @@
         m_propertiesCSSOMWrapper->reattach(m_styleRule->mutableProperties());
 }
 
-void CSSStyleRule::trace(Visitor* visitor)
-{
-    visitor->trace(m_styleRule);
-    visitor->trace(m_propertiesCSSOMWrapper);
-    CSSRule::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSStyleRule.h b/sky/engine/core/css/CSSStyleRule.h
index f55e892..130f5c0 100644
--- a/sky/engine/core/css/CSSStyleRule.h
+++ b/sky/engine/core/css/CSSStyleRule.h
@@ -52,8 +52,6 @@
     // FIXME: Not CSSOM. Remove.
     StyleRule* styleRule() const { return m_styleRule.get(); }
 
-    virtual void trace(Visitor*) override;
-
 private:
     CSSStyleRule(StyleRule*, CSSStyleSheet*);
 
diff --git a/sky/engine/core/css/CSSStyleSheet.cpp b/sky/engine/core/css/CSSStyleSheet.cpp
index 5cc8e87..a4d700b 100644
--- a/sky/engine/core/css/CSSStyleSheet.cpp
+++ b/sky/engine/core/css/CSSStyleSheet.cpp
@@ -45,12 +45,6 @@
         return adoptPtr(new StyleSheetCSSRuleList(sheet));
     }
 
-    virtual void trace(Visitor* visitor) override
-    {
-        visitor->trace(m_styleSheet);
-        CSSRuleList::trace(visitor);
-    }
-
 private:
     StyleSheetCSSRuleList(CSSStyleSheet* sheet) : m_styleSheet(sheet) { }
 
@@ -347,15 +341,4 @@
     m_childRuleCSSOMWrappers.clear();
 }
 
-void CSSStyleSheet::trace(Visitor* visitor)
-{
-    visitor->trace(m_contents);
-    visitor->trace(m_mediaQueries);
-    visitor->trace(m_ownerNode);
-    visitor->trace(m_mediaCSSOMWrapper);
-    visitor->trace(m_childRuleCSSOMWrappers);
-    visitor->trace(m_ruleListCSSOMWrapper);
-    StyleSheet::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSStyleSheet.h b/sky/engine/core/css/CSSStyleSheet.h
index 4459819..4bdb631 100644
--- a/sky/engine/core/css/CSSStyleSheet.h
+++ b/sky/engine/core/css/CSSStyleSheet.h
@@ -101,8 +101,6 @@
     bool isInline() const { return m_isInlineStylesheet; }
     TextPosition startPositionInSource() const { return m_startPosition; }
 
-    virtual void trace(Visitor*) override;
-
 private:
     CSSStyleSheet(PassRefPtr<StyleSheetContents>);
     CSSStyleSheet(PassRefPtr<StyleSheetContents>, Node* ownerNode, bool isInlineStylesheet, const TextPosition& startPosition);
diff --git a/sky/engine/core/css/CSSSupportsRule.h b/sky/engine/core/css/CSSSupportsRule.h
index e00478e..f6fae55 100644
--- a/sky/engine/core/css/CSSSupportsRule.h
+++ b/sky/engine/core/css/CSSSupportsRule.h
@@ -50,8 +50,6 @@
 
     String conditionText() const;
 
-    virtual void trace(Visitor* visitor) override { CSSGroupingRule::trace(visitor); }
-
 private:
     CSSSupportsRule(StyleRuleSupports*, CSSStyleSheet*);
 };
diff --git a/sky/engine/core/css/CSSTimingFunctionValue.h b/sky/engine/core/css/CSSTimingFunctionValue.h
index 1ad52d4..4701ff3 100644
--- a/sky/engine/core/css/CSSTimingFunctionValue.h
+++ b/sky/engine/core/css/CSSTimingFunctionValue.h
@@ -48,8 +48,6 @@
 
     bool equals(const CSSCubicBezierTimingFunctionValue&) const;
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
-
 private:
     CSSCubicBezierTimingFunctionValue(double x1, double y1, double x2, double y2)
         : CSSValue(CubicBezierTimingFunctionClass)
@@ -82,8 +80,6 @@
 
     bool equals(const CSSStepsTimingFunctionValue&) const;
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
-
 private:
     CSSStepsTimingFunctionValue(int steps, StepsTimingFunction::StepAtPosition stepAtPosition)
         : CSSValue(StepsTimingFunctionClass)
diff --git a/sky/engine/core/css/CSSTransformValue.h b/sky/engine/core/css/CSSTransformValue.h
index 27e06c9..1da374b 100644
--- a/sky/engine/core/css/CSSTransformValue.h
+++ b/sky/engine/core/css/CSSTransformValue.h
@@ -71,8 +71,6 @@
 
     PassRefPtr<CSSTransformValue> cloneForCSSOM() const;
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValueList::traceAfterDispatch(visitor); }
-
 private:
     CSSTransformValue(TransformOperationType);
     CSSTransformValue(const CSSTransformValue& cloneFrom);
diff --git a/sky/engine/core/css/CSSUnicodeRangeValue.h b/sky/engine/core/css/CSSUnicodeRangeValue.h
index 26bcc84..8f9aa14 100644
--- a/sky/engine/core/css/CSSUnicodeRangeValue.h
+++ b/sky/engine/core/css/CSSUnicodeRangeValue.h
@@ -45,8 +45,6 @@
 
     bool equals(const CSSUnicodeRangeValue&) const;
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
-
 private:
     CSSUnicodeRangeValue(UChar32 from, UChar32 to)
         : CSSValue(UnicodeRangeClass)
diff --git a/sky/engine/core/css/CSSUnknownRule.h b/sky/engine/core/css/CSSUnknownRule.h
index 00e4aa4..27736d2 100644
--- a/sky/engine/core/css/CSSUnknownRule.h
+++ b/sky/engine/core/css/CSSUnknownRule.h
@@ -34,7 +34,6 @@
     virtual CSSRule::Type type() const override { return UNKNOWN_RULE; }
     virtual String cssText() const override { return String(); }
     virtual void reattach(StyleRuleBase*) override { }
-    virtual void trace(Visitor* visitor) override { CSSRule::trace(visitor); }
 };
 
 } // namespace blink
diff --git a/sky/engine/core/css/CSSValue.cpp b/sky/engine/core/css/CSSValue.cpp
index 6cc0a70..b2fc80e 100644
--- a/sky/engine/core/css/CSSValue.cpp
+++ b/sky/engine/core/css/CSSValue.cpp
@@ -69,8 +69,6 @@
 
     String cssText() const { return m_cssText; }
 
-    void traceAfterDispatch(Visitor* visitor) { CSSValue::traceAfterDispatch(visitor); }
-
 private:
     TextCloneCSSValue(ClassType classType, const String& text)
         : CSSValue(classType, /*isCSSOMSafe*/ true)
@@ -350,184 +348,6 @@
     ASSERT_NOT_REACHED();
 }
 
-void CSSValue::finalizeGarbageCollectedObject()
-{
-    if (m_isTextClone) {
-        ASSERT(isCSSOMSafe());
-        toTextCloneCSSValue(this)->~TextCloneCSSValue();
-        return;
-    }
-    ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
-
-    switch (classType()) {
-    case AspectRatioClass:
-        toCSSAspectRatioValue(this)->~CSSAspectRatioValue();
-        return;
-    case BorderImageSliceClass:
-        toCSSBorderImageSliceValue(this)->~CSSBorderImageSliceValue();
-        return;
-    case CanvasClass:
-        toCSSCanvasValue(this)->~CSSCanvasValue();
-        return;
-    case CursorImageClass:
-        toCSSCursorImageValue(this)->~CSSCursorImageValue();
-        return;
-    case FontClass:
-        toCSSFontValue(this)->~CSSFontValue();
-        return;
-    case FontFaceSrcClass:
-        toCSSFontFaceSrcValue(this)->~CSSFontFaceSrcValue();
-        return;
-    case FontFeatureClass:
-        toCSSFontFeatureValue(this)->~CSSFontFeatureValue();
-        return;
-    case FunctionClass:
-        toCSSFunctionValue(this)->~CSSFunctionValue();
-        return;
-    case LinearGradientClass:
-        toCSSLinearGradientValue(this)->~CSSLinearGradientValue();
-        return;
-    case RadialGradientClass:
-        toCSSRadialGradientValue(this)->~CSSRadialGradientValue();
-        return;
-    case CrossfadeClass:
-        toCSSCrossfadeValue(this)->~CSSCrossfadeValue();
-        return;
-    case ImageClass:
-        toCSSImageValue(this)->~CSSImageValue();
-        return;
-    case InheritedClass:
-        toCSSInheritedValue(this)->~CSSInheritedValue();
-        return;
-    case InitialClass:
-        toCSSInitialValue(this)->~CSSInitialValue();
-        return;
-    case PrimitiveClass:
-        toCSSPrimitiveValue(this)->~CSSPrimitiveValue();
-        return;
-    case ShadowClass:
-        toCSSShadowValue(this)->~CSSShadowValue();
-        return;
-    case CubicBezierTimingFunctionClass:
-        toCSSCubicBezierTimingFunctionValue(this)->~CSSCubicBezierTimingFunctionValue();
-        return;
-    case StepsTimingFunctionClass:
-        toCSSStepsTimingFunctionValue(this)->~CSSStepsTimingFunctionValue();
-        return;
-    case UnicodeRangeClass:
-        toCSSUnicodeRangeValue(this)->~CSSUnicodeRangeValue();
-        return;
-    case ValueListClass:
-        toCSSValueList(this)->~CSSValueList();
-        return;
-    case CSSTransformClass:
-        toCSSTransformValue(this)->~CSSTransformValue();
-        return;
-    case LineBoxContainClass:
-        toCSSLineBoxContainValue(this)->~CSSLineBoxContainValue();
-        return;
-    case CalculationClass:
-        toCSSCalcValue(this)->~CSSCalcValue();
-        return;
-    case ImageSetClass:
-        toCSSImageSetValue(this)->~CSSImageSetValue();
-        return;
-    case CSSFilterClass:
-        toCSSFilterValue(this)->~CSSFilterValue();
-        return;
-    }
-    ASSERT_NOT_REACHED();
-}
-
-void CSSValue::trace(Visitor* visitor)
-{
-    if (m_isTextClone) {
-        ASSERT(isCSSOMSafe());
-        toTextCloneCSSValue(this)->traceAfterDispatch(visitor);
-        return;
-    }
-    ASSERT(!isCSSOMSafe() || isSubtypeExposedToCSSOM());
-
-    switch (classType()) {
-    case AspectRatioClass:
-        toCSSAspectRatioValue(this)->traceAfterDispatch(visitor);
-        return;
-    case BorderImageSliceClass:
-        toCSSBorderImageSliceValue(this)->traceAfterDispatch(visitor);
-        return;
-    case CanvasClass:
-        toCSSCanvasValue(this)->traceAfterDispatch(visitor);
-        return;
-    case CursorImageClass:
-        toCSSCursorImageValue(this)->traceAfterDispatch(visitor);
-        return;
-    case FontClass:
-        toCSSFontValue(this)->traceAfterDispatch(visitor);
-        return;
-    case FontFaceSrcClass:
-        toCSSFontFaceSrcValue(this)->traceAfterDispatch(visitor);
-        return;
-    case FontFeatureClass:
-        toCSSFontFeatureValue(this)->traceAfterDispatch(visitor);
-        return;
-    case FunctionClass:
-        toCSSFunctionValue(this)->traceAfterDispatch(visitor);
-        return;
-    case LinearGradientClass:
-        toCSSLinearGradientValue(this)->traceAfterDispatch(visitor);
-        return;
-    case RadialGradientClass:
-        toCSSRadialGradientValue(this)->traceAfterDispatch(visitor);
-        return;
-    case CrossfadeClass:
-        toCSSCrossfadeValue(this)->traceAfterDispatch(visitor);
-        return;
-    case ImageClass:
-        toCSSImageValue(this)->traceAfterDispatch(visitor);
-        return;
-    case InheritedClass:
-        toCSSInheritedValue(this)->traceAfterDispatch(visitor);
-        return;
-    case InitialClass:
-        toCSSInitialValue(this)->traceAfterDispatch(visitor);
-        return;
-    case PrimitiveClass:
-        toCSSPrimitiveValue(this)->traceAfterDispatch(visitor);
-        return;
-    case ShadowClass:
-        toCSSShadowValue(this)->traceAfterDispatch(visitor);
-        return;
-    case CubicBezierTimingFunctionClass:
-        toCSSCubicBezierTimingFunctionValue(this)->traceAfterDispatch(visitor);
-        return;
-    case StepsTimingFunctionClass:
-        toCSSStepsTimingFunctionValue(this)->traceAfterDispatch(visitor);
-        return;
-    case UnicodeRangeClass:
-        toCSSUnicodeRangeValue(this)->traceAfterDispatch(visitor);
-        return;
-    case ValueListClass:
-        toCSSValueList(this)->traceAfterDispatch(visitor);
-        return;
-    case CSSTransformClass:
-        toCSSTransformValue(this)->traceAfterDispatch(visitor);
-        return;
-    case LineBoxContainClass:
-        toCSSLineBoxContainValue(this)->traceAfterDispatch(visitor);
-        return;
-    case CalculationClass:
-        toCSSCalcValue(this)->traceAfterDispatch(visitor);
-        return;
-    case ImageSetClass:
-        toCSSImageSetValue(this)->traceAfterDispatch(visitor);
-        return;
-    case CSSFilterClass:
-        toCSSFilterValue(this)->traceAfterDispatch(visitor);
-        return;
-    }
-    ASSERT_NOT_REACHED();
-}
-
 PassRefPtr<CSSValue> CSSValue::cloneForCSSOM() const
 {
     switch (classType()) {
diff --git a/sky/engine/core/css/CSSValue.h b/sky/engine/core/css/CSSValue.h
index 551ad50..705c09b 100644
--- a/sky/engine/core/css/CSSValue.h
+++ b/sky/engine/core/css/CSSValue.h
@@ -115,10 +115,6 @@
 
     bool equals(const CSSValue&) const;
 
-    void finalizeGarbageCollectedObject();
-    void traceAfterDispatch(Visitor*) { }
-    void trace(Visitor*);
-
 protected:
 
     static const size_t ClassTypeBits = 6;
diff --git a/sky/engine/core/css/CSSValueList.cpp b/sky/engine/core/css/CSSValueList.cpp
index 9ab6a31..9d1601a 100644
--- a/sky/engine/core/css/CSSValueList.cpp
+++ b/sky/engine/core/css/CSSValueList.cpp
@@ -151,10 +151,4 @@
     return adoptRef(new CSSValueList(*this));
 }
 
-void CSSValueList::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_values);
-    CSSValue::traceAfterDispatch(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/CSSValueList.h b/sky/engine/core/css/CSSValueList.h
index b4c9d49..734e0d4 100644
--- a/sky/engine/core/css/CSSValueList.h
+++ b/sky/engine/core/css/CSSValueList.h
@@ -61,8 +61,6 @@
 
     PassRefPtr<CSSValueList> cloneForCSSOM() const;
 
-    void traceAfterDispatch(Visitor*);
-
 protected:
     CSSValueList(ClassType, ValueListSeparator);
     CSSValueList(const CSSValueList& cloneFrom);
diff --git a/sky/engine/core/css/CSSValuePool.cpp b/sky/engine/core/css/CSSValuePool.cpp
index 95504c2..bbc4f40 100644
--- a/sky/engine/core/css/CSSValuePool.cpp
+++ b/sky/engine/core/css/CSSValuePool.cpp
@@ -146,23 +146,4 @@
     return value;
 }
 
-void CSSValuePool::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_inheritedValue);
-    visitor->trace(m_implicitInitialValue);
-    visitor->trace(m_explicitInitialValue);
-    visitor->trace(m_identifierValueCache);
-    visitor->trace(m_colorValueCache);
-    visitor->trace(m_colorTransparent);
-    visitor->trace(m_colorWhite);
-    visitor->trace(m_colorBlack);
-    visitor->trace(m_pixelValueCache);
-    visitor->trace(m_percentValueCache);
-    visitor->trace(m_numberValueCache);
-    visitor->trace(m_fontFaceValueCache);
-    visitor->trace(m_fontFamilyValueCache);
-#endif
-}
-
 }
diff --git a/sky/engine/core/css/CSSValuePool.h b/sky/engine/core/css/CSSValuePool.h
index ef9ffb4..fb0000f 100644
--- a/sky/engine/core/css/CSSValuePool.h
+++ b/sky/engine/core/css/CSSValuePool.h
@@ -56,8 +56,6 @@
     PassRefPtr<CSSPrimitiveValue> createValue(const Length& value) { return CSSPrimitiveValue::create(value); }
     template<typename T> static PassRefPtr<CSSPrimitiveValue> createValue(T value) { return CSSPrimitiveValue::create(value); }
 
-    void trace(Visitor*);
-
 private:
     CSSValuePool();
 
diff --git a/sky/engine/core/css/DOMWindowCSS.h b/sky/engine/core/css/DOMWindowCSS.h
index cc531e3..53128f7 100644
--- a/sky/engine/core/css/DOMWindowCSS.h
+++ b/sky/engine/core/css/DOMWindowCSS.h
@@ -46,8 +46,6 @@
     bool supports(const String& property, const String& value) const;
     bool supports(const String& conditionText) const;
 
-    void trace(Visitor*) { }
-
 private:
     DOMWindowCSS()
     {
diff --git a/sky/engine/core/css/ElementRuleCollector.h b/sky/engine/core/css/ElementRuleCollector.h
index 87bf72f..50f75cf 100644
--- a/sky/engine/core/css/ElementRuleCollector.h
+++ b/sky/engine/core/css/ElementRuleCollector.h
@@ -62,10 +62,6 @@
     uint32_t cascadeScope() const { return m_cascadeScope; }
     uint64_t position() const { return m_position; }
     const CSSStyleSheet* parentStyleSheet() const { return m_parentStyleSheet; }
-    void trace(Visitor* visitor)
-    {
-        visitor->trace(m_parentStyleSheet);
-    }
 
 private:
     // FIXME: Oilpan: RuleData is in the oilpan heap and this pointer
@@ -89,13 +85,6 @@
 public:
     static PassRefPtr<StyleRuleList> create() { return adoptRef(new StyleRuleList()); }
 
-    void trace(Visitor* visitor)
-    {
-#if ENABLE(OILPAN)
-        visitor->trace(m_list);
-#endif
-    }
-
     Vector<RawPtr<StyleRule> > m_list;
 };
 
diff --git a/sky/engine/core/css/FontFaceCache.cpp b/sky/engine/core/css/FontFaceCache.cpp
index 719c990..0196941 100644
--- a/sky/engine/core/css/FontFaceCache.cpp
+++ b/sky/engine/core/css/FontFaceCache.cpp
@@ -226,14 +226,4 @@
     return faceResult.storedValue->value.get();
 }
 
-void FontFaceCache::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_fontFaces);
-    visitor->trace(m_fonts);
-    visitor->trace(m_styleRuleToFontFace);
-    visitor->trace(m_cssConnectedFontFaces);
-#endif
-}
-
 }
diff --git a/sky/engine/core/css/FontFaceCache.h b/sky/engine/core/css/FontFaceCache.h
index 788ab99..b2388a1 100644
--- a/sky/engine/core/css/FontFaceCache.h
+++ b/sky/engine/core/css/FontFaceCache.h
@@ -64,8 +64,6 @@
     unsigned version() const { return m_version; }
     void incrementVersion() { ++m_version; }
 
-    void trace(Visitor*);
-
 private:
     typedef HashMap<unsigned, RefPtr<CSSSegmentedFontFace> > TraitsMap;
     typedef HashMap<String, OwnPtr<TraitsMap>, CaseFoldingHash> FamilyToTraitsMap;
diff --git a/sky/engine/core/css/FontFaceSetForEachCallback.h b/sky/engine/core/css/FontFaceSetForEachCallback.h
index b7b6c1c..73effdf 100644
--- a/sky/engine/core/css/FontFaceSetForEachCallback.h
+++ b/sky/engine/core/css/FontFaceSetForEachCallback.h
@@ -37,7 +37,6 @@
 class FontFaceSetForEachCallback {
 public:
     virtual ~FontFaceSetForEachCallback() { }
-    virtual void trace(Visitor*) { }
     virtual bool handleItem(ScriptValue thisValue, FontFace*, FontFace*, FontFaceSet*) = 0;
     virtual bool handleItem(FontFace*, FontFace*, FontFaceSet*) = 0;
 };
diff --git a/sky/engine/core/css/FontFaceSetLoadEvent.cpp b/sky/engine/core/css/FontFaceSetLoadEvent.cpp
index d7776c4..376d424 100644
--- a/sky/engine/core/css/FontFaceSetLoadEvent.cpp
+++ b/sky/engine/core/css/FontFaceSetLoadEvent.cpp
@@ -58,10 +58,4 @@
     return EventNames::FontFaceSetLoadEvent;
 }
 
-void FontFaceSetLoadEvent::trace(Visitor* visitor)
-{
-    visitor->trace(m_fontfaces);
-    Event::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/FontFaceSetLoadEvent.h b/sky/engine/core/css/FontFaceSetLoadEvent.h
index f37fd68..9e20c41 100644
--- a/sky/engine/core/css/FontFaceSetLoadEvent.h
+++ b/sky/engine/core/css/FontFaceSetLoadEvent.h
@@ -67,8 +67,6 @@
 
     virtual const AtomicString& interfaceName() const override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     FontFaceSetLoadEvent();
     FontFaceSetLoadEvent(const AtomicString&, const FontFaceArray&);
diff --git a/sky/engine/core/css/FontLoader.cpp b/sky/engine/core/css/FontLoader.cpp
index b52c7e6..df0ebc7 100644
--- a/sky/engine/core/css/FontLoader.cpp
+++ b/sky/engine/core/css/FontLoader.cpp
@@ -93,10 +93,4 @@
     m_fontsToBeginLoading.clear();
 }
 
-void FontLoader::trace(Visitor* visitor)
-{
-    visitor->trace(m_resourceFetcher);
-    visitor->trace(m_fontSelector);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/FontLoader.h b/sky/engine/core/css/FontLoader.h
index b5b1e36..a966258 100644
--- a/sky/engine/core/css/FontLoader.h
+++ b/sky/engine/core/css/FontLoader.h
@@ -32,8 +32,6 @@
     void clearResourceFetcherAndFontSelector();
 #endif
 
-    void trace(Visitor*);
-
 private:
     FontLoader(CSSFontSelector*, ResourceFetcher*);
     void beginLoadTimerFired(Timer<FontLoader>*);
diff --git a/sky/engine/core/css/MediaList.cpp b/sky/engine/core/css/MediaList.cpp
index 44fb55f..460e0c1 100644
--- a/sky/engine/core/css/MediaList.cpp
+++ b/sky/engine/core/css/MediaList.cpp
@@ -169,10 +169,6 @@
     return text.toString();
 }
 
-void MediaQuerySet::trace(Visitor* visitor)
-{
-}
-
 MediaList::MediaList(MediaQuerySet* mediaQueries, CSSStyleSheet* parentSheet)
     : m_mediaQueries(mediaQueries)
     , m_parentStyleSheet(parentSheet)
@@ -242,13 +238,6 @@
     m_mediaQueries = mediaQueries;
 }
 
-void MediaList::trace(Visitor* visitor)
-{
-    visitor->trace(m_mediaQueries);
-    visitor->trace(m_parentStyleSheet);
-    visitor->trace(m_parentRule);
-}
-
 static void addResolutionWarningMessageToConsole(Document* document, const String& serializedExpression, CSSPrimitiveValue::UnitType type)
 {
     ASSERT(document);
diff --git a/sky/engine/core/css/MediaList.h b/sky/engine/core/css/MediaList.h
index f40a7b2..82cc489 100644
--- a/sky/engine/core/css/MediaList.h
+++ b/sky/engine/core/css/MediaList.h
@@ -61,8 +61,6 @@
 
     PassRefPtr<MediaQuerySet> copy() const { return adoptRef(new MediaQuerySet(*this)); }
 
-    void trace(Visitor*);
-
 private:
     MediaQuerySet();
     MediaQuerySet(const MediaQuerySet&);
@@ -105,8 +103,6 @@
 
     void reattach(MediaQuerySet*);
 
-    void trace(Visitor*);
-
 private:
     MediaList(MediaQuerySet*, CSSStyleSheet* parentSheet);
     MediaList(MediaQuerySet*, CSSRule* parentRule);
diff --git a/sky/engine/core/css/MediaQuery.cpp b/sky/engine/core/css/MediaQuery.cpp
index b786d44..1999b34 100644
--- a/sky/engine/core/css/MediaQuery.cpp
+++ b/sky/engine/core/css/MediaQuery.cpp
@@ -133,13 +133,4 @@
     return m_serializationCache;
 }
 
-void MediaQuery::trace(Visitor* visitor)
-{
-    // We don't support tracing of vectors of OwnPtrs (ie. OwnPtr<Vector<OwnPtr<MediaQuery> > >).
-    // Since this is a transitional object we are just ifdef'ing it out when oilpan is not enabled.
-#if ENABLE(OILPAN)
-    visitor->trace(m_expressions);
-#endif
-}
-
 }
diff --git a/sky/engine/core/css/MediaQuery.h b/sky/engine/core/css/MediaQuery.h
index 6b43a32..2bb5607 100644
--- a/sky/engine/core/css/MediaQuery.h
+++ b/sky/engine/core/css/MediaQuery.h
@@ -60,8 +60,6 @@
 
     PassOwnPtr<MediaQuery> copy() const { return adoptPtr(new MediaQuery(*this)); }
 
-    void trace(Visitor*);
-
 private:
     MediaQuery(const MediaQuery&);
 
diff --git a/sky/engine/core/css/MediaQueryExp.h b/sky/engine/core/css/MediaQueryExp.h
index 68d1bb4..f9cb263 100644
--- a/sky/engine/core/css/MediaQueryExp.h
+++ b/sky/engine/core/css/MediaQueryExp.h
@@ -96,8 +96,6 @@
 
     MediaQueryExp(const MediaQueryExp& other);
 
-    void trace(Visitor* visitor) { }
-
 private:
     MediaQueryExp(const String&, const MediaQueryExpValue&);
 
diff --git a/sky/engine/core/css/MediaQueryList.cpp b/sky/engine/core/css/MediaQueryList.cpp
index 7bd8709..9ca4b4e 100644
--- a/sky/engine/core/css/MediaQueryList.cpp
+++ b/sky/engine/core/css/MediaQueryList.cpp
@@ -125,16 +125,6 @@
     return m_matches;
 }
 
-void MediaQueryList::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_matcher);
-    visitor->trace(m_media);
-    visitor->trace(m_listeners);
-#endif
-    EventTargetWithInlineData::trace(visitor);
-}
-
 const AtomicString& MediaQueryList::interfaceName() const
 {
     return EventTargetNames::MediaQueryList;
diff --git a/sky/engine/core/css/MediaQueryList.h b/sky/engine/core/css/MediaQueryList.h
index 75329bc..6f20732 100644
--- a/sky/engine/core/css/MediaQueryList.h
+++ b/sky/engine/core/css/MediaQueryList.h
@@ -66,8 +66,6 @@
     // Will return true if a DOM event should be scheduled.
     bool mediaFeaturesChanged(Vector<RefPtr<MediaQueryListListener> >* listenersToNotify);
 
-    void trace(Visitor*);
-
     // From ActiveDOMObject
     virtual bool hasPendingActivity() const override;
     virtual void stop() override;
diff --git a/sky/engine/core/css/MediaQueryListEvent.h b/sky/engine/core/css/MediaQueryListEvent.h
index c37f438..1584d21 100644
--- a/sky/engine/core/css/MediaQueryListEvent.h
+++ b/sky/engine/core/css/MediaQueryListEvent.h
@@ -45,12 +45,6 @@
 
     virtual const AtomicString& interfaceName() const override { return EventNames::MediaQueryListEvent; }
 
-    virtual void trace(Visitor* visitor) override
-    {
-        Event::trace(visitor);
-        visitor->trace(m_mediaQueryList);
-    }
-
 private:
     MediaQueryListEvent()
         : m_matches(false)
diff --git a/sky/engine/core/css/MediaQueryListListener.h b/sky/engine/core/css/MediaQueryListListener.h
index 4c5435a..770593a 100644
--- a/sky/engine/core/css/MediaQueryListListener.h
+++ b/sky/engine/core/css/MediaQueryListListener.h
@@ -34,8 +34,6 @@
     virtual ~MediaQueryListListener();
 
     virtual void notifyMediaQueryChanged() = 0;
-
-    virtual void trace(Visitor* visitor) { }
 protected:
     MediaQueryListListener();
 };
diff --git a/sky/engine/core/css/MediaQueryMatcher.cpp b/sky/engine/core/css/MediaQueryMatcher.cpp
index 948efdd..070fdd4 100644
--- a/sky/engine/core/css/MediaQueryMatcher.cpp
+++ b/sky/engine/core/css/MediaQueryMatcher.cpp
@@ -144,13 +144,4 @@
     m_document->enqueueMediaQueryChangeListeners(listenersToNotify);
 }
 
-void MediaQueryMatcher::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_document);
-    visitor->trace(m_mediaLists);
-    visitor->trace(m_viewportListeners);
-#endif
-}
-
 }
diff --git a/sky/engine/core/css/MediaQueryMatcher.h b/sky/engine/core/css/MediaQueryMatcher.h
index 97066f8..0167ea9 100644
--- a/sky/engine/core/css/MediaQueryMatcher.h
+++ b/sky/engine/core/css/MediaQueryMatcher.h
@@ -58,8 +58,6 @@
     void viewportChanged();
     bool evaluate(const MediaQuerySet*);
 
-    void trace(Visitor*);
-
 private:
     explicit MediaQueryMatcher(Document&);
 
diff --git a/sky/engine/core/css/Pair.cpp b/sky/engine/core/css/Pair.cpp
deleted file mode 100644
index cadd148..0000000
--- a/sky/engine/core/css/Pair.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "config.h"
-#include "core/css/Pair.h"
-
-namespace blink {
-
-void Pair::trace(Visitor* visitor)
-{
-    visitor->trace(m_first);
-    visitor->trace(m_second);
-}
-
-}
diff --git a/sky/engine/core/css/Pair.h b/sky/engine/core/css/Pair.h
index 4e55286..7d49339 100644
--- a/sky/engine/core/css/Pair.h
+++ b/sky/engine/core/css/Pair.h
@@ -62,8 +62,6 @@
             && m_identicalValuesPolicy == other.m_identicalValuesPolicy;
     }
 
-    void trace(Visitor*);
-
 private:
     Pair()
         : m_first(nullptr)
diff --git a/sky/engine/core/css/PropertySetCSSStyleDeclaration.cpp b/sky/engine/core/css/PropertySetCSSStyleDeclaration.cpp
index 3ade73b..f51a286 100644
--- a/sky/engine/core/css/PropertySetCSSStyleDeclaration.cpp
+++ b/sky/engine/core/css/PropertySetCSSStyleDeclaration.cpp
@@ -120,12 +120,6 @@
 }
 #endif
 
-void PropertySetCSSStyleDeclaration::trace(Visitor* visitor)
-{
-    visitor->trace(m_propertySet);
-    AbstractPropertySetCSSStyleDeclaration::trace(visitor);
-}
-
 unsigned AbstractPropertySetCSSStyleDeclaration::length() const
 {
     return propertySet().propertyCount();
@@ -286,14 +280,6 @@
     return propertySet().propertyMatches(propertyID, propertyValue);
 }
 
-void AbstractPropertySetCSSStyleDeclaration::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_cssomCSSValueClones);
-#endif
-    CSSStyleDeclaration::trace(visitor);
-}
-
 StyleRuleCSSStyleDeclaration::StyleRuleCSSStyleDeclaration(MutableStylePropertySet& propertySetArg, CSSRule* parentRule)
     : PropertySetCSSStyleDeclaration(propertySetArg)
 #if !ENABLE(OILPAN)
@@ -359,12 +345,6 @@
 #endif
 }
 
-void StyleRuleCSSStyleDeclaration::trace(Visitor* visitor)
-{
-    visitor->trace(m_parentRule);
-    PropertySetCSSStyleDeclaration::trace(visitor);
-}
-
 MutableStylePropertySet& InlineCSSStyleDeclaration::propertySet() const
 {
     return m_parentElement->ensureMutableInlineStyle();
@@ -403,10 +383,4 @@
 }
 #endif
 
-void InlineCSSStyleDeclaration::trace(Visitor* visitor)
-{
-    visitor->trace(m_parentElement);
-    AbstractPropertySetCSSStyleDeclaration::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/PropertySetCSSStyleDeclaration.h b/sky/engine/core/css/PropertySetCSSStyleDeclaration.h
index be8996a..7a6f7bd 100644
--- a/sky/engine/core/css/PropertySetCSSStyleDeclaration.h
+++ b/sky/engine/core/css/PropertySetCSSStyleDeclaration.h
@@ -45,8 +45,6 @@
     virtual Element* parentElement() const { return 0; }
     StyleSheetContents* contextStyleSheet() const;
 
-    virtual void trace(Visitor*) override;
-
 private:
     virtual CSSRule* parentRule() const override { return 0; }
     virtual unsigned length() const override final;
@@ -87,8 +85,6 @@
     virtual void deref() override;
 #endif
 
-    virtual void trace(Visitor*) override;
-
 protected:
     virtual MutableStylePropertySet& propertySet() const override final { ASSERT(m_propertySet); return *m_propertySet; }
 
@@ -112,8 +108,6 @@
 
     void reattach(MutableStylePropertySet&);
 
-    virtual void trace(Visitor*) override;
-
 private:
     StyleRuleCSSStyleDeclaration(MutableStylePropertySet&, CSSRule*);
     virtual ~StyleRuleCSSStyleDeclaration();
@@ -139,8 +133,6 @@
     {
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     virtual MutableStylePropertySet& propertySet() const override;
 #if !ENABLE(OILPAN)
diff --git a/sky/engine/core/css/RGBColor.h b/sky/engine/core/css/RGBColor.h
index c571b00..a66dec4 100644
--- a/sky/engine/core/css/RGBColor.h
+++ b/sky/engine/core/css/RGBColor.h
@@ -47,8 +47,6 @@
 
     Color color() const { return Color(m_rgbColor); }
 
-    void trace(Visitor*) { }
-
 private:
     RGBColor(unsigned rgbColor)
         : m_rgbColor(rgbColor)
diff --git a/sky/engine/core/css/Rect.cpp b/sky/engine/core/css/Rect.cpp
index c21ef1b..18eafa2 100644
--- a/sky/engine/core/css/Rect.cpp
+++ b/sky/engine/core/css/Rect.cpp
@@ -9,12 +9,4 @@
 
 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(RectBase)
 
-void RectBase::trace(Visitor* visitor)
-{
-    visitor->trace(m_top);
-    visitor->trace(m_right);
-    visitor->trace(m_bottom);
-    visitor->trace(m_left);
-}
-
 }
diff --git a/sky/engine/core/css/Rect.h b/sky/engine/core/css/Rect.h
index c01930a..38f90d1 100644
--- a/sky/engine/core/css/Rect.h
+++ b/sky/engine/core/css/Rect.h
@@ -49,8 +49,6 @@
             && compareCSSValuePtr(m_bottom, other.m_bottom);
     }
 
-    void trace(Visitor*);
-
 protected:
     RectBase() { }
     RectBase(const RectBase& cloneFrom)
diff --git a/sky/engine/core/css/RemoteFontFaceSource.cpp b/sky/engine/core/css/RemoteFontFaceSource.cpp
index 2c78968..2e57bc1 100644
--- a/sky/engine/core/css/RemoteFontFaceSource.cpp
+++ b/sky/engine/core/css/RemoteFontFaceSource.cpp
@@ -131,12 +131,6 @@
     return m_font->ensureCustomFontData();
 }
 
-void RemoteFontFaceSource::trace(Visitor* visitor)
-{
-    visitor->trace(m_fontLoader);
-    CSSFontFaceSource::trace(visitor);
-}
-
 void RemoteFontFaceSource::FontLoadHistograms::loadStarted()
 {
     if (!m_loadStartTime)
diff --git a/sky/engine/core/css/RemoteFontFaceSource.h b/sky/engine/core/css/RemoteFontFaceSource.h
index adfad00..1d19875 100644
--- a/sky/engine/core/css/RemoteFontFaceSource.h
+++ b/sky/engine/core/css/RemoteFontFaceSource.h
@@ -34,8 +34,6 @@
     virtual bool hadBlankText() override { return m_histograms.hadBlankText(); }
     void paintRequested() { m_histograms.fallbackFontPainted(); }
 
-    virtual void trace(Visitor*) override;
-
 protected:
     virtual PassRefPtr<SimpleFontData> createFontData(const FontDescription&) override;
     PassRefPtr<SimpleFontData> createLoadingFallbackFontData(const FontDescription&);
diff --git a/sky/engine/core/css/RuleSet.cpp b/sky/engine/core/css/RuleSet.cpp
index f434411..904ae86 100644
--- a/sky/engine/core/css/RuleSet.cpp
+++ b/sky/engine/core/css/RuleSet.cpp
@@ -246,40 +246,6 @@
     m_keyframesRules.shrinkToFit();
 }
 
-void RuleData::trace(Visitor* visitor)
-{
-    visitor->trace(m_rule);
-}
-
-void RuleSet::PendingRuleMaps::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(idRules);
-    visitor->trace(classRules);
-    visitor->trace(tagRules);
-    visitor->trace(shadowPseudoElementRules);
-#endif
-}
-
-void RuleSet::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_idRules);
-    visitor->trace(m_classRules);
-    visitor->trace(m_tagRules);
-    visitor->trace(m_shadowPseudoElementRules);
-    visitor->trace(m_universalRules);
-    visitor->trace(m_features);
-    visitor->trace(m_fontFaceRules);
-    visitor->trace(m_keyframesRules);
-    visitor->trace(m_viewportDependentMediaQueryResults);
-    visitor->trace(m_pendingRules);
-#ifndef NDEBUG
-    visitor->trace(m_allRules);
-#endif
-#endif
-}
-
 #ifndef NDEBUG
 void RuleSet::show()
 {
diff --git a/sky/engine/core/css/RuleSet.h b/sky/engine/core/css/RuleSet.h
index 0139011..8531fdd 100644
--- a/sky/engine/core/css/RuleSet.h
+++ b/sky/engine/core/css/RuleSet.h
@@ -58,8 +58,6 @@
 
     bool containsAttributeSelector() const { return m_containsAttributeSelector; }
 
-    void trace(Visitor*);
-
 private:
     RawPtr<StyleRule> m_rule;
     unsigned m_selectorIndex : 12;
@@ -111,8 +109,6 @@
     void show();
 #endif
 
-    void trace(Visitor*);
-
 private:
     typedef HashMap<AtomicString, OwnPtr<LinkedStack<RuleData> > > PendingRuleMap;
     typedef HashMap<AtomicString, OwnPtr<TerminatedArray<RuleData> > > CompactRuleMap;
@@ -141,8 +137,6 @@
         PendingRuleMap tagRules;
         PendingRuleMap shadowPseudoElementRules;
 
-        void trace(Visitor*);
-
     private:
         PendingRuleMaps() { }
     };
diff --git a/sky/engine/core/css/StyleMedia.h b/sky/engine/core/css/StyleMedia.h
index e5457ed..1b1446c 100644
--- a/sky/engine/core/css/StyleMedia.h
+++ b/sky/engine/core/css/StyleMedia.h
@@ -45,8 +45,6 @@
     AtomicString type() const;
     bool matchMedium(const String&) const;
 
-    void trace(Visitor*) { }
-
 private:
     explicit StyleMedia(LocalFrame*);
 };
diff --git a/sky/engine/core/css/StylePropertySet.cpp b/sky/engine/core/css/StylePropertySet.cpp
index b04848e..c03e2a3 100644
--- a/sky/engine/core/css/StylePropertySet.cpp
+++ b/sky/engine/core/css/StylePropertySet.cpp
@@ -112,14 +112,6 @@
     return -1;
 }
 
-void ImmutableStylePropertySet::traceAfterDispatch(Visitor* visitor)
-{
-    const RawPtr<CSSValue>* values = valueArray();
-    for (unsigned i = 0; i < m_arraySize; i++)
-        visitor->trace(values[i]);
-    StylePropertySet::traceAfterDispatch(visitor);
-}
-
 MutableStylePropertySet::MutableStylePropertySet(const StylePropertySet& other)
     : StylePropertySet(other.cssParserMode())
 {
@@ -149,24 +141,6 @@
     return propertyAt(foundPropertyIndex).value();
 }
 
-void StylePropertySet::trace(Visitor* visitor)
-{
-    if (m_isMutable)
-        toMutableStylePropertySet(this)->traceAfterDispatch(visitor);
-    else
-        toImmutableStylePropertySet(this)->traceAfterDispatch(visitor);
-}
-
-#if ENABLE(OILPAN)
-void StylePropertySet::finalizeGarbageCollectedObject()
-{
-    if (m_isMutable)
-        toMutableStylePropertySet(this)->~MutableStylePropertySet();
-    else
-        toImmutableStylePropertySet(this)->~ImmutableStylePropertySet();
-}
-#endif
-
 bool MutableStylePropertySet::removeShorthandProperty(CSSPropertyID propertyID)
 {
     StylePropertyShorthand shorthand = shorthandForProperty(propertyID);
@@ -549,13 +523,6 @@
     return -1;
 }
 
-void MutableStylePropertySet::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_cssomWrapper);
-    visitor->trace(m_propertyVector);
-    StylePropertySet::traceAfterDispatch(visitor);
-}
-
 unsigned StylePropertySet::averageSizeInBytes()
 {
     // Please update this if the storage scheme changes so that this longer reflects the actual size.
diff --git a/sky/engine/core/css/StylePropertySet.h b/sky/engine/core/css/StylePropertySet.h
index 69c0960..17ae7f3 100644
--- a/sky/engine/core/css/StylePropertySet.h
+++ b/sky/engine/core/css/StylePropertySet.h
@@ -45,16 +45,9 @@
     friend class PropertyReference;
 public:
 
-#if ENABLE(OILPAN)
-    // When oilpan is enabled override the finalize method to dispatch to the subclasses'
-    // destructor. This can be removed once the MutableStylePropertySet's OwnPtr is moved
-    // to the heap.
-    void finalizeGarbageCollectedObject();
-#else
     // Override RefCounted's deref() to ensure operator delete is called on
     // the appropriate subclass type.
     void deref();
-#endif
 
     class PropertyReference {
     public:
@@ -126,9 +119,6 @@
 
     bool propertyMatches(CSSPropertyID, const CSSValue*) const;
 
-    void trace(Visitor*);
-    void traceAfterDispatch(Visitor*) { }
-
 protected:
 
     enum { MaxArraySize = (1 << 28) - 1 };
@@ -163,8 +153,6 @@
     const StylePropertyMetadata* metadataArray() const;
     int findPropertyIndex(CSSPropertyID) const;
 
-    void traceAfterDispatch(Visitor*);
-
     void* operator new(std::size_t, void* location)
     {
         return location;
@@ -225,8 +213,6 @@
     CSSStyleDeclaration* ensureCSSStyleDeclaration();
     int findPropertyIndex(CSSPropertyID) const;
 
-    void traceAfterDispatch(Visitor*);
-
 private:
     explicit MutableStylePropertySet(CSSParserMode);
     explicit MutableStylePropertySet(const StylePropertySet&);
diff --git a/sky/engine/core/css/StyleRule.cpp b/sky/engine/core/css/StyleRule.cpp
index e4ba4d8..47ba623 100644
--- a/sky/engine/core/css/StyleRule.cpp
+++ b/sky/engine/core/css/StyleRule.cpp
@@ -48,64 +48,6 @@
     return createCSSOMWrapper(0, parentRule);
 }
 
-void StyleRuleBase::trace(Visitor* visitor)
-{
-    switch (type()) {
-    case Style:
-        toStyleRule(this)->traceAfterDispatch(visitor);
-        return;
-    case FontFace:
-        toStyleRuleFontFace(this)->traceAfterDispatch(visitor);
-        return;
-    case Media:
-        toStyleRuleMedia(this)->traceAfterDispatch(visitor);
-        return;
-    case Supports:
-        toStyleRuleSupports(this)->traceAfterDispatch(visitor);
-        return;
-    case Keyframes:
-        toStyleRuleKeyframes(this)->traceAfterDispatch(visitor);
-        return;
-    case Filter:
-        toStyleRuleFilter(this)->traceAfterDispatch(visitor);
-        return;
-    case Unknown:
-    case Keyframe:
-        ASSERT_NOT_REACHED();
-        return;
-    }
-    ASSERT_NOT_REACHED();
-}
-
-void StyleRuleBase::finalizeGarbageCollectedObject()
-{
-    switch (type()) {
-    case Style:
-        toStyleRule(this)->~StyleRule();
-        return;
-    case FontFace:
-        toStyleRuleFontFace(this)->~StyleRuleFontFace();
-        return;
-    case Media:
-        toStyleRuleMedia(this)->~StyleRuleMedia();
-        return;
-    case Supports:
-        toStyleRuleSupports(this)->~StyleRuleSupports();
-        return;
-    case Keyframes:
-        toStyleRuleKeyframes(this)->~StyleRuleKeyframes();
-        return;
-    case Filter:
-        toStyleRuleFilter(this)->~StyleRuleFilter();
-        return;
-    case Unknown:
-    case Keyframe:
-        ASSERT_NOT_REACHED();
-        return;
-    }
-    ASSERT_NOT_REACHED();
-}
-
 void StyleRuleBase::destroy()
 {
     switch (type()) {
@@ -225,12 +167,6 @@
     m_properties = properties;
 }
 
-void StyleRule::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_properties);
-    StyleRuleBase::traceAfterDispatch(visitor);
-}
-
 StyleRuleFontFace::StyleRuleFontFace()
     : StyleRuleBase(FontFace)
 {
@@ -258,12 +194,6 @@
     m_properties = properties;
 }
 
-void StyleRuleFontFace::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_properties);
-    StyleRuleBase::traceAfterDispatch(visitor);
-}
-
 StyleRuleGroup::StyleRuleGroup(Type type, Vector<RefPtr<StyleRuleBase> >& adoptRule)
     : StyleRuleBase(type)
 {
@@ -288,12 +218,6 @@
     m_childRules.remove(index);
 }
 
-void StyleRuleGroup::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_childRules);
-    StyleRuleBase::traceAfterDispatch(visitor);
-}
-
 StyleRuleMedia::StyleRuleMedia(PassRefPtr<MediaQuerySet> media, Vector<RefPtr<StyleRuleBase> >& adoptRules)
     : StyleRuleGroup(Media, adoptRules)
     , m_mediaQueries(media)
@@ -307,12 +231,6 @@
         m_mediaQueries = o.m_mediaQueries->copy();
 }
 
-void StyleRuleMedia::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_mediaQueries);
-    StyleRuleGroup::traceAfterDispatch(visitor);
-}
-
 StyleRuleSupports::StyleRuleSupports(const String& conditionText, bool conditionIsSupported, Vector<RefPtr<StyleRuleBase> >& adoptRules)
     : StyleRuleGroup(Supports, adoptRules)
     , m_conditionText(conditionText)
@@ -356,10 +274,4 @@
     m_properties = properties;
 }
 
-void StyleRuleFilter::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_properties);
-    StyleRuleBase::traceAfterDispatch(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/StyleRule.h b/sky/engine/core/css/StyleRule.h
index eb992b5..058c334 100644
--- a/sky/engine/core/css/StyleRule.h
+++ b/sky/engine/core/css/StyleRule.h
@@ -72,10 +72,6 @@
     PassRefPtr<CSSRule> createCSSOMWrapper(CSSStyleSheet* parentSheet = 0) const;
     PassRefPtr<CSSRule> createCSSOMWrapper(CSSRule* parentRule) const;
 
-    void trace(Visitor*);
-    void traceAfterDispatch(Visitor*) { };
-    void finalizeGarbageCollectedObject();
-
 protected:
     StyleRuleBase(Type type) : m_type(type) { }
     StyleRuleBase(const StyleRuleBase& o) : m_type(o.m_type) { }
@@ -109,8 +105,6 @@
 
     static unsigned averageSizeInBytes();
 
-    void traceAfterDispatch(Visitor*);
-
 private:
     StyleRule();
     StyleRule(const StyleRule&);
@@ -132,8 +126,6 @@
 
     PassRefPtr<StyleRuleFontFace> copy() const { return adoptRef(new StyleRuleFontFace(*this)); }
 
-    void traceAfterDispatch(Visitor*);
-
 private:
     StyleRuleFontFace();
     StyleRuleFontFace(const StyleRuleFontFace&);
@@ -148,8 +140,6 @@
     void wrapperInsertRule(unsigned, PassRefPtr<StyleRuleBase>);
     void wrapperRemoveRule(unsigned);
 
-    void traceAfterDispatch(Visitor*);
-
 protected:
     StyleRuleGroup(Type, Vector<RefPtr<StyleRuleBase> >& adoptRule);
     StyleRuleGroup(const StyleRuleGroup&);
@@ -169,8 +159,6 @@
 
     PassRefPtr<StyleRuleMedia> copy() const { return adoptRef(new StyleRuleMedia(*this)); }
 
-    void traceAfterDispatch(Visitor*);
-
 private:
     StyleRuleMedia(PassRefPtr<MediaQuerySet>, Vector<RefPtr<StyleRuleBase> >& adoptRules);
     StyleRuleMedia(const StyleRuleMedia&);
@@ -189,8 +177,6 @@
     bool conditionIsSupported() const { return m_conditionIsSupported; }
     PassRefPtr<StyleRuleSupports> copy() const { return adoptRef(new StyleRuleSupports(*this)); }
 
-    void traceAfterDispatch(Visitor* visitor) { StyleRuleGroup::traceAfterDispatch(visitor); }
-
 private:
     StyleRuleSupports(const String& conditionText, bool conditionIsSupported, Vector<RefPtr<StyleRuleBase> >& adoptRules);
     StyleRuleSupports(const StyleRuleSupports&);
@@ -214,8 +200,6 @@
 
     PassRefPtr<StyleRuleFilter> copy() const { return adoptRef(new StyleRuleFilter(*this)); }
 
-    void traceAfterDispatch(Visitor*);
-
 private:
     StyleRuleFilter(const String&);
     StyleRuleFilter(const StyleRuleFilter&);
diff --git a/sky/engine/core/css/StyleSheet.h b/sky/engine/core/css/StyleSheet.h
index 3044abb..0552755 100644
--- a/sky/engine/core/css/StyleSheet.h
+++ b/sky/engine/core/css/StyleSheet.h
@@ -50,8 +50,6 @@
     virtual void clearOwnerNode() = 0;
     virtual KURL baseURL() const = 0;
     virtual bool isCSSStyleSheet() const { return false; }
-
-    virtual void trace(Visitor*) { }
 };
 
 } // namespace blink
diff --git a/sky/engine/core/css/StyleSheetContents.cpp b/sky/engine/core/css/StyleSheetContents.cpp
index 2239120..740fcf1 100644
--- a/sky/engine/core/css/StyleSheetContents.cpp
+++ b/sky/engine/core/css/StyleSheetContents.cpp
@@ -378,14 +378,4 @@
     findFontFaceRulesFromRules(childRules(), fontFaceRules);
 }
 
-void StyleSheetContents::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_childRules);
-    visitor->trace(m_loadingClients);
-    visitor->trace(m_completedClients);
-    visitor->trace(m_ruleSet);
-#endif
-}
-
 }
diff --git a/sky/engine/core/css/StyleSheetContents.h b/sky/engine/core/css/StyleSheetContents.h
index 8e3d5a8..250d56e 100644
--- a/sky/engine/core/css/StyleSheetContents.h
+++ b/sky/engine/core/css/StyleSheetContents.h
@@ -129,8 +129,6 @@
     RuleSet& ensureRuleSet(const MediaQueryEvaluator&, AddRuleFlags);
     void clearRuleSet();
 
-    void trace(Visitor*);
-
 private:
     StyleSheetContents(const String& originalURL, const CSSParserContext&);
     StyleSheetContents(const StyleSheetContents&);
diff --git a/sky/engine/core/css/StyleSheetList.cpp b/sky/engine/core/css/StyleSheetList.cpp
index e48c8f6..e145801 100644
--- a/sky/engine/core/css/StyleSheetList.cpp
+++ b/sky/engine/core/css/StyleSheetList.cpp
@@ -90,9 +90,4 @@
     return item->sheet();
 }
 
-void StyleSheetList::trace(Visitor* visitor)
-{
-    visitor->trace(m_treeScope);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/StyleSheetList.h b/sky/engine/core/css/StyleSheetList.h
index 284793f..a6b5b93 100644
--- a/sky/engine/core/css/StyleSheetList.h
+++ b/sky/engine/core/css/StyleSheetList.h
@@ -53,8 +53,6 @@
 
     CSSStyleSheet* anonymousNamedGetter(const AtomicString&);
 
-    void trace(Visitor*);
-
 private:
     StyleSheetList(TreeScope*);
     const Vector<RefPtr<StyleSheet> >& styleSheets();
diff --git a/sky/engine/core/css/resolver/MatchResult.cpp b/sky/engine/core/css/resolver/MatchResult.cpp
index 6c34ec7..8081563 100644
--- a/sky/engine/core/css/resolver/MatchResult.cpp
+++ b/sky/engine/core/css/resolver/MatchResult.cpp
@@ -42,11 +42,6 @@
 {
 }
 
-void MatchedProperties::trace(Visitor* visitor)
-{
-    visitor->trace(properties);
-}
-
 void MatchResult::addMatchedProperties(const StylePropertySet* properties)
 {
     matchedProperties.grow(matchedProperties.size() + 1);
diff --git a/sky/engine/core/css/resolver/MatchResult.h b/sky/engine/core/css/resolver/MatchResult.h
index 9ebc766..b75f009 100644
--- a/sky/engine/core/css/resolver/MatchResult.h
+++ b/sky/engine/core/css/resolver/MatchResult.h
@@ -55,8 +55,6 @@
     MatchedProperties();
     ~MatchedProperties();
 
-    void trace(Visitor*);
-
     RefPtr<StylePropertySet> properties;
 };
 
diff --git a/sky/engine/core/css/resolver/MatchedPropertiesCache.cpp b/sky/engine/core/css/resolver/MatchedPropertiesCache.cpp
index 146f4eb..6e226ce 100644
--- a/sky/engine/core/css/resolver/MatchedPropertiesCache.cpp
+++ b/sky/engine/core/css/resolver/MatchedPropertiesCache.cpp
@@ -150,8 +150,4 @@
     return true;
 }
 
-void MatchedPropertiesCache::trace(Visitor* visitor)
-{
-}
-
 }
diff --git a/sky/engine/core/css/resolver/MatchedPropertiesCache.h b/sky/engine/core/css/resolver/MatchedPropertiesCache.h
index d591362..4d3f59a 100644
--- a/sky/engine/core/css/resolver/MatchedPropertiesCache.h
+++ b/sky/engine/core/css/resolver/MatchedPropertiesCache.h
@@ -46,7 +46,6 @@
 
     void set(const RenderStyle*, const RenderStyle* parentStyle, const MatchResult&);
     void clear();
-    void trace(Visitor* visitor) { visitor->trace(matchedProperties); }
 };
 
 class MatchedPropertiesCache {
@@ -63,8 +62,6 @@
 
     static bool isCacheable(const Element*, const RenderStyle*, const RenderStyle* parentStyle);
 
-    void trace(Visitor*);
-
 private:
     // Every N additions to the matched declaration cache trigger a sweep where entries holding
     // the last reference to a style declaration are garbage collected.
diff --git a/sky/engine/core/css/resolver/MediaQueryResult.h b/sky/engine/core/css/resolver/MediaQueryResult.h
index a1976b5..e77a03f 100644
--- a/sky/engine/core/css/resolver/MediaQueryResult.h
+++ b/sky/engine/core/css/resolver/MediaQueryResult.h
@@ -38,8 +38,6 @@
     {
     }
 
-    void trace(Visitor* visitor) { visitor->trace(m_expression); }
-
     const MediaQueryExp* expression() const
     {
         return &m_expression;
diff --git a/sky/engine/core/css/resolver/ScopedStyleResolver.cpp b/sky/engine/core/css/resolver/ScopedStyleResolver.cpp
index 915e155..b95dedd 100644
--- a/sky/engine/core/css/resolver/ScopedStyleResolver.cpp
+++ b/sky/engine/core/css/resolver/ScopedStyleResolver.cpp
@@ -132,13 +132,4 @@
     }
 }
 
-void ScopedStyleResolver::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_scope);
-    visitor->trace(m_authorStyleSheets);
-    visitor->trace(m_keyframesRuleMap);
-#endif
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/resolver/ScopedStyleResolver.h b/sky/engine/core/css/resolver/ScopedStyleResolver.h
index 45edbcf..83e9c29 100644
--- a/sky/engine/core/css/resolver/ScopedStyleResolver.h
+++ b/sky/engine/core/css/resolver/ScopedStyleResolver.h
@@ -65,8 +65,6 @@
     void collectFeaturesTo(RuleFeatureSet&, HashSet<const StyleSheetContents*>& visitedSharedStyleSheetContents) const;
     void resetAuthorStyle();
 
-    void trace(Visitor*);
-
 private:
     explicit ScopedStyleResolver(TreeScope& scope)
         : m_scope(scope)
diff --git a/sky/engine/core/css/resolver/StyleResolver.cpp b/sky/engine/core/css/resolver/StyleResolver.cpp
index 50ac219..c4d1e33 100644
--- a/sky/engine/core/css/resolver/StyleResolver.cpp
+++ b/sky/engine/core/css/resolver/StyleResolver.cpp
@@ -1001,18 +1001,4 @@
     return false;
 }
 
-void StyleResolver::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_keyframesRuleMap);
-    visitor->trace(m_matchedPropertiesCache);
-    visitor->trace(m_viewportDependentMediaQueryResults);
-    visitor->trace(m_features);
-    visitor->trace(m_attributeRuleSet);
-    visitor->trace(m_styleSharingLists);
-    visitor->trace(m_pendingStyleSheets);
-    visitor->trace(m_document);
-#endif
-}
-
 } // namespace blink
diff --git a/sky/engine/core/css/resolver/StyleResolver.h b/sky/engine/core/css/resolver/StyleResolver.h
index 4f9052b..0b22ab5 100644
--- a/sky/engine/core/css/resolver/StyleResolver.h
+++ b/sky/engine/core/css/resolver/StyleResolver.h
@@ -190,8 +190,6 @@
     void increaseStyleSharingDepth() { ++m_styleSharingDepth; }
     void decreaseStyleSharingDepth() { --m_styleSharingDepth; }
 
-    void trace(Visitor*);
-
 private:
     // FIXME: This should probably go away, folded into FontBuilder.
     void updateFont(StyleResolverState&);
diff --git a/sky/engine/core/dom/ChildListMutationScope.cpp b/sky/engine/core/dom/ChildListMutationScope.cpp
index 7c61184..f613572 100644
--- a/sky/engine/core/dom/ChildListMutationScope.cpp
+++ b/sky/engine/core/dom/ChildListMutationScope.cpp
@@ -157,15 +157,4 @@
     return result;
 }
 
-void ChildListMutationAccumulator::trace(Visitor* visitor)
-{
-    visitor->trace(m_target);
-    visitor->trace(m_removedNodes);
-    visitor->trace(m_addedNodes);
-    visitor->trace(m_previousSibling);
-    visitor->trace(m_nextSibling);
-    visitor->trace(m_lastAdded);
-    visitor->trace(m_observers);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/ChildListMutationScope.h b/sky/engine/core/dom/ChildListMutationScope.h
index 28f0c8a..2c80873 100644
--- a/sky/engine/core/dom/ChildListMutationScope.h
+++ b/sky/engine/core/dom/ChildListMutationScope.h
@@ -64,8 +64,6 @@
     void enterMutationScope() { m_mutationScopes++; }
     void leaveMutationScope();
 
-    void trace(Visitor*);
-
 private:
     ChildListMutationAccumulator(PassRefPtr<Node>, PassOwnPtr<MutationObserverInterestGroup>);
 
diff --git a/sky/engine/core/dom/ClientRect.h b/sky/engine/core/dom/ClientRect.h
index ef3927a..ba03664 100644
--- a/sky/engine/core/dom/ClientRect.h
+++ b/sky/engine/core/dom/ClientRect.h
@@ -60,8 +60,6 @@
     float width() const { return m_rect.width(); }
     float height() const { return m_rect.height(); }
 
-    void trace(Visitor*) { }
-
 private:
     ClientRect();
     explicit ClientRect(const IntRect&);
diff --git a/sky/engine/core/dom/ClientRectList.cpp b/sky/engine/core/dom/ClientRectList.cpp
index 36f8fa7..e0b8006 100644
--- a/sky/engine/core/dom/ClientRectList.cpp
+++ b/sky/engine/core/dom/ClientRectList.cpp
@@ -60,9 +60,4 @@
     return m_list[index].get();
 }
 
-void ClientRectList::trace(Visitor* visitor)
-{
-    visitor->trace(m_list);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/ClientRectList.h b/sky/engine/core/dom/ClientRectList.h
index b8cdfdc..078275c 100644
--- a/sky/engine/core/dom/ClientRectList.h
+++ b/sky/engine/core/dom/ClientRectList.h
@@ -53,8 +53,6 @@
     unsigned length() const;
     ClientRect* item(unsigned index);
 
-    void trace(Visitor*);
-
 private:
     ClientRectList();
     explicit ClientRectList(const Vector<FloatQuad>&);
diff --git a/sky/engine/core/dom/DOMError.h b/sky/engine/core/dom/DOMError.h
index a9c39ff..373c8c6 100644
--- a/sky/engine/core/dom/DOMError.h
+++ b/sky/engine/core/dom/DOMError.h
@@ -61,8 +61,6 @@
     const String& name() const { return m_name; }
     const String& message() const { return m_message; }
 
-    void trace(Visitor*) { }
-
 protected:
     explicit DOMError(const String& name);
     DOMError(const String& name, const String& message);
diff --git a/sky/engine/core/dom/DOMException.h b/sky/engine/core/dom/DOMException.h
index 9c89493..74deeb8 100644
--- a/sky/engine/core/dom/DOMException.h
+++ b/sky/engine/core/dom/DOMException.h
@@ -58,8 +58,6 @@
     static String getErrorName(ExceptionCode);
     static String getErrorMessage(ExceptionCode);
 
-    void trace(Visitor*) { }
-
 private:
     DOMException(unsigned short m_code, const String& name, const String& sanitizedMessage, const String& unsanitizedMessage);
 
diff --git a/sky/engine/core/dom/DOMStringList.h b/sky/engine/core/dom/DOMStringList.h
index 0e81df0..5bc963a 100644
--- a/sky/engine/core/dom/DOMStringList.h
+++ b/sky/engine/core/dom/DOMStringList.h
@@ -57,8 +57,6 @@
 
     operator const Vector<String>&() const { return m_strings; }
 
-    void trace(Visitor*) { }
-
 private:
     DOMStringList()
     {
diff --git a/sky/engine/core/dom/DOMTokenList.h b/sky/engine/core/dom/DOMTokenList.h
index 04511b9..7de8f09 100644
--- a/sky/engine/core/dom/DOMTokenList.h
+++ b/sky/engine/core/dom/DOMTokenList.h
@@ -65,8 +65,6 @@
 
     virtual Element* element() { return 0; }
 
-    virtual void trace(Visitor*) { }
-
 protected:
     virtual const AtomicString& value() const = 0;
     virtual void setValue(const AtomicString&) = 0;
diff --git a/sky/engine/core/dom/DOMURL.h b/sky/engine/core/dom/DOMURL.h
index 70f8a9e..a5d88bb 100644
--- a/sky/engine/core/dom/DOMURL.h
+++ b/sky/engine/core/dom/DOMURL.h
@@ -63,8 +63,6 @@
     virtual String input() const override { return m_input; }
     virtual void setInput(const String&) override;
 
-    void trace(Visitor*) { }
-
 private:
     DOMURL(const String& url, const KURL& base, ExceptionState&);
 
diff --git a/sky/engine/core/dom/DocumentMarker.cpp b/sky/engine/core/dom/DocumentMarker.cpp
index 2d225bb..badd021 100644
--- a/sky/engine/core/dom/DocumentMarker.cpp
+++ b/sky/engine/core/dom/DocumentMarker.cpp
@@ -183,9 +183,4 @@
     return false;
 }
 
-void DocumentMarker::trace(Visitor* visitor)
-{
-    visitor->trace(m_details);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/DocumentMarker.h b/sky/engine/core/dom/DocumentMarker.h
index c29bc14..f717a4f 100644
--- a/sky/engine/core/dom/DocumentMarker.h
+++ b/sky/engine/core/dom/DocumentMarker.h
@@ -128,8 +128,6 @@
         return !(*this == o);
     }
 
-    void trace(Visitor*);
-
 private:
     MarkerType m_type;
     unsigned m_startOffset;
@@ -152,8 +150,6 @@
     virtual ~DocumentMarkerDetails();
     virtual bool isDescription() const { return false; }
     virtual bool isTextMatch() const { return false; }
-
-    virtual void trace(Visitor*) { }
 };
 
 } // namespace blink
diff --git a/sky/engine/core/dom/DocumentMarkerController.cpp b/sky/engine/core/dom/DocumentMarkerController.cpp
index 9c06043..5e1e03e 100644
--- a/sky/engine/core/dom/DocumentMarkerController.cpp
+++ b/sky/engine/core/dom/DocumentMarkerController.cpp
@@ -491,13 +491,6 @@
     return result;
 }
 
-void DocumentMarkerController::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_markers);
-#endif
-}
-
 void DocumentMarkerController::removeMarkers(Node* node, DocumentMarker::MarkerTypes markerTypes)
 {
     if (!possiblyHasMarkers(markerTypes))
diff --git a/sky/engine/core/dom/DocumentMarkerController.h b/sky/engine/core/dom/DocumentMarkerController.h
index ff1097d..5eeff4c 100644
--- a/sky/engine/core/dom/DocumentMarkerController.h
+++ b/sky/engine/core/dom/DocumentMarkerController.h
@@ -90,8 +90,6 @@
     DocumentMarkerVector markers();
     Vector<IntRect> renderedRectsForMarkers(DocumentMarker::MarkerType);
 
-    void trace(Visitor*);
-
 #ifndef NDEBUG
     void showMarkers() const;
 #endif
diff --git a/sky/engine/core/dom/DocumentOrderedList.cpp b/sky/engine/core/dom/DocumentOrderedList.cpp
index c575b22..fc74c1e 100644
--- a/sky/engine/core/dom/DocumentOrderedList.cpp
+++ b/sky/engine/core/dom/DocumentOrderedList.cpp
@@ -69,12 +69,5 @@
     m_nodes.remove(const_cast<Node*>(node));
 }
 
-void DocumentOrderedList::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_nodes);
-#endif
-}
-
 }
 
diff --git a/sky/engine/core/dom/DocumentOrderedList.h b/sky/engine/core/dom/DocumentOrderedList.h
index ec66567..7e01e73 100644
--- a/sky/engine/core/dom/DocumentOrderedList.h
+++ b/sky/engine/core/dom/DocumentOrderedList.h
@@ -54,8 +54,6 @@
     iterator begin() { return m_nodes.begin(); }
     iterator end() { return m_nodes.end(); }
 
-    void trace(Visitor*);
-
 private:
     ListHashSet<RawPtr<Node>, 32> m_nodes;
 };
diff --git a/sky/engine/core/dom/DocumentStyleSheetCollection.h b/sky/engine/core/dom/DocumentStyleSheetCollection.h
index dc60006..5fe109e 100644
--- a/sky/engine/core/dom/DocumentStyleSheetCollection.h
+++ b/sky/engine/core/dom/DocumentStyleSheetCollection.h
@@ -48,11 +48,6 @@
     void updateActiveStyleSheets(StyleEngine*, StyleResolverUpdateMode);
     void collectStyleSheets(StyleEngine*, DocumentStyleSheetCollector&);
 
-    virtual void trace(Visitor* visitor) override
-    {
-        TreeScopeStyleSheetCollection::trace(visitor);
-    }
-
 private:
     explicit DocumentStyleSheetCollection(TreeScope&);
 
diff --git a/sky/engine/core/dom/ElementData.cpp b/sky/engine/core/dom/ElementData.cpp
index b5821f4..4c9a28e 100644
--- a/sky/engine/core/dom/ElementData.cpp
+++ b/sky/engine/core/dom/ElementData.cpp
@@ -73,15 +73,6 @@
     // NOTE: The inline style is copied by the subclass copy constructor since we don't know what to do with it here.
 }
 
-#if ENABLE(OILPAN)
-void ElementData::finalizeGarbageCollectedObject()
-{
-    if (m_isUnique)
-        toUniqueElementData(this)->~UniqueElementData();
-    else
-        toShareableElementData(this)->~ShareableElementData();
-}
-#else
 void ElementData::destroy()
 {
     if (m_isUnique)
@@ -89,7 +80,6 @@
     else
         delete toShareableElementData(this);
 }
-#endif
 
 PassRefPtr<UniqueElementData> ElementData::makeUniqueCopy() const
 {
@@ -117,19 +107,6 @@
     return true;
 }
 
-void ElementData::trace(Visitor* visitor)
-{
-    if (m_isUnique)
-        toUniqueElementData(this)->traceAfterDispatch(visitor);
-    else
-        toShareableElementData(this)->traceAfterDispatch(visitor);
-}
-
-void ElementData::traceAfterDispatch(Visitor* visitor)
-{
-    visitor->trace(m_inlineStyle);
-}
-
 ShareableElementData::ShareableElementData(const Vector<Attribute>& attributes)
     : ElementData(attributes.size())
 {
@@ -195,9 +172,4 @@
     return adoptRef(new (slot) ShareableElementData(*this));
 }
 
-void UniqueElementData::traceAfterDispatch(Visitor* visitor)
-{
-    ElementData::traceAfterDispatch(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/ElementData.h b/sky/engine/core/dom/ElementData.h
index 1113e06..0e14fcc 100644
--- a/sky/engine/core/dom/ElementData.h
+++ b/sky/engine/core/dom/ElementData.h
@@ -71,9 +71,6 @@
 
     bool isUnique() const { return m_isUnique; }
 
-    void traceAfterDispatch(Visitor*);
-    void trace(Visitor*);
-
 protected:
     ElementData();
     explicit ElementData(unsigned arraySize);
@@ -116,8 +113,6 @@
     explicit ShareableElementData(const UniqueElementData&);
     ~ShareableElementData();
 
-    void traceAfterDispatch(Visitor* visitor) { ElementData::traceAfterDispatch(visitor); }
-
     // Add support for placement new as ShareableElementData is not allocated
     // with a fixed size. Instead the allocated memory size is computed based on
     // the number of attributes. This requires us to use Heap::allocate directly
@@ -153,8 +148,6 @@
     explicit UniqueElementData(const ShareableElementData&);
     explicit UniqueElementData(const UniqueElementData&);
 
-    void traceAfterDispatch(Visitor*);
-
     AttributeVector m_attributeVector;
 };
 
diff --git a/sky/engine/core/dom/ElementDataCache.cpp b/sky/engine/core/dom/ElementDataCache.cpp
index 912f623..1da617d 100644
--- a/sky/engine/core/dom/ElementDataCache.cpp
+++ b/sky/engine/core/dom/ElementDataCache.cpp
@@ -65,11 +65,4 @@
 {
 }
 
-void ElementDataCache::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_shareableElementDataCache);
-#endif
-}
-
 }
diff --git a/sky/engine/core/dom/ElementDataCache.h b/sky/engine/core/dom/ElementDataCache.h
index d94a1f6..fa041ae 100644
--- a/sky/engine/core/dom/ElementDataCache.h
+++ b/sky/engine/core/dom/ElementDataCache.h
@@ -47,8 +47,6 @@
 
     PassRefPtr<ShareableElementData> cachedShareableElementDataWithAttributes(const Vector<Attribute>&);
 
-    void trace(Visitor*);
-
 private:
     ElementDataCache();
 
diff --git a/sky/engine/core/dom/MutationObserver.cpp b/sky/engine/core/dom/MutationObserver.cpp
index 9f146bd..59fa6e3 100644
--- a/sky/engine/core/dom/MutationObserver.cpp
+++ b/sky/engine/core/dom/MutationObserver.cpp
@@ -267,12 +267,4 @@
     }
 }
 
-void MutationObserver::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_records);
-    visitor->trace(m_registrations);
-#endif
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/MutationObserver.h b/sky/engine/core/dom/MutationObserver.h
index b2cad0a..b62c5da 100644
--- a/sky/engine/core/dom/MutationObserver.h
+++ b/sky/engine/core/dom/MutationObserver.h
@@ -96,8 +96,6 @@
 
     HashSet<RawPtr<Node> > getObservedNodes() const;
 
-    void trace(Visitor*);
-
 private:
     struct ObserverLessThan;
 
diff --git a/sky/engine/core/dom/MutationObserverInterestGroup.cpp b/sky/engine/core/dom/MutationObserverInterestGroup.cpp
index f8ba117..93131c8 100644
--- a/sky/engine/core/dom/MutationObserverInterestGroup.cpp
+++ b/sky/engine/core/dom/MutationObserverInterestGroup.cpp
@@ -83,11 +83,4 @@
     }
 }
 
-void MutationObserverInterestGroup::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_observers);
-#endif
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/MutationObserverInterestGroup.h b/sky/engine/core/dom/MutationObserverInterestGroup.h
index 4e9eb61..1e385fd 100644
--- a/sky/engine/core/dom/MutationObserverInterestGroup.h
+++ b/sky/engine/core/dom/MutationObserverInterestGroup.h
@@ -71,8 +71,6 @@
     bool isOldValueRequested();
     void enqueueMutationRecord(PassRefPtr<MutationRecord>);
 
-    void trace(Visitor*);
-
 private:
     static PassOwnPtr<MutationObserverInterestGroup> createIfNeeded(Node& target, MutationObserver::MutationType, MutationRecordDeliveryOptions oldValueFlag, const QualifiedName* attributeName = 0);
     MutationObserverInterestGroup(HashMap<RawPtr<MutationObserver>, MutationRecordDeliveryOptions>& observers, MutationRecordDeliveryOptions oldValueFlag);
diff --git a/sky/engine/core/dom/MutationRecord.cpp b/sky/engine/core/dom/MutationRecord.cpp
index 6115b02..44e5504 100644
--- a/sky/engine/core/dom/MutationRecord.cpp
+++ b/sky/engine/core/dom/MutationRecord.cpp
@@ -53,16 +53,6 @@
     {
     }
 
-    virtual void trace(Visitor* visitor) override
-    {
-        visitor->trace(m_target);
-        visitor->trace(m_addedNodes);
-        visitor->trace(m_removedNodes);
-        visitor->trace(m_previousSibling);
-        visitor->trace(m_nextSibling);
-        MutationRecord::trace(visitor);
-    }
-
 private:
     virtual const AtomicString& type() override;
     virtual Node* target() override { return m_target.get(); }
@@ -86,14 +76,6 @@
     {
     }
 
-    virtual void trace(Visitor* visitor) override
-    {
-        visitor->trace(m_target);
-        visitor->trace(m_addedNodes);
-        visitor->trace(m_removedNodes);
-        MutationRecord::trace(visitor);
-    }
-
 private:
     virtual Node* target() override { return m_target.get(); }
     virtual String oldValue() override { return m_oldValue; }
@@ -146,12 +128,6 @@
     {
     }
 
-    virtual void trace(Visitor* visitor) override
-    {
-        visitor->trace(m_record);
-        MutationRecord::trace(visitor);
-    }
-
 private:
     virtual const AtomicString& type() override { return m_record->type(); }
     virtual Node* target() override { return m_record->target(); }
diff --git a/sky/engine/core/dom/MutationRecord.h b/sky/engine/core/dom/MutationRecord.h
index cc89d46..c6bd983 100644
--- a/sky/engine/core/dom/MutationRecord.h
+++ b/sky/engine/core/dom/MutationRecord.h
@@ -70,8 +70,6 @@
 
     virtual String oldValue() { return String(); }
 
-    virtual void trace(Visitor*) { }
-
 };
 
 } // namespace blink
diff --git a/sky/engine/core/dom/Node.h b/sky/engine/core/dom/Node.h
index a6214d2..01dd2fe 100644
--- a/sky/engine/core/dom/Node.h
+++ b/sky/engine/core/dom/Node.h
@@ -98,10 +98,7 @@
         : m_renderer(renderer)
     { }
 
-protected:
-    // Oilpan: This member is traced in NodeRareData.
-    // FIXME: Can we add traceAfterDispatch and finalizeGarbageCollectedObject
-    // to NodeRareDataBase, and make m_renderer Member<>?
+private:
     RenderObject* m_renderer;
 };
 
diff --git a/sky/engine/core/dom/NodeList.h b/sky/engine/core/dom/NodeList.h
index a609985..03781d7 100644
--- a/sky/engine/core/dom/NodeList.h
+++ b/sky/engine/core/dom/NodeList.h
@@ -46,8 +46,6 @@
 
     virtual Node* virtualOwnerNode() const { return 0; }
 
-    virtual void trace(Visitor*) { }
-
 protected:
     NodeList()
     {
diff --git a/sky/engine/core/dom/NodeRareData.cpp b/sky/engine/core/dom/NodeRareData.cpp
index 66c62a7..dfaf796 100644
--- a/sky/engine/core/dom/NodeRareData.cpp
+++ b/sky/engine/core/dom/NodeRareData.cpp
@@ -46,29 +46,4 @@
 
 COMPILE_ASSERT(sizeof(NodeRareData) == sizeof(SameSizeAsNodeRareData), NodeRareDataShouldStaySmall);
 
-void NodeRareData::traceAfterDispatch(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_renderer);
-#endif
-    visitor->trace(m_mutationObserverData);
-}
-
-void NodeRareData::trace(Visitor* visitor)
-{
-    if (m_isElementRareData)
-        static_cast<ElementRareData*>(this)->traceAfterDispatch(visitor);
-    else
-        traceAfterDispatch(visitor);
-}
-
-void NodeRareData::finalizeGarbageCollectedObject()
-{
-    RELEASE_ASSERT(!renderer());
-    if (m_isElementRareData)
-        static_cast<ElementRareData*>(this)->~ElementRareData();
-    else
-        this->~NodeRareData();
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/NodeRareData.h b/sky/engine/core/dom/NodeRareData.h
index 3f34fc2..725261c 100644
--- a/sky/engine/core/dom/NodeRareData.h
+++ b/sky/engine/core/dom/NodeRareData.h
@@ -43,14 +43,6 @@
         return adoptPtr(new NodeMutationObserverData);
     }
 
-    void trace(Visitor* visitor)
-    {
-#if ENABLE(OILPAN)
-        visitor->trace(registry);
-        visitor->trace(transientRegistry);
-#endif
-    }
-
 private:
     NodeMutationObserverData() { }
 };
@@ -76,11 +68,6 @@
     void setElementFlag(ElementFlags mask, bool value) { m_elementFlags = (m_elementFlags & ~mask) | (-(int32_t)value & mask); }
     void clearElementFlag(ElementFlags mask) { m_elementFlags &= ~mask; }
 
-    void trace(Visitor*);
-
-    void traceAfterDispatch(Visitor*);
-    void finalizeGarbageCollectedObject();
-
 protected:
     explicit NodeRareData(RenderObject* renderer)
         : NodeRareDataBase(renderer)
diff --git a/sky/engine/core/dom/Position.cpp b/sky/engine/core/dom/Position.cpp
index 1567b40..e4fc0b8 100644
--- a/sky/engine/core/dom/Position.cpp
+++ b/sky/engine/core/dom/Position.cpp
@@ -1162,11 +1162,6 @@
     return primaryDirection;
 }
 
-void Position::trace(Visitor* visitor)
-{
-    visitor->trace(m_anchorNode);
-}
-
 void Position::debugPosition(const char* msg) const
 {
     if (isNull())
diff --git a/sky/engine/core/dom/Position.h b/sky/engine/core/dom/Position.h
index d4ac550..d84eb85 100644
--- a/sky/engine/core/dom/Position.h
+++ b/sky/engine/core/dom/Position.h
@@ -198,8 +198,6 @@
     void showTreeForThis() const;
 #endif
 
-    void trace(Visitor*);
-
 private:
     int offsetForPositionAfterAnchor() const;
 
diff --git a/sky/engine/core/dom/Range.cpp b/sky/engine/core/dom/Range.cpp
index 907c4ed..a246715 100644
--- a/sky/engine/core/dom/Range.cpp
+++ b/sky/engine/core/dom/Range.cpp
@@ -1527,13 +1527,6 @@
     return result;
 }
 
-void Range::trace(Visitor* visitor)
-{
-    visitor->trace(m_ownerDocument);
-    visitor->trace(m_start);
-    visitor->trace(m_end);
-}
-
 } // namespace blink
 
 #ifndef NDEBUG
diff --git a/sky/engine/core/dom/Range.h b/sky/engine/core/dom/Range.h
index 011b1f8..530cb0c 100644
--- a/sky/engine/core/dom/Range.h
+++ b/sky/engine/core/dom/Range.h
@@ -139,8 +139,6 @@
     void formatForDebugger(char* buffer, unsigned length) const;
 #endif
 
-    void trace(Visitor*);
-
 private:
     explicit Range(Document&);
     Range(Document&, Node* startContainer, int startOffset, Node* endContainer, int endOffset);
diff --git a/sky/engine/core/dom/RangeBoundaryPoint.h b/sky/engine/core/dom/RangeBoundaryPoint.h
index b09c760..8612a6c 100644
--- a/sky/engine/core/dom/RangeBoundaryPoint.h
+++ b/sky/engine/core/dom/RangeBoundaryPoint.h
@@ -58,8 +58,6 @@
     void invalidateOffset() const;
     void ensureOffsetIsValid() const;
 
-    void trace(Visitor*);
-
 private:
     static const int invalidOffset = -1;
 
@@ -182,12 +180,6 @@
     m_offsetInContainer = invalidOffset;
 }
 
-inline void RangeBoundaryPoint::trace(Visitor* visitor)
-{
-    visitor->trace(m_containerNode);
-    visitor->trace(m_childBeforeBoundary);
-}
-
 inline bool operator==(const RangeBoundaryPoint& a, const RangeBoundaryPoint& b)
 {
     if (a.container() != b.container())
diff --git a/sky/engine/core/dom/RequestAnimationFrameCallback.h b/sky/engine/core/dom/RequestAnimationFrameCallback.h
index f5bb51a..6e813c0 100644
--- a/sky/engine/core/dom/RequestAnimationFrameCallback.h
+++ b/sky/engine/core/dom/RequestAnimationFrameCallback.h
@@ -38,7 +38,6 @@
 class RequestAnimationFrameCallback {
 public:
     virtual ~RequestAnimationFrameCallback() { }
-    virtual void trace(Visitor*) { }
     virtual void handleEvent(double highResTimeMs) = 0;
 
     int m_id;
diff --git a/sky/engine/core/dom/ScriptedAnimationController.cpp b/sky/engine/core/dom/ScriptedAnimationController.cpp
index b1cc13e..9a6e3ba 100644
--- a/sky/engine/core/dom/ScriptedAnimationController.cpp
+++ b/sky/engine/core/dom/ScriptedAnimationController.cpp
@@ -53,18 +53,6 @@
 {
 }
 
-void ScriptedAnimationController::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_callbacks);
-    visitor->trace(m_callbacksToInvoke);
-    visitor->trace(m_document);
-    visitor->trace(m_eventQueue);
-    visitor->trace(m_mediaQueryListListeners);
-    visitor->trace(m_perFrameEvents);
-#endif
-}
-
 void ScriptedAnimationController::suspend()
 {
     ++m_suspendCount;
diff --git a/sky/engine/core/dom/ScriptedAnimationController.h b/sky/engine/core/dom/ScriptedAnimationController.h
index f78fd5f..079f42e 100644
--- a/sky/engine/core/dom/ScriptedAnimationController.h
+++ b/sky/engine/core/dom/ScriptedAnimationController.h
@@ -48,7 +48,6 @@
         return adoptRef(new ScriptedAnimationController(document));
     }
     ~ScriptedAnimationController();
-    void trace(Visitor*);
     void clearDocumentPointer() { m_document = nullptr; }
 
     typedef int CallbackId;
diff --git a/sky/engine/core/dom/ShadowTreeStyleSheetCollection.h b/sky/engine/core/dom/ShadowTreeStyleSheetCollection.h
index e10b67d..0797f93 100644
--- a/sky/engine/core/dom/ShadowTreeStyleSheetCollection.h
+++ b/sky/engine/core/dom/ShadowTreeStyleSheetCollection.h
@@ -44,11 +44,6 @@
 
     void updateActiveStyleSheets(StyleEngine*, StyleResolverUpdateMode);
 
-    virtual void trace(Visitor* visitor) override
-    {
-        TreeScopeStyleSheetCollection::trace(visitor);
-    }
-
 private:
     void collectStyleSheets(StyleEngine*, StyleSheetCollection&);
 };
diff --git a/sky/engine/core/dom/StaticNodeList.h b/sky/engine/core/dom/StaticNodeList.h
index 66fdaa4..ba72f21 100644
--- a/sky/engine/core/dom/StaticNodeList.h
+++ b/sky/engine/core/dom/StaticNodeList.h
@@ -55,8 +55,6 @@
     virtual unsigned length() const override;
     virtual NodeType* item(unsigned index) const override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     ptrdiff_t AllocationSize()
     {
@@ -98,13 +96,6 @@
     return 0;
 }
 
-template <typename NodeType>
-void StaticNodeTypeList<NodeType>::trace(Visitor* visitor)
-{
-    visitor->trace(m_nodes);
-    NodeList::trace(visitor);
-}
-
 } // namespace blink
 
 #endif // StaticNodeList_h
diff --git a/sky/engine/core/dom/StyleElement.cpp b/sky/engine/core/dom/StyleElement.cpp
index 1a114b6..985b0ab 100644
--- a/sky/engine/core/dom/StyleElement.cpp
+++ b/sky/engine/core/dom/StyleElement.cpp
@@ -164,9 +164,4 @@
     document.styleResolverMayHaveChanged();
 }
 
-void StyleElement::trace(Visitor* visitor)
-{
-    visitor->trace(m_sheet);
-}
-
 }
diff --git a/sky/engine/core/dom/StyleElement.h b/sky/engine/core/dom/StyleElement.h
index d200861..4bfca16 100644
--- a/sky/engine/core/dom/StyleElement.h
+++ b/sky/engine/core/dom/StyleElement.h
@@ -35,7 +35,6 @@
 public:
     StyleElement(Document*, bool createdByParser);
     virtual ~StyleElement();
-    virtual void trace(Visitor*);
 
 protected:
     virtual const AtomicString& type() const = 0;
diff --git a/sky/engine/core/dom/StyleEngine.cpp b/sky/engine/core/dom/StyleEngine.cpp
index 659d823..ca4629e 100644
--- a/sky/engine/core/dom/StyleEngine.cpp
+++ b/sky/engine/core/dom/StyleEngine.cpp
@@ -512,20 +512,4 @@
     document().setNeedsStyleRecalc(SubtreeStyleChange);
 }
 
-void StyleEngine::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_document);
-    visitor->trace(m_authorStyleSheets);
-    visitor->trace(m_documentStyleSheetCollection);
-    visitor->trace(m_styleSheetCollectionMap);
-    visitor->trace(m_scopedStyleResolvers);
-    visitor->trace(m_resolver);
-    visitor->trace(m_fontSelector);
-    visitor->trace(m_textToSheetCache);
-    visitor->trace(m_sheetToTextCache);
-#endif
-    CSSFontSelectorClient::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/dom/StyleEngine.h b/sky/engine/core/dom/StyleEngine.h
index 591ffca..aca8a6e 100644
--- a/sky/engine/core/dom/StyleEngine.h
+++ b/sky/engine/core/dom/StyleEngine.h
@@ -141,8 +141,6 @@
     bool hasOnlyScopedResolverForDocument() const { return m_scopedStyleResolvers.size() == 1; }
     void collectScopedStyleFeaturesTo(RuleFeatureSet&) const;
 
-    virtual void trace(Visitor*) override;
-
 private:
     // CSSFontSelectorClient implementation.
     virtual void fontsNeedUpdate(CSSFontSelector*) override;
diff --git a/sky/engine/core/dom/StyleSheetCollection.cpp b/sky/engine/core/dom/StyleSheetCollection.cpp
index 3393653..a95ef1a 100644
--- a/sky/engine/core/dom/StyleSheetCollection.cpp
+++ b/sky/engine/core/dom/StyleSheetCollection.cpp
@@ -67,10 +67,4 @@
     m_styleSheetsForStyleSheetList.append(sheet);
 }
 
-void StyleSheetCollection::trace(Visitor* visitor)
-{
-    visitor->trace(m_activeAuthorStyleSheets);
-    visitor->trace(m_styleSheetsForStyleSheetList);
-}
-
 }
diff --git a/sky/engine/core/dom/StyleSheetCollection.h b/sky/engine/core/dom/StyleSheetCollection.h
index 6f26cc3..18263df 100644
--- a/sky/engine/core/dom/StyleSheetCollection.h
+++ b/sky/engine/core/dom/StyleSheetCollection.h
@@ -59,8 +59,6 @@
     void appendActiveStyleSheet(CSSStyleSheet*);
     void appendSheetForList(StyleSheet*);
 
-    virtual void trace(Visitor*);
-
 protected:
     Vector<RefPtr<StyleSheet> > m_styleSheetsForStyleSheetList;
     Vector<RefPtr<CSSStyleSheet> > m_activeAuthorStyleSheets;
diff --git a/sky/engine/core/dom/TemplateContentDocumentFragment.h b/sky/engine/core/dom/TemplateContentDocumentFragment.h
index 07d637f..7cbecae 100644
--- a/sky/engine/core/dom/TemplateContentDocumentFragment.h
+++ b/sky/engine/core/dom/TemplateContentDocumentFragment.h
@@ -43,12 +43,6 @@
     void clearHost() { m_host = nullptr; }
 #endif
 
-    virtual void trace(Visitor* visitor) override
-    {
-        visitor->trace(m_host);
-        DocumentFragment::trace(visitor);
-    }
-
 private:
     TemplateContentDocumentFragment(Document& document, Element* host)
         : DocumentFragment(&document, CreateDocumentFragment)
diff --git a/sky/engine/core/dom/Touch.cpp b/sky/engine/core/dom/Touch.cpp
index 2afc40d..95937e9 100644
--- a/sky/engine/core/dom/Touch.cpp
+++ b/sky/engine/core/dom/Touch.cpp
@@ -64,9 +64,4 @@
     return adoptRef(new Touch(eventTarget, m_identifier, m_clientPos, m_screenPos, m_pagePos, m_radius, m_rotationAngle, m_force, m_absoluteLocation));
 }
 
-void Touch::trace(Visitor* visitor)
-{
-    visitor->trace(m_target);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/Touch.h b/sky/engine/core/dom/Touch.h
index 91ad6da..e0e66a3 100644
--- a/sky/engine/core/dom/Touch.h
+++ b/sky/engine/core/dom/Touch.h
@@ -70,8 +70,6 @@
     const FloatPoint& screenLocation() const { return m_screenPos; }
     PassRefPtr<Touch> cloneWithNewTarget(EventTarget*) const;
 
-    void trace(Visitor*);
-
 private:
     Touch(LocalFrame* frame, EventTarget* target, unsigned identifier,
         const FloatPoint& screenPos, const FloatPoint& pagePos,
diff --git a/sky/engine/core/dom/TouchList.cpp b/sky/engine/core/dom/TouchList.cpp
index effe69a..08b9664 100644
--- a/sky/engine/core/dom/TouchList.cpp
+++ b/sky/engine/core/dom/TouchList.cpp
@@ -41,9 +41,4 @@
     return const_cast<TouchList*>(this)->item(index);
 }
 
-void TouchList::trace(Visitor* visitor)
-{
-    visitor->trace(m_values);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/TouchList.h b/sky/engine/core/dom/TouchList.h
index 5489d86..816ca7a 100644
--- a/sky/engine/core/dom/TouchList.h
+++ b/sky/engine/core/dom/TouchList.h
@@ -54,8 +54,6 @@
 
     void append(const PassRefPtr<Touch> touch) { m_values.append(touch); }
 
-    void trace(Visitor*);
-
 private:
     TouchList()
     {
diff --git a/sky/engine/core/dom/TreeScope.cpp b/sky/engine/core/dom/TreeScope.cpp
index c34be15..de3f429 100644
--- a/sky/engine/core/dom/TreeScope.cpp
+++ b/sky/engine/core/dom/TreeScope.cpp
@@ -433,16 +433,4 @@
     }
 }
 
-void TreeScope::trace(Visitor* visitor)
-{
-    visitor->trace(m_rootNode);
-    visitor->trace(m_document);
-    visitor->trace(m_parentTreeScope);
-    visitor->trace(m_selection);
-    visitor->trace(m_elementsById);
-    visitor->trace(m_imageMapsByName);
-    visitor->trace(m_labelsByForAttribute);
-    visitor->trace(m_scopedStyleResolver);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/TreeScope.h b/sky/engine/core/dom/TreeScope.h
index fdf303f..90a3537 100644
--- a/sky/engine/core/dom/TreeScope.h
+++ b/sky/engine/core/dom/TreeScope.h
@@ -113,8 +113,6 @@
 
     Element* getElementByAccessKey(const String& key) const;
 
-    virtual void trace(Visitor*);
-
     ScopedStyleResolver* scopedStyleResolver() const { return m_scopedStyleResolver.get(); }
     ScopedStyleResolver& ensureScopedStyleResolver();
     void clearScopedStyleResolver();
diff --git a/sky/engine/core/dom/TreeScopeStyleSheetCollection.cpp b/sky/engine/core/dom/TreeScopeStyleSheetCollection.cpp
index 492d30c..9ebc45a 100644
--- a/sky/engine/core/dom/TreeScopeStyleSheetCollection.cpp
+++ b/sky/engine/core/dom/TreeScopeStyleSheetCollection.cpp
@@ -169,11 +169,4 @@
     m_usesRemUnits = styleSheetsUseRemUnits(m_activeAuthorStyleSheets);
 }
 
-void TreeScopeStyleSheetCollection::trace(Visitor* visitor)
-{
-    visitor->trace(m_treeScope);
-    visitor->trace(m_styleSheetCandidateNodes);
-    StyleSheetCollection::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/dom/TreeScopeStyleSheetCollection.h b/sky/engine/core/dom/TreeScopeStyleSheetCollection.h
index 90e8d3a..db06ff3 100644
--- a/sky/engine/core/dom/TreeScopeStyleSheetCollection.h
+++ b/sky/engine/core/dom/TreeScopeStyleSheetCollection.h
@@ -58,8 +58,6 @@
 
     void clearMediaQueryRuleSetStyleSheets();
 
-    virtual void trace(Visitor*) override;
-
 protected:
     explicit TreeScopeStyleSheetCollection(TreeScope&);
 
diff --git a/sky/engine/core/dom/UserActionElementSet.cpp b/sky/engine/core/dom/UserActionElementSet.cpp
index 6f6e581..eac4bf0 100644
--- a/sky/engine/core/dom/UserActionElementSet.cpp
+++ b/sky/engine/core/dom/UserActionElementSet.cpp
@@ -118,11 +118,4 @@
     m_elements.add(element, flags);
 }
 
-void UserActionElementSet::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_elements);
-#endif
-}
-
 }
diff --git a/sky/engine/core/dom/UserActionElementSet.h b/sky/engine/core/dom/UserActionElementSet.h
index 3169b52..da48b95 100644
--- a/sky/engine/core/dom/UserActionElementSet.h
+++ b/sky/engine/core/dom/UserActionElementSet.h
@@ -58,8 +58,6 @@
     void documentDidRemoveLastRef();
 #endif
 
-    void trace(Visitor*);
-
 private:
     enum ElementFlags {
         IsActiveFlag      = 1 ,
diff --git a/sky/engine/core/dom/custom/CustomElementCallbackQueue.cpp b/sky/engine/core/dom/custom/CustomElementCallbackQueue.cpp
index 8ce8a80..f0700f4 100644
--- a/sky/engine/core/dom/custom/CustomElementCallbackQueue.cpp
+++ b/sky/engine/core/dom/custom/CustomElementCallbackQueue.cpp
@@ -72,9 +72,4 @@
     return didWork;
 }
 
-void CustomElementCallbackQueue::trace(Visitor* visitor)
-{
-    visitor->trace(m_element);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/custom/CustomElementCallbackQueue.h b/sky/engine/core/dom/custom/CustomElementCallbackQueue.h
index bbed841..ad0f77e 100644
--- a/sky/engine/core/dom/custom/CustomElementCallbackQueue.h
+++ b/sky/engine/core/dom/custom/CustomElementCallbackQueue.h
@@ -65,8 +65,6 @@
     void append(PassOwnPtr<CustomElementProcessingStep> invocation) { m_queue.append(invocation); }
     bool inCreatedCallback() const { return m_inCreatedCallback; }
 
-    void trace(Visitor*);
-
 private:
     explicit CustomElementCallbackQueue(PassRefPtr<Element>);
 
diff --git a/sky/engine/core/dom/custom/CustomElementMicrotaskDispatcher.cpp b/sky/engine/core/dom/custom/CustomElementMicrotaskDispatcher.cpp
index d7c5fa6..e1019c7 100644
--- a/sky/engine/core/dom/custom/CustomElementMicrotaskDispatcher.cpp
+++ b/sky/engine/core/dom/custom/CustomElementMicrotaskDispatcher.cpp
@@ -83,11 +83,4 @@
     m_phase = Quiescent;
 }
 
-void CustomElementMicrotaskDispatcher::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_elements);
-#endif
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/custom/CustomElementMicrotaskDispatcher.h b/sky/engine/core/dom/custom/CustomElementMicrotaskDispatcher.h
index 23473a3..cde46ca 100644
--- a/sky/engine/core/dom/custom/CustomElementMicrotaskDispatcher.h
+++ b/sky/engine/core/dom/custom/CustomElementMicrotaskDispatcher.h
@@ -28,8 +28,6 @@
 
     bool elementQueueIsEmpty() { return m_elements.isEmpty(); }
 
-    void trace(Visitor*);
-
 private:
     CustomElementMicrotaskDispatcher();
 
diff --git a/sky/engine/core/dom/custom/CustomElementMicrotaskImportStep.cpp b/sky/engine/core/dom/custom/CustomElementMicrotaskImportStep.cpp
index 7634b0c..18ef654 100644
--- a/sky/engine/core/dom/custom/CustomElementMicrotaskImportStep.cpp
+++ b/sky/engine/core/dom/custom/CustomElementMicrotaskImportStep.cpp
@@ -87,11 +87,4 @@
     return FinishedProcessing;
 }
 
-void CustomElementMicrotaskImportStep::trace(Visitor* visitor)
-{
-    visitor->trace(m_import);
-    visitor->trace(m_queue);
-    CustomElementMicrotaskStep::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/custom/CustomElementMicrotaskImportStep.h b/sky/engine/core/dom/custom/CustomElementMicrotaskImportStep.h
index 27b2bdc..f8f5dac 100644
--- a/sky/engine/core/dom/custom/CustomElementMicrotaskImportStep.h
+++ b/sky/engine/core/dom/custom/CustomElementMicrotaskImportStep.h
@@ -63,8 +63,6 @@
     WeakPtr<CustomElementMicrotaskImportStep> weakPtr() { return m_weakFactory.createWeakPtr(); }
 #endif
 
-    virtual void trace(Visitor*) override;
-
 private:
     explicit CustomElementMicrotaskImportStep(HTMLImportChild*);
 
diff --git a/sky/engine/core/dom/custom/CustomElementMicrotaskQueueBase.cpp b/sky/engine/core/dom/custom/CustomElementMicrotaskQueueBase.cpp
index 3bcbfa9..74cd36c 100644
--- a/sky/engine/core/dom/custom/CustomElementMicrotaskQueueBase.cpp
+++ b/sky/engine/core/dom/custom/CustomElementMicrotaskQueueBase.cpp
@@ -17,9 +17,4 @@
     m_inDispatch = false;
 }
 
-void CustomElementMicrotaskQueueBase::trace(Visitor* visitor)
-{
-    visitor->trace(m_queue);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/custom/CustomElementMicrotaskQueueBase.h b/sky/engine/core/dom/custom/CustomElementMicrotaskQueueBase.h
index 07ee67b..54e2253 100644
--- a/sky/engine/core/dom/custom/CustomElementMicrotaskQueueBase.h
+++ b/sky/engine/core/dom/custom/CustomElementMicrotaskQueueBase.h
@@ -24,8 +24,6 @@
     bool isEmpty() const { return m_queue.isEmpty(); }
     void dispatch();
 
-    void trace(Visitor*);
-
 protected:
     CustomElementMicrotaskQueueBase() : m_inDispatch(false) { }
     virtual void doDispatch() = 0;
diff --git a/sky/engine/core/dom/custom/CustomElementMicrotaskResolutionStep.cpp b/sky/engine/core/dom/custom/CustomElementMicrotaskResolutionStep.cpp
index 3e5c6a1..94221d3 100644
--- a/sky/engine/core/dom/custom/CustomElementMicrotaskResolutionStep.cpp
+++ b/sky/engine/core/dom/custom/CustomElementMicrotaskResolutionStep.cpp
@@ -58,11 +58,4 @@
     return CustomElementMicrotaskStep::FinishedProcessing;
 }
 
-void CustomElementMicrotaskResolutionStep::trace(Visitor* visitor)
-{
-    visitor->trace(m_context);
-    visitor->trace(m_element);
-    CustomElementMicrotaskStep::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/custom/CustomElementMicrotaskResolutionStep.h b/sky/engine/core/dom/custom/CustomElementMicrotaskResolutionStep.h
index 452d695..607e149 100644
--- a/sky/engine/core/dom/custom/CustomElementMicrotaskResolutionStep.h
+++ b/sky/engine/core/dom/custom/CustomElementMicrotaskResolutionStep.h
@@ -50,8 +50,6 @@
 
     virtual ~CustomElementMicrotaskResolutionStep();
 
-    virtual void trace(Visitor*) override;
-
 private:
     CustomElementMicrotaskResolutionStep(PassRefPtr<CustomElementRegistrationContext>, PassRefPtr<Element>, const CustomElementDescriptor&);
 
diff --git a/sky/engine/core/dom/custom/CustomElementMicrotaskStep.h b/sky/engine/core/dom/custom/CustomElementMicrotaskStep.h
index 50ae45d..6871c8f 100644
--- a/sky/engine/core/dom/custom/CustomElementMicrotaskStep.h
+++ b/sky/engine/core/dom/custom/CustomElementMicrotaskStep.h
@@ -48,8 +48,6 @@
     };
 
     virtual Result process() = 0;
-
-    virtual void trace(Visitor*) { }
 };
 
 }
diff --git a/sky/engine/core/dom/custom/CustomElementObserver.h b/sky/engine/core/dom/custom/CustomElementObserver.h
index 2f88bd6..cf0350e 100644
--- a/sky/engine/core/dom/custom/CustomElementObserver.h
+++ b/sky/engine/core/dom/custom/CustomElementObserver.h
@@ -47,8 +47,6 @@
     static void notifyElementDidFinishParsingChildren(Element*);
     static void notifyElementWasDestroyed(Element*);
 
-    virtual void trace(Visitor*) { }
-
 protected:
     CustomElementObserver() { }
 
diff --git a/sky/engine/core/dom/custom/CustomElementRegistrationContext.cpp b/sky/engine/core/dom/custom/CustomElementRegistrationContext.cpp
index 4963a73..8b38625 100644
--- a/sky/engine/core/dom/custom/CustomElementRegistrationContext.cpp
+++ b/sky/engine/core/dom/custom/CustomElementRegistrationContext.cpp
@@ -144,9 +144,4 @@
     context->didGiveTypeExtension(element, type);
 }
 
-void CustomElementRegistrationContext::trace(Visitor* visitor)
-{
-    visitor->trace(m_candidates);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/custom/CustomElementRegistrationContext.h b/sky/engine/core/dom/custom/CustomElementRegistrationContext.h
index b25936f..28ac838 100644
--- a/sky/engine/core/dom/custom/CustomElementRegistrationContext.h
+++ b/sky/engine/core/dom/custom/CustomElementRegistrationContext.h
@@ -66,8 +66,6 @@
 
     void resolve(Element*, const CustomElementDescriptor&);
 
-    void trace(Visitor*);
-
 protected:
     CustomElementRegistrationContext();
 
diff --git a/sky/engine/core/dom/custom/CustomElementScheduler.cpp b/sky/engine/core/dom/custom/CustomElementScheduler.cpp
index 091272c..2efc11b 100644
--- a/sky/engine/core/dom/custom/CustomElementScheduler.cpp
+++ b/sky/engine/core/dom/custom/CustomElementScheduler.cpp
@@ -156,11 +156,4 @@
     return callbackQueue;
 }
 
-void CustomElementScheduler::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_elementCallbackQueueMap);
-#endif
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/custom/CustomElementScheduler.h b/sky/engine/core/dom/custom/CustomElementScheduler.h
index 2d4479c..1ae8629 100644
--- a/sky/engine/core/dom/custom/CustomElementScheduler.h
+++ b/sky/engine/core/dom/custom/CustomElementScheduler.h
@@ -62,8 +62,6 @@
     static void microtaskDispatcherDidFinish();
     static void callbackDispatcherDidFinish();
 
-    void trace(Visitor*);
-
 private:
     CustomElementScheduler() { }
 
diff --git a/sky/engine/core/dom/custom/CustomElementUpgradeCandidateMap.cpp b/sky/engine/core/dom/custom/CustomElementUpgradeCandidateMap.cpp
index 046409e..4c385bb 100644
--- a/sky/engine/core/dom/custom/CustomElementUpgradeCandidateMap.cpp
+++ b/sky/engine/core/dom/custom/CustomElementUpgradeCandidateMap.cpp
@@ -110,13 +110,4 @@
     return candidates.release();
 }
 
-void CustomElementUpgradeCandidateMap::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_upgradeCandidates);
-    visitor->trace(m_unresolvedDefinitions);
-#endif
-    CustomElementObserver::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/dom/custom/CustomElementUpgradeCandidateMap.h b/sky/engine/core/dom/custom/CustomElementUpgradeCandidateMap.h
index fdebebc..2ecfb26 100644
--- a/sky/engine/core/dom/custom/CustomElementUpgradeCandidateMap.h
+++ b/sky/engine/core/dom/custom/CustomElementUpgradeCandidateMap.h
@@ -55,8 +55,6 @@
     void add(const CustomElementDescriptor&, Element*);
     PassOwnPtr<ElementSet> takeUpgradeCandidatesFor(const CustomElementDescriptor&);
 
-    virtual void trace(Visitor*) override;
-
 private:
     CustomElementUpgradeCandidateMap() { }
 
diff --git a/sky/engine/core/dom/shadow/ContentDistribution.cpp b/sky/engine/core/dom/shadow/ContentDistribution.cpp
index 78a4f5c..0b23a21 100644
--- a/sky/engine/core/dom/shadow/ContentDistribution.cpp
+++ b/sky/engine/core/dom/shadow/ContentDistribution.cpp
@@ -71,12 +71,4 @@
     return at(index - 1).get();
 }
 
-void ContentDistribution::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_nodes);
-    visitor->trace(m_indices);
-#endif
-}
-
 } // namespace blink
diff --git a/sky/engine/core/dom/shadow/ContentDistribution.h b/sky/engine/core/dom/shadow/ContentDistribution.h
index 52294e1..5532561 100644
--- a/sky/engine/core/dom/shadow/ContentDistribution.h
+++ b/sky/engine/core/dom/shadow/ContentDistribution.h
@@ -62,8 +62,6 @@
 
     const Vector<RefPtr<Node> >& nodes() const { return m_nodes; }
 
-    void trace(Visitor*);
-
 private:
     Vector<RefPtr<Node> > m_nodes;
     HashMap<RawPtr<const Node>, size_t> m_indices;
diff --git a/sky/engine/core/dom/shadow/ElementShadow.cpp b/sky/engine/core/dom/shadow/ElementShadow.cpp
index 459dab7..28ceafc 100644
--- a/sky/engine/core/dom/shadow/ElementShadow.cpp
+++ b/sky/engine/core/dom/shadow/ElementShadow.cpp
@@ -315,16 +315,4 @@
     m_nodeToInsertionPoints.clear();
 }
 
-void ElementShadow::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_nodeToInsertionPoints);
-    visitor->trace(m_selectFeatures);
-    // Shadow roots are linked with previous and next pointers which are traced.
-    // It is therefore enough to trace one of the shadow roots here and the
-    // rest will be traced from there.
-    visitor->trace(m_shadowRoots.head());
-#endif
-}
-
 } // namespace
diff --git a/sky/engine/core/dom/shadow/ElementShadow.h b/sky/engine/core/dom/shadow/ElementShadow.h
index 7aa3ded..46d4895 100644
--- a/sky/engine/core/dom/shadow/ElementShadow.h
+++ b/sky/engine/core/dom/shadow/ElementShadow.h
@@ -68,8 +68,6 @@
 
     void didDistributeNode(const Node*, InsertionPoint*);
 
-    void trace(Visitor*);
-
 private:
     ElementShadow();
 
diff --git a/sky/engine/core/dom/shadow/SelectRuleFeatureSet.h b/sky/engine/core/dom/shadow/SelectRuleFeatureSet.h
index d1d80f4..8e9cfaf 100644
--- a/sky/engine/core/dom/shadow/SelectRuleFeatureSet.h
+++ b/sky/engine/core/dom/shadow/SelectRuleFeatureSet.h
@@ -54,8 +54,6 @@
     bool checkSelectorsForClassChange(const SpaceSplitString& changedClasses) const;
     bool checkSelectorsForClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses) const;
 
-    void trace(Visitor* visitor) { visitor->trace(m_cssRuleFeatureSet); }
-
 private:
     RuleFeatureSet m_cssRuleFeatureSet;
 };
diff --git a/sky/engine/core/dom/shadow/ShadowRoot.cpp b/sky/engine/core/dom/shadow/ShadowRoot.cpp
index ad544f5..3941a1f 100644
--- a/sky/engine/core/dom/shadow/ShadowRoot.cpp
+++ b/sky/engine/core/dom/shadow/ShadowRoot.cpp
@@ -255,13 +255,4 @@
     return m_shadowRootRareData->styleSheets();
 }
 
-void ShadowRoot::trace(Visitor* visitor)
-{
-    visitor->trace(m_prev);
-    visitor->trace(m_next);
-    visitor->trace(m_shadowRootRareData);
-    TreeScope::trace(visitor);
-    DocumentFragment::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/dom/shadow/ShadowRoot.h b/sky/engine/core/dom/shadow/ShadowRoot.h
index 1626034..b98a5a1 100644
--- a/sky/engine/core/dom/shadow/ShadowRoot.h
+++ b/sky/engine/core/dom/shadow/ShadowRoot.h
@@ -99,8 +99,6 @@
 
     StyleSheetList* styleSheets();
 
-    virtual void trace(Visitor*) override;
-
 private:
     ShadowRoot(Document&);
     virtual ~ShadowRoot();
diff --git a/sky/engine/core/editing/AppendNodeCommand.cpp b/sky/engine/core/editing/AppendNodeCommand.cpp
index b2ae37d..6c3830b 100644
--- a/sky/engine/core/editing/AppendNodeCommand.cpp
+++ b/sky/engine/core/editing/AppendNodeCommand.cpp
@@ -58,11 +58,4 @@
     m_node->remove(IGNORE_EXCEPTION);
 }
 
-void AppendNodeCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_parent);
-    visitor->trace(m_node);
-    SimpleEditCommand::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/editing/AppendNodeCommand.h b/sky/engine/core/editing/AppendNodeCommand.h
index d619531..5324560 100644
--- a/sky/engine/core/editing/AppendNodeCommand.h
+++ b/sky/engine/core/editing/AppendNodeCommand.h
@@ -37,8 +37,6 @@
         return adoptRef(new AppendNodeCommand(parent, node));
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     AppendNodeCommand(PassRefPtr<ContainerNode> parent, PassRefPtr<Node>);
 
diff --git a/sky/engine/core/editing/ApplyBlockElementCommand.cpp b/sky/engine/core/editing/ApplyBlockElementCommand.cpp
index 2c717fd..fb70030 100644
--- a/sky/engine/core/editing/ApplyBlockElementCommand.cpp
+++ b/sky/engine/core/editing/ApplyBlockElementCommand.cpp
@@ -238,10 +238,4 @@
     return element.release();
 }
 
-void ApplyBlockElementCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_endOfLastParagraph);
-    CompositeEditCommand::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/editing/ApplyBlockElementCommand.h b/sky/engine/core/editing/ApplyBlockElementCommand.h
index 42c6cac..0acaddb 100644
--- a/sky/engine/core/editing/ApplyBlockElementCommand.h
+++ b/sky/engine/core/editing/ApplyBlockElementCommand.h
@@ -45,8 +45,6 @@
     PassRefPtr<HTMLElement> createBlockElement() const;
     const QualifiedName tagName() const { return m_tagName; }
 
-    virtual void trace(Visitor*) override;
-
 private:
     virtual void doApply() override final;
     virtual void formatRange(const Position& start, const Position& end, const Position& endOfSelection, RefPtr<HTMLElement>&) = 0;
diff --git a/sky/engine/core/editing/Caret.cpp b/sky/engine/core/editing/Caret.cpp
index b03f84e..a953797 100644
--- a/sky/engine/core/editing/Caret.cpp
+++ b/sky/engine/core/editing/Caret.cpp
@@ -109,11 +109,6 @@
     clear();
 }
 
-void DragCaretController::trace(Visitor* visitor)
-{
-    visitor->trace(m_position);
-}
-
 void CaretBase::clearCaretRect()
 {
     m_caretLocalRect = LayoutRect();
diff --git a/sky/engine/core/editing/Caret.h b/sky/engine/core/editing/Caret.h
index d2b0386..7257d2a 100644
--- a/sky/engine/core/editing/Caret.h
+++ b/sky/engine/core/editing/Caret.h
@@ -94,8 +94,6 @@
 
     void nodeWillBeRemoved(Node&);
 
-    void trace(Visitor*);
-
 private:
     DragCaretController();
 
diff --git a/sky/engine/core/editing/CompositeEditCommand.cpp b/sky/engine/core/editing/CompositeEditCommand.cpp
index e4a67a5..e6f03bd 100644
--- a/sky/engine/core/editing/CompositeEditCommand.cpp
+++ b/sky/engine/core/editing/CompositeEditCommand.cpp
@@ -142,17 +142,6 @@
     m_endingRootEditableElement = selection.rootEditableElement();
 }
 
-void EditCommandComposition::trace(Visitor* visitor)
-{
-    visitor->trace(m_document);
-    visitor->trace(m_startingSelection);
-    visitor->trace(m_endingSelection);
-    visitor->trace(m_commands);
-    visitor->trace(m_startingRootEditableElement);
-    visitor->trace(m_endingRootEditableElement);
-    UndoStep::trace(visitor);
-}
-
 CompositeEditCommand::CompositeEditCommand(Document& document)
     : EditCommand(document)
 {
@@ -1078,11 +1067,4 @@
     return node.release();
 }
 
-void CompositeEditCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_commands);
-    visitor->trace(m_composition);
-    EditCommand::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/editing/CompositeEditCommand.h b/sky/engine/core/editing/CompositeEditCommand.h
index a376470..fba6dbd 100644
--- a/sky/engine/core/editing/CompositeEditCommand.h
+++ b/sky/engine/core/editing/CompositeEditCommand.h
@@ -55,8 +55,6 @@
     Element* startingRootEditableElement() const { return m_startingRootEditableElement.get(); }
     Element* endingRootEditableElement() const { return m_endingRootEditableElement.get(); }
 
-    virtual void trace(Visitor*) override;
-
 private:
     EditCommandComposition(Document*, const VisibleSelection& startingSelection, const VisibleSelection& endingSelection, EditAction);
 
@@ -83,8 +81,6 @@
     virtual void setShouldRetainAutocorrectionIndicator(bool);
     virtual bool shouldStopCaretBlinking() const { return false; }
 
-    virtual void trace(Visitor*) override;
-
 protected:
     explicit CompositeEditCommand(Document&);
 
diff --git a/sky/engine/core/editing/DOMSelection.h b/sky/engine/core/editing/DOMSelection.h
index 77626be..673c1e7 100644
--- a/sky/engine/core/editing/DOMSelection.h
+++ b/sky/engine/core/editing/DOMSelection.h
@@ -96,8 +96,6 @@
     // Microsoft Selection Object API
     void empty();
 
-    void trace(Visitor* visitor) { visitor->trace(m_treeScope); }
-
 private:
     explicit DOMSelection(const TreeScope*);
 
diff --git a/sky/engine/core/editing/DeleteFromTextNodeCommand.cpp b/sky/engine/core/editing/DeleteFromTextNodeCommand.cpp
index 3e316be..afde38a 100644
--- a/sky/engine/core/editing/DeleteFromTextNodeCommand.cpp
+++ b/sky/engine/core/editing/DeleteFromTextNodeCommand.cpp
@@ -68,10 +68,4 @@
     m_node->insertData(m_offset, m_text, IGNORE_EXCEPTION, CharacterData::DeprecatedRecalcStyleImmediatlelyForEditing);
 }
 
-void DeleteFromTextNodeCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_node);
-    SimpleEditCommand::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/editing/DeleteFromTextNodeCommand.h b/sky/engine/core/editing/DeleteFromTextNodeCommand.h
index db53eb3..34b7f69 100644
--- a/sky/engine/core/editing/DeleteFromTextNodeCommand.h
+++ b/sky/engine/core/editing/DeleteFromTextNodeCommand.h
@@ -39,8 +39,6 @@
         return adoptRef(new DeleteFromTextNodeCommand(node, offset, count));
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     DeleteFromTextNodeCommand(PassRefPtr<Text>, unsigned offset, unsigned count);
 
diff --git a/sky/engine/core/editing/DeleteSelectionCommand.cpp b/sky/engine/core/editing/DeleteSelectionCommand.cpp
index 4a29796..1f4b0e7 100644
--- a/sky/engine/core/editing/DeleteSelectionCommand.cpp
+++ b/sky/engine/core/editing/DeleteSelectionCommand.cpp
@@ -673,23 +673,4 @@
     return false;
 }
 
-void DeleteSelectionCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_selectionToDelete);
-    visitor->trace(m_upstreamStart);
-    visitor->trace(m_downstreamStart);
-    visitor->trace(m_upstreamEnd);
-    visitor->trace(m_downstreamEnd);
-    visitor->trace(m_endingPosition);
-    visitor->trace(m_leadingWhitespace);
-    visitor->trace(m_trailingWhitespace);
-    visitor->trace(m_startBlock);
-    visitor->trace(m_endBlock);
-    visitor->trace(m_deleteIntoBlockquoteStyle);
-    visitor->trace(m_startRoot);
-    visitor->trace(m_endRoot);
-    visitor->trace(m_temporaryPlaceholder);
-    CompositeEditCommand::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/editing/DeleteSelectionCommand.h b/sky/engine/core/editing/DeleteSelectionCommand.h
index 2641f13..40bb4cf 100644
--- a/sky/engine/core/editing/DeleteSelectionCommand.h
+++ b/sky/engine/core/editing/DeleteSelectionCommand.h
@@ -43,8 +43,6 @@
         return adoptRef(new DeleteSelectionCommand(selection, smartDelete, mergeBlocksAfterDelete, expandForSpecialElements, sanitizeMarkup));
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     DeleteSelectionCommand(Document&, bool smartDelete, bool mergeBlocksAfterDelete, bool expandForSpecialElements, bool santizeMarkup);
     DeleteSelectionCommand(const VisibleSelection&, bool smartDelete, bool mergeBlocksAfterDelete, bool expandForSpecialElements, bool sanitizeMarkup);
diff --git a/sky/engine/core/editing/EditCommand.cpp b/sky/engine/core/editing/EditCommand.cpp
index 0953c4e..a9d4857 100644
--- a/sky/engine/core/editing/EditCommand.cpp
+++ b/sky/engine/core/editing/EditCommand.cpp
@@ -120,12 +120,4 @@
     doApply();
 }
 
-void EditCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_document);
-    visitor->trace(m_startingSelection);
-    visitor->trace(m_endingSelection);
-    visitor->trace(m_parent);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/editing/EditCommand.h b/sky/engine/core/editing/EditCommand.h
index b3b9e92..8e424f4 100644
--- a/sky/engine/core/editing/EditCommand.h
+++ b/sky/engine/core/editing/EditCommand.h
@@ -53,8 +53,6 @@
 
     virtual void doApply() = 0;
 
-    virtual void trace(Visitor*);
-
 protected:
     explicit EditCommand(Document&);
     EditCommand(Document*, const VisibleSelection&, const VisibleSelection&);
diff --git a/sky/engine/core/editing/EditingStyle.cpp b/sky/engine/core/editing/EditingStyle.cpp
index c26490f..1a239bc 100644
--- a/sky/engine/core/editing/EditingStyle.cpp
+++ b/sky/engine/core/editing/EditingStyle.cpp
@@ -165,8 +165,6 @@
     virtual bool valueIsPresentInStyle(HTMLElement*, StylePropertySet*) const;
     virtual void addToStyle(Element*, EditingStyle*) const;
 
-    virtual void trace(Visitor* visitor) { visitor->trace(m_primitiveValue); }
-
 protected:
     HTMLElementEquivalent(CSSPropertyID);
     HTMLElementEquivalent(CSSPropertyID, const HTMLQualifiedName& tagName);
@@ -218,8 +216,6 @@
     virtual bool propertyExistsInStyle(const StylePropertySet*) const override;
     virtual bool valueIsPresentInStyle(HTMLElement*, StylePropertySet*) const override;
 
-    virtual void trace(Visitor* visitor) override { HTMLElementEquivalent::trace(visitor); }
-
 private:
     HTMLTextDecorationEquivalent(CSSValueID primitiveValue, const HTMLQualifiedName& tagName);
 };
@@ -262,8 +258,6 @@
     virtual PassRefPtr<CSSValue> attributeValueAsCSSValue(Element*) const;
     inline const QualifiedName& attributeName() const { return m_attrName; }
 
-    virtual void trace(Visitor* visitor) override { HTMLElementEquivalent::trace(visitor); }
-
 protected:
     HTMLAttributeEquivalent(CSSPropertyID, const HTMLQualifiedName& tagName, const QualifiedName& attrName);
     HTMLAttributeEquivalent(CSSPropertyID, const QualifiedName& attrName);
@@ -1266,11 +1260,6 @@
     return foundDirection;
 }
 
-void EditingStyle::trace(Visitor* visitor)
-{
-    visitor->trace(m_mutableStyle);
-}
-
 static void reconcileTextDecorationProperties(MutableStylePropertySet* style)
 {
     RefPtr<CSSValue> textDecorationsInEffect = style->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect);
diff --git a/sky/engine/core/editing/EditingStyle.h b/sky/engine/core/editing/EditingStyle.h
index 4c19036..ee12d3a 100644
--- a/sky/engine/core/editing/EditingStyle.h
+++ b/sky/engine/core/editing/EditingStyle.h
@@ -143,8 +143,6 @@
     static PassRefPtr<EditingStyle> styleAtSelectionStart(const VisibleSelection&, bool shouldUseBackgroundColorInEffect = false);
     static WritingDirection textDirectionForSelection(const VisibleSelection&, EditingStyle* typingStyle, bool& hasNestedOrMultipleEmbeddings);
 
-    void trace(Visitor*);
-
 private:
     EditingStyle();
     EditingStyle(ContainerNode*, PropertiesToInclude);
diff --git a/sky/engine/core/editing/Editor.cpp b/sky/engine/core/editing/Editor.cpp
index 7475de4..6205149 100644
--- a/sky/engine/core/editing/Editor.cpp
+++ b/sky/engine/core/editing/Editor.cpp
@@ -851,10 +851,4 @@
     frame().selection().setShouldShowBlockCursor(m_overwriteModeEnabled);
 }
 
-void Editor::trace(Visitor* visitor)
-{
-    visitor->trace(m_lastEditCommand);
-    visitor->trace(m_mark);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/editing/Editor.h b/sky/engine/core/editing/Editor.h
index 3cd623e..cf88356 100644
--- a/sky/engine/core/editing/Editor.h
+++ b/sky/engine/core/editing/Editor.h
@@ -216,8 +216,6 @@
     };
     friend class RevealSelectionScope;
 
-    void trace(Visitor*);
-
 private:
     LocalFrame& m_frame;
     RefPtr<CompositeEditCommand> m_lastEditCommand;
diff --git a/sky/engine/core/editing/FrameSelection.cpp b/sky/engine/core/editing/FrameSelection.cpp
index 58f72e7..1a9309e 100644
--- a/sky/engine/core/editing/FrameSelection.cpp
+++ b/sky/engine/core/editing/FrameSelection.cpp
@@ -1696,16 +1696,6 @@
 
 #endif
 
-void FrameSelection::trace(Visitor* visitor)
-{
-    visitor->trace(m_selection);
-    visitor->trace(m_originalBase);
-    visitor->trace(m_logicalRange);
-    visitor->trace(m_previousCaretNode);
-    visitor->trace(m_typingStyle);
-    VisibleSelection::ChangeObserver::trace(visitor);
-}
-
 void FrameSelection::setCaretRectNeedsUpdate()
 {
     m_caretRectDirty = true;
diff --git a/sky/engine/core/editing/FrameSelection.h b/sky/engine/core/editing/FrameSelection.h
index 7582f18..aa777d9 100644
--- a/sky/engine/core/editing/FrameSelection.h
+++ b/sky/engine/core/editing/FrameSelection.h
@@ -210,8 +210,6 @@
     // VisibleSelection::ChangeObserver interface.
     virtual void didChangeVisibleSelection() override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     explicit FrameSelection(LocalFrame*);
 
diff --git a/sky/engine/core/editing/InsertIntoTextNodeCommand.cpp b/sky/engine/core/editing/InsertIntoTextNodeCommand.cpp
index 9ef008f..b77e168 100644
--- a/sky/engine/core/editing/InsertIntoTextNodeCommand.cpp
+++ b/sky/engine/core/editing/InsertIntoTextNodeCommand.cpp
@@ -61,10 +61,4 @@
     m_node->deleteData(m_offset, m_text.length(), IGNORE_EXCEPTION, CharacterData::DeprecatedRecalcStyleImmediatlelyForEditing);
 }
 
-void InsertIntoTextNodeCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_node);
-    SimpleEditCommand::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/editing/InsertIntoTextNodeCommand.h b/sky/engine/core/editing/InsertIntoTextNodeCommand.h
index 581e4dd..681db84 100644
--- a/sky/engine/core/editing/InsertIntoTextNodeCommand.h
+++ b/sky/engine/core/editing/InsertIntoTextNodeCommand.h
@@ -39,8 +39,6 @@
         return adoptRef(new InsertIntoTextNodeCommand(node, offset, text));
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     InsertIntoTextNodeCommand(PassRefPtr<Text> node, unsigned offset, const String& text);
 
diff --git a/sky/engine/core/editing/InsertNodeBeforeCommand.cpp b/sky/engine/core/editing/InsertNodeBeforeCommand.cpp
index b550844..74e34ec 100644
--- a/sky/engine/core/editing/InsertNodeBeforeCommand.cpp
+++ b/sky/engine/core/editing/InsertNodeBeforeCommand.cpp
@@ -63,11 +63,4 @@
     m_insertChild->remove(IGNORE_EXCEPTION);
 }
 
-void InsertNodeBeforeCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_insertChild);
-    visitor->trace(m_refChild);
-    SimpleEditCommand::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/editing/InsertNodeBeforeCommand.h b/sky/engine/core/editing/InsertNodeBeforeCommand.h
index ecfb0fe..daa224c 100644
--- a/sky/engine/core/editing/InsertNodeBeforeCommand.h
+++ b/sky/engine/core/editing/InsertNodeBeforeCommand.h
@@ -38,8 +38,6 @@
         return adoptRef(new InsertNodeBeforeCommand(childToInsert, childToInsertBefore, shouldAssumeContentIsAlwaysEditable));
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     InsertNodeBeforeCommand(PassRefPtr<Node> childToInsert, PassRefPtr<Node> childToInsertBefore, ShouldAssumeContentIsAlwaysEditable);
 
diff --git a/sky/engine/core/editing/InsertParagraphSeparatorCommand.cpp b/sky/engine/core/editing/InsertParagraphSeparatorCommand.cpp
index 8e1cbcf..470dc6a 100644
--- a/sky/engine/core/editing/InsertParagraphSeparatorCommand.cpp
+++ b/sky/engine/core/editing/InsertParagraphSeparatorCommand.cpp
@@ -318,11 +318,4 @@
     setEndingSelection(VisibleSelection(firstPositionInNode(blockToInsert.get()), DOWNSTREAM, endingSelection().isDirectional()));
 }
 
-void InsertParagraphSeparatorCommand::trace(Visitor *visitor)
-{
-    visitor->trace(m_style);
-    CompositeEditCommand::trace(visitor);
-}
-
-
 } // namespace blink
diff --git a/sky/engine/core/editing/InsertParagraphSeparatorCommand.h b/sky/engine/core/editing/InsertParagraphSeparatorCommand.h
index c7aeb8d..54ca11f 100644
--- a/sky/engine/core/editing/InsertParagraphSeparatorCommand.h
+++ b/sky/engine/core/editing/InsertParagraphSeparatorCommand.h
@@ -39,8 +39,6 @@
         return adoptRef(new InsertParagraphSeparatorCommand(document, useDefaultParagraphElement, pasteBlockquoteIntoUnquotedArea));
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     InsertParagraphSeparatorCommand(Document&, bool useDefaultParagraphElement, bool pasteBlockquoteIntoUnquotedArea);
 
diff --git a/sky/engine/core/editing/MoveSelectionCommand.cpp b/sky/engine/core/editing/MoveSelectionCommand.cpp
index a136315..958953b 100644
--- a/sky/engine/core/editing/MoveSelectionCommand.cpp
+++ b/sky/engine/core/editing/MoveSelectionCommand.cpp
@@ -83,11 +83,4 @@
     return EditActionDrag;
 }
 
-void MoveSelectionCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_fragment);
-    visitor->trace(m_position);
-    CompositeEditCommand::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/editing/MoveSelectionCommand.h b/sky/engine/core/editing/MoveSelectionCommand.h
index a6fbbf2..810f6aa 100644
--- a/sky/engine/core/editing/MoveSelectionCommand.h
+++ b/sky/engine/core/editing/MoveSelectionCommand.h
@@ -39,8 +39,6 @@
         return adoptRef(new MoveSelectionCommand(fragment, position, smartInsert, smartDelete));
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     MoveSelectionCommand(PassRefPtr<DocumentFragment>, const Position&, bool smartInsert, bool smartDelete);
 
diff --git a/sky/engine/core/editing/PositionWithAffinity.cpp b/sky/engine/core/editing/PositionWithAffinity.cpp
index 668c408..e6650f4 100644
--- a/sky/engine/core/editing/PositionWithAffinity.cpp
+++ b/sky/engine/core/editing/PositionWithAffinity.cpp
@@ -22,9 +22,4 @@
 {
 }
 
-void PositionWithAffinity::trace(Visitor* visitor)
-{
-    visitor->trace(m_position);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/editing/PositionWithAffinity.h b/sky/engine/core/editing/PositionWithAffinity.h
index 408c2e9..f68d8a7 100644
--- a/sky/engine/core/editing/PositionWithAffinity.h
+++ b/sky/engine/core/editing/PositionWithAffinity.h
@@ -20,8 +20,6 @@
     EAffinity affinity() const { return m_affinity; }
     const Position& position() const { return m_position; }
 
-    void trace(Visitor*);
-
 private:
     Position m_position;
     EAffinity m_affinity;
diff --git a/sky/engine/core/editing/RemoveNodeCommand.cpp b/sky/engine/core/editing/RemoveNodeCommand.cpp
index bd02059..6044ea7 100644
--- a/sky/engine/core/editing/RemoveNodeCommand.cpp
+++ b/sky/engine/core/editing/RemoveNodeCommand.cpp
@@ -65,12 +65,4 @@
     parent->insertBefore(m_node.get(), refChild.get(), IGNORE_EXCEPTION);
 }
 
-void RemoveNodeCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_node);
-    visitor->trace(m_parent);
-    visitor->trace(m_refChild);
-    SimpleEditCommand::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/editing/RemoveNodeCommand.h b/sky/engine/core/editing/RemoveNodeCommand.h
index 1270920..fdcc683 100644
--- a/sky/engine/core/editing/RemoveNodeCommand.h
+++ b/sky/engine/core/editing/RemoveNodeCommand.h
@@ -37,8 +37,6 @@
         return adoptRef(new RemoveNodeCommand(node, shouldAssumeContentIsAlwaysEditable));
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     explicit RemoveNodeCommand(PassRefPtr<Node>, ShouldAssumeContentIsAlwaysEditable);
 
diff --git a/sky/engine/core/editing/RemoveNodePreservingChildrenCommand.cpp b/sky/engine/core/editing/RemoveNodePreservingChildrenCommand.cpp
index 22c5795..2a38588 100644
--- a/sky/engine/core/editing/RemoveNodePreservingChildrenCommand.cpp
+++ b/sky/engine/core/editing/RemoveNodePreservingChildrenCommand.cpp
@@ -55,10 +55,4 @@
     removeNode(m_node, m_shouldAssumeContentIsAlwaysEditable);
 }
 
-void RemoveNodePreservingChildrenCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_node);
-    CompositeEditCommand::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/editing/RemoveNodePreservingChildrenCommand.h b/sky/engine/core/editing/RemoveNodePreservingChildrenCommand.h
index 6c4ebd5..174623c 100644
--- a/sky/engine/core/editing/RemoveNodePreservingChildrenCommand.h
+++ b/sky/engine/core/editing/RemoveNodePreservingChildrenCommand.h
@@ -37,8 +37,6 @@
         return adoptRef(new RemoveNodePreservingChildrenCommand(node, shouldAssumeContentIsAlwaysEditable));
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     RemoveNodePreservingChildrenCommand(PassRefPtr<Node>, ShouldAssumeContentIsAlwaysEditable);
 
diff --git a/sky/engine/core/editing/ReplaceSelectionCommand.cpp b/sky/engine/core/editing/ReplaceSelectionCommand.cpp
index 2eea3f8..d94eaf6 100644
--- a/sky/engine/core/editing/ReplaceSelectionCommand.cpp
+++ b/sky/engine/core/editing/ReplaceSelectionCommand.cpp
@@ -1012,13 +1012,4 @@
     return true;
 }
 
-void ReplaceSelectionCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_startOfInsertedContent);
-    visitor->trace(m_endOfInsertedContent);
-    visitor->trace(m_insertionStyle);
-    visitor->trace(m_documentFragment);
-    CompositeEditCommand::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/editing/ReplaceSelectionCommand.h b/sky/engine/core/editing/ReplaceSelectionCommand.h
index 90b1c48..6c44721 100644
--- a/sky/engine/core/editing/ReplaceSelectionCommand.h
+++ b/sky/engine/core/editing/ReplaceSelectionCommand.h
@@ -51,8 +51,6 @@
         return adoptRef(new ReplaceSelectionCommand(document, fragment, options, action));
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     ReplaceSelectionCommand(Document&, PassRefPtr<DocumentFragment>, CommandOptions, EditAction);
 
diff --git a/sky/engine/core/editing/SplitElementCommand.cpp b/sky/engine/core/editing/SplitElementCommand.cpp
index d84a9f3..931e623 100644
--- a/sky/engine/core/editing/SplitElementCommand.cpp
+++ b/sky/engine/core/editing/SplitElementCommand.cpp
@@ -107,12 +107,4 @@
     executeApply();
 }
 
-void SplitElementCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_element1);
-    visitor->trace(m_element2);
-    visitor->trace(m_atChild);
-    SimpleEditCommand::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/editing/SplitElementCommand.h b/sky/engine/core/editing/SplitElementCommand.h
index 5d7b250..ba7e262 100644
--- a/sky/engine/core/editing/SplitElementCommand.h
+++ b/sky/engine/core/editing/SplitElementCommand.h
@@ -37,8 +37,6 @@
         return adoptRef(new SplitElementCommand(element, splitPointChild));
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     SplitElementCommand(PassRefPtr<Element>, PassRefPtr<Node> splitPointChild);
 
diff --git a/sky/engine/core/editing/SplitTextNodeCommand.cpp b/sky/engine/core/editing/SplitTextNodeCommand.cpp
index 7d692a2..eb18121 100644
--- a/sky/engine/core/editing/SplitTextNodeCommand.cpp
+++ b/sky/engine/core/editing/SplitTextNodeCommand.cpp
@@ -103,11 +103,4 @@
     m_text2->deleteData(0, m_offset, exceptionState, CharacterData::DeprecatedRecalcStyleImmediatlelyForEditing);
 }
 
-void SplitTextNodeCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_text1);
-    visitor->trace(m_text2);
-    SimpleEditCommand::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/editing/SplitTextNodeCommand.h b/sky/engine/core/editing/SplitTextNodeCommand.h
index 110bee1..563a2ca 100644
--- a/sky/engine/core/editing/SplitTextNodeCommand.h
+++ b/sky/engine/core/editing/SplitTextNodeCommand.h
@@ -39,8 +39,6 @@
         return adoptRef(new SplitTextNodeCommand(node, offset));
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     SplitTextNodeCommand(PassRefPtr<Text>, int offset);
 
diff --git a/sky/engine/core/editing/SplitTextNodeContainingElementCommand.cpp b/sky/engine/core/editing/SplitTextNodeContainingElementCommand.cpp
index 56270d3..719d8c2 100644
--- a/sky/engine/core/editing/SplitTextNodeContainingElementCommand.cpp
+++ b/sky/engine/core/editing/SplitTextNodeContainingElementCommand.cpp
@@ -48,10 +48,4 @@
     splitTextNode(m_text.get(), m_offset);
 }
 
-void SplitTextNodeContainingElementCommand::trace(Visitor* visitor)
-{
-    visitor->trace(m_text);
-    CompositeEditCommand::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/editing/SplitTextNodeContainingElementCommand.h b/sky/engine/core/editing/SplitTextNodeContainingElementCommand.h
index cadbbc7..fbfb5cd 100644
--- a/sky/engine/core/editing/SplitTextNodeContainingElementCommand.h
+++ b/sky/engine/core/editing/SplitTextNodeContainingElementCommand.h
@@ -37,8 +37,6 @@
         return adoptRef(new SplitTextNodeContainingElementCommand(node, offset));
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     SplitTextNodeContainingElementCommand(PassRefPtr<Text>, int offset);
 
diff --git a/sky/engine/core/editing/UndoStack.cpp b/sky/engine/core/editing/UndoStack.cpp
index 062524a..65cf013 100644
--- a/sky/engine/core/editing/UndoStack.cpp
+++ b/sky/engine/core/editing/UndoStack.cpp
@@ -120,10 +120,4 @@
     }
 }
 
-void UndoStack::trace(Visitor* visitor)
-{
-    visitor->trace(m_undoStack);
-    visitor->trace(m_redoStack);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/editing/UndoStack.h b/sky/engine/core/editing/UndoStack.h
index e784282..58b909c 100644
--- a/sky/engine/core/editing/UndoStack.h
+++ b/sky/engine/core/editing/UndoStack.h
@@ -53,8 +53,6 @@
     void undo();
     void redo();
 
-    void trace(Visitor*);
-
 private:
     UndoStack();
 
diff --git a/sky/engine/core/editing/UndoStep.h b/sky/engine/core/editing/UndoStep.h
index 5c0c8b8..e119d93 100644
--- a/sky/engine/core/editing/UndoStep.h
+++ b/sky/engine/core/editing/UndoStep.h
@@ -42,7 +42,6 @@
 class UndoStep : public RefCounted<UndoStep> {
 public:
     virtual ~UndoStep() { }
-    virtual void trace(Visitor*) { }
 
     virtual bool belongsTo(const LocalFrame&) const = 0;
     virtual void unapply() = 0;
diff --git a/sky/engine/core/editing/VisiblePosition.cpp b/sky/engine/core/editing/VisiblePosition.cpp
index 7cfc49a..fbbf4df 100644
--- a/sky/engine/core/editing/VisiblePosition.cpp
+++ b/sky/engine/core/editing/VisiblePosition.cpp
@@ -767,11 +767,6 @@
     return next.isNull() || !next.deepEquivalent().deprecatedNode()->isDescendantOf(node);
 }
 
-void VisiblePosition::trace(Visitor* visitor)
-{
-    visitor->trace(m_deepPosition);
-}
-
 }  // namespace blink
 
 #ifndef NDEBUG
diff --git a/sky/engine/core/editing/VisiblePosition.h b/sky/engine/core/editing/VisiblePosition.h
index d404e96..1aecd90 100644
--- a/sky/engine/core/editing/VisiblePosition.h
+++ b/sky/engine/core/editing/VisiblePosition.h
@@ -101,8 +101,6 @@
     // FIXME: navigation with transforms should be smarter.
     int lineDirectionPointForBlockDirectionNavigation() const;
 
-    void trace(Visitor*);
-
 #ifndef NDEBUG
     void debugPosition(const char* msg = "") const;
     void formatForDebugger(char* buffer, unsigned length) const;
diff --git a/sky/engine/core/editing/VisibleSelection.cpp b/sky/engine/core/editing/VisibleSelection.cpp
index 742ff2d..a48f13e 100644
--- a/sky/engine/core/editing/VisibleSelection.cpp
+++ b/sky/engine/core/editing/VisibleSelection.cpp
@@ -761,15 +761,6 @@
         m_changeObserver->didChangeVisibleSelection();
 }
 
-void VisibleSelection::trace(Visitor* visitor)
-{
-    visitor->trace(m_base);
-    visitor->trace(m_extent);
-    visitor->trace(m_start);
-    visitor->trace(m_end);
-    visitor->trace(m_changeObserver);
-}
-
 static bool isValidPosition(const Position& position)
 {
     if (!position.inDocument())
diff --git a/sky/engine/core/editing/VisibleSelection.h b/sky/engine/core/editing/VisibleSelection.h
index 3c2666d..6b5215e 100644
--- a/sky/engine/core/editing/VisibleSelection.h
+++ b/sky/engine/core/editing/VisibleSelection.h
@@ -123,15 +123,12 @@
         ChangeObserver();
         virtual ~ChangeObserver();
         virtual void didChangeVisibleSelection() = 0;
-        virtual void trace(Visitor*) { }
     };
 
     void setChangeObserver(ChangeObserver&);
     void clearChangeObserver();
     void didChange(); // Fire the change observer, if any.
 
-    void trace(Visitor*);
-
     void validatePositionsIfNeeded();
 
 #ifndef NDEBUG
diff --git a/sky/engine/core/editing/markup.cpp b/sky/engine/core/editing/markup.cpp
index 7bd6356..3f9b288 100644
--- a/sky/engine/core/editing/markup.cpp
+++ b/sky/engine/core/editing/markup.cpp
@@ -79,11 +79,6 @@
         m_element->setAttribute(m_name, AtomicString(m_value));
     }
 
-    void trace(Visitor* visitor)
-    {
-        visitor->trace(m_element);
-    }
-
 private:
     RefPtr<Element> m_element;
     QualifiedName m_name;
diff --git a/sky/engine/core/events/AnimationEvent.cpp b/sky/engine/core/events/AnimationEvent.cpp
index 15fae75..4edbb9e 100644
--- a/sky/engine/core/events/AnimationEvent.cpp
+++ b/sky/engine/core/events/AnimationEvent.cpp
@@ -72,9 +72,4 @@
     return EventNames::AnimationEvent;
 }
 
-void AnimationEvent::trace(Visitor* visitor)
-{
-    Event::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/events/AnimationEvent.h b/sky/engine/core/events/AnimationEvent.h
index ab31fab..75d4522 100644
--- a/sky/engine/core/events/AnimationEvent.h
+++ b/sky/engine/core/events/AnimationEvent.h
@@ -63,8 +63,6 @@
 
     virtual const AtomicString& interfaceName() const override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     AnimationEvent();
     AnimationEvent(const AtomicString& type, const String& animationName, double elapsedTime);
diff --git a/sky/engine/core/events/AnimationPlayerEvent.cpp b/sky/engine/core/events/AnimationPlayerEvent.cpp
index b43c782..df79d4d 100644
--- a/sky/engine/core/events/AnimationPlayerEvent.cpp
+++ b/sky/engine/core/events/AnimationPlayerEvent.cpp
@@ -52,9 +52,4 @@
     return EventNames::AnimationPlayerEvent;
 }
 
-void AnimationPlayerEvent::trace(Visitor* visitor)
-{
-    Event::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/events/AnimationPlayerEvent.h b/sky/engine/core/events/AnimationPlayerEvent.h
index 2d24bf7..d3ff6d9 100644
--- a/sky/engine/core/events/AnimationPlayerEvent.h
+++ b/sky/engine/core/events/AnimationPlayerEvent.h
@@ -39,8 +39,6 @@
 
     virtual const AtomicString& interfaceName() const override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     AnimationPlayerEvent();
     AnimationPlayerEvent(const AtomicString& type, double currentTime, double timelineTime);
diff --git a/sky/engine/core/events/BeforeTextInsertedEvent.cpp b/sky/engine/core/events/BeforeTextInsertedEvent.cpp
index 766d63e..0ba4ee4 100644
--- a/sky/engine/core/events/BeforeTextInsertedEvent.cpp
+++ b/sky/engine/core/events/BeforeTextInsertedEvent.cpp
@@ -43,9 +43,4 @@
     return EventNames::Event;
 }
 
-void BeforeTextInsertedEvent::trace(Visitor* visitor)
-{
-    Event::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/events/BeforeTextInsertedEvent.h b/sky/engine/core/events/BeforeTextInsertedEvent.h
index 16c0c1d..2b99724 100644
--- a/sky/engine/core/events/BeforeTextInsertedEvent.h
+++ b/sky/engine/core/events/BeforeTextInsertedEvent.h
@@ -45,8 +45,6 @@
     const String& text() const { return m_text; }
     void setText(const String& s) { m_text = s; }
 
-    virtual void trace(Visitor*) override;
-
 private:
     explicit BeforeTextInsertedEvent(const String&);
 
diff --git a/sky/engine/core/events/CompositionEvent.cpp b/sky/engine/core/events/CompositionEvent.cpp
index 49f5a8c..696f778 100644
--- a/sky/engine/core/events/CompositionEvent.cpp
+++ b/sky/engine/core/events/CompositionEvent.cpp
@@ -100,9 +100,4 @@
     return EventNames::CompositionEvent;
 }
 
-void CompositionEvent::trace(Visitor* visitor)
-{
-    UIEvent::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/events/CompositionEvent.h b/sky/engine/core/events/CompositionEvent.h
index 8c788aa..81f35f3 100644
--- a/sky/engine/core/events/CompositionEvent.h
+++ b/sky/engine/core/events/CompositionEvent.h
@@ -67,8 +67,6 @@
 
     virtual const AtomicString& interfaceName() const override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     CompositionEvent();
     CompositionEvent(const AtomicString& type, PassRefPtr<AbstractView>, const String&, const Vector<CompositionUnderline>& underlines);
diff --git a/sky/engine/core/events/CustomEvent.cpp b/sky/engine/core/events/CustomEvent.cpp
index e9d8d66..e05f107 100644
--- a/sky/engine/core/events/CustomEvent.cpp
+++ b/sky/engine/core/events/CustomEvent.cpp
@@ -58,9 +58,4 @@
     return EventNames::CustomEvent;
 }
 
-void CustomEvent::trace(Visitor* visitor)
-{
-    Event::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/events/CustomEvent.h b/sky/engine/core/events/CustomEvent.h
index 57a0862..cd2d15e 100644
--- a/sky/engine/core/events/CustomEvent.h
+++ b/sky/engine/core/events/CustomEvent.h
@@ -62,8 +62,6 @@
         m_serializedDetail = detail;
     }
 
-    virtual void trace(Visitor*) override;
-
 private:
     CustomEvent();
     CustomEvent(const AtomicString& type, const CustomEventInit& initializer);
diff --git a/sky/engine/core/events/DOMWindowEventQueue.cpp b/sky/engine/core/events/DOMWindowEventQueue.cpp
index 4b73006..f43a0e9 100644
--- a/sky/engine/core/events/DOMWindowEventQueue.cpp
+++ b/sky/engine/core/events/DOMWindowEventQueue.cpp
@@ -39,7 +39,6 @@
     DOMWindowEventQueueTimer(DOMWindowEventQueue* eventQueue, ExecutionContext* context)
         : SuspendableTimer(context)
         , m_eventQueue(eventQueue) { }
-    void trace(Visitor* visitor) { visitor->trace(m_eventQueue); }
 
 private:
     virtual void fired() { m_eventQueue->pendingEventTimerFired(); }
@@ -63,15 +62,6 @@
 {
 }
 
-void DOMWindowEventQueue::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_pendingEventTimer);
-    visitor->trace(m_queuedEvents);
-#endif
-    EventQueue::trace(visitor);
-}
-
 bool DOMWindowEventQueue::enqueueEvent(PassRefPtr<Event> event)
 {
     if (m_isClosed)
diff --git a/sky/engine/core/events/DOMWindowEventQueue.h b/sky/engine/core/events/DOMWindowEventQueue.h
index 72f8bb1..746c7cc 100644
--- a/sky/engine/core/events/DOMWindowEventQueue.h
+++ b/sky/engine/core/events/DOMWindowEventQueue.h
@@ -52,7 +52,6 @@
     virtual ~DOMWindowEventQueue();
 
     // EventQueue
-    virtual void trace(Visitor*) override;
     virtual bool enqueueEvent(PassRefPtr<Event>) override;
     virtual bool cancelEvent(Event*) override;
     virtual void close() override;
diff --git a/sky/engine/core/events/ErrorEvent.cpp b/sky/engine/core/events/ErrorEvent.cpp
index d83ce29..2c66611 100644
--- a/sky/engine/core/events/ErrorEvent.cpp
+++ b/sky/engine/core/events/ErrorEvent.cpp
@@ -88,9 +88,4 @@
     return EventNames::ErrorEvent;
 }
 
-void ErrorEvent::trace(Visitor* visitor)
-{
-    Event::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/events/ErrorEvent.h b/sky/engine/core/events/ErrorEvent.h
index 6f4efd6..d7f9d98 100644
--- a/sky/engine/core/events/ErrorEvent.h
+++ b/sky/engine/core/events/ErrorEvent.h
@@ -83,8 +83,6 @@
 
     void setUnsanitizedMessage(const String&);
 
-    virtual void trace(Visitor*) override;
-
 private:
     ErrorEvent();
     ErrorEvent(const String& message, const String& fileName, unsigned lineNumber, unsigned columnNumber, DOMWrapperWorld*);
diff --git a/sky/engine/core/events/Event.cpp b/sky/engine/core/events/Event.cpp
index b1cec4f..0855500 100644
--- a/sky/engine/core/events/Event.cpp
+++ b/sky/engine/core/events/Event.cpp
@@ -239,12 +239,4 @@
     return m_currentTarget.get();
 }
 
-void Event::trace(Visitor* visitor)
-{
-    visitor->trace(m_currentTarget);
-    visitor->trace(m_target);
-    visitor->trace(m_underlyingEvent);
-    visitor->trace(m_eventPath);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/events/Event.h b/sky/engine/core/events/Event.h
index c1d735c..20cb39d 100644
--- a/sky/engine/core/events/Event.h
+++ b/sky/engine/core/events/Event.h
@@ -180,8 +180,6 @@
 
     bool isBeingDispatched() const { return eventPhase(); }
 
-    virtual void trace(Visitor*);
-
 protected:
     Event();
     Event(const AtomicString& type, bool canBubble, bool cancelable);
diff --git a/sky/engine/core/events/EventDispatchMediator.cpp b/sky/engine/core/events/EventDispatchMediator.cpp
index 4e0bf14..838d1b7 100644
--- a/sky/engine/core/events/EventDispatchMediator.cpp
+++ b/sky/engine/core/events/EventDispatchMediator.cpp
@@ -46,11 +46,6 @@
 {
 }
 
-void EventDispatchMediator::trace(Visitor* visitor)
-{
-    visitor->trace(m_event);
-}
-
 bool EventDispatchMediator::dispatchEvent(EventDispatcher* dispatcher) const
 {
     ASSERT(m_event.get() == dispatcher->event());
diff --git a/sky/engine/core/events/EventDispatchMediator.h b/sky/engine/core/events/EventDispatchMediator.h
index e6df55b..d5a7fa9 100644
--- a/sky/engine/core/events/EventDispatchMediator.h
+++ b/sky/engine/core/events/EventDispatchMediator.h
@@ -46,7 +46,6 @@
 public:
     static PassRefPtr<EventDispatchMediator> create(PassRefPtr<Event>);
     virtual ~EventDispatchMediator() { };
-    virtual void trace(Visitor*);
     virtual bool dispatchEvent(EventDispatcher*) const;
     Event* event() const { return m_event.get(); };
 
diff --git a/sky/engine/core/events/EventPath.cpp b/sky/engine/core/events/EventPath.cpp
index 9031715..08717f9 100644
--- a/sky/engine/core/events/EventPath.cpp
+++ b/sky/engine/core/events/EventPath.cpp
@@ -325,12 +325,4 @@
 }
 #endif
 
-void EventPath::trace(Visitor* visitor)
-{
-    visitor->trace(m_nodeEventContexts);
-    visitor->trace(m_node);
-    visitor->trace(m_event);
-    visitor->trace(m_treeScopeEventContexts);
-}
-
 } // namespace
diff --git a/sky/engine/core/events/EventPath.h b/sky/engine/core/events/EventPath.h
index 0a1eb19..1c67c8d 100644
--- a/sky/engine/core/events/EventPath.h
+++ b/sky/engine/core/events/EventPath.h
@@ -60,8 +60,6 @@
 
     static EventTarget* eventTargetRespectingTargetRules(Node*);
 
-    void trace(Visitor*);
-
 private:
     EventPath();
 
diff --git a/sky/engine/core/events/EventQueue.h b/sky/engine/core/events/EventQueue.h
index 8497c2e..86305af 100644
--- a/sky/engine/core/events/EventQueue.h
+++ b/sky/engine/core/events/EventQueue.h
@@ -39,7 +39,6 @@
 class EventQueue {
 public:
     virtual ~EventQueue() { }
-    virtual void trace(Visitor*) { }
     virtual bool enqueueEvent(PassRefPtr<Event>) = 0;
     virtual bool cancelEvent(Event*) = 0;
     // The accumulated and all the future events will be discarded, no events will be dispatched anymore.
diff --git a/sky/engine/core/events/EventTarget.h b/sky/engine/core/events/EventTarget.h
index d9747e4..637e150 100644
--- a/sky/engine/core/events/EventTarget.h
+++ b/sky/engine/core/events/EventTarget.h
@@ -120,8 +120,6 @@
 
     bool fireEventListeners(Event*);
 
-    virtual void trace(Visitor*) { }
-
     virtual bool keepEventInNode(Event*) { return false; };
 
 protected:
diff --git a/sky/engine/core/events/FocusEvent.cpp b/sky/engine/core/events/FocusEvent.cpp
index fcc419b..050986b 100644
--- a/sky/engine/core/events/FocusEvent.cpp
+++ b/sky/engine/core/events/FocusEvent.cpp
@@ -62,12 +62,6 @@
 {
 }
 
-void FocusEvent::trace(Visitor* visitor)
-{
-    visitor->trace(m_relatedTarget);
-    UIEvent::trace(visitor);
-}
-
 PassRefPtr<FocusEventDispatchMediator> FocusEventDispatchMediator::create(PassRefPtr<FocusEvent> focusEvent)
 {
     return adoptRef(new FocusEventDispatchMediator(focusEvent));
diff --git a/sky/engine/core/events/FocusEvent.h b/sky/engine/core/events/FocusEvent.h
index 396e399..d0f812a 100644
--- a/sky/engine/core/events/FocusEvent.h
+++ b/sky/engine/core/events/FocusEvent.h
@@ -63,8 +63,6 @@
     virtual const AtomicString& interfaceName() const override;
     virtual bool isFocusEvent() const override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     FocusEvent();
     FocusEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<AbstractView>, int, EventTarget*);
diff --git a/sky/engine/core/events/GenericEventQueue.cpp b/sky/engine/core/events/GenericEventQueue.cpp
index 9bbdf59..387690f 100644
--- a/sky/engine/core/events/GenericEventQueue.cpp
+++ b/sky/engine/core/events/GenericEventQueue.cpp
@@ -48,13 +48,6 @@
 {
 }
 
-void GenericEventQueue::trace(Visitor* visitor)
-{
-    visitor->trace(m_owner);
-    visitor->trace(m_pendingEvents);
-    EventQueue::trace(visitor);
-}
-
 bool GenericEventQueue::enqueueEvent(PassRefPtr<Event> event)
 {
     if (m_isClosed)
diff --git a/sky/engine/core/events/GenericEventQueue.h b/sky/engine/core/events/GenericEventQueue.h
index a22e9cb..6427637 100644
--- a/sky/engine/core/events/GenericEventQueue.h
+++ b/sky/engine/core/events/GenericEventQueue.h
@@ -42,7 +42,6 @@
     virtual ~GenericEventQueue();
 
     // EventQueue
-    virtual void trace(Visitor*) override;
     virtual bool enqueueEvent(PassRefPtr<Event>) override;
     virtual bool cancelEvent(Event*) override;
     virtual void close() override;
diff --git a/sky/engine/core/events/GestureEvent.cpp b/sky/engine/core/events/GestureEvent.cpp
index f8c23cd..de46000 100644
--- a/sky/engine/core/events/GestureEvent.cpp
+++ b/sky/engine/core/events/GestureEvent.cpp
@@ -94,11 +94,6 @@
 {
 }
 
-void GestureEvent::trace(Visitor* visitor)
-{
-    MouseRelatedEvent::trace(visitor);
-}
-
 GestureEventDispatchMediator::GestureEventDispatchMediator(PassRefPtr<GestureEvent> gestureEvent)
     : EventDispatchMediator(gestureEvent)
 {
diff --git a/sky/engine/core/events/GestureEvent.h b/sky/engine/core/events/GestureEvent.h
index 0ac314c..9ba35da 100644
--- a/sky/engine/core/events/GestureEvent.h
+++ b/sky/engine/core/events/GestureEvent.h
@@ -45,8 +45,6 @@
     float deltaX() const { return m_deltaX; }
     float deltaY() const { return m_deltaY; }
 
-    virtual void trace(Visitor*) override;
-
 private:
     GestureEvent();
     GestureEvent(const AtomicString& type, PassRefPtr<AbstractView>, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, float deltaX, float deltaY);
diff --git a/sky/engine/core/events/HashChangeEvent.h b/sky/engine/core/events/HashChangeEvent.h
index 6d039bd..09ab286 100644
--- a/sky/engine/core/events/HashChangeEvent.h
+++ b/sky/engine/core/events/HashChangeEvent.h
@@ -68,8 +68,6 @@
 
     virtual const AtomicString& interfaceName() const override { return EventNames::HashChangeEvent; }
 
-    virtual void trace(Visitor* visitor) override { Event::trace(visitor); }
-
 private:
     HashChangeEvent()
     {
diff --git a/sky/engine/core/events/KeyboardEvent.cpp b/sky/engine/core/events/KeyboardEvent.cpp
index ba75677..99822ee 100644
--- a/sky/engine/core/events/KeyboardEvent.cpp
+++ b/sky/engine/core/events/KeyboardEvent.cpp
@@ -207,11 +207,6 @@
     return keyCode();
 }
 
-void KeyboardEvent::trace(Visitor* visitor)
-{
-    UIEventWithKeyState::trace(visitor);
-}
-
 PassRefPtr<KeyboardEventDispatchMediator> KeyboardEventDispatchMediator::create(PassRefPtr<KeyboardEvent> event)
 {
     return adoptRef(new KeyboardEventDispatchMediator(event));
diff --git a/sky/engine/core/events/KeyboardEvent.h b/sky/engine/core/events/KeyboardEvent.h
index be1bfd5..8eed296 100644
--- a/sky/engine/core/events/KeyboardEvent.h
+++ b/sky/engine/core/events/KeyboardEvent.h
@@ -99,8 +99,6 @@
     virtual bool isKeyboardEvent() const override;
     virtual int which() const override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     KeyboardEvent();
     KeyboardEvent(const PlatformKeyboardEvent&, AbstractView*);
diff --git a/sky/engine/core/events/MouseEvent.cpp b/sky/engine/core/events/MouseEvent.cpp
index 700bbcb..08f8b7a 100644
--- a/sky/engine/core/events/MouseEvent.cpp
+++ b/sky/engine/core/events/MouseEvent.cpp
@@ -184,12 +184,6 @@
     return target() ? target()->toNode() : 0;
 }
 
-void MouseEvent::trace(Visitor* visitor)
-{
-    visitor->trace(m_relatedTarget);
-    MouseRelatedEvent::trace(visitor);
-}
-
 PassRefPtr<SimulatedMouseEvent> SimulatedMouseEvent::create(const AtomicString& eventType, PassRefPtr<AbstractView> view, PassRefPtr<Event> underlyingEvent)
 {
     return adoptRef(new SimulatedMouseEvent(eventType, view, underlyingEvent));
@@ -218,11 +212,6 @@
     }
 }
 
-void SimulatedMouseEvent::trace(Visitor* visitor)
-{
-    MouseEvent::trace(visitor);
-}
-
 PassRefPtr<MouseEventDispatchMediator> MouseEventDispatchMediator::create(PassRefPtr<MouseEvent> mouseEvent, MouseEventType mouseEventType)
 {
     return adoptRef(new MouseEventDispatchMediator(mouseEvent, mouseEventType));
diff --git a/sky/engine/core/events/MouseEvent.h b/sky/engine/core/events/MouseEvent.h
index 39e8c83..46a4136 100644
--- a/sky/engine/core/events/MouseEvent.h
+++ b/sky/engine/core/events/MouseEvent.h
@@ -91,8 +91,6 @@
     virtual bool isDragEvent() const override final;
     virtual int which() const override final;
 
-    virtual void trace(Visitor*) override;
-
 protected:
     MouseEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<AbstractView>,
         int detail, int screenX, int screenY, int pageX, int pageY,
@@ -117,8 +115,6 @@
     static PassRefPtr<SimulatedMouseEvent> create(const AtomicString& eventType, PassRefPtr<AbstractView>, PassRefPtr<Event> underlyingEvent);
     virtual ~SimulatedMouseEvent();
 
-    virtual void trace(Visitor*) override;
-
 private:
     SimulatedMouseEvent(const AtomicString& eventType, PassRefPtr<AbstractView>, PassRefPtr<Event> underlyingEvent);
 };
diff --git a/sky/engine/core/events/MouseRelatedEvent.cpp b/sky/engine/core/events/MouseRelatedEvent.cpp
index 8387b04..4713862 100644
--- a/sky/engine/core/events/MouseRelatedEvent.cpp
+++ b/sky/engine/core/events/MouseRelatedEvent.cpp
@@ -189,9 +189,4 @@
     return m_clientLocation.y();
 }
 
-void MouseRelatedEvent::trace(Visitor* visitor)
-{
-    UIEventWithKeyState::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/events/MouseRelatedEvent.h b/sky/engine/core/events/MouseRelatedEvent.h
index c5548df..4b24bfd 100644
--- a/sky/engine/core/events/MouseRelatedEvent.h
+++ b/sky/engine/core/events/MouseRelatedEvent.h
@@ -58,8 +58,6 @@
         const LayoutPoint& absoluteLocation() const { return m_absoluteLocation; }
         void setAbsoluteLocation(const LayoutPoint& p) { m_absoluteLocation = p; }
 
-        virtual void trace(Visitor*) override;
-
     protected:
         MouseRelatedEvent();
         MouseRelatedEvent(const AtomicString& type, bool canBubble, bool cancelable,
diff --git a/sky/engine/core/events/NodeEventContext.cpp b/sky/engine/core/events/NodeEventContext.cpp
index 5cd97f4..8dec3d0 100644
--- a/sky/engine/core/events/NodeEventContext.cpp
+++ b/sky/engine/core/events/NodeEventContext.cpp
@@ -44,13 +44,6 @@
     ASSERT(m_node);
 }
 
-void NodeEventContext::trace(Visitor* visitor)
-{
-    visitor->trace(m_node);
-    visitor->trace(m_currentTarget);
-    visitor->trace(m_treeScopeEventContext);
-}
-
 void NodeEventContext::handleLocalEvents(Event* event) const
 {
     if (touchEventContext()) {
diff --git a/sky/engine/core/events/NodeEventContext.h b/sky/engine/core/events/NodeEventContext.h
index 3326716..4cb667e 100644
--- a/sky/engine/core/events/NodeEventContext.h
+++ b/sky/engine/core/events/NodeEventContext.h
@@ -43,7 +43,6 @@
 public:
     // FIXME: Use ContainerNode instead of Node.
     NodeEventContext(PassRefPtr<Node>, PassRefPtr<EventTarget> currentTarget);
-    void trace(Visitor*);
 
     Node* node() const { return m_node.get(); }
 
diff --git a/sky/engine/core/events/PageTransitionEvent.cpp b/sky/engine/core/events/PageTransitionEvent.cpp
index 2d48bb8..7cd93e2 100644
--- a/sky/engine/core/events/PageTransitionEvent.cpp
+++ b/sky/engine/core/events/PageTransitionEvent.cpp
@@ -59,9 +59,4 @@
     return EventNames::PageTransitionEvent;
 }
 
-void PageTransitionEvent::trace(Visitor* visitor)
-{
-    Event::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/events/PageTransitionEvent.h b/sky/engine/core/events/PageTransitionEvent.h
index d5f1309..057902d 100644
--- a/sky/engine/core/events/PageTransitionEvent.h
+++ b/sky/engine/core/events/PageTransitionEvent.h
@@ -58,8 +58,6 @@
 
     bool persisted() const { return m_persisted; }
 
-    virtual void trace(Visitor*) override;
-
 private:
     PageTransitionEvent();
     PageTransitionEvent(const AtomicString& type, bool persisted);
diff --git a/sky/engine/core/events/PopStateEvent.cpp b/sky/engine/core/events/PopStateEvent.cpp
index e8b259b..17b2fcb 100644
--- a/sky/engine/core/events/PopStateEvent.cpp
+++ b/sky/engine/core/events/PopStateEvent.cpp
@@ -76,10 +76,4 @@
     return EventNames::PopStateEvent;
 }
 
-void PopStateEvent::trace(Visitor* visitor)
-{
-    visitor->trace(m_history);
-    Event::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/events/PopStateEvent.h b/sky/engine/core/events/PopStateEvent.h
index dd43d33..a38b64e 100644
--- a/sky/engine/core/events/PopStateEvent.h
+++ b/sky/engine/core/events/PopStateEvent.h
@@ -55,8 +55,6 @@
 
     virtual const AtomicString& interfaceName() const override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     PopStateEvent();
     PopStateEvent(const AtomicString&, const PopStateEventInit&);
diff --git a/sky/engine/core/events/ProgressEvent.cpp b/sky/engine/core/events/ProgressEvent.cpp
index 184cc33..70adab5 100644
--- a/sky/engine/core/events/ProgressEvent.cpp
+++ b/sky/engine/core/events/ProgressEvent.cpp
@@ -63,9 +63,4 @@
     return EventNames::ProgressEvent;
 }
 
-void ProgressEvent::trace(Visitor* visitor)
-{
-    Event::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/events/ProgressEvent.h b/sky/engine/core/events/ProgressEvent.h
index d9b6bf0..107e629 100644
--- a/sky/engine/core/events/ProgressEvent.h
+++ b/sky/engine/core/events/ProgressEvent.h
@@ -60,8 +60,6 @@
 
     virtual const AtomicString& interfaceName() const override;
 
-    virtual void trace(Visitor*) override;
-
 protected:
     ProgressEvent();
     ProgressEvent(const AtomicString& type, bool lengthComputable, unsigned long long loaded, unsigned long long total);
diff --git a/sky/engine/core/events/ResourceProgressEvent.cpp b/sky/engine/core/events/ResourceProgressEvent.cpp
index 49291c5..792762a 100644
--- a/sky/engine/core/events/ResourceProgressEvent.cpp
+++ b/sky/engine/core/events/ResourceProgressEvent.cpp
@@ -49,9 +49,4 @@
     return EventNames::ResourceProgressEvent;
 }
 
-void ResourceProgressEvent::trace(Visitor* visitor)
-{
-    ProgressEvent::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/events/ResourceProgressEvent.h b/sky/engine/core/events/ResourceProgressEvent.h
index 1d11533..120342e 100644
--- a/sky/engine/core/events/ResourceProgressEvent.h
+++ b/sky/engine/core/events/ResourceProgressEvent.h
@@ -58,8 +58,6 @@
 
     virtual const AtomicString& interfaceName() const override;
 
-    virtual void trace(Visitor*) override;
-
 protected:
     ResourceProgressEvent();
     ResourceProgressEvent(const AtomicString& type, bool lengthComputable, unsigned long long loaded, unsigned long long total, const String& url);
diff --git a/sky/engine/core/events/TextEvent.cpp b/sky/engine/core/events/TextEvent.cpp
index 612792e..fbd9591 100644
--- a/sky/engine/core/events/TextEvent.cpp
+++ b/sky/engine/core/events/TextEvent.cpp
@@ -103,10 +103,4 @@
     return EventNames::TextEvent;
 }
 
-void TextEvent::trace(Visitor* visitor)
-{
-    visitor->trace(m_pastingFragment);
-    UIEvent::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/events/TextEvent.h b/sky/engine/core/events/TextEvent.h
index 6e192a9..3031d0e 100644
--- a/sky/engine/core/events/TextEvent.h
+++ b/sky/engine/core/events/TextEvent.h
@@ -60,8 +60,6 @@
     bool shouldMatchStyle() const { return m_shouldMatchStyle; }
     DocumentFragment* pastingFragment() const { return m_pastingFragment.get(); }
 
-    virtual void trace(Visitor*) override;
-
 private:
     TextEvent();
 
diff --git a/sky/engine/core/events/TouchEvent.cpp b/sky/engine/core/events/TouchEvent.cpp
index eeaea5f..3e17a54 100644
--- a/sky/engine/core/events/TouchEvent.cpp
+++ b/sky/engine/core/events/TouchEvent.cpp
@@ -101,13 +101,6 @@
             "Ignored attempt to cancel a " + type() + " event with cancelable=false, for example because scrolling is in progress and cannot be interrupted."));
     }
 }
-void TouchEvent::trace(Visitor* visitor)
-{
-    visitor->trace(m_touches);
-    visitor->trace(m_targetTouches);
-    visitor->trace(m_changedTouches);
-    UIEventWithKeyState::trace(visitor);
-}
 
 PassRefPtr<TouchEventDispatchMediator> TouchEventDispatchMediator::create(PassRefPtr<TouchEvent> touchEvent)
 {
diff --git a/sky/engine/core/events/TouchEvent.h b/sky/engine/core/events/TouchEvent.h
index 64e7d1b..7fcd891 100644
--- a/sky/engine/core/events/TouchEvent.h
+++ b/sky/engine/core/events/TouchEvent.h
@@ -71,8 +71,6 @@
 
     virtual void preventDefault() override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     TouchEvent();
     TouchEvent(TouchList* touches, TouchList* targetTouches,
diff --git a/sky/engine/core/events/TouchEventContext.cpp b/sky/engine/core/events/TouchEventContext.cpp
index 9df9b61..f821325 100644
--- a/sky/engine/core/events/TouchEventContext.cpp
+++ b/sky/engine/core/events/TouchEventContext.cpp
@@ -56,11 +56,4 @@
     touchEvent->setChangedTouches(m_changedTouches);
 }
 
-void TouchEventContext::trace(Visitor* visitor)
-{
-    visitor->trace(m_touches);
-    visitor->trace(m_targetTouches);
-    visitor->trace(m_changedTouches);
-}
-
 }
diff --git a/sky/engine/core/events/TouchEventContext.h b/sky/engine/core/events/TouchEventContext.h
index 0d59024..b16db7e 100644
--- a/sky/engine/core/events/TouchEventContext.h
+++ b/sky/engine/core/events/TouchEventContext.h
@@ -46,8 +46,6 @@
     TouchList& targetTouches() { return *m_targetTouches; }
     TouchList& changedTouches() { return *m_changedTouches; }
 
-    void trace(Visitor*);
-
 private:
     TouchEventContext();
 
diff --git a/sky/engine/core/events/TransitionEvent.cpp b/sky/engine/core/events/TransitionEvent.cpp
index 4e1f8f1..63a3a3c 100644
--- a/sky/engine/core/events/TransitionEvent.cpp
+++ b/sky/engine/core/events/TransitionEvent.cpp
@@ -72,9 +72,4 @@
     return EventNames::TransitionEvent;
 }
 
-void TransitionEvent::trace(Visitor* visitor)
-{
-    Event::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/events/TransitionEvent.h b/sky/engine/core/events/TransitionEvent.h
index c563984..a67f2d5 100644
--- a/sky/engine/core/events/TransitionEvent.h
+++ b/sky/engine/core/events/TransitionEvent.h
@@ -61,8 +61,6 @@
 
     virtual const AtomicString& interfaceName() const override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     TransitionEvent();
     TransitionEvent(const AtomicString& type, const String& propertyName, double elapsedTime);
diff --git a/sky/engine/core/events/TreeScopeEventContext.cpp b/sky/engine/core/events/TreeScopeEventContext.cpp
index 7f34522bfe..c0814e7 100644
--- a/sky/engine/core/events/TreeScopeEventContext.cpp
+++ b/sky/engine/core/events/TreeScopeEventContext.cpp
@@ -73,18 +73,6 @@
 
 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(TreeScopeEventContext)
 
-void TreeScopeEventContext::trace(Visitor* visitor)
-{
-    visitor->trace(m_treeScope);
-    visitor->trace(m_target);
-    visitor->trace(m_relatedTarget);
-    visitor->trace(m_eventPath);
-    visitor->trace(m_touchEventContext);
-#if ENABLE(OILPAN)
-    visitor->trace(m_children);
-#endif
-}
-
 int TreeScopeEventContext::calculatePrePostOrderNumber(int orderNumber)
 {
     m_preOrder = orderNumber;
diff --git a/sky/engine/core/events/TreeScopeEventContext.h b/sky/engine/core/events/TreeScopeEventContext.h
index 33c5e8b..e8dc694 100644
--- a/sky/engine/core/events/TreeScopeEventContext.h
+++ b/sky/engine/core/events/TreeScopeEventContext.h
@@ -48,7 +48,6 @@
     DECLARE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(TreeScopeEventContext);
 public:
     static PassRefPtr<TreeScopeEventContext> create(TreeScope&);
-    void trace(Visitor*);
 
     TreeScope& treeScope() const { return *m_treeScope; }
 
diff --git a/sky/engine/core/events/UIEvent.cpp b/sky/engine/core/events/UIEvent.cpp
index 7f34522bfb..97f3b18 100644
--- a/sky/engine/core/events/UIEvent.cpp
+++ b/sky/engine/core/events/UIEvent.cpp
@@ -111,10 +111,4 @@
     return 0;
 }
 
-void UIEvent::trace(Visitor* visitor)
-{
-    visitor->trace(m_view);
-    Event::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/events/UIEvent.h b/sky/engine/core/events/UIEvent.h
index f70ee58..2e4ad3c 100644
--- a/sky/engine/core/events/UIEvent.h
+++ b/sky/engine/core/events/UIEvent.h
@@ -75,8 +75,6 @@
 
     virtual int which() const;
 
-    virtual void trace(Visitor*) override;
-
 protected:
     UIEvent();
     UIEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<AbstractView>, int detail);
diff --git a/sky/engine/core/events/WheelEvent.cpp b/sky/engine/core/events/WheelEvent.cpp
index c1d55fb..8496ecd 100644
--- a/sky/engine/core/events/WheelEvent.cpp
+++ b/sky/engine/core/events/WheelEvent.cpp
@@ -86,11 +86,6 @@
     return true;
 }
 
-void WheelEvent::trace(Visitor* visitor)
-{
-    MouseEvent::trace(visitor);
-}
-
 inline static unsigned deltaMode(const PlatformWheelEvent& event)
 {
     return event.granularity() == ScrollByPageWheelEvent ? WheelEvent::DOM_DELTA_PAGE : WheelEvent::DOM_DELTA_PIXEL;
diff --git a/sky/engine/core/events/WheelEvent.h b/sky/engine/core/events/WheelEvent.h
index d0c7b8f..25c78d2 100644
--- a/sky/engine/core/events/WheelEvent.h
+++ b/sky/engine/core/events/WheelEvent.h
@@ -88,8 +88,6 @@
     virtual bool isMouseEvent() const override;
     virtual bool isWheelEvent() const override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     WheelEvent();
     WheelEvent(const AtomicString&, const WheelEventInit&);
diff --git a/sky/engine/core/fetch/FontResource.cpp b/sky/engine/core/fetch/FontResource.cpp
index f4fb3c9..13f5243 100644
--- a/sky/engine/core/fetch/FontResource.cpp
+++ b/sky/engine/core/fetch/FontResource.cpp
@@ -79,11 +79,6 @@
 {
 }
 
-void FontResource::trace(Visitor* visitor)
-{
-    Resource::trace(visitor);
-}
-
 void FontResource::didScheduleLoad()
 {
     if (m_state == Unloaded)
diff --git a/sky/engine/core/fetch/FontResource.h b/sky/engine/core/fetch/FontResource.h
index ccf7a95..1e9ba5c 100644
--- a/sky/engine/core/fetch/FontResource.h
+++ b/sky/engine/core/fetch/FontResource.h
@@ -47,7 +47,6 @@
 
     FontResource(const ResourceRequest&);
     virtual ~FontResource();
-    virtual void trace(Visitor*) override;
 
     virtual void load(ResourceFetcher*, const ResourceLoaderOptions&) override;
 
diff --git a/sky/engine/core/fetch/MemoryCache.cpp b/sky/engine/core/fetch/MemoryCache.cpp
index 6c904b8..c373578 100644
--- a/sky/engine/core/fetch/MemoryCache.cpp
+++ b/sky/engine/core/fetch/MemoryCache.cpp
@@ -63,20 +63,6 @@
     return oldCache.release();
 }
 
-void MemoryCacheEntry::trace(Visitor* visitor)
-{
-    visitor->trace(m_previousInLiveResourcesList);
-    visitor->trace(m_nextInLiveResourcesList);
-    visitor->trace(m_previousInAllResourcesList);
-    visitor->trace(m_nextInAllResourcesList);
-}
-
-void MemoryCacheLRUList::trace(Visitor* visitor)
-{
-    visitor->trace(m_head);
-    visitor->trace(m_tail);
-}
-
 inline MemoryCache::MemoryCache()
     : m_inPruneResources(false)
     , m_maxPruneDeferralDelay(cMaxPruneDeferralDelay)
@@ -107,17 +93,6 @@
 {
 }
 
-void MemoryCache::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_allResources);
-    for (size_t i = 0; i < WTF_ARRAY_LENGTH(m_liveDecodedResources); ++i)
-        visitor->trace(m_liveDecodedResources[i]);
-    visitor->trace(m_resources);
-    visitor->trace(m_liveResources);
-#endif
-}
-
 KURL MemoryCache::removeFragmentIdentifierIfNeeded(const KURL& originalURL)
 {
     if (!originalURL.hasFragmentIdentifier())
diff --git a/sky/engine/core/fetch/MemoryCache.h b/sky/engine/core/fetch/MemoryCache.h
index b8a0352..be81f34 100644
--- a/sky/engine/core/fetch/MemoryCache.h
+++ b/sky/engine/core/fetch/MemoryCache.h
@@ -77,7 +77,6 @@
 class MemoryCacheEntry final {
 public:
     static PassOwnPtr<MemoryCacheEntry> create(Resource* resource) { return adoptPtr(new MemoryCacheEntry(resource)); }
-    void trace(Visitor*);
 
     ResourcePtr<Resource> m_resource;
     bool m_inLiveDecodedResourcesList;
@@ -115,7 +114,6 @@
     RawPtr<MemoryCacheEntry> m_tail;
 
     MemoryCacheLRUList() : m_head(nullptr), m_tail(nullptr) { }
-    void trace(Visitor*);
 };
 
 }
@@ -129,7 +127,6 @@
 public:
     static PassOwnPtr<MemoryCache> create();
     ~MemoryCache();
-    void trace(Visitor*);
 
     struct TypeStatistic {
         int count;
diff --git a/sky/engine/core/fetch/Resource.cpp b/sky/engine/core/fetch/Resource.cpp
index c632c79..f3abc4c 100644
--- a/sky/engine/core/fetch/Resource.cpp
+++ b/sky/engine/core/fetch/Resource.cpp
@@ -153,13 +153,6 @@
 {
 }
 
-void Resource::trace(Visitor* visitor)
-{
-    visitor->trace(m_loader);
-    visitor->trace(m_resourceToRevalidate);
-    visitor->trace(m_proxyResource);
-}
-
 void Resource::failBeforeStarting()
 {
     WTF_LOG(ResourceLoading, "Cannot start loading '%s'", url().string().latin1().data());
diff --git a/sky/engine/core/fetch/Resource.h b/sky/engine/core/fetch/Resource.h
index 706f6d1..6812056 100644
--- a/sky/engine/core/fetch/Resource.h
+++ b/sky/engine/core/fetch/Resource.h
@@ -85,7 +85,6 @@
 public:
 #endif
     virtual void dispose();
-    virtual void trace(Visitor*);
     static unsigned instanceCount() { return s_instanceCount; }
 
     virtual void load(ResourceFetcher*, const ResourceLoaderOptions&);
diff --git a/sky/engine/core/fetch/ResourceLoader.cpp b/sky/engine/core/fetch/ResourceLoader.cpp
index d18a656..f9b87dc 100644
--- a/sky/engine/core/fetch/ResourceLoader.cpp
+++ b/sky/engine/core/fetch/ResourceLoader.cpp
@@ -90,12 +90,6 @@
     ASSERT(m_state == Terminated);
 }
 
-void ResourceLoader::trace(Visitor* visitor)
-{
-    visitor->trace(m_host);
-    visitor->trace(m_resource);
-}
-
 void ResourceLoader::releaseResources()
 {
     ASSERT(m_state != Terminated);
diff --git a/sky/engine/core/fetch/ResourceLoader.h b/sky/engine/core/fetch/ResourceLoader.h
index 2c4bd27..31d5363 100644
--- a/sky/engine/core/fetch/ResourceLoader.h
+++ b/sky/engine/core/fetch/ResourceLoader.h
@@ -48,7 +48,6 @@
 public:
     static PassRefPtr<ResourceLoader> create(ResourceLoaderHost*, Resource*, const ResourceRequest&, const ResourceLoaderOptions&);
     virtual ~ResourceLoader();
-    void trace(Visitor*);
 
     void start();
 
diff --git a/sky/engine/core/fetch/ResourceLoaderHost.h b/sky/engine/core/fetch/ResourceLoaderHost.h
index 207535c..e189791 100644
--- a/sky/engine/core/fetch/ResourceLoaderHost.h
+++ b/sky/engine/core/fetch/ResourceLoaderHost.h
@@ -67,8 +67,6 @@
 
     virtual bool isLoadedBy(ResourceLoaderHost*) const = 0;
 
-    virtual void trace(Visitor*) { }
-
 #if !ENABLE(OILPAN)
     virtual void refResourceLoaderHost() = 0;
     virtual void derefResourceLoaderHost() = 0;
diff --git a/sky/engine/core/fetch/ResourceLoaderSet.cpp b/sky/engine/core/fetch/ResourceLoaderSet.cpp
index bb2b8c2..57ee0e7 100644
--- a/sky/engine/core/fetch/ResourceLoaderSet.cpp
+++ b/sky/engine/core/fetch/ResourceLoaderSet.cpp
@@ -40,13 +40,6 @@
     return adoptPtr(new ResourceLoaderSet);
 }
 
-void ResourceLoaderSet::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_set);
-#endif
-}
-
 void ResourceLoaderSet::cancelAll()
 {
     Vector<RefPtr<ResourceLoader> > loadersCopy;
diff --git a/sky/engine/core/fetch/ResourceLoaderSet.h b/sky/engine/core/fetch/ResourceLoaderSet.h
index 936d661..ce9195b 100644
--- a/sky/engine/core/fetch/ResourceLoaderSet.h
+++ b/sky/engine/core/fetch/ResourceLoaderSet.h
@@ -41,7 +41,6 @@
     typedef HashSet<RefPtr<ResourceLoader> > SetType;
 
     static PassOwnPtr<ResourceLoaderSet> create();
-    void trace(Visitor*);
 
     void add(const RefPtr<ResourceLoader>& loader) { m_set.add(loader); }
     void remove(const RefPtr<ResourceLoader>& loader) { m_set.remove(loader); }
diff --git a/sky/engine/core/frame/Console.h b/sky/engine/core/frame/Console.h
index 8971a3e..aace58c 100644
--- a/sky/engine/core/frame/Console.h
+++ b/sky/engine/core/frame/Console.h
@@ -54,8 +54,6 @@
 
     PassRefPtr<MemoryInfo> memory() const;
 
-    virtual void trace(Visitor* visitor) override { ConsoleBase::trace(visitor); }
-
 protected:
     virtual ExecutionContext* context() override;
     virtual void reportMessageToConsole(PassRefPtr<ConsoleMessage>) override;
diff --git a/sky/engine/core/frame/ConsoleBase.h b/sky/engine/core/frame/ConsoleBase.h
index 18dee3b..f3559c6 100644
--- a/sky/engine/core/frame/ConsoleBase.h
+++ b/sky/engine/core/frame/ConsoleBase.h
@@ -74,8 +74,6 @@
     void groupCollapsed(ScriptState*, PassRefPtr<ScriptArguments>);
     void groupEnd();
 
-    virtual void trace(Visitor*) { }
-
     virtual ~ConsoleBase();
 
 protected:
diff --git a/sky/engine/core/frame/FrameConsole.cpp b/sky/engine/core/frame/FrameConsole.cpp
index ce351e5..b59a8d3 100644
--- a/sky/engine/core/frame/FrameConsole.cpp
+++ b/sky/engine/core/frame/FrameConsole.cpp
@@ -170,9 +170,4 @@
     messageStorage()->clear();
 }
 
-void FrameConsole::trace(Visitor* visitor)
-{
-    visitor->trace(m_consoleMessageStorage);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/frame/FrameConsole.h b/sky/engine/core/frame/FrameConsole.h
index b2d9d4e..60b76c3 100644
--- a/sky/engine/core/frame/FrameConsole.h
+++ b/sky/engine/core/frame/FrameConsole.h
@@ -66,8 +66,6 @@
     ConsoleMessageStorage* messageStorage();
     void clearMessages();
 
-    void trace(Visitor*);
-
 private:
     explicit FrameConsole(LocalFrame&);
 
diff --git a/sky/engine/core/frame/FrameHost.cpp b/sky/engine/core/frame/FrameHost.cpp
index 2ca340c..6dfc42a 100644
--- a/sky/engine/core/frame/FrameHost.cpp
+++ b/sky/engine/core/frame/FrameHost.cpp
@@ -73,9 +73,4 @@
     return m_page->deviceScaleFactor();
 }
 
-void FrameHost::trace(Visitor* visitor)
-{
-    visitor->trace(m_page);
-}
-
 }
diff --git a/sky/engine/core/frame/FrameHost.h b/sky/engine/core/frame/FrameHost.h
index 6b59b89..0089a0a 100644
--- a/sky/engine/core/frame/FrameHost.h
+++ b/sky/engine/core/frame/FrameHost.h
@@ -74,8 +74,6 @@
     // This value does not account for Page zoom, use LocalFrame::devicePixelRatio instead.
     float deviceScaleFactor() const;
 
-    void trace(Visitor*);
-
 private:
     FrameHost(Page&, ServiceProvider&);
 
diff --git a/sky/engine/core/frame/History.h b/sky/engine/core/frame/History.h
index a616c67..a4b1fc4 100644
--- a/sky/engine/core/frame/History.h
+++ b/sky/engine/core/frame/History.h
@@ -62,8 +62,6 @@
 
     void stateObjectAdded(PassRefPtr<SerializedScriptValue>, const String& title, const String& url, FrameLoadType, ExceptionState&);
 
-    void trace(Visitor*) { }
-
 private:
     explicit History(LocalFrame*);
 
diff --git a/sky/engine/core/frame/ImageBitmap.cpp b/sky/engine/core/frame/ImageBitmap.cpp
index 7414b4e..2cd85f8 100644
--- a/sky/engine/core/frame/ImageBitmap.cpp
+++ b/sky/engine/core/frame/ImageBitmap.cpp
@@ -186,10 +186,4 @@
     return FloatSize(width(), height());
 }
 
-void ImageBitmap::trace(Visitor* visitor)
-{
-    visitor->trace(m_imageElement);
-    ImageLoaderClient::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/frame/ImageBitmap.h b/sky/engine/core/frame/ImageBitmap.h
index 953ca59..602021c 100644
--- a/sky/engine/core/frame/ImageBitmap.h
+++ b/sky/engine/core/frame/ImageBitmap.h
@@ -44,8 +44,6 @@
     virtual void adjustDrawRects(FloatRect* srcRect, FloatRect* dstRect) const override;
     virtual FloatSize sourceSize() const override;
 
-    virtual void trace(Visitor*);
-
 private:
     ImageBitmap(HTMLImageElement*, const IntRect&);
     ImageBitmap(HTMLCanvasElement*, const IntRect&);
diff --git a/sky/engine/core/frame/Location.h b/sky/engine/core/frame/Location.h
index c88d5b1..f527ba5 100644
--- a/sky/engine/core/frame/Location.h
+++ b/sky/engine/core/frame/Location.h
@@ -76,8 +76,6 @@
 
     PassRefPtr<DOMStringList> ancestorOrigins() const;
 
-    void trace(Visitor*) { }
-
 private:
     explicit Location(LocalFrame*);
 
diff --git a/sky/engine/core/html/ClassList.cpp b/sky/engine/core/html/ClassList.cpp
index 066cb91..35e32c1 100644
--- a/sky/engine/core/html/ClassList.cpp
+++ b/sky/engine/core/html/ClassList.cpp
@@ -66,10 +66,4 @@
     return m_element->classNames();
 }
 
-void ClassList::trace(Visitor* visitor)
-{
-    visitor->trace(m_element);
-    DOMTokenList::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/html/ClassList.h b/sky/engine/core/html/ClassList.h
index e098ec2..d5384f8 100644
--- a/sky/engine/core/html/ClassList.h
+++ b/sky/engine/core/html/ClassList.h
@@ -55,8 +55,6 @@
 
     virtual Element* element() override { return m_element; }
 
-    virtual void trace(Visitor*) override;
-
 private:
     explicit ClassList(Element*);
 
diff --git a/sky/engine/core/html/HTMLImageElement.cpp b/sky/engine/core/html/HTMLImageElement.cpp
index 428c08c..4bf05c9 100644
--- a/sky/engine/core/html/HTMLImageElement.cpp
+++ b/sky/engine/core/html/HTMLImageElement.cpp
@@ -59,14 +59,8 @@
             m_element->notifyViewportChanged();
     }
 
-#if !ENABLE(OILPAN)
     void clearElement() { m_element = nullptr; }
-#endif
-    virtual void trace(Visitor* visitor) override
-    {
-        visitor->trace(m_element);
-        MediaQueryListListener::trace(visitor);
-    }
+
 private:
     explicit ViewportChangeListener(HTMLImageElement* element) : m_element(element) { }
     RawPtr<HTMLImageElement> m_element;
@@ -102,13 +96,6 @@
 #endif
 }
 
-void HTMLImageElement::trace(Visitor* visitor)
-{
-    visitor->trace(m_imageLoader);
-    visitor->trace(m_listener);
-    HTMLElement::trace(visitor);
-}
-
 void HTMLImageElement::notifyViewportChanged()
 {
     // Re-selecting the source URL in order to pick a more fitting resource
diff --git a/sky/engine/core/html/HTMLImageElement.h b/sky/engine/core/html/HTMLImageElement.h
index 13dfd41..fc04974 100644
--- a/sky/engine/core/html/HTMLImageElement.h
+++ b/sky/engine/core/html/HTMLImageElement.h
@@ -45,7 +45,6 @@
     static PassRefPtr<HTMLImageElement> createForJSConstructor(Document&, int width, int height);
 
     virtual ~HTMLImageElement();
-    virtual void trace(Visitor*) override;
 
     int width(bool ignorePendingStylesheets = false);
     int height(bool ignorePendingStylesheets = false);
diff --git a/sky/engine/core/html/HTMLStyleElement.cpp b/sky/engine/core/html/HTMLStyleElement.cpp
index 200a133..8b78645 100644
--- a/sky/engine/core/html/HTMLStyleElement.cpp
+++ b/sky/engine/core/html/HTMLStyleElement.cpp
@@ -127,10 +127,4 @@
     return &document();
 }
 
-void HTMLStyleElement::trace(Visitor* visitor)
-{
-    StyleElement::trace(visitor);
-    HTMLElement::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/html/HTMLStyleElement.h b/sky/engine/core/html/HTMLStyleElement.h
index 7e6dc42..3793e00 100644
--- a/sky/engine/core/html/HTMLStyleElement.h
+++ b/sky/engine/core/html/HTMLStyleElement.h
@@ -43,8 +43,6 @@
 
     using StyleElement::sheet;
 
-    virtual void trace(Visitor*) override;
-
 private:
     HTMLStyleElement(Document&, bool createdByParser);
 
diff --git a/sky/engine/core/html/HTMLTemplateElement.cpp b/sky/engine/core/html/HTMLTemplateElement.cpp
index 5a7dffe..20b5a28 100644
--- a/sky/engine/core/html/HTMLTemplateElement.cpp
+++ b/sky/engine/core/html/HTMLTemplateElement.cpp
@@ -80,10 +80,4 @@
     document().ensureTemplateDocument().adoptIfNeeded(*m_content);
 }
 
-void HTMLTemplateElement::trace(Visitor* visitor)
-{
-    visitor->trace(m_content);
-    HTMLElement::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/html/HTMLTemplateElement.h b/sky/engine/core/html/HTMLTemplateElement.h
index ccaae5a..fce2e9c 100644
--- a/sky/engine/core/html/HTMLTemplateElement.h
+++ b/sky/engine/core/html/HTMLTemplateElement.h
@@ -43,7 +43,6 @@
 public:
     DECLARE_NODE_FACTORY(HTMLTemplateElement);
     virtual ~HTMLTemplateElement();
-    virtual void trace(Visitor*) override;
 
     DocumentFragment* content() const;
 
diff --git a/sky/engine/core/html/ImageData.h b/sky/engine/core/html/ImageData.h
index 1d9a955..ac22b43 100644
--- a/sky/engine/core/html/ImageData.h
+++ b/sky/engine/core/html/ImageData.h
@@ -53,8 +53,6 @@
     int height() const { return m_size.height(); }
     Uint8ClampedArray* data() const { return m_data.get(); }
 
-    void trace(Visitor*) { }
-
     virtual v8::Handle<v8::Object> wrap(v8::Handle<v8::Object> creationContext, v8::Isolate*) override;
 
 private:
diff --git a/sky/engine/core/html/TextMetrics.h b/sky/engine/core/html/TextMetrics.h
index 03be7f4..f33221c 100644
--- a/sky/engine/core/html/TextMetrics.h
+++ b/sky/engine/core/html/TextMetrics.h
@@ -74,8 +74,6 @@
     float ideographicBaseline() const { return m_ideographicBaseline; }
     void setIdeographicBaseline(float ideographicBaseline) { m_ideographicBaseline = ideographicBaseline; }
 
-    void trace(Visitor*) { }
-
 private:
     TextMetrics()
         : m_width(0)
diff --git a/sky/engine/core/html/VoidCallback.h b/sky/engine/core/html/VoidCallback.h
index 70cc895..c07a6d5 100644
--- a/sky/engine/core/html/VoidCallback.h
+++ b/sky/engine/core/html/VoidCallback.h
@@ -33,7 +33,6 @@
 class VoidCallback {
 public:
     virtual ~VoidCallback() { }
-    virtual void trace(Visitor*) { }
     virtual void handleEvent() = 0;
 };
 
diff --git a/sky/engine/core/html/canvas/CanvasContextAttributes.h b/sky/engine/core/html/canvas/CanvasContextAttributes.h
index d78db19..556976f 100644
--- a/sky/engine/core/html/canvas/CanvasContextAttributes.h
+++ b/sky/engine/core/html/canvas/CanvasContextAttributes.h
@@ -38,7 +38,6 @@
 class CanvasContextAttributes : public RefCounted<CanvasContextAttributes> {
     DECLARE_EMPTY_VIRTUAL_DESTRUCTOR_WILL_BE_REMOVED(CanvasContextAttributes);
 public:
-    virtual void trace(Visitor*) { }
 
 protected:
     CanvasContextAttributes();
diff --git a/sky/engine/core/html/canvas/CanvasGradient.h b/sky/engine/core/html/canvas/CanvasGradient.h
index 30a246f..376833d 100644
--- a/sky/engine/core/html/canvas/CanvasGradient.h
+++ b/sky/engine/core/html/canvas/CanvasGradient.h
@@ -54,8 +54,6 @@
 
     void addColorStop(float value, const String& color, ExceptionState&);
 
-    void trace(Visitor*) { }
-
 private:
     CanvasGradient(const FloatPoint& p0, const FloatPoint& p1);
     CanvasGradient(const FloatPoint& p0, float r0, const FloatPoint& p1, float r1);
diff --git a/sky/engine/core/html/canvas/CanvasPattern.h b/sky/engine/core/html/canvas/CanvasPattern.h
index 3e48e42..4f6b49f 100644
--- a/sky/engine/core/html/canvas/CanvasPattern.h
+++ b/sky/engine/core/html/canvas/CanvasPattern.h
@@ -49,8 +49,6 @@
 
     Pattern* pattern() const { return m_pattern.get(); }
 
-    void trace(Visitor*) { }
-
 private:
     CanvasPattern(PassRefPtr<Image>, Pattern::RepeatMode);
 
diff --git a/sky/engine/core/html/canvas/CanvasRenderingContext.h b/sky/engine/core/html/canvas/CanvasRenderingContext.h
index 1fcbcbe..e3b412a 100644
--- a/sky/engine/core/html/canvas/CanvasRenderingContext.h
+++ b/sky/engine/core/html/canvas/CanvasRenderingContext.h
@@ -64,8 +64,6 @@
 
     virtual blink::WebLayer* platformLayer() const { return 0; }
 
-    virtual void trace(Visitor* visitor) { visitor->trace(m_canvas); }
-
 protected:
     CanvasRenderingContext(HTMLCanvasElement*);
 
diff --git a/sky/engine/core/html/canvas/CanvasRenderingContext2D.cpp b/sky/engine/core/html/canvas/CanvasRenderingContext2D.cpp
index 18467c3..53657df 100644
--- a/sky/engine/core/html/canvas/CanvasRenderingContext2D.cpp
+++ b/sky/engine/core/html/canvas/CanvasRenderingContext2D.cpp
@@ -161,16 +161,6 @@
     }
 }
 
-void CanvasRenderingContext2D::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_stateStack);
-    visitor->trace(m_fetchedFonts);
-    visitor->trace(m_hitRegionManager);
-#endif
-    CanvasRenderingContext::trace(visitor);
-}
-
 void CanvasRenderingContext2D::dispatchContextLostEvent(Timer<CanvasRenderingContext2D>*)
 {
     if (contextLostRestoredEventsEnabled()) {
@@ -354,13 +344,6 @@
     m_font.update(fontSelector);
 }
 
-void CanvasRenderingContext2D::State::trace(Visitor* visitor)
-{
-    visitor->trace(m_strokeStyle);
-    visitor->trace(m_fillStyle);
-    CSSFontSelectorClient::trace(visitor);
-}
-
 void CanvasRenderingContext2D::realizeSaves(GraphicsContext* context)
 {
     validateStateStack();
diff --git a/sky/engine/core/html/canvas/CanvasRenderingContext2D.h b/sky/engine/core/html/canvas/CanvasRenderingContext2D.h
index 85ee610..59ceafc 100644
--- a/sky/engine/core/html/canvas/CanvasRenderingContext2D.h
+++ b/sky/engine/core/html/canvas/CanvasRenderingContext2D.h
@@ -234,8 +234,6 @@
     void loseContext();
     void restoreContext();
 
-    virtual void trace(Visitor*) override;
-
 private:
     enum Direction {
         DirectionInherit,
@@ -254,8 +252,6 @@
         // CSSFontSelectorClient implementation
         virtual void fontsNeedUpdate(CSSFontSelector*) override;
 
-        virtual void trace(Visitor*) override;
-
         unsigned m_unrealizedSaveCount;
 
         String m_unparsedStrokeColor;
diff --git a/sky/engine/core/html/canvas/CanvasStyle.cpp b/sky/engine/core/html/canvas/CanvasStyle.cpp
index c8576e0..788a234 100644
--- a/sky/engine/core/html/canvas/CanvasStyle.cpp
+++ b/sky/engine/core/html/canvas/CanvasStyle.cpp
@@ -272,10 +272,4 @@
     }
 }
 
-void CanvasStyle::trace(Visitor* visitor)
-{
-    visitor->trace(m_gradient);
-    visitor->trace(m_pattern);
-}
-
 }
diff --git a/sky/engine/core/html/canvas/CanvasStyle.h b/sky/engine/core/html/canvas/CanvasStyle.h
index e34c23e..a709a1c 100644
--- a/sky/engine/core/html/canvas/CanvasStyle.h
+++ b/sky/engine/core/html/canvas/CanvasStyle.h
@@ -66,8 +66,6 @@
         bool isEquivalentRGBA(float r, float g, float b, float a) const;
         bool isEquivalentCMYKA(float c, float m, float y, float k, float a) const;
 
-        void trace(Visitor*);
-
     private:
         enum Type { RGBA, CMYKA, Gradient, ImagePattern, CurrentColor, CurrentColorWithOverrideAlpha };
 
diff --git a/sky/engine/core/html/canvas/HitRegion.cpp b/sky/engine/core/html/canvas/HitRegion.cpp
index aa9b27b..99f785f 100644
--- a/sky/engine/core/html/canvas/HitRegion.cpp
+++ b/sky/engine/core/html/canvas/HitRegion.cpp
@@ -31,11 +31,6 @@
     m_path.subtractPath(clearArea);
 }
 
-void HitRegion::trace(Visitor* visitor)
-{
-    visitor->trace(m_control);
-}
-
 void HitRegionManager::addHitRegion(PassRefPtr<HitRegion> passHitRegion)
 {
     RefPtr<HitRegion> hitRegion = passHitRegion;
@@ -133,15 +128,6 @@
     return m_hitRegionList.size();
 }
 
-void HitRegionManager::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_hitRegionList);
-    visitor->trace(m_hitRegionIdMap);
-    visitor->trace(m_hitRegionControlMap);
-#endif
-}
-
 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(HitRegionManager)
 
 } // namespace blink
diff --git a/sky/engine/core/html/canvas/HitRegion.h b/sky/engine/core/html/canvas/HitRegion.h
index 4daf5e0..14a2504 100644
--- a/sky/engine/core/html/canvas/HitRegion.h
+++ b/sky/engine/core/html/canvas/HitRegion.h
@@ -46,8 +46,6 @@
     Element* control() const { return m_control.get(); }
     WindRule fillRule() const { return m_fillRule; }
 
-    void trace(Visitor*);
-
 private:
     explicit HitRegion(const HitRegionOptions&);
 
@@ -77,8 +75,6 @@
 
     unsigned getHitRegionsCount() const;
 
-    void trace(Visitor*);
-
 private:
     HitRegionManager() { }
 
diff --git a/sky/engine/core/html/canvas/Path2D.h b/sky/engine/core/html/canvas/Path2D.h
index 3794f25..6f96bb9 100644
--- a/sky/engine/core/html/canvas/Path2D.h
+++ b/sky/engine/core/html/canvas/Path2D.h
@@ -55,7 +55,6 @@
     }
 
     virtual ~Path2D() { }
-    void trace(Visitor*) { }
 
 private:
     Path2D() : CanvasPathMethods()
diff --git a/sky/engine/core/html/canvas/WebGLActiveInfo.h b/sky/engine/core/html/canvas/WebGLActiveInfo.h
index 1fe4d74..3553678 100644
--- a/sky/engine/core/html/canvas/WebGLActiveInfo.h
+++ b/sky/engine/core/html/canvas/WebGLActiveInfo.h
@@ -45,8 +45,6 @@
     GLenum type() const { return m_type; }
     GLint size() const { return m_size; }
 
-    void trace(Visitor*) { }
-
 private:
     WebGLActiveInfo(const String& name, GLenum type, GLint size)
         : m_name(name)
diff --git a/sky/engine/core/html/canvas/WebGLContextEvent.cpp b/sky/engine/core/html/canvas/WebGLContextEvent.cpp
index bceb93f..12424ab 100644
--- a/sky/engine/core/html/canvas/WebGLContextEvent.cpp
+++ b/sky/engine/core/html/canvas/WebGLContextEvent.cpp
@@ -57,9 +57,4 @@
     return EventNames::WebGLContextEvent;
 }
 
-void WebGLContextEvent::trace(Visitor* visitor)
-{
-    Event::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/html/canvas/WebGLContextEvent.h b/sky/engine/core/html/canvas/WebGLContextEvent.h
index 659ef27..5fb3811 100644
--- a/sky/engine/core/html/canvas/WebGLContextEvent.h
+++ b/sky/engine/core/html/canvas/WebGLContextEvent.h
@@ -58,8 +58,6 @@
 
     virtual const AtomicString& interfaceName() const override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     WebGLContextEvent();
     WebGLContextEvent(const AtomicString& type, bool canBubble, bool cancelable, const String& statusMessage);
diff --git a/sky/engine/core/html/canvas/WebGLExtension.cpp b/sky/engine/core/html/canvas/WebGLExtension.cpp
index 8070663..042be62 100644
--- a/sky/engine/core/html/canvas/WebGLExtension.cpp
+++ b/sky/engine/core/html/canvas/WebGLExtension.cpp
@@ -38,9 +38,4 @@
 {
 }
 
-void WebGLExtension::trace(Visitor* visitor)
-{
-    visitor->trace(m_context);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/html/canvas/WebGLExtension.h b/sky/engine/core/html/canvas/WebGLExtension.h
index 4fd5f72..a48fffd 100644
--- a/sky/engine/core/html/canvas/WebGLExtension.h
+++ b/sky/engine/core/html/canvas/WebGLExtension.h
@@ -54,8 +54,6 @@
         return !m_context;
     }
 
-    virtual void trace(Visitor*);
-
 protected:
     explicit WebGLExtension(WebGLRenderingContextBase*);
 
diff --git a/sky/engine/core/html/canvas/WebGLObject.h b/sky/engine/core/html/canvas/WebGLObject.h
index c054918..cf648d0 100644
--- a/sky/engine/core/html/canvas/WebGLObject.h
+++ b/sky/engine/core/html/canvas/WebGLObject.h
@@ -61,8 +61,6 @@
     // True if this object belongs to the group or context.
     virtual bool validate(const WebGLContextGroup*, const WebGLRenderingContextBase*) const = 0;
 
-    virtual void trace(Visitor*) { }
-
 protected:
     explicit WebGLObject(WebGLRenderingContextBase*);
 
diff --git a/sky/engine/core/html/canvas/WebGLRenderbuffer.cpp b/sky/engine/core/html/canvas/WebGLRenderbuffer.cpp
index e0a8e45..81e73a5 100644
--- a/sky/engine/core/html/canvas/WebGLRenderbuffer.cpp
+++ b/sky/engine/core/html/canvas/WebGLRenderbuffer.cpp
@@ -76,10 +76,4 @@
     m_emulatedStencilBuffer.clear();
 }
 
-void WebGLRenderbuffer::trace(Visitor* visitor)
-{
-    visitor->trace(m_emulatedStencilBuffer);
-    WebGLSharedObject::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/html/canvas/WebGLRenderbuffer.h b/sky/engine/core/html/canvas/WebGLRenderbuffer.h
index 22dab16..001f55d 100644
--- a/sky/engine/core/html/canvas/WebGLRenderbuffer.h
+++ b/sky/engine/core/html/canvas/WebGLRenderbuffer.h
@@ -62,8 +62,6 @@
     WebGLRenderbuffer* emulatedStencilBuffer() const { return m_emulatedStencilBuffer.get(); }
     void deleteEmulatedStencilBuffer(blink::WebGraphicsContext3D* context3d);
 
-    virtual void trace(Visitor*) override;
-
 protected:
     explicit WebGLRenderbuffer(WebGLRenderingContextBase*);
 
diff --git a/sky/engine/core/html/canvas/WebGLRenderingContext.cpp b/sky/engine/core/html/canvas/WebGLRenderingContext.cpp
index c4fe5e3..a769206 100644
--- a/sky/engine/core/html/canvas/WebGLRenderingContext.cpp
+++ b/sky/engine/core/html/canvas/WebGLRenderingContext.cpp
@@ -138,30 +138,4 @@
     registerExtension<WebGLLoseContext>(m_webglLoseContext, ApprovedExtension, bothPrefixes);
 }
 
-void WebGLRenderingContext::trace(Visitor* visitor)
-{
-    visitor->trace(m_angleInstancedArrays);
-    visitor->trace(m_extBlendMinMax);
-    visitor->trace(m_extFragDepth);
-    visitor->trace(m_extShaderTextureLOD);
-    visitor->trace(m_extTextureFilterAnisotropic);
-    visitor->trace(m_oesTextureFloat);
-    visitor->trace(m_oesTextureFloatLinear);
-    visitor->trace(m_oesTextureHalfFloat);
-    visitor->trace(m_oesTextureHalfFloatLinear);
-    visitor->trace(m_oesStandardDerivatives);
-    visitor->trace(m_oesVertexArrayObject);
-    visitor->trace(m_oesElementIndexUint);
-    visitor->trace(m_webglLoseContext);
-    visitor->trace(m_webglDebugRendererInfo);
-    visitor->trace(m_webglDebugShaders);
-    visitor->trace(m_webglDrawBuffers);
-    visitor->trace(m_webglCompressedTextureATC);
-    visitor->trace(m_webglCompressedTextureETC1);
-    visitor->trace(m_webglCompressedTexturePVRTC);
-    visitor->trace(m_webglCompressedTextureS3TC);
-    visitor->trace(m_webglDepthTexture);
-    WebGLRenderingContextBase::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/html/canvas/WebGLRenderingContext.h b/sky/engine/core/html/canvas/WebGLRenderingContext.h
index 65ee90c..b79e634 100644
--- a/sky/engine/core/html/canvas/WebGLRenderingContext.h
+++ b/sky/engine/core/html/canvas/WebGLRenderingContext.h
@@ -41,8 +41,6 @@
     virtual String contextName() const override { return "WebGLRenderingContext"; }
     virtual void registerContextExtensions() override;
 
-    virtual void trace(Visitor*) override;
-
 private:
     WebGLRenderingContext(HTMLCanvasElement*, PassOwnPtr<blink::WebGraphicsContext3D>, WebGLContextAttributes*);
 
diff --git a/sky/engine/core/html/canvas/WebGLRenderingContextBase.cpp b/sky/engine/core/html/canvas/WebGLRenderingContextBase.cpp
index 893bfd1..cae6902 100644
--- a/sky/engine/core/html/canvas/WebGLRenderingContextBase.cpp
+++ b/sky/engine/core/html/canvas/WebGLRenderingContextBase.cpp
@@ -504,11 +504,6 @@
 
     virtual void onContextLost() { m_context->forceLostContext(WebGLRenderingContextBase::RealLostContext, WebGLRenderingContextBase::Auto); }
 
-    void trace(Visitor* visitor)
-    {
-        visitor->trace(m_context);
-    }
-
 private:
     explicit WebGLRenderingContextLostCallback(WebGLRenderingContextBase* context)
         : m_context(context) { }
@@ -532,11 +527,6 @@
             m_context->printGLErrorToConsole(message);
     }
 
-    void trace(Visitor* visitor)
-    {
-        visitor->trace(m_context);
-    }
-
 private:
     explicit WebGLRenderingContextErrorMessageCallback(WebGLRenderingContextBase* context)
         : m_context(context) { }
@@ -5612,34 +5602,6 @@
     m_onePlusMaxNonDefaultTextureUnit = 0;
 }
 
-void WebGLRenderingContextBase::TextureUnitState::trace(Visitor* visitor)
-{
-    visitor->trace(m_texture2DBinding);
-    visitor->trace(m_textureCubeMapBinding);
-}
-
-void WebGLRenderingContextBase::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_contextObjects);
-#endif
-    visitor->trace(m_contextLostCallbackAdapter);
-    visitor->trace(m_errorMessageCallbackAdapter);
-    visitor->trace(m_boundArrayBuffer);
-    visitor->trace(m_defaultVertexArrayObject);
-    visitor->trace(m_boundVertexArrayObject);
-    visitor->trace(m_vertexAttrib0Buffer);
-    visitor->trace(m_currentProgram);
-    visitor->trace(m_framebufferBinding);
-    visitor->trace(m_renderbufferBinding);
-    visitor->trace(m_textureUnits);
-    visitor->trace(m_blackTexture2D);
-    visitor->trace(m_blackTextureCubeMap);
-    visitor->trace(m_requestedAttributes);
-    visitor->trace(m_extensions);
-    CanvasRenderingContext::trace(visitor);
-}
-
 #if ENABLE(OILPAN)
 PassRefPtr<WebGLSharedWebGraphicsContext3D> WebGLRenderingContextBase::sharedWebGraphicsContext3D() const
 {
diff --git a/sky/engine/core/html/canvas/WebGLRenderingContextBase.h b/sky/engine/core/html/canvas/WebGLRenderingContextBase.h
index 6a55fb7..e898dab 100644
--- a/sky/engine/core/html/canvas/WebGLRenderingContextBase.h
+++ b/sky/engine/core/html/canvas/WebGLRenderingContextBase.h
@@ -355,15 +355,11 @@
 
     void setSavingImage(bool isSaving) { m_savingImage = isSaving; }
 
-    virtual void trace(Visitor*) override;
-
     class TextureUnitState {
         ALLOW_ONLY_INLINE_ALLOCATION();
     public:
         RefPtr<WebGLTexture> m_texture2DBinding;
         RefPtr<WebGLTexture> m_textureCubeMapBinding;
-
-        void trace(Visitor*);
     };
 
 protected:
@@ -599,8 +595,6 @@
         virtual const char* extensionName() const = 0;
         virtual void loseExtension() = 0;
 
-        virtual void trace(Visitor*) { }
-
     private:
         bool m_draft;
         const char* const* m_prefixes;
@@ -653,12 +647,6 @@
             }
         }
 
-        virtual void trace(Visitor* visitor) override
-        {
-            visitor->trace(m_extension);
-            ExtensionTracker::trace(visitor);
-        }
-
     private:
         TypedExtensionTracker(RefPtr<T>& extensionField, ExtensionFlags flags, const char* const* prefixes)
             : ExtensionTracker(flags, prefixes)
diff --git a/sky/engine/core/html/canvas/WebGLShaderPrecisionFormat.h b/sky/engine/core/html/canvas/WebGLShaderPrecisionFormat.h
index 74ab35a..f806d57 100644
--- a/sky/engine/core/html/canvas/WebGLShaderPrecisionFormat.h
+++ b/sky/engine/core/html/canvas/WebGLShaderPrecisionFormat.h
@@ -44,8 +44,6 @@
     GLint rangeMax() const;
     GLint precision() const;
 
-    void trace(Visitor*) { }
-
 private:
     WebGLShaderPrecisionFormat(GLint rangeMin, GLint rangeMax, GLint precision);
 
diff --git a/sky/engine/core/html/canvas/WebGLUniformLocation.cpp b/sky/engine/core/html/canvas/WebGLUniformLocation.cpp
index d4dd1da..1105e55 100644
--- a/sky/engine/core/html/canvas/WebGLUniformLocation.cpp
+++ b/sky/engine/core/html/canvas/WebGLUniformLocation.cpp
@@ -60,9 +60,4 @@
     return m_location;
 }
 
-void WebGLUniformLocation::trace(Visitor* visitor)
-{
-    visitor->trace(m_program);
-}
-
 }
diff --git a/sky/engine/core/html/canvas/WebGLUniformLocation.h b/sky/engine/core/html/canvas/WebGLUniformLocation.h
index cd168d6..629db85 100644
--- a/sky/engine/core/html/canvas/WebGLUniformLocation.h
+++ b/sky/engine/core/html/canvas/WebGLUniformLocation.h
@@ -43,8 +43,6 @@
 
     GLint location() const;
 
-    void trace(Visitor*);
-
 protected:
     WebGLUniformLocation(WebGLProgram*, GLint location);
 
diff --git a/sky/engine/core/html/ime/InputMethodContext.cpp b/sky/engine/core/html/ime/InputMethodContext.cpp
index a0c2f5b..9bbda1c 100644
--- a/sky/engine/core/html/ime/InputMethodContext.cpp
+++ b/sky/engine/core/html/ime/InputMethodContext.cpp
@@ -177,10 +177,4 @@
     dispatchEvent(Event::create(EventTypeNames::candidatewindowhide));
 }
 
-void InputMethodContext::trace(Visitor* visitor)
-{
-    visitor->trace(m_element);
-    EventTargetWithInlineData::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/html/ime/InputMethodContext.h b/sky/engine/core/html/ime/InputMethodContext.h
index 477134d..f8b4f9f 100644
--- a/sky/engine/core/html/ime/InputMethodContext.h
+++ b/sky/engine/core/html/ime/InputMethodContext.h
@@ -73,8 +73,6 @@
     void dispatchCandidateWindowUpdateEvent();
     void dispatchCandidateWindowHideEvent();
 
-    virtual void trace(Visitor*) override;
-
 private:
     InputMethodContext(HTMLElement*);
     bool hasFocus() const;
diff --git a/sky/engine/core/html/imports/HTMLImport.h b/sky/engine/core/html/imports/HTMLImport.h
index 711a962..670dd23 100644
--- a/sky/engine/core/html/imports/HTMLImport.h
+++ b/sky/engine/core/html/imports/HTMLImport.h
@@ -119,8 +119,6 @@
     virtual void stateWillChange() { }
     virtual void stateDidChange();
 
-    virtual void trace(Visitor*) { }
-
 protected:
     // Stating from most conservative state.
     // It will be corrected through state update flow.
diff --git a/sky/engine/core/html/imports/HTMLImportChild.cpp b/sky/engine/core/html/imports/HTMLImportChild.cpp
index 6813e65..d39d490 100644
--- a/sky/engine/core/html/imports/HTMLImportChild.cpp
+++ b/sky/engine/core/html/imports/HTMLImportChild.cpp
@@ -227,12 +227,4 @@
 }
 #endif
 
-void HTMLImportChild::trace(Visitor* visitor)
-{
-    visitor->trace(m_customElementMicrotaskStep);
-    visitor->trace(m_loader);
-    visitor->trace(m_client);
-    HTMLImport::trace(visitor);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/html/imports/HTMLImportChild.h b/sky/engine/core/html/imports/HTMLImportChild.h
index fd63467..c3dd934 100644
--- a/sky/engine/core/html/imports/HTMLImportChild.h
+++ b/sky/engine/core/html/imports/HTMLImportChild.h
@@ -74,7 +74,6 @@
     virtual HTMLImportLoader* loader() const override;
     virtual void stateWillChange() override;
     virtual void stateDidChange() override;
-    virtual void trace(Visitor*) override;
 
 #if !defined(NDEBUG)
     virtual void showThis() override;
diff --git a/sky/engine/core/html/imports/HTMLImportChildClient.h b/sky/engine/core/html/imports/HTMLImportChildClient.h
index b82d7b8..da3fa3e 100644
--- a/sky/engine/core/html/imports/HTMLImportChildClient.h
+++ b/sky/engine/core/html/imports/HTMLImportChildClient.h
@@ -45,7 +45,6 @@
 #endif
     virtual bool isSync() const = 0;
     virtual Element* link() = 0;
-    virtual void trace(Visitor*) { }
 };
 
 } // namespace blink
diff --git a/sky/engine/core/html/imports/HTMLImportLoader.cpp b/sky/engine/core/html/imports/HTMLImportLoader.cpp
index ce598b9..44dc906 100644
--- a/sky/engine/core/html/imports/HTMLImportLoader.cpp
+++ b/sky/engine/core/html/imports/HTMLImportLoader.cpp
@@ -196,14 +196,4 @@
     return m_microtaskQueue;
 }
 
-void HTMLImportLoader::trace(Visitor* visitor)
-{
-    visitor->trace(m_controller);
-#if ENABLE(OILPAN)
-    visitor->trace(m_imports);
-#endif
-    visitor->trace(m_document);
-    visitor->trace(m_microtaskQueue);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/html/imports/HTMLImportLoader.h b/sky/engine/core/html/imports/HTMLImportLoader.h
index a96cc4e..fc6e2ae 100644
--- a/sky/engine/core/html/imports/HTMLImportLoader.h
+++ b/sky/engine/core/html/imports/HTMLImportLoader.h
@@ -93,8 +93,6 @@
 
     PassRefPtr<CustomElementSyncMicrotaskQueue> microtaskQueue() const;
 
-    virtual void trace(Visitor*);
-
 private:
     HTMLImportLoader(HTMLImportsController*);
 
diff --git a/sky/engine/core/html/imports/HTMLImportTreeRoot.cpp b/sky/engine/core/html/imports/HTMLImportTreeRoot.cpp
index d1b86c7..8b4bba6 100644
--- a/sky/engine/core/html/imports/HTMLImportTreeRoot.cpp
+++ b/sky/engine/core/html/imports/HTMLImportTreeRoot.cpp
@@ -99,11 +99,4 @@
     } while (m_recalcTimer.isActive());
 }
 
-void HTMLImportTreeRoot::trace(Visitor* visitor)
-{
-    visitor->trace(m_document);
-    visitor->trace(m_imports);
-    HTMLImport::trace(visitor);
-}
-
 }
diff --git a/sky/engine/core/html/imports/HTMLImportTreeRoot.h b/sky/engine/core/html/imports/HTMLImportTreeRoot.h
index 60eede1..6114ebd 100644
--- a/sky/engine/core/html/imports/HTMLImportTreeRoot.h
+++ b/sky/engine/core/html/imports/HTMLImportTreeRoot.h
@@ -30,8 +30,6 @@
     HTMLImportChild* add(PassOwnPtr<HTMLImportChild>);
     HTMLImportChild* find(const KURL&) const;
 
-    virtual void trace(Visitor*) override;
-
 private:
     explicit HTMLImportTreeRoot(Document*);
 
diff --git a/sky/engine/core/html/parser/HTMLConstructionSite.cpp b/sky/engine/core/html/parser/HTMLConstructionSite.cpp
index 91dc06f..daee337 100644
--- a/sky/engine/core/html/parser/HTMLConstructionSite.cpp
+++ b/sky/engine/core/html/parser/HTMLConstructionSite.cpp
@@ -262,14 +262,6 @@
     ASSERT(m_pendingText.isEmpty());
 }
 
-void HTMLConstructionSite::trace(Visitor* visitor)
-{
-    visitor->trace(m_document);
-    visitor->trace(m_attachmentRoot);
-    visitor->trace(m_taskQueue);
-    visitor->trace(m_pendingText);
-}
-
 void HTMLConstructionSite::detach()
 {
     // FIXME: We'd like to ASSERT here that we're canceling and not just discarding
@@ -360,10 +352,4 @@
     return element.release();
 }
 
-void HTMLConstructionSite::PendingText::trace(Visitor* visitor)
-{
-    visitor->trace(parent);
-    visitor->trace(nextChild);
-}
-
 }
diff --git a/sky/engine/core/html/parser/HTMLConstructionSite.h b/sky/engine/core/html/parser/HTMLConstructionSite.h
index d8d5e8c..c5cfe92 100644
--- a/sky/engine/core/html/parser/HTMLConstructionSite.h
+++ b/sky/engine/core/html/parser/HTMLConstructionSite.h
@@ -51,13 +51,6 @@
     {
     }
 
-    void trace(Visitor* visitor)
-    {
-        visitor->trace(parent);
-        visitor->trace(nextChild);
-        visitor->trace(child);
-    }
-
     Operation operation;
     RefPtr<ContainerNode> parent;
     RefPtr<Node> nextChild;
@@ -90,7 +83,6 @@
     explicit HTMLConstructionSite(Document*);
     explicit HTMLConstructionSite(DocumentFragment*);
     ~HTMLConstructionSite();
-    void trace(Visitor*);
 
     void detach();
 
@@ -194,8 +186,6 @@
             return stringBuilder.isEmpty();
         }
 
-        void trace(Visitor*);
-
         RefPtr<ContainerNode> parent;
         RefPtr<Node> nextChild;
         StringBuilder stringBuilder;
diff --git a/sky/engine/core/html/parser/HTMLTreeBuilder.cpp b/sky/engine/core/html/parser/HTMLTreeBuilder.cpp
index 710a99d..a8f7e3a 100644
--- a/sky/engine/core/html/parser/HTMLTreeBuilder.cpp
+++ b/sky/engine/core/html/parser/HTMLTreeBuilder.cpp
@@ -90,11 +90,6 @@
 {
 }
 
-void HTMLTreeBuilder::FragmentParsingContext::trace(Visitor* visitor)
-{
-    visitor->trace(m_fragment);
-}
-
 PassRefPtr<Element> HTMLTreeBuilder::takeScriptToProcess(TextPosition& scriptStartPosition)
 {
     ASSERT(m_scriptToProcess);
diff --git a/sky/engine/core/html/parser/HTMLTreeBuilder.h b/sky/engine/core/html/parser/HTMLTreeBuilder.h
index bbadaf0..f2be981 100644
--- a/sky/engine/core/html/parser/HTMLTreeBuilder.h
+++ b/sky/engine/core/html/parser/HTMLTreeBuilder.h
@@ -109,8 +109,6 @@
 
         DocumentFragment* fragment() const { return m_fragment; }
 
-        void trace(Visitor*);
-
     private:
         RawPtr<DocumentFragment> m_fragment;
     };
diff --git a/sky/engine/core/inspector/CodeGeneratorInspectorStrings.py b/sky/engine/core/inspector/CodeGeneratorInspectorStrings.py
index 2011cb6..33c1503 100644
--- a/sky/engine/core/inspector/CodeGeneratorInspectorStrings.py
+++ b/sky/engine/core/inspector/CodeGeneratorInspectorStrings.py
@@ -145,13 +145,11 @@
 public:
     static PassRefPtr<InspectorBackendDispatcher> create(InspectorFrontendChannel* inspectorFrontendChannel);
     virtual ~InspectorBackendDispatcher() { }
-    virtual void trace(Visitor*) { }
 
     class CallbackBase: public RefCounted<CallbackBase> {
     public:
         CallbackBase(PassRefPtr<InspectorBackendDispatcherImpl> backendImpl, int id);
         virtual ~CallbackBase();
-        virtual void trace(Visitor*);
         void sendFailure(const ErrorString&);
         bool isActive();
 
@@ -492,11 +490,6 @@
 
 InspectorBackendDispatcher::CallbackBase::~CallbackBase() {}
 
-void InspectorBackendDispatcher::CallbackBase::trace(Visitor* visitor)
-{
-    visitor->trace(m_backendImpl);
-}
-
 void InspectorBackendDispatcher::CallbackBase::sendFailure(const ErrorString& error)
 {
     ASSERT(error.length());
diff --git a/sky/engine/core/inspector/ConsoleMessage.cpp b/sky/engine/core/inspector/ConsoleMessage.cpp
index a9b610f..ea6f16f 100644
--- a/sky/engine/core/inspector/ConsoleMessage.cpp
+++ b/sky/engine/core/inspector/ConsoleMessage.cpp
@@ -194,10 +194,4 @@
     m_callStack.clear();
 }
 
-void ConsoleMessage::trace(Visitor* visitor)
-{
-    visitor->trace(m_callStack);
-    visitor->trace(m_scriptArguments);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/inspector/ConsoleMessage.h b/sky/engine/core/inspector/ConsoleMessage.h
index f8bb765..d33d7e9 100644
--- a/sky/engine/core/inspector/ConsoleMessage.h
+++ b/sky/engine/core/inspector/ConsoleMessage.h
@@ -58,8 +58,6 @@
 
     void collectCallStack();
 
-    void trace(Visitor*);
-
 private:
     ConsoleMessage(MessageSource, MessageLevel, const String& message, const String& url = String(), unsigned lineNumber = 0, unsigned columnNumber = 0);
 
diff --git a/sky/engine/core/inspector/ConsoleMessageStorage.cpp b/sky/engine/core/inspector/ConsoleMessageStorage.cpp
index f24d7f3..15ef7f9 100644
--- a/sky/engine/core/inspector/ConsoleMessageStorage.cpp
+++ b/sky/engine/core/inspector/ConsoleMessageStorage.cpp
@@ -84,10 +84,4 @@
     return m_frame ? m_frame->document() : m_context;
 }
 
-void ConsoleMessageStorage::trace(Visitor* visitor)
-{
-    visitor->trace(m_messages);
-    visitor->trace(m_context);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/inspector/ConsoleMessageStorage.h b/sky/engine/core/inspector/ConsoleMessageStorage.h
index c7959d9..94f0d50 100644
--- a/sky/engine/core/inspector/ConsoleMessageStorage.h
+++ b/sky/engine/core/inspector/ConsoleMessageStorage.h
@@ -35,8 +35,6 @@
 
     int expiredCount() const;
 
-    void trace(Visitor*);
-
 private:
     explicit ConsoleMessageStorage(ExecutionContext*);
     explicit ConsoleMessageStorage(LocalFrame*);
diff --git a/sky/engine/core/inspector/JavaScriptCallFrame.cpp b/sky/engine/core/inspector/JavaScriptCallFrame.cpp
index 691a229..78c7e35 100644
--- a/sky/engine/core/inspector/JavaScriptCallFrame.cpp
+++ b/sky/engine/core/inspector/JavaScriptCallFrame.cpp
@@ -207,9 +207,4 @@
     return exceptionDetails;
 }
 
-void JavaScriptCallFrame::trace(Visitor* visitor)
-{
-    visitor->trace(m_caller);
-}
-
 } // namespace blink
\ No newline at end of file
diff --git a/sky/engine/core/inspector/JavaScriptCallFrame.h b/sky/engine/core/inspector/JavaScriptCallFrame.h
index efbd63a..e766eae 100644
--- a/sky/engine/core/inspector/JavaScriptCallFrame.h
+++ b/sky/engine/core/inspector/JavaScriptCallFrame.h
@@ -50,7 +50,6 @@
         return adoptRef(new JavaScriptCallFrame(debuggerContext, callFrame));
     }
     ~JavaScriptCallFrame();
-    void trace(Visitor*);
 
     JavaScriptCallFrame* caller();
 
diff --git a/sky/engine/core/inspector/ScriptArguments.h b/sky/engine/core/inspector/ScriptArguments.h
index 6e5934d..7f70d9c 100644
--- a/sky/engine/core/inspector/ScriptArguments.h
+++ b/sky/engine/core/inspector/ScriptArguments.h
@@ -53,8 +53,6 @@
 
     bool getFirstArgumentAsString(WTF::String& result, bool checkForNullOrUndefined = false);
 
-    void trace(Visitor*) { }
-
 private:
     ScriptArguments(ScriptState*, Vector<ScriptValue>& arguments);
 
diff --git a/sky/engine/core/inspector/ScriptAsyncCallStack.cpp b/sky/engine/core/inspector/ScriptAsyncCallStack.cpp
index e1fb6ea..f5e0906 100644
--- a/sky/engine/core/inspector/ScriptAsyncCallStack.cpp
+++ b/sky/engine/core/inspector/ScriptAsyncCallStack.cpp
@@ -22,10 +22,4 @@
     ASSERT(m_callStack);
 }
 
-void ScriptAsyncCallStack::trace(Visitor* visitor)
-{
-    visitor->trace(m_callStack);
-    visitor->trace(m_asyncStackTrace);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/inspector/ScriptAsyncCallStack.h b/sky/engine/core/inspector/ScriptAsyncCallStack.h
index 2542ead..1ecc4fc 100644
--- a/sky/engine/core/inspector/ScriptAsyncCallStack.h
+++ b/sky/engine/core/inspector/ScriptAsyncCallStack.h
@@ -17,8 +17,6 @@
 public:
     static PassRefPtr<ScriptAsyncCallStack> create(const String&, PassRefPtr<ScriptCallStack>, PassRefPtr<ScriptAsyncCallStack>);
 
-    void trace(Visitor*);
-
 private:
     ScriptAsyncCallStack(const String&, PassRefPtr<ScriptCallStack>, PassRefPtr<ScriptAsyncCallStack>);
 
diff --git a/sky/engine/core/inspector/ScriptCallStack.cpp b/sky/engine/core/inspector/ScriptCallStack.cpp
index ff3e7c7..68835d5 100644
--- a/sky/engine/core/inspector/ScriptCallStack.cpp
+++ b/sky/engine/core/inspector/ScriptCallStack.cpp
@@ -68,9 +68,4 @@
     m_asyncCallStack = asyncCallStack;
 }
 
-void ScriptCallStack::trace(Visitor* visitor)
-{
-    visitor->trace(m_asyncCallStack);
-}
-
 } // namespace blink
diff --git a/sky/engine/core/inspector/ScriptCallStack.h b/sky/engine/core/inspector/ScriptCallStack.h
index 4cab24c..8750d00 100644
--- a/sky/engine/core/inspector/ScriptCallStack.h
+++ b/sky/engine/core/inspector/ScriptCallStack.h
@@ -54,8 +54,6 @@
     PassRefPtr<ScriptAsyncCallStack> asyncCallStack() const;
     void setAsyncCallStack(PassRefPtr<ScriptAsyncCallStack>);
 
-    void trace(Visitor*);
-
 private:
     explicit ScriptCallStack(Vector<ScriptCallFrame>&);
 
diff --git a/sky/engine/core/inspector/ScriptProfile.h b/sky/engine/core/inspector/ScriptProfile.h
index 86a5913..7ce38b0 100644
--- a/sky/engine/core/inspector/ScriptProfile.h
+++ b/sky/engine/core/inspector/ScriptProfile.h
@@ -45,7 +45,6 @@
         return adoptRef(new ScriptProfile(profile, idleTime));
     }
     ~ScriptProfile();
-    void trace(Visitor*) { }
 
     String title() const;
     double idleTime() const;
diff --git a/sky/engine/core/loader/ImageLoader.cpp b/sky/engine/core/loader/ImageLoader.cpp
index b29803a..97cb8dc 100644
--- a/sky/engine/core/loader/ImageLoader.cpp
+++ b/sky/engine/core/loader/ImageLoader.cpp
@@ -128,11 +128,6 @@
         errorEventSender().cancelEvent(this);
 }
 
-void ImageLoader::trace(Visitor* visitor)
-{
-    visitor->trace(m_element);
-}
-
 void ImageLoader::setImage(ImageResource* newImage)
 {
     setImageWithoutConsideringPendingLoadEvent(newImage);
diff --git a/sky/engine/core/loader/ImageLoader.h b/sky/engine/core/loader/ImageLoader.h
index b9c4629..5798eb4 100644
--- a/sky/engine/core/loader/ImageLoader.h
+++ b/sky/engine/core/loader/ImageLoader.h
@@ -44,8 +44,6 @@
     // Determines whether the observed ImageResource should have higher priority in the decoded resources cache.
     virtual bool requestsHighLiveResourceCachePriority() { return false; }
 
-    virtual void trace(Visitor*) { }
-
 protected:
     ImageLoaderClient() { }
 };
@@ -61,7 +59,6 @@
 public:
     explicit ImageLoader(Element*);
     virtual ~ImageLoader();
-    void trace(Visitor*);
 
     enum LoadType {
         LoadNormally,
diff --git a/sky/engine/core/page/EventHandler.cpp b/sky/engine/core/page/EventHandler.cpp
index a8a45a6..6e1ecb8 100644
--- a/sky/engine/core/page/EventHandler.cpp
+++ b/sky/engine/core/page/EventHandler.cpp
@@ -184,25 +184,6 @@
     ASSERT(!m_fakeMouseMoveEventTimer.isActive());
 }
 
-void EventHandler::trace(Visitor* visitor)
-{
-#if ENABLE(OILPAN)
-    visitor->trace(m_mousePressNode);
-    visitor->trace(m_capturingMouseEventsNode);
-    visitor->trace(m_nodeUnderMouse);
-    visitor->trace(m_lastNodeUnderMouse);
-    visitor->trace(m_clickNode);
-    visitor->trace(m_dragTarget);
-    visitor->trace(m_latchedWheelEventNode);
-    visitor->trace(m_previousWheelScrolledNode);
-    visitor->trace(m_targetForTouchID);
-    visitor->trace(m_touchSequenceDocument);
-    visitor->trace(m_scrollGestureHandlingNode);
-    visitor->trace(m_previousGestureScrolledNode);
-    visitor->trace(m_lastDeferredTapElement);
-#endif
-}
-
 void EventHandler::clear()
 {
     m_hoverTimer.stop();
diff --git a/sky/engine/core/page/EventHandler.h b/sky/engine/core/page/EventHandler.h
index 5c9e6f3..2caa9c9 100644
--- a/sky/engine/core/page/EventHandler.h
+++ b/sky/engine/core/page/EventHandler.h
@@ -86,7 +86,6 @@
 public:
     explicit EventHandler(LocalFrame*);
     ~EventHandler();
-    void trace(Visitor*);
 
     void clear();
     void nodeWillBeRemoved(Node&);
diff --git a/sky/engine/core/page/TouchAdjustment.cpp b/sky/engine/core/page/TouchAdjustment.cpp
index a746b63..191670c 100644
--- a/sky/engine/core/page/TouchAdjustment.cpp
+++ b/sky/engine/core/page/TouchAdjustment.cpp
@@ -51,7 +51,6 @@
         : m_node(node)
         , m_quad(quad)
     { }
-    void trace(Visitor* visitor) { visitor->trace(m_node); }
 
     Node* node() const { return m_node; }
     FloatQuad quad() const { return m_quad; }
diff --git a/sky/engine/core/rendering/HitTestResult.cpp b/sky/engine/core/rendering/HitTestResult.cpp
index ddfa5a8..0f54931 100644
--- a/sky/engine/core/rendering/HitTestResult.cpp
+++ b/sky/engine/core/rendering/HitTestResult.cpp
@@ -100,17 +100,6 @@
     return *this;
 }
 
-void HitTestResult::trace(Visitor* visitor)
-{
-    visitor->trace(m_innerNode);
-    visitor->trace(m_innerPossiblyPseudoNode);
-    visitor->trace(m_innerNonSharedNode);
-    visitor->trace(m_innerURLElement);
-#if ENABLE(OILPAN)
-    visitor->trace(m_rectBasedTestResult);
-#endif
-}
-
 PositionWithAffinity HitTestResult::position() const
 {
     if (!m_innerPossiblyPseudoNode)
diff --git a/sky/engine/core/rendering/HitTestResult.h b/sky/engine/core/rendering/HitTestResult.h
index 759cda2..9292912 100644
--- a/sky/engine/core/rendering/HitTestResult.h
+++ b/sky/engine/core/rendering/HitTestResult.h
@@ -58,7 +58,6 @@
     HitTestResult(const HitTestResult&);
     ~HitTestResult();
     HitTestResult& operator=(const HitTestResult&);
-    void trace(Visitor*);
 
     // For point-based hit tests, these accessors provide information about the node
     // under the point. For rect-based hit tests they are meaningless (reflect the
diff --git a/sky/engine/core/rendering/RenderBlock.cpp b/sky/engine/core/rendering/RenderBlock.cpp
index 1d0a01d..a59cb17 100644
--- a/sky/engine/core/rendering/RenderBlock.cpp
+++ b/sky/engine/core/rendering/RenderBlock.cpp
@@ -91,12 +91,6 @@
     // By default, subclasses do not have inline children.
 }
 
-void RenderBlock::trace(Visitor* visitor)
-{
-    visitor->trace(m_children);
-    RenderBox::trace(visitor);
-}
-
 static void removeBlockFromDescendantAndContainerMaps(RenderBlock* block, TrackedDescendantsMap*& descendantMap, TrackedContainerMap*& containerMap)
 {
     if (OwnPtr<TrackedRendererListHashSet> descendantSet = descendantMap->take(block)) {
diff --git a/sky/engine/core/rendering/RenderBlock.h b/sky/engine/core/rendering/RenderBlock.h
index d0c03ac..21c95b2 100644
--- a/sky/engine/core/rendering/RenderBlock.h
+++ b/sky/engine/core/rendering/RenderBlock.h
@@ -53,7 +53,6 @@
 class RenderBlock : public RenderBox {
 public:
     virtual void destroy() override;
-    virtual void trace(Visitor*) override;
     friend class LineLayoutState;
 
 protected:
diff --git a/sky/engine/core/rendering/RenderInline.cpp b/sky/engine/core/rendering/RenderInline.cpp
index add605f..4d93b6b 100644
--- a/sky/engine/core/rendering/RenderInline.cpp
+++ b/sky/engine/core/rendering/RenderInline.cpp
@@ -54,12 +54,6 @@
     setChildrenInline(true);
 }
 
-void RenderInline::trace(Visitor* visitor)
-{
-    visitor->trace(m_children);
-    RenderBoxModelObject::trace(visitor);
-}
-
 RenderInline* RenderInline::createAnonymous(Document* document)
 {
     RenderInline* renderer = new RenderInline(0);
diff --git a/sky/engine/core/rendering/RenderInline.h b/sky/engine/core/rendering/RenderInline.h
index 39972f7..0d2f0fa 100644
--- a/sky/engine/core/rendering/RenderInline.h
+++ b/sky/engine/core/rendering/RenderInline.h
@@ -33,7 +33,6 @@
 class RenderInline : public RenderBoxModelObject {
 public:
     explicit RenderInline(Element*);
-    virtual void trace(Visitor*) override;
 
     static RenderInline* createAnonymous(Document*);
 
diff --git a/sky/engine/core/rendering/RenderObject.cpp b/sky/engine/core/rendering/RenderObject.cpp
index ba07891..0938f76 100644
--- a/sky/engine/core/rendering/RenderObject.cpp
+++ b/sky/engine/core/rendering/RenderObject.cpp
@@ -184,14 +184,6 @@
     --s_instanceCount;
 }
 
-void RenderObject::trace(Visitor* visitor)
-{
-    visitor->trace(m_node);
-    visitor->trace(m_parent);
-    visitor->trace(m_previous);
-    visitor->trace(m_next);
-}
-
 String RenderObject::debugName() const
 {
     StringBuilder name;
diff --git a/sky/engine/core/rendering/RenderObject.h b/sky/engine/core/rendering/RenderObject.h
index fd5be33..7373085 100644
--- a/sky/engine/core/rendering/RenderObject.h
+++ b/sky/engine/core/rendering/RenderObject.h
@@ -153,7 +153,6 @@
     // marked as anonymous in the constructor.
     explicit RenderObject(Node*);
     virtual ~RenderObject();
-    virtual void trace(Visitor*);
 
     virtual const char* renderName() const = 0;
 
diff --git a/sky/engine/core/rendering/RenderSelectionInfo.h b/sky/engine/core/rendering/RenderSelectionInfo.h
index 4346c22..dd9866c 100644
--- a/sky/engine/core/rendering/RenderSelectionInfo.h
+++ b/sky/engine/core/rendering/RenderSelectionInfo.h
@@ -47,12 +47,6 @@
     {
     }
 
-    void trace(Visitor* visitor)
-    {
-        visitor->trace(m_object);
-        visitor->trace(m_paintInvalidationContainer);
-    }
-
     RenderObject* object() const { return m_object; }
     const RenderLayerModelObject* paintInvalidationContainer() const { return m_paintInvalidationContainer; }
     RenderObject::SelectionState state() const { return m_state; }
diff --git a/sky/engine/core/rendering/RenderView.cpp b/sky/engine/core/rendering/RenderView.cpp
index 853ea5f..beb07ac 100644
--- a/sky/engine/core/rendering/RenderView.cpp
+++ b/sky/engine/core/rendering/RenderView.cpp
@@ -66,13 +66,6 @@
 {
 }
 
-void RenderView::trace(Visitor* visitor)
-{
-    visitor->trace(m_selectionStart);
-    visitor->trace(m_selectionEnd);
-    RenderBlockFlow::trace(visitor);
-}
-
 bool RenderView::hitTest(const HitTestRequest& request, HitTestResult& result)
 {
     return hitTest(request, result.hitTestLocation(), result);
diff --git a/sky/engine/core/rendering/RenderView.h b/sky/engine/core/rendering/RenderView.h
index b838d7c..e76f46a 100644
--- a/sky/engine/core/rendering/RenderView.h
+++ b/sky/engine/core/rendering/RenderView.h
@@ -41,7 +41,6 @@
 public:
     explicit RenderView(Document*);
     virtual ~RenderView();
-    virtual void trace(Visitor*) override;
 
     bool hitTest(const HitTestRequest&, HitTestResult&);
     bool hitTest(const HitTestRequest&, const HitTestLocation&, HitTestResult&);
diff --git a/sky/engine/core/testing/NullExecutionContext.h b/sky/engine/core/testing/NullExecutionContext.h
index e801f03..beca1b3 100644
--- a/sky/engine/core/testing/NullExecutionContext.h
+++ b/sky/engine/core/testing/NullExecutionContext.h
@@ -19,12 +19,6 @@
 
     virtual EventQueue* eventQueue() const override { return m_queue.get(); }
 
-    void trace(Visitor* visitor)
-    {
-        visitor->trace(m_queue);
-        ExecutionContext::trace(visitor);
-    }
-
     virtual void reportBlockedScriptExecutionToInspector(const String& directiveText) override { }
 
 #if !ENABLE(OILPAN)
diff --git a/sky/engine/platform/Supplementable.h b/sky/engine/platform/Supplementable.h
index 9efa8c1..a06d870 100644
--- a/sky/engine/platform/Supplementable.h
+++ b/sky/engine/platform/Supplementable.h
@@ -170,7 +170,6 @@
     // the vtable at the first word of the object. However we don't trace the
     // m_supplements here, but in the partially specialized template subclasses
     // since we only want to trace it for garbage collected classes.
-    virtual void trace(Visitor*) { }
 
     // FIXME: Oilpan: Make private and remove this ignore once PersistentHeapSupplementable is removed again.
 protected:
diff --git a/sky/engine/platform/fonts/FontCacheClient.h b/sky/engine/platform/fonts/FontCacheClient.h
index fe2950c..491b086 100644
--- a/sky/engine/platform/fonts/FontCacheClient.h
+++ b/sky/engine/platform/fonts/FontCacheClient.h
@@ -42,7 +42,6 @@
     virtual ~FontCacheClient() { }
 
     virtual void fontCacheInvalidated() = 0;
-    virtual void trace(Visitor*) { }
 };
 
 } // namespace blink
diff --git a/sky/engine/platform/heap/Handle.h b/sky/engine/platform/heap/Handle.h
index cb5dad0..acfe08e 100644
--- a/sky/engine/platform/heap/Handle.h
+++ b/sky/engine/platform/heap/Handle.h
@@ -85,24 +85,6 @@
 #define STACK_ALLOCATED() DISALLOW_ALLOCATION()
 #endif
 
-namespace blink {
-
-class Visitor {
-public:
-    template<typename T>
-    void trace(const T* t)
-    {
-    }
-    template<typename T>
-    void trace(T* t)
-    {
-    }
-    template<typename T>
-    void trace(const T& t)
-    {
-    }
-};
-
 #define DECLARE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(type) \
     public:                                            \
         ~type();                                       \
@@ -118,6 +100,4 @@
 #define DEFINE_STATIC_REF_WILL_BE_PERSISTENT(type, name, arguments) \
     DEFINE_STATIC_REF(type, name, arguments)
 
-} // namespace blink
-
 #endif
diff --git a/sky/engine/web/WebHitTestResult.cpp b/sky/engine/web/WebHitTestResult.cpp
index 0779533..a9e1e28 100644
--- a/sky/engine/web/WebHitTestResult.cpp
+++ b/sky/engine/web/WebHitTestResult.cpp
@@ -43,7 +43,6 @@
 public:
     static PassRefPtr<WebHitTestResultPrivate> create(const HitTestResult&);
     static PassRefPtr<WebHitTestResultPrivate> create(const WebHitTestResultPrivate&);
-    void trace(Visitor* visitor) { visitor->trace(m_result); }
     const HitTestResult& result() const { return m_result; }
 
 private:
diff --git a/sky/engine/wtf/Deque.h b/sky/engine/wtf/Deque.h
index 9ecabec..e8257c4 100644
--- a/sky/engine/wtf/Deque.h
+++ b/sky/engine/wtf/Deque.h
@@ -59,7 +59,6 @@
         Deque<T, 0, Allocator>& operator=(const Deque&);
 
         void finalize();
-        void finalizeGarbageCollectedObject() { finalize(); }
 
         // We hard wire the inlineCapacity to zero here, due to crbug.com/360572
         void swap(Deque<T, 0, Allocator>&);
diff --git a/sky/engine/wtf/Vector.h b/sky/engine/wtf/Vector.h
index 0912c2c..89f54b6 100644
--- a/sky/engine/wtf/Vector.h
+++ b/sky/engine/wtf/Vector.h
@@ -600,11 +600,6 @@
             Base::destruct();
         }
 
-        void finalizeGarbageCollectedObject()
-        {
-            finalize();
-        }
-
         Vector(const Vector&);
         template<size_t otherCapacity>
         explicit Vector(const Vector<T, otherCapacity, Allocator>&);
