WebKit Bugzilla
Attachment 369851 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.diff (text/plain), 31.51 KB, created by
cathiechen
on 2019-05-14 08:36:05 PDT
(
hide
)
Description:
WIP
Filename:
MIME Type:
Creator:
cathiechen
Created:
2019-05-14 08:36:05 PDT
Size:
31.51 KB
patch
obsolete
>diff --git a/LayoutTests/TestExpectations b/LayoutTests/TestExpectations >index 7641823e01..cd316d0419 100644 >--- a/LayoutTests/TestExpectations >+++ b/LayoutTests/TestExpectations >@@ -889,7 +889,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 ca64447313..c2d44c46c7 100644 >--- a/Source/WebCore/html/HTMLAttributeNames.in >+++ b/Source/WebCore/html/HTMLAttributeNames.in >@@ -148,6 +148,7 @@ incremental > indeterminate > inputmode > integrity >+intrinsicsize > is > ismap > itemid >diff --git a/Source/WebCore/html/HTMLImageElement.cpp b/Source/WebCore/html/HTMLImageElement.cpp >index d047978fc8..c3f31a428f 100644 >--- a/Source/WebCore/html/HTMLImageElement.cpp >+++ b/Source/WebCore/html/HTMLImageElement.cpp >@@ -243,7 +243,11 @@ 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()) { >+ bool intrinsicSizeChanged = parseIntrinsicSizeAttribute(value, m_overriddenIntrinsicSize); >+ if (intrinsicSizeChanged && renderer() && is<RenderImage>(renderer())) >+ downcast<RenderImage>(*renderer()).intrinsicSizeChanged(); >+ } else { > if (name == nameAttr) { > bool willHaveName = !value.isNull(); > if (m_hadNameBeforeAttributeChanged != willHaveName && isConnected() && !isInShadowTree() && is<HTMLDocument>(document())) { >@@ -511,6 +515,9 @@ unsigned HTMLImageElement::height(bool ignorePendingStylesheets) > > int HTMLImageElement::naturalWidth() const > { >+ if (!m_overriddenIntrinsicSize.isEmpty()) >+ return m_overriddenIntrinsicSize.width(); >+ > if (!m_imageLoader.image()) > return 0; > >@@ -519,6 +526,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 d20fa7275a..dcf88ff735 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..3fbf9b1866 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; > >+ // github.com/ojanvafai/intrinsicsize-attribute/blob/master/README.md >+ [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 f47d4678de..0be4e9c092 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,10 @@ void HTMLVideoElement::parseAttribute(const QualifiedName& name, const AtomicStr > if (auto* renderer = this->renderer()) > renderer->imageResource().setCachedImage(nullptr); > } >+ } else if (name == intrinsicsizeAttr && RuntimeEnabledFeatures::sharedFeatures().intrinsicSizeAttributeEnabled()) { >+ bool intrinsicSizeChanged = parseIntrinsicSizeAttribute(value, m_overriddenIntrinsicSize); >+ if (intrinsicSizeChanged && renderer()) >+ renderer()->intrinsicSizeChanged(); > } > #if ENABLE(WIRELESS_PLAYBACK_TARGET) > else if (name == webkitwirelessvideoplaybackdisabledAttr) >@@ -201,6 +206,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 +215,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..94658bc7c1 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; > >+ // github.com/ojanvafai/intrinsicsize-attribute/blob/master/README.md >+ [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..15ec1c92df 100644 >--- a/Source/WebCore/html/parser/HTMLParserIdioms.cpp >+++ b/Source/WebCore/html/parser/HTMLParserIdioms.cpp >@@ -476,4 +476,31 @@ AtomicString parseHTMLHashNameReference(StringView usemap) > return usemap.substring(numberSignIndex + 1).toAtomicString(); > } > >+bool parseIntrinsicSizeAttribute(StringView input, IntSize& intrinsicSize) >+{ >+ unsigned newWidth = 0, newHeight = 0; >+ auto splitResult = input.split('x'); >+ auto it = splitResult.begin(); >+ if (it != splitResult.end()) { >+ if (auto parsedWidth = parseHTMLNonNegativeInteger(*it)) { >+ ++it; >+ if (it != splitResult.end()) { >+ if (auto parsedHeight = parseHTMLNonNegativeInteger(*it)) { >+ ++it; >+ if (it == splitResult.end()) { >+ newWidth = parsedWidth.value(); >+ newHeight = parsedHeight.value(); >+ } >+ } >+ } >+ } >+ } >+ IntSize newSize(newWidth, newHeight); >+ if (intrinsicSize != newSize) { >+ intrinsicSize = newSize; >+ return true; >+ } >+ return false; >+} >+ > } >diff --git a/Source/WebCore/html/parser/HTMLParserIdioms.h b/Source/WebCore/html/parser/HTMLParserIdioms.h >index 69e894d108..d30aa16d0b 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,7 @@ inline unsigned clampHTMLNonNegativeIntegerToRange(StringView stringValue, unsig > return optionalValue.error() == HTMLIntegerParsingError::PositiveOverflow ? max : defaultValue; > } > >+// https://github.com/ojanvafai/intrinsicsize-attribute >+bool parseIntrinsicSizeAttribute(StringView input, IntSize& intrinsicSize); >+ > } // namespace WebCore >diff --git a/Source/WebCore/page/RuntimeEnabledFeatures.h b/Source/WebCore/page/RuntimeEnabledFeatures.h >index 0e9c86f35f..f5c7f67d3c 100644 >--- a/Source/WebCore/page/RuntimeEnabledFeatures.h >+++ b/Source/WebCore/page/RuntimeEnabledFeatures.h >@@ -355,6 +355,9 @@ public: > bool referrerPolicyAttributeEnabled() const { return m_referrerPolicyAttributeEnabled; } > void setReferrerPolicyAttributeEnabled(bool isEnabled) { m_referrerPolicyAttributeEnabled = isEnabled; } > >+ bool intrinsicSizeAttributeEnabled() const { return m_adClickAttributionEnabled; } >+ void setIntrinsicSizeAttributeEnabled(bool isEnabled) { m_adClickAttributionEnabled = isEnabled; } >+ > WEBCORE_EXPORT static RuntimeEnabledFeatures& sharedFeatures(); > > private: >@@ -534,6 +537,7 @@ private: > #if ENABLE(TOUCH_EVENTS) > bool m_mouseEventsSimulationEnabled { false }; > #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 5162ac3db8..bfce523fce 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); >@@ -699,6 +708,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; > } > >@@ -825,7 +838,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; > } >@@ -847,4 +860,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 3e56946285..55158fa935 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 d2a3bfdaa4..941340dfe5 100644 >--- a/Source/WebKit/Shared/WebPreferences.yaml >+++ b/Source/WebKit/Shared/WebPreferences.yaml >@@ -702,6 +702,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 7e2d989c2c..935a648245 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h >+++ b/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h >@@ -153,6 +153,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 9da600a77d..6cd957cd53 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebPreferences.mm >+++ b/Source/WebKitLegacy/mac/WebView/WebPreferences.mm >@@ -518,6 +518,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 3356ed9407..eb83c5461e 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h >+++ b/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h >@@ -601,6 +601,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 c160605eb8..e5c03379ba 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebView.mm >+++ b/Source/WebKitLegacy/mac/WebView/WebView.mm >@@ -3216,6 +3216,7 @@ static bool needsSelfRetainWhileLoadingQuirk() > > settings.setLargeImageAsyncDecodingEnabled([preferences largeImageAsyncDecodingEnabled]); > settings.setAnimatedImageAsyncDecodingEnabled([preferences animatedImageAsyncDecodingEnabled]); >+ settings.setIntrinsicSizeAttributeEnabled([preferences IntrinsicSizeAttributeEnabled]); > settings.setMediaCapabilitiesEnabled([preferences mediaCapabilitiesEnabled]); > > RuntimeEnabledFeatures::sharedFeatures().setServerTimingEnabled([preferences serverTimingEnabled]); >diff --git a/Source/WebKitLegacy/win/Interfaces/IWebPreferencesPrivate.idl b/Source/WebKitLegacy/win/Interfaces/IWebPreferencesPrivate.idl >index ed8b1ccaa9..a0c3dc0f5c 100644 >--- a/Source/WebKitLegacy/win/Interfaces/IWebPreferencesPrivate.idl >+++ b/Source/WebKitLegacy/win/Interfaces/IWebPreferencesPrivate.idl >@@ -240,4 +240,6 @@ interface IWebPreferencesPrivate7 : IWebPreferencesPrivate6 > HRESULT setCrossOriginWindowPolicySupportEnabled([in] BOOL enabled); > HRESULT resizeObserverEnabled([out, retval] BOOL*); > HRESULT setResizeObserverEnabled([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 413a6fdf29..226d9eaa82 100644 >--- a/Source/WebKitLegacy/win/WebPreferenceKeysPrivate.h >+++ b/Source/WebKitLegacy/win/WebPreferenceKeysPrivate.h >@@ -207,3 +207,5 @@ > #define WebKitCSSOMViewScrollingAPIEnabledPreferenceKey "WebKitCSSOMViewScrollingAPIEnabled" > > #define WebKitResizeObserverEnabledPreferenceKey "WebKitResizeObserverEnabled" >+ >+#define WebKitIntrinsicSizeAttributeEnabledPreferenceKey "WebKitIntrinsicSizeAttributeEnabled" >diff --git a/Source/WebKitLegacy/win/WebPreferences.cpp b/Source/WebKitLegacy/win/WebPreferences.cpp >index 9023e3f415..ee7f74c99d 100644 >--- a/Source/WebKitLegacy/win/WebPreferences.cpp >+++ b/Source/WebKitLegacy/win/WebPreferences.cpp >@@ -331,6 +331,8 @@ void WebPreferences::initializeDefaultSettings() > > CFDictionaryAddValue(defaults, CFSTR(WebKitResizeObserverEnabledPreferenceKey), kCFBooleanFalse); > >+ CFDictionaryAddValue(defaults, CFSTR(WebKitIntrinsicSizeAttributeEnabledPreferenceKey), kCFBooleanFalse); >+ > defaultSettings = defaults; > } > >@@ -2049,6 +2051,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 6eba17c3e8..5c75c70677 100644 >--- a/Source/WebKitLegacy/win/WebPreferences.h >+++ b/Source/WebKitLegacy/win/WebPreferences.h >@@ -285,6 +285,8 @@ public: > virtual HRESULT STDMETHODCALLTYPE setCrossOriginWindowPolicySupportEnabled(BOOL); > virtual HRESULT STDMETHODCALLTYPE resizeObserverEnabled(_Out_ BOOL*); > virtual HRESULT STDMETHODCALLTYPE setResizeObserverEnabled(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 631253a49c..592d6f429c 100644 >--- a/Source/WebKitLegacy/win/WebView.cpp >+++ b/Source/WebKitLegacy/win/WebView.cpp >@@ -5298,6 +5298,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 77a4aff779..34cabfbf32 100644 >--- a/Tools/DumpRenderTree/TestOptions.cpp >+++ b/Tools/DumpRenderTree/TestOptions.cpp >@@ -113,6 +113,8 @@ TestOptions::TestOptions(const std::string& pathOrURL, const std::string& absolu > adClickAttributionEnabled = parseBooleanTestHeaderValue(value); > else if (key == "experimental:ResizeObserverEnabled") > enableResizeObserver = 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 d885edbdeb..34fcd59984 100644 >--- a/Tools/DumpRenderTree/TestOptions.h >+++ b/Tools/DumpRenderTree/TestOptions.h >@@ -47,6 +47,7 @@ struct TestOptions { > bool enableCSSLogical { false }; > bool adClickAttributionEnabled { false }; > bool enableResizeObserver { false }; >+ bool intrinsicSizeAttributeEnabled { false }; > std::string jscOptions; > > TestOptions(const std::string& pathOrURL, const std::string& absolutePath); >diff --git a/Tools/DumpRenderTree/mac/DumpRenderTree.mm b/Tools/DumpRenderTree/mac/DumpRenderTree.mm >index 6587253e94..25839837c2 100644 >--- a/Tools/DumpRenderTree/mac/DumpRenderTree.mm >+++ b/Tools/DumpRenderTree/mac/DumpRenderTree.mm >@@ -1020,6 +1020,7 @@ static void setWebPreferencesForTestOptions(const TestOptions& options) > preferences.CSSLogicalEnabled = options.enableCSSLogical; > preferences.adClickAttributionEnabled = options.adClickAttributionEnabled; > preferences.resizeObserverEnabled = options.enableResizeObserver; >+ 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