Ignore:
Timestamp:
Feb 20, 2014, 4:39:35 PM (12 years ago)
Author:
[email protected]
Message:

Add very basic image control rendering
https://bugs.webkit.org/show_bug.cgi?id=129080

Reviewed by Tim Horton.

Source/WebCore:

Test: fast/images/image-controls-basic.html

This patch is groundwork that adds a very basic image control that can render on top of images.

  • dom/Node.h:

(WebCore::Node:: isImageControlsRootElement): Returns false, unless you are an ImageControls object.

  • html/HTMLAttributeNames.in:

Teach HTMLImageElement how to understand an experimental attribute to install controls,
how to actually build the DOM to attach to the shadow root, how to tear that DOM down,
and how to make sure that Renderers are created for that DOM:

  • html/HTMLImageElement.cpp:

(WebCore::HTMLImageElement::HTMLImageElement):
(WebCore::HTMLImageElement::parseAttribute):
(WebCore::HTMLImageElement::didAttachRenderers):
(WebCore::HTMLImageElement::updateImageControls):
(WebCore::HTMLImageElement::createImageControls):
(WebCore::HTMLImageElement::destroyImageControls):
(WebCore::HTMLImageElement::hasImageControls):
(WebCore::HTMLImageElement::childShouldCreateRenderer):

  • html/HTMLImageElement.h:

(WebCore::HTMLImageElement::hasShadowControls): For RenderImage to query when it is constructed.

Add a generic, platform independent ImageControls root element that does nothing:

  • html/shadow/ImageControlsRootElement.cpp: Added.

(WebCore::ImageControlsRootElement::maybeCreate):
(WebCore::ImageControlsRootElement::ImageControlsRootElement):
(WebCore::ImageControlsRootElement::~ImageControlsRootElement):

  • html/shadow/ImageControlsRootElement.h: Added.

Add a Mac-specific ImageControls root element that renders a 20x20 red box (for now):

  • html/shadow/mac/ImageControlsRootElementMac.cpp: Added.

(WebCore::ImageControlsRootElementMac::ImageControlsRootElementMac):
(WebCore::ImageControlsRootElementMac::~ImageControlsRootElementMac):
(WebCore::ImageControlsRootElement::maybeCreate):
(WebCore::ImageControlsRootElementMac::maybeCreate):

  • html/shadow/mac/ImageControlsRootElementMac.h: Added.

Since much of the RenderMedia::layout() method is now required for RenderImage as well,
move the logic to RenderImage. The extra work is controlled by a bool flag that will always
be set for RenderMedias but will only be set for certain RenderImages:

  • rendering/RenderImage.cpp:

(WebCore::RenderImage::RenderImage):
(WebCore::RenderImage::canHaveChildren):
(WebCore::RenderImage::layout):
(WebCore::RenderImage::layoutShadowControls):

  • rendering/RenderImage.h:

(WebCore::RenderImage::setHasShadowControls):
(WebCore::RenderImage::shadowControlsNeedCustomLayoutMetrics):

  • rendering/RenderMedia.cpp:

(WebCore::RenderMedia::RenderMedia):

  • rendering/RenderMedia.h:

(WebCore::RenderMedia::shadowControlsNeedCustomLayoutMetrics):

  • WebCore.xcodeproj/project.pbxproj:

Source/WebKit/mac:

Expose the imageControlsEnabled setting to WebKit1 so DRT can use it.

  • WebView/WebPreferenceKeysPrivate.h:
  • WebView/WebPreferences.mm:

(+[WebPreferences initialize]):
(-[WebPreferences imageControlsEnabled]):
(-[WebPreferences setImageControlsEnabled:]):

  • WebView/WebPreferencesPrivate.h:
  • WebView/WebView.mm:

(-[WebView _preferencesChanged:]):

Source/WebKit2:

  • WebProcess/InjectedBundle/InjectedBundle.cpp:

(WebKit::InjectedBundle::overrideBoolPreferenceForTestRunner): Expose the

imageControlsEnabled setting to WKTR.

LayoutTests:

  • fast/images/image-controls-basic.html: Added.
  • platform/mac/fast/images/image-controls-basic-expected.txt: Added.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/rendering/RenderMedia.cpp

    r162356 r164457  
    3838    : RenderImage(element, std::move(style))
    3939{
     40    setHasShadowControls(true);
    4041}
    4142
     
    4445{
    4546    setIntrinsicSize(intrinsicSize);
     47    setHasShadowControls(true);
    4648}
    4749
    4850RenderMedia::~RenderMedia()
    4951{
    50 }
    51 
    52 void RenderMedia::layout()
    53 {
    54     StackStats::LayoutCheckPoint layoutCheckPoint;
    55     LayoutSize oldSize = contentBoxRect().size();
    56 
    57     RenderImage::layout();
    58 
    59     RenderBox* controlsRenderer = toRenderBox(firstChild());
    60     if (!controlsRenderer)
    61         return;
    62 
    63     bool controlsNeedLayout = controlsRenderer->needsLayout();
    64     // If the region chain has changed we also need to relayout the controls to update the region box info.
    65     // FIXME: We can do better once we compute region box info for RenderReplaced, not only for RenderBlock.
    66     const RenderFlowThread* flowThread = flowThreadContainingBlock();
    67     if (flowThread && !controlsNeedLayout) {
    68         if (flowThread->pageLogicalSizeChanged())
    69             controlsNeedLayout = true;
    70     }
    71 
    72     LayoutSize newSize = contentBoxRect().size();
    73     if (newSize == oldSize && !controlsNeedLayout)
    74         return;
    75 
    76     // When calling layout() on a child node, a parent must either push a LayoutStateMaintainter, or
    77     // instantiate LayoutStateDisabler. Since using a LayoutStateMaintainer is slightly more efficient,
    78     // and this method will be called many times per second during playback, use a LayoutStateMaintainer:
    79     LayoutStateMaintainer statePusher(view(), *this, locationOffset(), hasTransform() || hasReflection() || style().isFlippedBlocksWritingMode());
    80 
    81     controlsRenderer->setLocation(LayoutPoint(borderLeft(), borderTop()) + LayoutSize(paddingLeft(), paddingTop()));
    82     controlsRenderer->style().setHeight(Length(newSize.height(), Fixed));
    83     controlsRenderer->style().setWidth(Length(newSize.width(), Fixed));
    84     controlsRenderer->setNeedsLayout(MarkOnlyThis);
    85     controlsRenderer->layout();
    86     clearChildNeedsLayout();
    87 
    88     statePusher.pop();
    8952}
    9053
Note: See TracChangeset for help on using the changeset viewer.