WebKit Bugzilla
Attachment 370842 Details for
Bug 197739
: Intent to implement intrinsicSize attribute
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
WIP
IS_003.diff (text/plain), 31.38 KB, created by
cathiechen
on 2019-05-29 07:18:02 PDT
(
hide
)
Description:
WIP
Filename:
MIME Type:
Creator:
cathiechen
Created:
2019-05-29 07:18:02 PDT
Size:
31.38 KB
patch
obsolete
>diff --git a/LayoutTests/TestExpectations b/LayoutTests/TestExpectations >index d7dc37c885..22cec7b03f 100644 >--- a/LayoutTests/TestExpectations >+++ b/LayoutTests/TestExpectations >@@ -895,7 +895,6 @@ imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/ > imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/invalid-src.html [ Skip ] > imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/relevant-mutations.html [ Skip ] > imported/w3c/web-platform-tests/html/semantics/embedded-content/the-object-element/object-events.html [ Skip ] >-imported/w3c/web-platform-tests/html/semantics/embedded-content/the-video-element/intrinsicsize/intrinsicsize-without-unsized-media.tentative.https.sub.html [ Skip ] > > # @supports W3C Failures > webkit.org/b/137568 css3/conditional/w3c/at-supports-014.html [ ImageOnlyFailure ] >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/intrinsicsize/intrinsicsize-with-responsive-images.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/intrinsicsize/intrinsicsize-with-responsive-images.tentative-expected.txt >index 07c56f0c1d..c04f5a7957 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/intrinsicsize/intrinsicsize-with-responsive-images.tentative-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/intrinsicsize/intrinsicsize-with-responsive-images.tentative-expected.txt >@@ -1,10 +1,10 @@ > > >-FAIL Test image /images/green.svg with no specified sizes, width, or height assert_equals: width expected 400 but got 33 >-FAIL Test image /images/green.svg with width = 800, no specified sizes, or height assert_equals: height expected 1000 but got 400 >-FAIL Test image /images/green.svg with width = 800, height = 800, and no specified sizes assert_equals: naturalWidth expected 400 but got 800 >-FAIL Test image /images/green.png with no specified sizes, width, or height assert_equals: width expected 400 but got 33 >-FAIL Test image /images/green.png with width = 800, no specified sizes, or height assert_equals: height expected 1000 but got 400 >-FAIL Test image /images/green.png with width = 800, height = 800, and no specified sizes assert_equals: naturalWidth expected 400 but got 100 >-FAIL Test image (32 x 32) with sizes = 100 and srcset descriptor = 32w assert_equals: height expected 125 but got 100 >+PASS Test image /images/green.svg with no specified sizes, width, or height >+PASS Test image /images/green.svg with width = 800, no specified sizes, or height >+PASS Test image /images/green.svg with width = 800, height = 800, and no specified sizes >+PASS Test image /images/green.png with no specified sizes, width, or height >+PASS Test image /images/green.png with width = 800, no specified sizes, or height >+PASS Test image /images/green.png with width = 800, height = 800, and no specified sizes >+FAIL Test image (32 x 32) with sizes = 100 and srcset descriptor = 32w assert_equals: width expected 100 but got 400 > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/intrinsicsize/intrinsicsize-without-unsized-media.tentative.https.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/intrinsicsize/intrinsicsize-without-unsized-media.tentative.https.sub-expected.txt >index ea2e984c63..1ee4bb7d79 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/intrinsicsize/intrinsicsize-without-unsized-media.tentative.https.sub-expected.txt >+++ b/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/intrinsicsize/intrinsicsize-without-unsized-media.tentative.https.sub-expected.txt >@@ -1,5 +1,5 @@ >- >+ > >-FAIL Test intrinsicsize for html image element, src=/images/green.svg assert_equals: width expected 400 but got 100 >-FAIL Test intrinsicsize for html image element, src=/images/green.png assert_equals: width expected 400 but got 100 >+PASS Test intrinsicsize for html image element, src=/images/green.svg >+PASS Test intrinsicsize for html image element, src=/images/green.png > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-video-element/intrinsicsize/intrinsicsize-without-unsized-media.tentative.https.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-video-element/intrinsicsize/intrinsicsize-without-unsized-media.tentative.https.sub-expected.txt >new file mode 100644 >index 0000000000..3e6d7fc879 >--- /dev/null >+++ b/LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-video-element/intrinsicsize/intrinsicsize-without-unsized-media.tentative.https.sub-expected.txt >@@ -0,0 +1,4 @@ >+ >+ >+PASS Test intrinsicsize for html video element >+ >diff --git a/Source/WebCore/html/HTMLAttributeNames.in b/Source/WebCore/html/HTMLAttributeNames.in >index 1e9a826559..b64c3a73bc 100644 >--- a/Source/WebCore/html/HTMLAttributeNames.in >+++ b/Source/WebCore/html/HTMLAttributeNames.in >@@ -150,6 +150,7 @@ incremental > indeterminate > inputmode > integrity >+intrinsicsize > is > ismap > itemid >diff --git a/Source/WebCore/html/HTMLImageElement.cpp b/Source/WebCore/html/HTMLImageElement.cpp >index 5cdc709399..7c4aba562c 100644 >--- a/Source/WebCore/html/HTMLImageElement.cpp >+++ b/Source/WebCore/html/HTMLImageElement.cpp >@@ -242,7 +242,14 @@ void HTMLImageElement::parseAttribute(const QualifiedName& name, const AtomicStr > #endif > } else if (name == x_apple_editable_imageAttr) > updateEditableImage(); >- else { >+ else if (name == intrinsicsizeAttr && RuntimeEnabledFeatures::sharedFeatures().intrinsicSizeAttributeEnabled()) { >+ auto newSize = parseIntrinsicSizeAttribute(value); >+ if (newSize && m_overriddenIntrinsicSize != newSize.value()) { >+ m_overriddenIntrinsicSize = newSize.value(); >+ if (is<RenderImage>(renderer())) >+ downcast<RenderImage>(*renderer()).intrinsicSizeChanged(); >+ } >+ } else { > if (name == nameAttr) { > bool willHaveName = !value.isNull(); > if (m_hadNameBeforeAttributeChanged != willHaveName && isConnected() && !isInShadowTree() && is<HTMLDocument>(document())) { >@@ -510,6 +517,9 @@ unsigned HTMLImageElement::height(bool ignorePendingStylesheets) > > int HTMLImageElement::naturalWidth() const > { >+ if (!m_overriddenIntrinsicSize.isEmpty()) >+ return m_overriddenIntrinsicSize.width(); >+ > if (!m_imageLoader.image()) > return 0; > >@@ -518,6 +528,9 @@ int HTMLImageElement::naturalWidth() const > > int HTMLImageElement::naturalHeight() const > { >+ if(!m_overriddenIntrinsicSize.isEmpty()) >+ return m_overriddenIntrinsicSize.height(); >+ > if (!m_imageLoader.image()) > return 0; > >diff --git a/Source/WebCore/html/HTMLImageElement.h b/Source/WebCore/html/HTMLImageElement.h >index 1869880df3..fd30825ff0 100644 >--- a/Source/WebCore/html/HTMLImageElement.h >+++ b/Source/WebCore/html/HTMLImageElement.h >@@ -36,6 +36,7 @@ class EditableImageReference; > class HTMLAttachmentElement; > class HTMLFormElement; > class HTMLMapElement; >+class IntSize; > > struct ImageCandidate; > >@@ -84,6 +85,8 @@ public: > > WEBCORE_EXPORT void setWidth(unsigned); > >+ IntSize getOverriddenIntrinsicSize() const { return m_overriddenIntrinsicSize; } >+ > WEBCORE_EXPORT int x() const; > WEBCORE_EXPORT int y() const; > >@@ -191,6 +194,8 @@ private: > String m_pendingClonedAttachmentID; > #endif > >+ IntSize m_overriddenIntrinsicSize; >+ > friend class HTMLPictureElement; > }; > >diff --git a/Source/WebCore/html/HTMLImageElement.idl b/Source/WebCore/html/HTMLImageElement.idl >index 03d6e2c04b..410cc4cad1 100644 >--- a/Source/WebCore/html/HTMLImageElement.idl >+++ b/Source/WebCore/html/HTMLImageElement.idl >@@ -42,6 +42,9 @@ > [CEReactions=NotNeeded] attribute unsigned long width; > [CEReactions=NotNeeded, Reflect] attribute DOMString decoding; > >+ // https://github.com/WICG/intrinsicsize-attribute >+ [EnabledAtRuntime=IntrinsicSizeAttribute, CEReactions, Reflect] attribute DOMString intrinsicSize; >+ > [Conditional=ATTACHMENT_ELEMENT, EnabledAtRuntime=AttachmentElement] readonly attribute DOMString attachmentIdentifier; > > // Extensions >diff --git a/Source/WebCore/html/HTMLVideoElement.cpp b/Source/WebCore/html/HTMLVideoElement.cpp >index a6f2f835bb..d2ad21f149 100644 >--- a/Source/WebCore/html/HTMLVideoElement.cpp >+++ b/Source/WebCore/html/HTMLVideoElement.cpp >@@ -41,6 +41,7 @@ > #include "Page.h" > #include "RenderImage.h" > #include "RenderVideo.h" >+#include "RuntimeEnabledFeatures.h" > #include "ScriptController.h" > #include "Settings.h" > #include <wtf/IsoMallocInlines.h> >@@ -133,6 +134,13 @@ void HTMLVideoElement::parseAttribute(const QualifiedName& name, const AtomicStr > if (auto* renderer = this->renderer()) > renderer->imageResource().setCachedImage(nullptr); > } >+ } else if (name == intrinsicsizeAttr && RuntimeEnabledFeatures::sharedFeatures().intrinsicSizeAttributeEnabled()) { >+ auto newSize = parseIntrinsicSizeAttribute(value); >+ if (newSize && m_overriddenIntrinsicSize != newSize.value()) { >+ m_overriddenIntrinsicSize = newSize.value(); >+ if (renderer()) >+ renderer()->intrinsicSizeChanged(); >+ } > } > #if ENABLE(WIRELESS_PLAYBACK_TARGET) > else if (name == webkitwirelessvideoplaybackdisabledAttr) >@@ -201,6 +209,8 @@ void HTMLVideoElement::webkitRequestFullscreen() > > unsigned HTMLVideoElement::videoWidth() const > { >+ if (m_overriddenIntrinsicSize.width() > 0) >+ return m_overriddenIntrinsicSize.width(); > if (!player()) > return 0; > return clampToUnsigned(player()->naturalSize().width()); >@@ -208,6 +218,8 @@ unsigned HTMLVideoElement::videoWidth() const > > unsigned HTMLVideoElement::videoHeight() const > { >+ if (m_overriddenIntrinsicSize.height() > 0) >+ return m_overriddenIntrinsicSize.height(); > if (!player()) > return 0; > return clampToUnsigned(player()->naturalSize().height()); >diff --git a/Source/WebCore/html/HTMLVideoElement.h b/Source/WebCore/html/HTMLVideoElement.h >index d4ba370b42..569523d942 100644 >--- a/Source/WebCore/html/HTMLVideoElement.h >+++ b/Source/WebCore/html/HTMLVideoElement.h >@@ -33,6 +33,7 @@ > namespace WebCore { > > class HTMLImageLoader; >+class IntSize; > class RenderVideo; > > class HTMLVideoElement final : public HTMLMediaElement { >@@ -94,6 +95,8 @@ public: > > RenderVideo* renderer() const; > >+ IntSize getOverriddenIntrinsicSize() const { return m_overriddenIntrinsicSize; } >+ > private: > HTMLVideoElement(const QualifiedName&, Document&, bool createdByParser); > >@@ -123,6 +126,8 @@ private: > > unsigned m_lastReportedVideoWidth { 0 }; > unsigned m_lastReportedVideoHeight { 0 }; >+ >+ IntSize m_overriddenIntrinsicSize; > }; > > } // namespace WebCore >diff --git a/Source/WebCore/html/HTMLVideoElement.idl b/Source/WebCore/html/HTMLVideoElement.idl >index 1f931685bc..186ebb3e35 100644 >--- a/Source/WebCore/html/HTMLVideoElement.idl >+++ b/Source/WebCore/html/HTMLVideoElement.idl >@@ -33,6 +33,9 @@ > readonly attribute unsigned long videoHeight; > [CEReactions=NotNeeded, Reflect, URL] attribute USVString poster; > >+ // https://github.com/WICG/intrinsicsize-attribute >+ [EnabledAtRuntime=IntrinsicSizeAttribute, CEReactions, Reflect] attribute DOMString intrinsicSize; >+ > [CEReactions=NotNeeded, Reflect] attribute boolean playsInline; > readonly attribute boolean webkitSupportsFullscreen; > readonly attribute boolean webkitDisplayingFullscreen; >diff --git a/Source/WebCore/html/parser/HTMLParserIdioms.cpp b/Source/WebCore/html/parser/HTMLParserIdioms.cpp >index 3991e75461..35a70242f1 100644 >--- a/Source/WebCore/html/parser/HTMLParserIdioms.cpp >+++ b/Source/WebCore/html/parser/HTMLParserIdioms.cpp >@@ -476,4 +476,25 @@ AtomicString parseHTMLHashNameReference(StringView usemap) > return usemap.substring(numberSignIndex + 1).toAtomicString(); > } > >+Expected<IntSize, HTMLIntegerParsingError> parseIntrinsicSizeAttribute(StringView input) >+{ >+ auto splitResult = input.split('x'); >+ auto it = splitResult.begin(); >+ if (it != splitResult.end()) { >+ auto newWidth = parseHTMLNonNegativeInteger(*it); >+ if (!newWidth) >+ return makeUnexpected(WTFMove(newWidth.error())); >+ ++it; >+ if (it != splitResult.end()) { >+ auto newHeight = parseHTMLNonNegativeInteger(*it); >+ if (!newHeight) >+ return makeUnexpected(WTFMove(newHeight.error())); >+ ++it; >+ if (it == splitResult.end()) >+ return IntSize(newWidth.value(), newHeight.value()); >+ } >+ } >+ return makeUnexpected(HTMLIntegerParsingError::Other); >+} >+ > } >diff --git a/Source/WebCore/html/parser/HTMLParserIdioms.h b/Source/WebCore/html/parser/HTMLParserIdioms.h >index 69e894d108..30f3542ce6 100644 >--- a/Source/WebCore/html/parser/HTMLParserIdioms.h >+++ b/Source/WebCore/html/parser/HTMLParserIdioms.h >@@ -32,6 +32,7 @@ namespace WebCore { > > class Decimal; > class QualifiedName; >+class IntSize; > > // Space characters as defined by the HTML specification. > template<typename CharacterType> bool isHTMLSpace(CharacterType); >@@ -172,4 +173,6 @@ inline unsigned clampHTMLNonNegativeIntegerToRange(StringView stringValue, unsig > return optionalValue.error() == HTMLIntegerParsingError::PositiveOverflow ? max : defaultValue; > } > >+// https://github.com/WICG/intrinsicsize-attribute >+Expected<IntSize, HTMLIntegerParsingError> parseIntrinsicSizeAttribute(StringView input); > } // namespace WebCore >diff --git a/Source/WebCore/page/RuntimeEnabledFeatures.h b/Source/WebCore/page/RuntimeEnabledFeatures.h >index a40c762492..921eecf387 100644 >--- a/Source/WebCore/page/RuntimeEnabledFeatures.h >+++ b/Source/WebCore/page/RuntimeEnabledFeatures.h >@@ -356,6 +356,8 @@ public: > > bool pageAtRuleSupportEnabled() const { return m_pageAtRuleSupportEnabled; } > void setPageAtRuleSupportEnabled(bool isEnabled) { m_pageAtRuleSupportEnabled = isEnabled; } >+ bool intrinsicSizeAttributeEnabled() const { return m_intrinsicSizeAttributeEnabled; } >+ void setIntrinsicSizeAttributeEnabled(bool isEnabled) { m_intrinsicSizeAttributeEnabled = isEnabled; } > > WEBCORE_EXPORT static RuntimeEnabledFeatures& sharedFeatures(); > >@@ -535,6 +537,7 @@ private: > bool m_mouseEventsSimulationEnabled { false }; > Optional<bool> m_touchEventsEnabled; > #endif >+ bool m_intrinsicSizeAttributeEnabled { false }; > > bool m_isITPDatabaseEnabled { false }; > bool m_isITPFirstPartyWebsiteDataRemovalEnabled { false }; >diff --git a/Source/WebCore/rendering/RenderImage.cpp b/Source/WebCore/rendering/RenderImage.cpp >index 4d6aa757ea..3143af555c 100644 >--- a/Source/WebCore/rendering/RenderImage.cpp >+++ b/Source/WebCore/rendering/RenderImage.cpp >@@ -140,12 +140,16 @@ RenderImage::RenderImage(Element& element, RenderStyle&& style, StyleImage* styl > updateAltText(); > if (is<HTMLImageElement>(element)) > m_hasShadowControls = downcast<HTMLImageElement>(element).hasShadowControls(); >+ if (!getOverriddenIntrinsicSize().isEmpty()) >+ intrinsicSizeChanged(); > } > > RenderImage::RenderImage(Document& document, RenderStyle&& style, StyleImage* styleImage) > : RenderReplaced(document, WTFMove(style), IntSize()) > , m_imageResource(styleImage ? std::make_unique<RenderImageResourceStyleImage>(*styleImage) : std::make_unique<RenderImageResource>()) > { >+ if (!getOverriddenIntrinsicSize().isEmpty()) >+ intrinsicSizeChanged(); > } > > RenderImage::~RenderImage() >@@ -218,7 +222,7 @@ bool RenderImage::isEditableImage() const > return false; > return downcast<HTMLImageElement>(element())->hasEditableImageAttribute(); > } >- >+ > bool RenderImage::requiresLayer() const > { > if (RenderReplaced::requiresLayer()) >@@ -267,7 +271,7 @@ void RenderImage::imageChanged(WrappedImagePtr newImage, const IntRect* rect) > if (hasVisibleBoxDecorations() || hasMask() || hasShapeOutside()) > RenderReplaced::imageChanged(newImage, rect); > >- if (newImage != imageResource().imagePtr() || !newImage) >+ if ((newImage != imageResource().imagePtr() || !newImage) && getOverriddenIntrinsicSize().isEmpty()) > return; > > if (!m_didIncrementVisuallyNonEmptyPixelCount) { >@@ -297,7 +301,7 @@ void RenderImage::imageChanged(WrappedImagePtr newImage, const IntRect* rect) > > void RenderImage::updateIntrinsicSizeIfNeeded(const LayoutSize& newSize) > { >- if (imageResource().errorOccurred() || !m_imageResource->cachedImage()) >+ if ((imageResource().errorOccurred() || !m_imageResource->cachedImage()) && getOverriddenIntrinsicSize().isEmpty()) > return; > setIntrinsicSize(newSize); > } >@@ -326,6 +330,11 @@ void RenderImage::repaintOrMarkForLayout(ImageSizeChangeType imageSizeChange, co > #else > LayoutSize newIntrinsicSize = imageResource().intrinsicSize(style().effectiveZoom()); > #endif >+ >+ auto overriddenIntrinsicSize = getOverriddenIntrinsicSize(); >+ if (!overriddenIntrinsicSize.isEmpty()) >+ newIntrinsicSize = LayoutSize(overriddenIntrinsicSize); >+ > LayoutSize oldIntrinsicSize = intrinsicSize(); > > updateIntrinsicSizeIfNeeded(newIntrinsicSize); >@@ -702,6 +711,10 @@ bool RenderImage::computeBackgroundIsKnownToBeObscured(const LayoutPoint& paintO > > LayoutUnit RenderImage::minimumReplacedHeight() const > { >+ auto overriddenIntrinsicSize = getOverriddenIntrinsicSize(); >+ if (!overriddenIntrinsicSize.isEmpty()) >+ return overriddenIntrinsicSize.height(); >+ > return imageResource().errorOccurred() ? intrinsicSize().height() : 0_lu; > } > >@@ -828,7 +841,7 @@ void RenderImage::computeIntrinsicRatioInformation(FloatSize& intrinsicSize, dou > } > } > // Don't compute an intrinsic ratio to preserve historical WebKit behavior if we're painting alt text and/or a broken image. >- if (imageResource().errorOccurred()) { >+ if (imageResource().errorOccurred() && getOverriddenIntrinsicSize().isEmpty()) { > intrinsicRatio = 1; > return; > } >@@ -850,4 +863,12 @@ RenderBox* RenderImage::embeddedContentBox() const > return nullptr; > } > >+IntSize RenderImage::getOverriddenIntrinsicSize() const >+{ >+ auto* imageElement = element(); >+ if (imageElement && is<HTMLImageElement>(imageElement)) >+ return downcast<HTMLImageElement>(imageElement)->getOverriddenIntrinsicSize(); >+ return IntSize(); >+} >+ > } // namespace WebCore >diff --git a/Source/WebCore/rendering/RenderImage.h b/Source/WebCore/rendering/RenderImage.h >index 82cc7419fe..eac87cd3f7 100644 >--- a/Source/WebCore/rendering/RenderImage.h >+++ b/Source/WebCore/rendering/RenderImage.h >@@ -78,6 +78,13 @@ public: > > bool isEditableImage() const; > >+ void intrinsicSizeChanged() override >+ { >+ imageChanged(imageResource().imagePtr()); >+ } >+ >+ IntSize getOverriddenIntrinsicSize() const; >+ > protected: > void willBeDestroyed() override; > >@@ -95,11 +102,6 @@ protected: > void paint(PaintInfo&, const LayoutPoint&) final; > void layout() override; > >- void intrinsicSizeChanged() override >- { >- imageChanged(imageResource().imagePtr()); >- } >- > private: > const char* renderName() const override { return "RenderImage"; } > >diff --git a/Source/WebCore/rendering/RenderReplaced.cpp b/Source/WebCore/rendering/RenderReplaced.cpp >index d1e144eb3f..dbeb4a6062 100644 >--- a/Source/WebCore/rendering/RenderReplaced.cpp >+++ b/Source/WebCore/rendering/RenderReplaced.cpp >@@ -345,7 +345,8 @@ bool RenderReplaced::setNeedsLayoutIfNeededAfterIntrinsicSizeChange() > void RenderReplaced::computeAspectRatioInformationForRenderBox(RenderBox* contentRenderer, FloatSize& constrainedSize, double& intrinsicRatio) const > { > FloatSize intrinsicSize; >- if (contentRenderer) { >+ IntSize overriddenIntrinsicSize = is<RenderImage>(*this) ? downcast<RenderImage>(*this).getOverriddenIntrinsicSize() : IntSize(); >+ if (contentRenderer && overriddenIntrinsicSize.isEmpty()) { > contentRenderer->computeIntrinsicRatioInformation(intrinsicSize, intrinsicRatio); > > // Handle zoom & vertical writing modes here, as the embedded document doesn't know about them. >@@ -423,7 +424,7 @@ LayoutRect RenderReplaced::replacedContentRect(const LayoutSize& intrinsicSize) > void RenderReplaced::computeIntrinsicRatioInformation(FloatSize& intrinsicSize, double& intrinsicRatio) const > { > // If there's an embeddedContentBox() of a remote, referenced document available, this code-path should never be used. >- ASSERT(!embeddedContentBox()); >+ ASSERT(!embeddedContentBox() || (is<RenderImage>(*this) && !downcast<RenderImage>(*this).getOverriddenIntrinsicSize().isEmpty())); > intrinsicSize = FloatSize(intrinsicLogicalWidth(), intrinsicLogicalHeight()); > > // Figure out if we need to compute an intrinsic ratio. >diff --git a/Source/WebCore/rendering/RenderVideo.cpp b/Source/WebCore/rendering/RenderVideo.cpp >index 2eed9c45b2..ebf1f1ff1e 100644 >--- a/Source/WebCore/rendering/RenderVideo.cpp >+++ b/Source/WebCore/rendering/RenderVideo.cpp >@@ -38,6 +38,7 @@ > #include "Page.h" > #include "PaintInfo.h" > #include "RenderView.h" >+#include "RuntimeEnabledFeatures.h" > #include <wtf/IsoMallocInlines.h> > #include <wtf/StackStats.h> > >@@ -112,6 +113,9 @@ bool RenderVideo::updateIntrinsicSize() > > LayoutSize RenderVideo::calculateIntrinsicSize() > { >+ if (RuntimeEnabledFeatures::sharedFeatures().intrinsicSizeAttributeEnabled() && !videoElement().getOverriddenIntrinsicSize().isEmpty()) >+ return LayoutSize(videoElement().getOverriddenIntrinsicSize()); >+ > // Spec text from 4.8.6 > // > // The intrinsic width of a video element's playback area is the intrinsic width >diff --git a/Source/WebCore/rendering/RenderVideo.h b/Source/WebCore/rendering/RenderVideo.h >index 8e25c68a53..a03dde319d 100644 >--- a/Source/WebCore/rendering/RenderVideo.h >+++ b/Source/WebCore/rendering/RenderVideo.h >@@ -53,11 +53,12 @@ public: > > void updateFromElement() final; > >+ void intrinsicSizeChanged() final; >+ > private: > void willBeDestroyed() override; > void mediaElement() const = delete; > >- void intrinsicSizeChanged() final; > LayoutSize calculateIntrinsicSize(); > bool updateIntrinsicSize(); > >diff --git a/Source/WebKit/Shared/WebPreferences.yaml b/Source/WebKit/Shared/WebPreferences.yaml >index e59efb801c..31c9db3b3f 100644 >--- a/Source/WebKit/Shared/WebPreferences.yaml >+++ b/Source/WebKit/Shared/WebPreferences.yaml >@@ -706,6 +706,14 @@ AnimatedImageAsyncDecodingEnabled: > type: bool > defaultValue: true > >+IntrinsicSizeAttributeEnabled: >+ type: bool >+ defaultValue: true >+ webcoreBinding: RuntimeEnabledFeatures >+ humanReadableName: "intrinsicsize attribute" >+ humanReadableDescription: "Enable support for the intrinsicsize attribute" >+ category: internal >+ > CustomElementsEnabled: > type: bool > defaultValue: true >diff --git a/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h b/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h >index 1dcbc25ff5..915f27da79 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h >+++ b/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h >@@ -152,6 +152,7 @@ > #define WebKitResourceLoadStatisticsEnabledPreferenceKey @"WebKitResourceLoadStatisticsEnabled" > #define WebKitLargeImageAsyncDecodingEnabledPreferenceKey @"WebKitLargeImageAsyncDecodingEnabled" > #define WebKitAnimatedImageAsyncDecodingEnabledPreferenceKey @"WebKitAnimatedImageAsyncDecodingEnabled" >+#define WebKitIntrinsicSizeAttributeEnabledPreferenceKey @"WebKitIntrinsicSizeAttributeEnabled" > #if TARGET_OS_IPHONE > #define WebKitAudioSessionCategoryOverride @"WebKitAudioSessionCategoryOverride" > #define WebKitAVKitEnabled @"WebKitAVKitEnabled" >diff --git a/Source/WebKitLegacy/mac/WebView/WebPreferences.mm b/Source/WebKitLegacy/mac/WebView/WebPreferences.mm >index 9f1c226fb9..bff37ee4a6 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebPreferences.mm >+++ b/Source/WebKitLegacy/mac/WebView/WebPreferences.mm >@@ -514,6 +514,7 @@ public: > [NSNumber numberWithBool:NO], WebKitResourceLoadStatisticsEnabledPreferenceKey, > [NSNumber numberWithBool:YES], WebKitLargeImageAsyncDecodingEnabledPreferenceKey, > [NSNumber numberWithBool:YES], WebKitAnimatedImageAsyncDecodingEnabledPreferenceKey, >+ [NSNumber numberWithBool:YES], WebKitIntrinsicSizeAttributeEnabledPreferenceKey, > #if PLATFORM(IOS_FAMILY) > [NSNumber numberWithUnsignedInt:static_cast<uint32_t>(FrameFlattening::FullyEnabled)], WebKitFrameFlatteningPreferenceKey, > #else >diff --git a/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h b/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h >index 4c6581f98e..f9eb07fd3a 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h >+++ b/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h >@@ -610,6 +610,7 @@ extern NSString *WebPreferencesCacheModelChangedInternalNotification WEBKIT_DEPR > @property (nonatomic) BOOL CSSOMViewScrollingAPIEnabled; > @property (nonatomic) BOOL largeImageAsyncDecodingEnabled; > @property (nonatomic) BOOL animatedImageAsyncDecodingEnabled; >+@property (nonatomic) BOOL IntrinsicSizeAttributeEnabled; > @property (nonatomic) BOOL javaScriptMarkupEnabled; > @property (nonatomic) BOOL mediaDataLoadsAutomatically; > @property (nonatomic) BOOL attachmentElementEnabled; >diff --git a/Source/WebKitLegacy/mac/WebView/WebView.mm b/Source/WebKitLegacy/mac/WebView/WebView.mm >index 9d6eea41c5..1688edc60e 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebView.mm >+++ b/Source/WebKitLegacy/mac/WebView/WebView.mm >@@ -3233,6 +3233,7 @@ static bool needsSelfRetainWhileLoadingQuirk() > > settings.setLargeImageAsyncDecodingEnabled([preferences largeImageAsyncDecodingEnabled]); > settings.setAnimatedImageAsyncDecodingEnabled([preferences animatedImageAsyncDecodingEnabled]); >+ settings.setIntrinsicSizeAttributeEnabled([preferences IntrinsicSizeAttributeEnabled]); > settings.setMediaCapabilitiesEnabled([preferences mediaCapabilitiesEnabled]); > > settings.setCoreMathMLEnabled([preferences coreMathMLEnabled]); >diff --git a/Source/WebKitLegacy/win/Interfaces/IWebPreferencesPrivate.idl b/Source/WebKitLegacy/win/Interfaces/IWebPreferencesPrivate.idl >index cb8dda4aef..d8e2fc4d01 100644 >--- a/Source/WebKitLegacy/win/Interfaces/IWebPreferencesPrivate.idl >+++ b/Source/WebKitLegacy/win/Interfaces/IWebPreferencesPrivate.idl >@@ -242,4 +242,6 @@ interface IWebPreferencesPrivate7 : IWebPreferencesPrivate6 > HRESULT setResizeObserverEnabled([in] BOOL enabled); > HRESULT coreMathMLEnabled([out, retval] BOOL* enabled); > HRESULT setCoreMathMLEnabled([in] BOOL enabled); >+ HRESULT intrinsicSizeAttributeEnabled([out, retval] BOOL*); >+ HRESULT setIntrinsicSizeAttributeEnabled([in] BOOL enabled); > } >diff --git a/Source/WebKitLegacy/win/WebPreferenceKeysPrivate.h b/Source/WebKitLegacy/win/WebPreferenceKeysPrivate.h >index ba662703ab..1ad5cb303b 100644 >--- a/Source/WebKitLegacy/win/WebPreferenceKeysPrivate.h >+++ b/Source/WebKitLegacy/win/WebPreferenceKeysPrivate.h >@@ -209,3 +209,4 @@ > #define WebKitResizeObserverEnabledPreferenceKey "WebKitResizeObserverEnabled" > > #define WebKitCoreMathMLEnabledPreferenceKey "WebKitCoreMathMLEnabled" >+#define WebKitIntrinsicSizeAttributeEnabledPreferenceKey "WebKitIntrinsicSizeAttributeEnabled" >diff --git a/Source/WebKitLegacy/win/WebPreferences.cpp b/Source/WebKitLegacy/win/WebPreferences.cpp >index 13948686bc..2318081d93 100644 >--- a/Source/WebKitLegacy/win/WebPreferences.cpp >+++ b/Source/WebKitLegacy/win/WebPreferences.cpp >@@ -333,6 +333,8 @@ void WebPreferences::initializeDefaultSettings() > > CFDictionaryAddValue(defaults, CFSTR(WebKitCoreMathMLEnabledPreferenceKey), kCFBooleanFalse); > >+ CFDictionaryAddValue(defaults, CFSTR(WebKitIntrinsicSizeAttributeEnabledPreferenceKey), kCFBooleanFalse); >+ > defaultSettings = defaults; > } > >@@ -2051,6 +2053,20 @@ HRESULT WebPreferences::setCrossOriginWindowPolicySupportEnabled(BOOL) > return S_OK; > } > >+HRESULT WebPreferences::intrinsicSizeAttributeEnabled(_Out_ BOOL* enabled) >+{ >+ if (!enabled) >+ return E_POINTER; >+ *enabled = boolValueForKey(WebKitIntrinsicSizeAttributeEnabledPreferenceKey); >+ return S_OK; >+} >+ >+HRESULT WebPreferences::setIntrinsicSizeAttributeEnabled(BOOL enabled) >+{ >+ setBoolValue(WebKitIntrinsicSizeAttributeEnabledPreferenceKey, enabled); >+ return S_OK; >+} >+ > HRESULT WebPreferences::setModernMediaControlsEnabled(BOOL enabled) > { > setBoolValue(WebKitModernMediaControlsEnabledPreferenceKey, enabled); >diff --git a/Source/WebKitLegacy/win/WebPreferences.h b/Source/WebKitLegacy/win/WebPreferences.h >index 5ee6427b35..c0492a79dc 100644 >--- a/Source/WebKitLegacy/win/WebPreferences.h >+++ b/Source/WebKitLegacy/win/WebPreferences.h >@@ -287,6 +287,8 @@ public: > virtual HRESULT STDMETHODCALLTYPE setResizeObserverEnabled(BOOL); > virtual HRESULT STDMETHODCALLTYPE coreMathMLEnabled(_Out_ BOOL*); > virtual HRESULT STDMETHODCALLTYPE setCoreMathMLEnabled(BOOL); >+ virtual HRESULT STDMETHODCALLTYPE intrinsicSizeAttributeEnabled(_Out_ BOOL*); >+ virtual HRESULT STDMETHODCALLTYPE setIntrinsicSizeAttributeEnabled(BOOL); > > // WebPreferences > >diff --git a/Source/WebKitLegacy/win/WebView.cpp b/Source/WebKitLegacy/win/WebView.cpp >index 79fc46d0fb..c0b721a839 100644 >--- a/Source/WebKitLegacy/win/WebView.cpp >+++ b/Source/WebKitLegacy/win/WebView.cpp >@@ -5297,6 +5297,11 @@ HRESULT WebView::notifyPreferencesChanged(IWebNotification* notification) > return hr; > settings.setCSSOMViewScrollingAPIEnabled(!!enabled); > >+ hr = prefsPrivate->IntrinsicSizeAttributeEnabled(&enabled); >+ if (FAILED(hr)) >+ return hr; >+ settings.setIntrinsicSizeAttributeEnabled(!!enabled); >+ > hr = preferences->privateBrowsingEnabled(&enabled); > if (FAILED(hr)) > return hr; >diff --git a/Tools/DumpRenderTree/TestOptions.cpp b/Tools/DumpRenderTree/TestOptions.cpp >index aaa5e72d4e..f1f1623d42 100644 >--- a/Tools/DumpRenderTree/TestOptions.cpp >+++ b/Tools/DumpRenderTree/TestOptions.cpp >@@ -117,6 +117,8 @@ TestOptions::TestOptions(const std::string& pathOrURL, const std::string& absolu > enableResizeObserver = parseBooleanTestHeaderValue(value); > else if (key == "experimental:CoreMathMLEnabled") > enableCoreMathML = parseBooleanTestHeaderValue(value); >+ else if (key == "internal:IntrinsicSizeAttributeEnabled") >+ intrinsicSizeAttributeEnabled = parseBooleanTestHeaderValue(value); > pairStart = pairEnd + 1; > } > } >diff --git a/Tools/DumpRenderTree/TestOptions.h b/Tools/DumpRenderTree/TestOptions.h >index d16f758a36..5a16b9b89b 100644 >--- a/Tools/DumpRenderTree/TestOptions.h >+++ b/Tools/DumpRenderTree/TestOptions.h >@@ -48,6 +48,7 @@ struct TestOptions { > bool adClickAttributionEnabled { false }; > bool enableResizeObserver { false }; > bool enableCoreMathML { false }; >+ bool intrinsicSizeAttributeEnabled { false }; > std::string jscOptions; > std::string additionalSupportedImageTypes; > >diff --git a/Tools/DumpRenderTree/mac/DumpRenderTree.mm b/Tools/DumpRenderTree/mac/DumpRenderTree.mm >index 3e0d89525d..5db0547c0f 100644 >--- a/Tools/DumpRenderTree/mac/DumpRenderTree.mm >+++ b/Tools/DumpRenderTree/mac/DumpRenderTree.mm >@@ -1020,6 +1020,7 @@ static void setWebPreferencesForTestOptions(const TestOptions& options) > preferences.adClickAttributionEnabled = options.adClickAttributionEnabled; > preferences.resizeObserverEnabled = options.enableResizeObserver; > preferences.coreMathMLEnabled = options.enableCoreMathML; >+ preferences.intrinsicSizeAttributeEnabled = options.intrinsicSizeAttributeEnabled; > } > > // Called once on DumpRenderTree startup.
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 197739
:
369850
|
369851
| 370842