CTTE: RenderMedia and RenderVideo are never anonymous.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 15 Sep 2013 14:13:55 +0000 (14:13 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 15 Sep 2013 14:13:55 +0000 (14:13 +0000)
<https://webkit.org/b/121388>

Reviewed by Sam Weinig.

Codify the following:

- RenderMedia always has an HTMLMediaElement.
- RenderVideo always has an HTMLVideoElement.

None of these renderers are ever anonymous, so delete element() and provide
strongly typed reference getters instead.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@155811 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSHTMLMediaElementCustom.cpp
Source/WebCore/html/HTMLMediaElement.cpp
Source/WebCore/html/HTMLMediaElement.h
Source/WebCore/html/HTMLVideoElement.cpp
Source/WebCore/rendering/RenderMedia.cpp
Source/WebCore/rendering/RenderMedia.h
Source/WebCore/rendering/RenderVideo.cpp
Source/WebCore/rendering/RenderVideo.h

index fd80c18..1a34b39 100644 (file)
@@ -1,5 +1,20 @@
 2013-09-15  Andreas Kling  <akling@apple.com>
 
+        CTTE: RenderMedia and RenderVideo are never anonymous.
+        <https://webkit.org/b/121388>
+
+        Reviewed by Sam Weinig.
+
+        Codify the following:
+
+        - RenderMedia always has an HTMLMediaElement.
+        - RenderVideo always has an HTMLVideoElement.
+
+        None of these renderers are ever anonymous, so delete element() and provide
+        strongly typed reference getters instead.
+
+2013-09-15  Andreas Kling  <akling@apple.com>
+
         Unreviewed, rolling out r155809.
         http://trac.webkit.org/changeset/155809
         https://bugs.webkit.org/show_bug.cgi?id=121388
index bce0794..c4265cb 100644 (file)
@@ -36,12 +36,11 @@ using namespace JSC;
 
 void JSHTMLMediaElement::setController(ExecState*, JSValue value)
 {
-    HTMLMediaElement* imp = toHTMLMediaElement(impl());
     // 4.8.10.11.2 Media controllers: controller attribute.
     // On setting, it must first remove the element's mediagroup attribute, if any, 
-    imp->setMediaGroup(String());
+    impl()->setMediaGroup(String());
     // and then set the current media controller to the given value.
-    imp->setController(toMediaController(value));
+    impl()->setController(toMediaController(value));
 }
 
 }
index ec8a158..eec7bbd 100644 (file)
@@ -560,7 +560,7 @@ RenderObject* HTMLMediaElement::createRenderer(RenderArena* arena, RenderStyle*)
 {
 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
     // Setup the renderer if we already have a proxy widget.
-    RenderEmbeddedObject* mediaRenderer = new (arena) RenderEmbeddedObject(this);
+    RenderEmbeddedObject* mediaRenderer = new (arena) RenderEmbeddedObject(*this);
     if (m_proxyWidget) {
         mediaRenderer->setWidget(m_proxyWidget);
 
@@ -569,7 +569,7 @@ RenderObject* HTMLMediaElement::createRenderer(RenderArena* arena, RenderStyle*)
     }
     return mediaRenderer;
 #else
-    return new (arena) RenderMedia(this);
+    return new (arena) RenderMedia(*this);
 #endif
 }
 
index 6f135f5..1c8953a 100644 (file)
@@ -802,12 +802,21 @@ inline bool isMediaElement(Node* node)
     return node && node->isElementNode() && toElement(node)->isMediaElement();
 }
 
+inline HTMLMediaElement& toHTMLMediaElement(Node& node)
+{
+    ASSERT_WITH_SECURITY_IMPLICATION(isMediaElement(&node));
+    return static_cast<HTMLMediaElement&>(node);
+}
+
 inline HTMLMediaElement* toHTMLMediaElement(Node* node)
 {
     ASSERT_WITH_SECURITY_IMPLICATION(!node || isMediaElement(node));
     return static_cast<HTMLMediaElement*>(node);
 }
 
+void toHTMLMediaElement(const HTMLMediaElement&);
+void toHTMLMediaElement(const HTMLMediaElement*);
+
 } //namespace
 
 #endif
index 2ac689e..27d7a20 100644 (file)
@@ -71,7 +71,7 @@ bool HTMLVideoElement::rendererIsNeeded(const RenderStyle& style)
 #if !ENABLE(PLUGIN_PROXY_FOR_VIDEO)
 RenderObject* HTMLVideoElement::createRenderer(RenderArena* arena, RenderStyle*)
 {
-    return new (arena) RenderVideo(this);
+    return new (arena) RenderVideo(*this);
 }
 #endif
 
index acd1adf..f49baa4 100644 (file)
 #if ENABLE(VIDEO)
 #include "RenderMedia.h"
 
-#include "HTMLMediaElement.h"
 #include "RenderFlowThread.h"
 #include "RenderView.h"
 #include <wtf/StackStats.h>
 
 namespace WebCore {
 
-RenderMedia::RenderMedia(HTMLMediaElement* video)
-    : RenderImage(video)
+RenderMedia::RenderMedia(HTMLMediaElement& element)
+    : RenderImage(&element)
 {
     setImageResource(RenderImageResource::create());
 }
 
-RenderMedia::RenderMedia(HTMLMediaElement* video, const IntSize& intrinsicSize)
-    : RenderImage(video)
+RenderMedia::RenderMedia(HTMLMediaElement& element, const IntSize& intrinsicSize)
+    : RenderImage(&element)
 {
     setImageResource(RenderImageResource::create());
     setIntrinsicSize(intrinsicSize);
@@ -52,11 +51,6 @@ RenderMedia::~RenderMedia()
 {
 }
 
-HTMLMediaElement* RenderMedia::mediaElement() const
-{ 
-    return toHTMLMediaElement(element()); 
-}
-
 void RenderMedia::layout()
 {
     StackStats::LayoutCheckPoint layoutCheckPoint;
index b6b2487..2aeb3ba 100644 (file)
 
 #if ENABLE(VIDEO)
 
+#include "HTMLMediaElement.h"
 #include "RenderImage.h"
 
 namespace WebCore {
 
-class HTMLMediaElement;
-
 class RenderMedia : public RenderImage {
 public:
-    explicit RenderMedia(HTMLMediaElement*);
-    RenderMedia(HTMLMediaElement*, const IntSize& intrinsicSize);
+    explicit RenderMedia(HTMLMediaElement&);
+    RenderMedia(HTMLMediaElement&, const IntSize& intrinsicSize);
     virtual ~RenderMedia();
 
+    HTMLMediaElement& mediaElement() const { return *toHTMLMediaElement(RenderImage::element()); }
+
     RenderObject* firstChild() const { return m_children.firstChild(); }
     RenderObject* lastChild() const { return m_children.lastChild(); }
 
     virtual const RenderObjectChildList* children() const OVERRIDE FINAL { return &m_children; }
     virtual RenderObjectChildList* children() OVERRIDE FINAL { return &m_children; }
 
-    HTMLMediaElement* mediaElement() const;
-
 protected:
     virtual void layout();
 
 private:
+    void element() const WTF_DELETED_FUNCTION;
+
     virtual bool canHaveChildren() const OVERRIDE FINAL { return true; }
 
     virtual const char* renderName() const OVERRIDE { return "RenderMedia"; }
index 98f4a29..e535c2f 100644 (file)
@@ -48,17 +48,17 @@ namespace WebCore {
 
 using namespace HTMLNames;
 
-RenderVideo::RenderVideo(HTMLVideoElement* video)
-    : RenderMedia(video)
+RenderVideo::RenderVideo(HTMLVideoElement& element)
+    : RenderMedia(element)
 {
     setIntrinsicSize(calculateIntrinsicSize());
 }
 
 RenderVideo::~RenderVideo()
 {
-    if (MediaPlayer* p = mediaElement()->player()) {
-        p->setVisible(false);
-        p->setFrameView(0);
+    if (MediaPlayer* player = videoElement().player()) {
+        player->setVisible(false);
+        player->setFrameView(0);
     }
 }
 
@@ -73,7 +73,7 @@ IntSize RenderVideo::defaultSize()
 
 void RenderVideo::intrinsicSizeChanged()
 {
-    if (videoElement()->shouldDisplayPosterImage())
+    if (videoElement().shouldDisplayPosterImage())
         RenderMedia::intrinsicSizeChanged();
     updateIntrinsicSize(); 
 }
@@ -84,7 +84,7 @@ void RenderVideo::updateIntrinsicSize()
     size.scale(style()->effectiveZoom());
 
     // Never set the element size to zero when in a media document.
-    if (size.isEmpty() && element()->document().isMediaDocument())
+    if (size.isEmpty() && document().isMediaDocument())
         return;
 
     if (size == intrinsicSize())
@@ -97,8 +97,6 @@ void RenderVideo::updateIntrinsicSize()
     
 LayoutSize RenderVideo::calculateIntrinsicSize()
 {
-    HTMLVideoElement* video = videoElement();
-    
     // Spec text from 4.8.6
     //
     // The intrinsic width of a video element's playback area is the intrinsic width 
@@ -108,27 +106,27 @@ LayoutSize RenderVideo::calculateIntrinsicSize()
     // The intrinsic height of a video element's playback area is the intrinsic height 
     // of the video resource, if that is available; otherwise it is the intrinsic 
     // height of the poster frame, if that is available; otherwise it is 150 CSS pixels.
-    MediaPlayer* player = mediaElement()->player();
-    if (player && video->readyState() >= HTMLVideoElement::HAVE_METADATA) {
+    MediaPlayer* player = videoElement().player();
+    if (player && videoElement().readyState() >= HTMLVideoElement::HAVE_METADATA) {
         LayoutSize size = player->naturalSize();
         if (!size.isEmpty())
             return size;
     }
 
-    if (video->shouldDisplayPosterImage() && !m_cachedImageSize.isEmpty() && !imageResource()->errorOccurred())
+    if (videoElement().shouldDisplayPosterImage() && !m_cachedImageSize.isEmpty() && !imageResource()->errorOccurred())
         return m_cachedImageSize;
 
     // When the natural size of the video is unavailable, we use the provided
     // width and height attributes of the video element as the intrinsic size until
-    // better values become available. 
-    if (video->hasAttribute(widthAttr) && video->hasAttribute(heightAttr))
-        return LayoutSize(video->width(), video->height());
+    // better values become available.
+    if (videoElement().hasAttribute(widthAttr) && videoElement().hasAttribute(heightAttr))
+        return LayoutSize(videoElement().width(), videoElement().height());
 
     // <video> in standalone media documents should not use the default 300x150
     // size since they also have audio-only files. By setting the intrinsic
     // size to 300x1 the video will resize itself in these cases, and audio will
     // have the correct height (it needs to be > 0 for controls to render properly).
-    if (video->document().isMediaDocument())
+    if (videoElement().document().isMediaDocument())
         return LayoutSize(defaultSize().width(), 1);
 
     return defaultSize();
@@ -141,7 +139,7 @@ void RenderVideo::imageChanged(WrappedImagePtr newImage, const IntRect* rect)
     // Cache the image intrinsic size so we can continue to use it to draw the image correctly
     // even if we know the video intrinsic size but aren't able to draw video frames yet
     // (we don't want to scale the poster to the video size without keeping aspect ratio).
-    if (videoElement()->shouldDisplayPosterImage())
+    if (videoElement().shouldDisplayPosterImage())
         m_cachedImageSize = intrinsicSize();
 
     // The intrinsic size is now that of the image, but in case we already had the
@@ -153,7 +151,7 @@ IntRect RenderVideo::videoBox() const
 {
     LayoutSize intrinsicSize = this->intrinsicSize();
 
-    if (videoElement()->shouldDisplayPosterImage())
+    if (videoElement().shouldDisplayPosterImage())
         intrinsicSize = m_cachedImageSize;
 
     return pixelSnappedIntRect(replacedContentRect(intrinsicSize));
@@ -161,13 +159,13 @@ IntRect RenderVideo::videoBox() const
 
 bool RenderVideo::shouldDisplayVideo() const
 {
-    return !videoElement()->shouldDisplayPosterImage();
+    return !videoElement().shouldDisplayPosterImage();
 }
 
 void RenderVideo::paintReplaced(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
 {
-    MediaPlayer* mediaPlayer = mediaElement()->player();
-    bool displayingPoster = videoElement()->shouldDisplayPosterImage();
+    MediaPlayer* mediaPlayer = videoElement().player();
+    bool displayingPoster = videoElement().shouldDisplayPosterImage();
 
     Page* page = frame().page();
 
@@ -211,9 +209,9 @@ void RenderVideo::layout()
     updatePlayer();
 }
     
-HTMLVideoElement* RenderVideo::videoElement() const
+HTMLVideoElement& RenderVideo::videoElement() const
 {
-    return toHTMLVideoElement(element()); 
+    return toHTMLVideoElement(RenderMedia::mediaElement());
 }
 
 void RenderVideo::updateFromElement()
@@ -229,11 +227,11 @@ void RenderVideo::updatePlayer()
 
     updateIntrinsicSize();
 
-    MediaPlayer* mediaPlayer = mediaElement()->player();
+    MediaPlayer* mediaPlayer = videoElement().player();
     if (!mediaPlayer)
         return;
 
-    if (!videoElement()->inActiveDocument()) {
+    if (!videoElement().inActiveDocument()) {
         mediaPlayer->setVisible(false);
         return;
     }
@@ -267,24 +265,21 @@ LayoutUnit RenderVideo::minimumReplacedHeight() const
 #if USE(ACCELERATED_COMPOSITING)
 bool RenderVideo::supportsAcceleratedRendering() const
 {
-    MediaPlayer* p = mediaElement()->player();
-    if (p)
-        return p->supportsAcceleratedRendering();
-
+    if (MediaPlayer* player = videoElement().player())
+        return player->supportsAcceleratedRendering();
     return false;
 }
 
 void RenderVideo::acceleratedRenderingStateChanged()
 {
-    MediaPlayer* p = mediaElement()->player();
-    if (p)
-        p->acceleratedRenderingStateChanged();
+    if (MediaPlayer* player = videoElement().player())
+        player->acceleratedRenderingStateChanged();
 }
 #endif  // USE(ACCELERATED_COMPOSITING)
 
 bool RenderVideo::requiresImmediateCompositing() const
 {
-    MediaPlayer* player = mediaElement()->player();
+    MediaPlayer* player = videoElement().player();
     return player && player->requiresImmediateCompositing();
 }
 
@@ -333,13 +328,13 @@ LayoutUnit RenderVideo::offsetHeight() const
 
 bool RenderVideo::foregroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect, unsigned maxDepthToTest) const
 {
-    if (videoElement()->shouldDisplayPosterImage())
+    if (videoElement().shouldDisplayPosterImage())
         return RenderImage::foregroundIsKnownToBeOpaqueInRect(localRect, maxDepthToTest);
 
     if (!videoBox().contains(enclosingIntRect(localRect)))
         return false;
 
-    if (MediaPlayer* player = mediaElement()->player())
+    if (MediaPlayer* player = videoElement().player())
         return player->hasAvailableVideoFrame();
 
     return false;
index 1a9128b..60752c0 100644 (file)
 #include "RenderMedia.h"
 
 namespace WebCore {
-    
-class HTMLMediaElement;
+
 class HTMLVideoElement;
 
 class RenderVideo FINAL : public RenderMedia {
 public:
-    RenderVideo(HTMLVideoElement*);
+    explicit RenderVideo(HTMLVideoElement&);
     virtual ~RenderVideo();
 
+    HTMLVideoElement& videoElement() const;
+
     IntRect videoBox() const;
 
     static IntSize defaultSize();
@@ -54,8 +55,9 @@ public:
     virtual bool shouldDisplayVideo() const;
 
 private:
+    void mediaElement() const WTF_DELETED_FUNCTION;
+
     virtual void updateFromElement();
-    inline HTMLVideoElement* videoElement() const;
 
     virtual void intrinsicSizeChanged();
     LayoutSize calculateIntrinsicSize();