Changeset 273290 in webkit


Ignore:
Timestamp:
Feb 22, 2021 5:43:27 PM (3 years ago)
Author:
weinig@apple.com
Message:

HTMLModelElement needs a renderer
https://bugs.webkit.org/show_bug.cgi?id=222114

Reviewed by Simon Fraser.

Source/WebCore:

Tests: model-element/model-element-ready-load-aborted.html

model-element/model-element-ready-load-failed.html
model-element/model-element-ready.html
model-element/model-element-renderer-no-source.html
model-element/model-element-renderer.html

  • Headers.cmake:
  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:

Add RenderModel.h/cpp

  • Modules/model-element/HTMLModelElement.cpp:

(WebCore::HTMLModelElement::HTMLModelElement):
(WebCore::HTMLModelElement::~HTMLModelElement):
(WebCore::HTMLModelElement::modelData const):
(WebCore::HTMLModelElement::sourcesChanged):
(WebCore::HTMLModelElement::setSourceURL):
(WebCore::HTMLModelElement::readyPromiseResolve):
(WebCore::HTMLModelElement::createElementRenderer):
(WebCore::HTMLModelElement::responseReceived):
(WebCore::HTMLModelElement::dataReceived):
(WebCore::HTMLModelElement::redirectReceived):
(WebCore::HTMLModelElement::notifyFinished):

  • Modules/model-element/HTMLModelElement.h:
  • Modules/model-element/HTMLModelElement.idl:

Add basic loading of model data as a CachedRawResource. In the future,
we may want a more specialized loader, but for now this gets the data
into a data buffer and that's a good start.

Also adds a "ready" promise that resolves when the load completes. This
may mutate to an event in the future as the spec moves forward.

  • rendering/RenderModel.cpp: Added.

(WebCore::RenderModel::RenderModel):
(WebCore::RenderModel::modelElement const):
(WebCore::RenderModel::updateFromElement):

  • rendering/RenderModel.h: Added.
  • rendering/RenderObject.h:

(WebCore::RenderObject::isRenderModel const):
Add a simple RenderReplaced subclass as the starting point of a renderer
for <model>. It's enough that it shows up in a render tree dump, but not
really anything else.

LayoutTests:

Add basic tests for loading HTMLModelElement elements and rendering
RenderModel elements.

  • model-element/model-element-ready-expected.txt: Added.
  • model-element/model-element-ready-load-aborted-expected.txt: Added.
  • model-element/model-element-ready-load-aborted.html: Added.
  • model-element/model-element-ready-load-failed-expected.txt: Added.
  • model-element/model-element-ready-load-failed.html: Added.
  • model-element/model-element-ready.html: Added.
  • model-element/model-element-renderer-expected.txt: Added.
  • model-element/model-element-renderer-no-source-expected.txt: Added.
  • model-element/model-element-renderer-no-source.html: Added.
  • model-element/model-element-renderer.html: Added.
  • model-element/resources: Added.
  • model-element/resources/heart.usdz: Added.
Location:
trunk
Files:
14 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r273245 r273290  
     12021-02-22  Sam Weinig  <weinig@apple.com>
     2
     3        HTMLModelElement needs a renderer
     4        https://bugs.webkit.org/show_bug.cgi?id=222114
     5
     6        Reviewed by Simon Fraser.
     7
     8        Add basic tests for loading HTMLModelElement elements and rendering
     9        RenderModel elements.
     10
     11        * model-element/model-element-ready-expected.txt: Added.
     12        * model-element/model-element-ready-load-aborted-expected.txt: Added.
     13        * model-element/model-element-ready-load-aborted.html: Added.
     14        * model-element/model-element-ready-load-failed-expected.txt: Added.
     15        * model-element/model-element-ready-load-failed.html: Added.
     16        * model-element/model-element-ready.html: Added.
     17        * model-element/model-element-renderer-expected.txt: Added.
     18        * model-element/model-element-renderer-no-source-expected.txt: Added.
     19        * model-element/model-element-renderer-no-source.html: Added.
     20        * model-element/model-element-renderer.html: Added.
     21        * model-element/resources: Added.
     22        * model-element/resources/heart.usdz: Added.
     23
    1242021-02-22  Rob Buis  <rbuis@igalia.com>
    225
  • trunk/Source/WebCore/ChangeLog

    r273287 r273290  
     12021-02-22  Sam Weinig  <weinig@apple.com>
     2
     3        HTMLModelElement needs a renderer
     4        https://bugs.webkit.org/show_bug.cgi?id=222114
     5
     6        Reviewed by Simon Fraser.
     7
     8        Tests: model-element/model-element-ready-load-aborted.html
     9               model-element/model-element-ready-load-failed.html
     10               model-element/model-element-ready.html
     11               model-element/model-element-renderer-no-source.html
     12               model-element/model-element-renderer.html
     13
     14        * Headers.cmake:
     15        * Sources.txt:
     16        * WebCore.xcodeproj/project.pbxproj:
     17        Add RenderModel.h/cpp
     18
     19        * Modules/model-element/HTMLModelElement.cpp:
     20        (WebCore::HTMLModelElement::HTMLModelElement):
     21        (WebCore::HTMLModelElement::~HTMLModelElement):
     22        (WebCore::HTMLModelElement::modelData const):
     23        (WebCore::HTMLModelElement::sourcesChanged):
     24        (WebCore::HTMLModelElement::setSourceURL):
     25        (WebCore::HTMLModelElement::readyPromiseResolve):
     26        (WebCore::HTMLModelElement::createElementRenderer):
     27        (WebCore::HTMLModelElement::responseReceived):
     28        (WebCore::HTMLModelElement::dataReceived):
     29        (WebCore::HTMLModelElement::redirectReceived):
     30        (WebCore::HTMLModelElement::notifyFinished):
     31        * Modules/model-element/HTMLModelElement.h:
     32        * Modules/model-element/HTMLModelElement.idl:
     33        Add basic loading of model data as a CachedRawResource. In the future,
     34        we may want a more specialized loader, but for now this gets the data
     35        into a data buffer and that's a good start.
     36       
     37        Also adds a "ready" promise that resolves when the load completes. This
     38        may mutate to an event in the future as the spec moves forward.
     39
     40        * rendering/RenderModel.cpp: Added.
     41        (WebCore::RenderModel::RenderModel):
     42        (WebCore::RenderModel::modelElement const):
     43        (WebCore::RenderModel::updateFromElement):
     44        * rendering/RenderModel.h: Added.
     45        * rendering/RenderObject.h:
     46        (WebCore::RenderObject::isRenderModel const):
     47        Add a simple RenderReplaced subclass as the starting point of a renderer
     48        for <model>. It's enough that it shows up in a render tree dump, but not
     49        really anything else.
     50
    1512021-02-22  Alex Christensen  <achristensen@webkit.org>
    252
  • trunk/Source/WebCore/Headers.cmake

    r273203 r273290  
    15141514    rendering/RenderLineBoxList.h
    15151515    rendering/RenderMedia.h
     1516    rendering/RenderModel.h
    15161517    rendering/RenderObject.h
    15171518    rendering/RenderObjectEnums.h
  • trunk/Source/WebCore/Modules/model-element/HTMLModelElement.cpp

    r269984 r273290  
    2929#if ENABLE(MODEL_ELEMENT)
    3030
     31#include "CachedResourceLoader.h"
     32#include "DOMPromiseProxy.h"
    3133#include "ElementChildIterator.h"
    3234#include "HTMLNames.h"
     35#include "HTMLParserIdioms.h"
    3336#include "HTMLSourceElement.h"
     37#include "RenderModel.h"
    3438#include <wtf/IsoMallocInlines.h>
    3539#include <wtf/URL.h>
     
    4145HTMLModelElement::HTMLModelElement(const QualifiedName& tagName, Document& document)
    4246    : HTMLElement(tagName, document)
     47    , m_readyPromise { makeUniqueRef<ReadyPromise>(*this, &HTMLModelElement::readyPromiseResolve) }
    4348{
    4449}
     
    4651HTMLModelElement::~HTMLModelElement()
    4752{
     53    if (m_resource) {
     54        m_resource->removeClient(*this);
     55        m_resource = nullptr;
     56    }
    4857}
    4958
     
    5362}
    5463
     64RefPtr<SharedBuffer> HTMLModelElement::modelData() const
     65{
     66    if (!m_dataComplete)
     67        return nullptr;
     68
     69    return m_data;
     70}
     71
    5572void HTMLModelElement::sourcesChanged()
    5673{
    5774    if (!document().hasBrowsingContext()) {
    58         setSourceURL(URL());
     75        setSourceURL(URL { });
    5976        return;
    6077    }
     
    6986    }
    7087
    71     setSourceURL(URL());
     88    setSourceURL(URL { });
    7289}
    7390
    7491void HTMLModelElement::setSourceURL(const URL& url)
    7592{
    76     // FIXME: actually do something with that URL now.
     93    if (url == m_sourceURL)
     94        return;
     95
    7796    m_sourceURL = url;
     97
     98    m_data = nullptr;
     99    m_dataComplete = false;
     100
     101    if (m_resource) {
     102        m_resource->removeClient(*this);
     103        m_resource = nullptr;
     104    }
     105
     106    if (!m_readyPromise->isFulfilled())
     107        m_readyPromise->reject(Exception { AbortError });
     108
     109    m_readyPromise = makeUniqueRef<ReadyPromise>(*this, &HTMLModelElement::readyPromiseResolve);
     110
     111    if (m_sourceURL.isEmpty())
     112        return;
     113
     114    ResourceLoaderOptions options = CachedResourceLoader::defaultCachedResourceOptions();
     115    options.destination = FetchOptions::Destination::Model;
     116    // FIXME: Set other options.
     117
     118    auto crossOriginAttribute = parseCORSSettingsAttribute(attributeWithoutSynchronization(HTMLNames::crossoriginAttr));
     119    auto request = createPotentialAccessControlRequest(ResourceRequest { m_sourceURL }, WTFMove(options), document(), crossOriginAttribute);
     120    request.setInitiator(*this);
     121
     122    auto resource = document().cachedResourceLoader().requestModelResource(WTFMove(request));
     123    if (!resource.has_value()) {
     124        m_readyPromise->reject(Exception { NetworkError });
     125        return;
     126    }
     127
     128    m_data = SharedBuffer::create();
     129
     130    m_resource = resource.value();
     131    m_resource->addClient(*this);
    78132}
     133
     134HTMLModelElement& HTMLModelElement::readyPromiseResolve()
     135{
     136    return *this;
     137}
     138
     139// MARK: - DOM overrides.
    79140
    80141void HTMLModelElement::didMoveToNewDocument(Document& oldDocument, Document& newDocument)
     
    84145}
    85146
     147// MARK: - Rendering overrides.
     148
     149RenderPtr<RenderElement> HTMLModelElement::createElementRenderer(RenderStyle&& style, const RenderTreePosition&)
     150{
     151    return createRenderer<RenderModel>(*this, WTFMove(style));
     152}
     153
     154// MARK: - CachedRawResourceClient
     155
     156void HTMLModelElement::dataReceived(CachedResource& resource, const char* data, int dataLength)
     157{
     158    ASSERT_UNUSED(resource, &resource == m_resource);
     159    ASSERT(m_data);
     160    m_data->append(data, dataLength);
     161}
     162
     163void HTMLModelElement::notifyFinished(CachedResource& resource, const NetworkLoadMetrics&)
     164{
     165    auto invalidateResourceHandleAndUpdateRenderer = [&] {
     166        m_resource->removeClient(*this);
     167        m_resource = nullptr;
     168
     169        if (auto* renderer = this->renderer())
     170            renderer->updateFromElement();
     171    };
     172
     173    if (resource.loadFailedOrCanceled()) {
     174        m_data = nullptr;
     175
     176        invalidateResourceHandleAndUpdateRenderer();
     177
     178        m_readyPromise->reject(Exception { NetworkError });
     179        return;
     180    }
     181
     182    m_dataComplete = true;
     183
     184    invalidateResourceHandleAndUpdateRenderer();
     185
     186    m_readyPromise->resolve(*this);
     187}
     188
    86189}
    87190
  • trunk/Source/WebCore/Modules/model-element/HTMLModelElement.h

    r269984 r273290  
    2828#if ENABLE(MODEL_ELEMENT)
    2929
     30#include "CachedRawResource.h"
     31#include "CachedRawResourceClient.h"
     32#include "CachedResourceHandle.h"
    3033#include "HTMLElement.h"
     34#include "IDLTypes.h"
     35#include "SharedBuffer.h"
     36#include <wtf/UniqueRef.h>
    3137
    3238namespace WebCore {
    3339
    34 class HTMLModelElement final : public HTMLElement {
     40template<typename IDLType> class DOMPromiseProxyWithResolveCallback;
     41
     42class HTMLModelElement final : public HTMLElement, private CachedRawResourceClient {
    3543    WTF_MAKE_ISO_ALLOCATED(HTMLModelElement);
    3644public:
     
    4149    const URL& currentSrc() const { return m_sourceURL; }
    4250
     51    using ReadyPromise = DOMPromiseProxyWithResolveCallback<IDLInterface<HTMLModelElement>>;
     52    ReadyPromise& ready() { return m_readyPromise.get(); }
     53
     54    RefPtr<SharedBuffer> modelData() const;
     55
    4356private:
    4457    HTMLModelElement(const QualifiedName&, Document&);
    4558
     59    void setSourceURL(const URL&);
     60    HTMLModelElement& readyPromiseResolve();
     61
     62    // DOM overrides.
    4663    void didMoveToNewDocument(Document& oldDocument, Document& newDocument) final;
    4764
    48     void setSourceURL(const URL&);
     65    // Rendering overrides.
     66    RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
     67
     68    // CachedRawResourceClient overrides.
     69    void dataReceived(CachedResource&, const char* data, int dataLength) final;
     70    void notifyFinished(CachedResource&, const NetworkLoadMetrics&) final;
    4971
    5072    URL m_sourceURL;
     73    CachedResourceHandle<CachedRawResource> m_resource;
     74    RefPtr<SharedBuffer> m_data;
     75    UniqueRef<ReadyPromise> m_readyPromise;
     76    bool m_dataComplete { false };
    5177};
    5278
  • trunk/Source/WebCore/Modules/model-element/HTMLModelElement.idl

    r269984 r273290  
    3030] interface HTMLModelElement : HTMLElement {
    3131    [URL] readonly attribute USVString currentSrc;
     32
     33    readonly attribute Promise<HTMLModelElement> ready;
    3234};
  • trunk/Source/WebCore/Sources.txt

    r273203 r273290  
    22562256rendering/RenderMenuList.cpp
    22572257rendering/RenderMeter.cpp
     2258rendering/RenderModel.cpp
    22582259rendering/RenderMultiColumnFlow.cpp
    22592260rendering/RenderMultiColumnSet.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r273203 r273290  
    40794079                BCB16C280979C3BD00467741 /* CachedXSLStyleSheet.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB16C0F0979C3BD00467741 /* CachedXSLStyleSheet.h */; };
    40804080                BCB16C2A0979C3BD00467741 /* CachedResourceLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB16C110979C3BD00467741 /* CachedResourceLoader.h */; settings = {ATTRIBUTES = (Private, ); }; };
     4081                BCB4779925D46EFF005EF0C8 /* RenderModel.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB4779725D46EFF005EF0C8 /* RenderModel.h */; };
    40814082                BCB92D4F1293550B00C8387F /* FontBaseline.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB92D4E1293550B00C8387F /* FontBaseline.h */; settings = {ATTRIBUTES = (Private, ); }; };
    40824083                BCBB8AB913F1AFB000734DF0 /* PODInterval.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBB8AB513F1AFB000734DF0 /* PODInterval.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1422814229                BCB16C100979C3BD00467741 /* CachedResourceLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CachedResourceLoader.cpp; sourceTree = "<group>"; };
    1422914230                BCB16C110979C3BD00467741 /* CachedResourceLoader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CachedResourceLoader.h; sourceTree = "<group>"; };
     14231                BCB4779725D46EFF005EF0C8 /* RenderModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RenderModel.h; sourceTree = "<group>"; };
     14232                BCB4779825D46EFF005EF0C8 /* RenderModel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RenderModel.cpp; sourceTree = "<group>"; };
    1423014233                BCB92D4E1293550B00C8387F /* FontBaseline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FontBaseline.h; sourceTree = "<group>"; };
    1423114234                BCBB8AB513F1AFB000734DF0 /* PODInterval.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PODInterval.h; sourceTree = "<group>"; };
     
    2990329906                                A454424C119B3687009BE912 /* RenderMeter.cpp */,
    2990429907                                A454424D119B3687009BE912 /* RenderMeter.h */,
     29908                                BCB4779825D46EFF005EF0C8 /* RenderModel.cpp */,
     29909                                BCB4779725D46EFF005EF0C8 /* RenderModel.h */,
    2990529910                                1A3586DD15264C450022A659 /* RenderMultiColumnFlow.cpp */,
    2990629911                                1A3586DE15264C450022A659 /* RenderMultiColumnFlow.h */,
     
    3145131456                                BC5EB5E10E81BE8700B25965 /* BorderData.h in Headers */,
    3145231457                                589556ED18D4A44000764B03 /* BorderEdge.h in Headers */,
     31458                                BCB4779925D46EFF005EF0C8 /* RenderModel.h in Headers */,
    3145331459                                BC5EB5DB0E81B7EA00B25965 /* BorderValue.h in Headers */,
    3145431460                                9316DE00240C64F9009340AA /* BoundaryPoint.h in Headers */,
  • trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp

    r272920 r273290  
    375375#endif // ENABLE(APPLICATION_MANIFEST)
    376376
     377#if ENABLE(MODEL_ELEMENT)
     378ResourceErrorOr<CachedResourceHandle<CachedRawResource>> CachedResourceLoader::requestModelResource(CachedResourceRequest&& request)
     379{
     380    return castCachedResourceTo<CachedRawResource>(requestResource(CachedResource::Type::ModelResource, WTFMove(request)));
     381}
     382#endif
     383
    377384static MixedContentChecker::ContentType contentTypeFromResourceType(CachedResource::Type type)
    378385{
  • trunk/Source/WebCore/loader/cache/CachedResourceLoader.h

    r271638 r273290  
    103103#if ENABLE(APPLICATION_MANIFEST)
    104104    ResourceErrorOr<CachedResourceHandle<CachedApplicationManifest>> requestApplicationManifest(CachedResourceRequest&&);
     105#endif
     106#if ENABLE(MODEL_ELEMENT)
     107    ResourceErrorOr<CachedResourceHandle<CachedRawResource>> requestModelResource(CachedResourceRequest&&);
    105108#endif
    106109
  • trunk/Source/WebCore/rendering/RenderObject.h

    r272433 r273290  
    223223    virtual bool isRenderIFrame() const { return false; }
    224224    virtual bool isRenderImage() const { return false; }
     225#if ENABLE(MODEL_ELEMENT)
     226    virtual bool isRenderModel() const { return false; }
     227#endif
    225228    virtual bool isRenderFragmentContainer() const { return false; }
    226229    virtual bool isReplica() const { return false; }
Note: See TracChangeset for help on using the changeset viewer.