Changeset 273290 in webkit
- Timestamp:
- Feb 22, 2021 5:43:27 PM (3 years ago)
- Location:
- trunk
- Files:
-
- 14 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r273245 r273290 1 2021-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 1 24 2021-02-22 Rob Buis <rbuis@igalia.com> 2 25 -
trunk/Source/WebCore/ChangeLog
r273287 r273290 1 2021-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 1 51 2021-02-22 Alex Christensen <achristensen@webkit.org> 2 52 -
trunk/Source/WebCore/Headers.cmake
r273203 r273290 1514 1514 rendering/RenderLineBoxList.h 1515 1515 rendering/RenderMedia.h 1516 rendering/RenderModel.h 1516 1517 rendering/RenderObject.h 1517 1518 rendering/RenderObjectEnums.h -
trunk/Source/WebCore/Modules/model-element/HTMLModelElement.cpp
r269984 r273290 29 29 #if ENABLE(MODEL_ELEMENT) 30 30 31 #include "CachedResourceLoader.h" 32 #include "DOMPromiseProxy.h" 31 33 #include "ElementChildIterator.h" 32 34 #include "HTMLNames.h" 35 #include "HTMLParserIdioms.h" 33 36 #include "HTMLSourceElement.h" 37 #include "RenderModel.h" 34 38 #include <wtf/IsoMallocInlines.h> 35 39 #include <wtf/URL.h> … … 41 45 HTMLModelElement::HTMLModelElement(const QualifiedName& tagName, Document& document) 42 46 : HTMLElement(tagName, document) 47 , m_readyPromise { makeUniqueRef<ReadyPromise>(*this, &HTMLModelElement::readyPromiseResolve) } 43 48 { 44 49 } … … 46 51 HTMLModelElement::~HTMLModelElement() 47 52 { 53 if (m_resource) { 54 m_resource->removeClient(*this); 55 m_resource = nullptr; 56 } 48 57 } 49 58 … … 53 62 } 54 63 64 RefPtr<SharedBuffer> HTMLModelElement::modelData() const 65 { 66 if (!m_dataComplete) 67 return nullptr; 68 69 return m_data; 70 } 71 55 72 void HTMLModelElement::sourcesChanged() 56 73 { 57 74 if (!document().hasBrowsingContext()) { 58 setSourceURL(URL ());75 setSourceURL(URL { }); 59 76 return; 60 77 } … … 69 86 } 70 87 71 setSourceURL(URL ());88 setSourceURL(URL { }); 72 89 } 73 90 74 91 void HTMLModelElement::setSourceURL(const URL& url) 75 92 { 76 // FIXME: actually do something with that URL now. 93 if (url == m_sourceURL) 94 return; 95 77 96 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); 78 132 } 133 134 HTMLModelElement& HTMLModelElement::readyPromiseResolve() 135 { 136 return *this; 137 } 138 139 // MARK: - DOM overrides. 79 140 80 141 void HTMLModelElement::didMoveToNewDocument(Document& oldDocument, Document& newDocument) … … 84 145 } 85 146 147 // MARK: - Rendering overrides. 148 149 RenderPtr<RenderElement> HTMLModelElement::createElementRenderer(RenderStyle&& style, const RenderTreePosition&) 150 { 151 return createRenderer<RenderModel>(*this, WTFMove(style)); 152 } 153 154 // MARK: - CachedRawResourceClient 155 156 void 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 163 void 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 86 189 } 87 190 -
trunk/Source/WebCore/Modules/model-element/HTMLModelElement.h
r269984 r273290 28 28 #if ENABLE(MODEL_ELEMENT) 29 29 30 #include "CachedRawResource.h" 31 #include "CachedRawResourceClient.h" 32 #include "CachedResourceHandle.h" 30 33 #include "HTMLElement.h" 34 #include "IDLTypes.h" 35 #include "SharedBuffer.h" 36 #include <wtf/UniqueRef.h> 31 37 32 38 namespace WebCore { 33 39 34 class HTMLModelElement final : public HTMLElement { 40 template<typename IDLType> class DOMPromiseProxyWithResolveCallback; 41 42 class HTMLModelElement final : public HTMLElement, private CachedRawResourceClient { 35 43 WTF_MAKE_ISO_ALLOCATED(HTMLModelElement); 36 44 public: … … 41 49 const URL& currentSrc() const { return m_sourceURL; } 42 50 51 using ReadyPromise = DOMPromiseProxyWithResolveCallback<IDLInterface<HTMLModelElement>>; 52 ReadyPromise& ready() { return m_readyPromise.get(); } 53 54 RefPtr<SharedBuffer> modelData() const; 55 43 56 private: 44 57 HTMLModelElement(const QualifiedName&, Document&); 45 58 59 void setSourceURL(const URL&); 60 HTMLModelElement& readyPromiseResolve(); 61 62 // DOM overrides. 46 63 void didMoveToNewDocument(Document& oldDocument, Document& newDocument) final; 47 64 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; 49 71 50 72 URL m_sourceURL; 73 CachedResourceHandle<CachedRawResource> m_resource; 74 RefPtr<SharedBuffer> m_data; 75 UniqueRef<ReadyPromise> m_readyPromise; 76 bool m_dataComplete { false }; 51 77 }; 52 78 -
trunk/Source/WebCore/Modules/model-element/HTMLModelElement.idl
r269984 r273290 30 30 ] interface HTMLModelElement : HTMLElement { 31 31 [URL] readonly attribute USVString currentSrc; 32 33 readonly attribute Promise<HTMLModelElement> ready; 32 34 }; -
trunk/Source/WebCore/Sources.txt
r273203 r273290 2256 2256 rendering/RenderMenuList.cpp 2257 2257 rendering/RenderMeter.cpp 2258 rendering/RenderModel.cpp 2258 2259 rendering/RenderMultiColumnFlow.cpp 2259 2260 rendering/RenderMultiColumnSet.cpp -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r273203 r273290 4079 4079 BCB16C280979C3BD00467741 /* CachedXSLStyleSheet.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB16C0F0979C3BD00467741 /* CachedXSLStyleSheet.h */; }; 4080 4080 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 */; }; 4081 4082 BCB92D4F1293550B00C8387F /* FontBaseline.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB92D4E1293550B00C8387F /* FontBaseline.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4082 4083 BCBB8AB913F1AFB000734DF0 /* PODInterval.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBB8AB513F1AFB000734DF0 /* PODInterval.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 14228 14229 BCB16C100979C3BD00467741 /* CachedResourceLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CachedResourceLoader.cpp; sourceTree = "<group>"; }; 14229 14230 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>"; }; 14230 14233 BCB92D4E1293550B00C8387F /* FontBaseline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FontBaseline.h; sourceTree = "<group>"; }; 14231 14234 BCBB8AB513F1AFB000734DF0 /* PODInterval.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PODInterval.h; sourceTree = "<group>"; }; … … 29903 29906 A454424C119B3687009BE912 /* RenderMeter.cpp */, 29904 29907 A454424D119B3687009BE912 /* RenderMeter.h */, 29908 BCB4779825D46EFF005EF0C8 /* RenderModel.cpp */, 29909 BCB4779725D46EFF005EF0C8 /* RenderModel.h */, 29905 29910 1A3586DD15264C450022A659 /* RenderMultiColumnFlow.cpp */, 29906 29911 1A3586DE15264C450022A659 /* RenderMultiColumnFlow.h */, … … 31451 31456 BC5EB5E10E81BE8700B25965 /* BorderData.h in Headers */, 31452 31457 589556ED18D4A44000764B03 /* BorderEdge.h in Headers */, 31458 BCB4779925D46EFF005EF0C8 /* RenderModel.h in Headers */, 31453 31459 BC5EB5DB0E81B7EA00B25965 /* BorderValue.h in Headers */, 31454 31460 9316DE00240C64F9009340AA /* BoundaryPoint.h in Headers */, -
trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp
r272920 r273290 375 375 #endif // ENABLE(APPLICATION_MANIFEST) 376 376 377 #if ENABLE(MODEL_ELEMENT) 378 ResourceErrorOr<CachedResourceHandle<CachedRawResource>> CachedResourceLoader::requestModelResource(CachedResourceRequest&& request) 379 { 380 return castCachedResourceTo<CachedRawResource>(requestResource(CachedResource::Type::ModelResource, WTFMove(request))); 381 } 382 #endif 383 377 384 static MixedContentChecker::ContentType contentTypeFromResourceType(CachedResource::Type type) 378 385 { -
trunk/Source/WebCore/loader/cache/CachedResourceLoader.h
r271638 r273290 103 103 #if ENABLE(APPLICATION_MANIFEST) 104 104 ResourceErrorOr<CachedResourceHandle<CachedApplicationManifest>> requestApplicationManifest(CachedResourceRequest&&); 105 #endif 106 #if ENABLE(MODEL_ELEMENT) 107 ResourceErrorOr<CachedResourceHandle<CachedRawResource>> requestModelResource(CachedResourceRequest&&); 105 108 #endif 106 109 -
trunk/Source/WebCore/rendering/RenderObject.h
r272433 r273290 223 223 virtual bool isRenderIFrame() const { return false; } 224 224 virtual bool isRenderImage() const { return false; } 225 #if ENABLE(MODEL_ELEMENT) 226 virtual bool isRenderModel() const { return false; } 227 #endif 225 228 virtual bool isRenderFragmentContainer() const { return false; } 226 229 virtual bool isReplica() const { return false; }
Note: See TracChangeset
for help on using the changeset viewer.