Changeset 286836 in webkit
- Timestamp:
- Dec 10, 2021 12:15:09 AM (7 months ago)
- Location:
- trunk
- Files:
-
- 3 added
- 4 deleted
- 15 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/model-element/model-element-contents-layer-updates-with-clipping.html (modified) (1 diff)
-
LayoutTests/model-element/model-element-contents-layer-updates.html (modified) (1 diff)
-
LayoutTests/model-element/model-element-error-and-load-events-expected.txt (added)
-
LayoutTests/model-element/model-element-error-and-load-events.html (added)
-
LayoutTests/model-element/model-element-graphics-layers-opacity.html (modified) (1 diff)
-
LayoutTests/model-element/model-element-graphics-layers.html (modified) (1 diff)
-
LayoutTests/model-element/model-element-ready-expected.txt (modified) (1 diff)
-
LayoutTests/model-element/model-element-ready-load-aborted-expected.txt (deleted)
-
LayoutTests/model-element/model-element-ready-load-aborted.html (deleted)
-
LayoutTests/model-element/model-element-ready-load-failed-expected.txt (deleted)
-
LayoutTests/model-element/model-element-ready-load-failed.html (deleted)
-
LayoutTests/model-element/model-element-ready.html (modified) (1 diff)
-
LayoutTests/model-element/resources/model-element-test-utils.js (added)
-
LayoutTests/platform/ios-simulator/TestExpectations (modified) (1 diff)
-
LayoutTests/platform/mac/TestExpectations (modified) (2 diffs)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/model-element/HTMLModelElement.cpp (modified) (11 diffs)
-
Source/WebCore/Modules/model-element/HTMLModelElement.h (modified) (6 diffs)
-
Source/WebCore/Modules/model-element/HTMLModelElement.idl (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/ios/DragAndDropTestsIOS.mm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r286829 r286836 1 2021-12-09 Antoine Quint <graouts@webkit.org> 2 3 [Model] Add load and error events to distinguish resource load from model readiness 4 https://bugs.webkit.org/show_bug.cgi?id=233706 5 rdar://85922697 6 7 Reviewed by Chris Dumez and Dean Jackson. 8 9 Remove existing tests around resource loading and recreate them in terms of "load" and "error" 10 events in model-element/model-element-error-and-load-events.html and in terms of the ready 11 promise in model-element/model-element-ready.html. 12 13 Other tests using model.ready for other purposes are also rewritten using events. 14 15 * model-element/model-element-contents-layer-updates-with-clipping.html: 16 * model-element/model-element-contents-layer-updates.html: 17 * model-element/model-element-error-and-load-events-expected.txt: Added. 18 * model-element/model-element-error-and-load-events.html: Added. 19 * model-element/model-element-graphics-layers-opacity.html: 20 * model-element/model-element-graphics-layers.html: 21 * model-element/model-element-ready-expected.txt: 22 * model-element/model-element-ready-load-aborted-expected.txt: Removed. 23 * model-element/model-element-ready-load-aborted.html: Removed. 24 * model-element/model-element-ready-load-failed-expected.txt: Removed. 25 * model-element/model-element-ready-load-failed.html: Removed. 26 * model-element/model-element-ready.html: 27 * model-element/resources/model-element-test-utils.js: Added. 28 (const.createModelAndSource): 29 * platform/ios-simulator/TestExpectations: 30 * platform/mac/TestExpectations: 31 1 32 2021-12-09 Arcady Goldmints-Orlov <agoldmints@igalia.com> 2 33 -
trunk/LayoutTests/model-element/model-element-contents-layer-updates-with-clipping.html
r276562 r286836 7 7 <pre id="layers"></pre> 8 8 <script> 9 let layers = document.getElementById("layers");10 let source = document.getElementsByTagName("source")[0];9 window.testRunner?.waitUntilDone(); 10 window.testRunner?.dumpAsText(); 11 11 12 if (window.testRunner) { 13 testRunner.waitUntilDone(); 14 testRunner.dumpAsText(); 15 } else 16 layers.textContent = "This test requires testRunner."; 12 const layers = document.getElementById("layers"); 13 const source = document.querySelector("source"); 14 const model = document.getElementById("model"); 17 15 18 let model = document.getElementById("model"); 16 const modelDidLoadFirstSource = () => { 17 layers.textContent = "Before Changing Source:\n"; 18 layers.textContent += window.internals?.platformLayerTreeAsText(model, window.internals.PLATFORM_LAYER_TREE_INCLUDE_MODELS) ?? "This test requires testRunner."; 19 19 20 model.ready.then(value => { 21 layers.textContent = "Before Changing Source:\n"; 22 layers.textContent += window.internals.platformLayerTreeAsText(model, window.internals.PLATFORM_LAYER_TREE_INCLUDE_MODELS); 20 model.addEventListener("load", event => { 21 layers.textContent += "After Changing Source:\n"; 22 layers.textContent += window.internals?.platformLayerTreeAsText(model, window.internals.PLATFORM_LAYER_TREE_INCLUDE_MODELS) ?? "This test requires testRunner."; 23 window.testRunner?.notifyDone(); 24 }, { once: true }); 25 26 model.addEventListener("error", event => { 27 layers.textContent = `Failed. Second model did not load.`; 28 window.testRunner?.notifyDone(); 29 }, { once: true }); 23 30 24 31 source.src = "resources/cube.usdz"; 25 model.ready.then(value => { 26 if (window.testRunner) { 27 layers.textContent += "After Changing Source:\n"; 28 layers.textContent += window.internals.platformLayerTreeAsText(model, window.internals.PLATFORM_LAYER_TREE_INCLUDE_MODELS); 29 } 30 }, reason => { 31 layers.textContent = `Failed. Second model did not load: ${reason}`; 32 }).finally(() => { 33 if (window.testRunner) 34 testRunner.notifyDone(); 35 }); 36 37 }, reason => { 38 layers.textContent = `Failed. First model did not load: ${reason}`; 39 if (window.testRunner) 40 testRunner.notifyDone(); 41 }); 32 } 33 34 if (model.complete) 35 modelDidLoadFirstSource(); 36 else { 37 model.addEventListener("load", modelDidLoadFirstSource, { once: true }); 38 model.addEventListener("error", event => { 39 layers.textContent = `Failed. First model did not load.`; 40 window.testRunner?.notifyDone(); 41 }, { once: true }); 42 } 42 43 </script> 43 44 </body> -
trunk/LayoutTests/model-element/model-element-contents-layer-updates.html
r276562 r286836 7 7 <pre id="layers"></pre> 8 8 <script> 9 let layers = document.getElementById("layers");10 let source = document.getElementsByTagName("source")[0];9 window.testRunner?.waitUntilDone(); 10 window.testRunner?.dumpAsText(); 11 11 12 if (window.testRunner) { 13 testRunner.waitUntilDone(); 14 testRunner.dumpAsText(); 15 } else 16 layers.textContent = "This test requires testRunner."; 12 const layers = document.getElementById("layers"); 13 const source = document.querySelector("source"); 14 const model = document.getElementById("model"); 17 15 18 let model = document.getElementById("model"); 16 const modelDidLoadFirstSource = () => { 17 layers.textContent = "Before Changing Source:\n"; 18 layers.textContent += window.internals?.platformLayerTreeAsText(model, window.internals.PLATFORM_LAYER_TREE_INCLUDE_MODELS) ?? "This test requires testRunner."; 19 19 20 model.ready.then(value => { 21 layers.textContent = "Before Changing Source:\n"; 22 layers.textContent += window.internals.platformLayerTreeAsText(model, window.internals.PLATFORM_LAYER_TREE_INCLUDE_MODELS); 20 model.addEventListener("load", event => { 21 layers.textContent += "After Changing Source:\n"; 22 layers.textContent += window.internals?.platformLayerTreeAsText(model, window.internals.PLATFORM_LAYER_TREE_INCLUDE_MODELS) ?? "This test requires testRunner."; 23 window.testRunner?.notifyDone(); 24 }, { once: true }); 25 26 model.addEventListener("error", event => { 27 layers.textContent = `Failed. Second model did not load.`; 28 window.testRunner?.notifyDone(); 29 }, { once: true }); 23 30 24 31 source.src = "resources/cube.usdz"; 25 model.ready.then(value => { 26 if (window.testRunner) { 27 layers.textContent += "After Changing Source:\n"; 28 layers.textContent += window.internals.platformLayerTreeAsText(model, window.internals.PLATFORM_LAYER_TREE_INCLUDE_MODELS); 29 } 30 }, reason => { 31 layers.textContent = `Failed. Second model did not load: ${reason}`; 32 }).finally(() => { 33 if (window.testRunner) 34 testRunner.notifyDone(); 35 }); 36 37 }, reason => { 38 layers.textContent = `Failed. First model did not load: ${reason}`; 39 if (window.testRunner) 40 testRunner.notifyDone(); 41 }); 32 } 33 34 if (model.complete) 35 modelDidLoadFirstSource(); 36 else { 37 model.addEventListener("load", modelDidLoadFirstSource, { once: true }); 38 model.addEventListener("error", event => { 39 layers.textContent = `Failed. First model did not load.`; 40 window.testRunner?.notifyDone(); 41 }, { once: true }); 42 } 42 43 </script> 43 44 </body> -
trunk/LayoutTests/model-element/model-element-graphics-layers-opacity.html
r276562 r286836 14 14 <pre id="layers"></pre> 15 15 <script> 16 let layers = document.getElementById("layers"); 16 window.testRunner?.waitUntilDone(); 17 window.testRunner?.dumpAsText(); 17 18 18 if (window.testRunner) { 19 testRunner.waitUntilDone(); 20 testRunner.dumpAsText(); 21 } else 22 layers.textContent = "This test requires testRunner."; 19 const layers = document.getElementById("layers"); 20 const model = document.getElementById("model"); 23 21 24 let model = document.getElementById("model"); 22 const modelDidLoad = () => { 23 layers.innerText = window.internals?.platformLayerTreeAsText(model) ?? "This test requires testRunner."; 24 model.remove(); 25 window.testRunner?.notifyDone(); 26 }; 25 27 26 model.ready.then(value => { 27 if (window.testRunner) 28 layers.innerText = window.internals.platformLayerTreeAsText(model); 29 model.remove(); 30 }, reason => { 31 layers.textContent = `Failed. Model did not load: ${reason}`; 32 }).finally(() => { 33 if (window.testRunner) 34 testRunner.notifyDone(); 35 }); 28 if (model.complete) 29 modelDidLoad(); 30 else { 31 model.addEventListener("load", modelDidLoad); 32 model.addEventListener("error", event => { 33 layers.textContent = `Failed. Model did not load.`; 34 window.testRunner?.notifyDone(); 35 }); 36 } 36 37 </script> 37 38 </body> -
trunk/LayoutTests/model-element/model-element-graphics-layers.html
r276327 r286836 7 7 <pre id="layers"></pre> 8 8 <script> 9 let layers = document.getElementById("layers"); 9 window.testRunner?.waitUntilDone(); 10 window.testRunner?.dumpAsText(); 10 11 11 if (window.testRunner) { 12 testRunner.waitUntilDone(); 13 testRunner.dumpAsText(); 14 } else 15 layers.textContent = "This test requires testRunner."; 12 const layers = document.getElementById("layers"); 13 const model = document.getElementById("model"); 16 14 17 let model = document.getElementById("model"); 15 const modelDidLoad = () => { 16 layers.innerText = window.internals?.layerTreeAsText(document) ?? "This test requires testRunner."; 17 model.remove(); 18 window.testRunner?.notifyDone(); 19 } 18 20 19 model.ready.then(value => { 20 if (window.testRunner) 21 layers.innerText = window.internals.layerTreeAsText(document); 22 model.remove(); 23 }, reason => { 24 layers.textContent = `Failed. Model did not load: ${reason}`; 25 }).finally(() => { 26 if (window.testRunner) 27 testRunner.notifyDone(); 28 }); 21 if (model.complete) 22 modelDidLoad(); 23 else { 24 model.addEventListener("load", modelDidLoad); 25 model.addEventListener("error", event => { 26 layers.textContent = `Failed. Model did not load.`; 27 window.testRunner?.notifyDone(); 28 }); 29 } 29 30 </script> 30 31 </body> -
trunk/LayoutTests/model-element/model-element-ready-expected.txt
r273290 r286836 1 This test passes if you see the word "Passed" below:2 1 3 Passed 2 PASS <model> rejects the ready promise when provided with an unknown resoure. 3 PASS <model> rejects the ready promise when its resource load is aborted. 4 PASS <model> resolves the ready promise when provided with a known resource. 5 -
trunk/LayoutTests/model-element/model-element-ready.html
r273290 r286836 1 <!DOCTYPE html><!-- webkit-test-runner [ ModelElementEnabled=true ] --> 2 <html> 1 <!doctype html> 2 <meta charset="utf-8"> 3 <title><model> ready promise</title> 4 <script src="../resources/testharness.js"></script> 5 <script src="../resources/testharnessreport.js"></script> 6 <script src="resources/model-element-test-utils.js"></script> 3 7 <body> 4 <model id="model">5 <source src="resources/heart.usdz">6 </model>7 <p>This test passes if you see the word "Passed" below:</p>8 <p id="result">Failed</p>9 8 <script> 10 if (window.testRunner) { 11 testRunner.waitUntilDone(); 12 testRunner.dumpAsText(); 13 } 9 'use strict'; 14 10 15 let result = document.getElementById("result"); 16 let model = document.getElementById("model"); 11 promise_test(async t => { 12 const [model, source] = createModelAndSource(t, "resources/does-not-exist.usdz"); 13 return model.ready.then( 14 value => assert_unreached("Unexpected ready promise resolution."), 15 reason => assert_true(reason.toString().includes("NetworkError"), "The ready promise is rejected with a NetworkError.") 16 ); 17 }, `<model> rejects the ready promise when provided with an unknown resoure.`); 17 18 18 model.ready.then(value => { 19 result.textContent = `Passed`; 20 }, reason => { 21 result.textContent = `Failed. Model did not load: ${reason}`; 22 }).finally(() => { 23 if (window.testRunner) 24 testRunner.notifyDone(); 25 }); 19 promise_test(async t => { 20 const [model, source] = createModelAndSource(t, "resources/heart.usdz"); 21 const modelReady = model.ready; 22 23 source.remove(); 24 assert_not_equals(model.ready, modelReady, "Removing the <source> child resets the ready promise."); 25 26 return modelReady.then( 27 value => assert_unreached("Unexpected ready promise resolution."), 28 reason => assert_true(reason.toString().includes("AbortError"), "The ready promise is rejected with a NetworkError.") 29 ); 30 }, `<model> rejects the ready promise when its resource load is aborted.`); 31 32 promise_test(async t => { 33 const [model, source] = createModelAndSource(t, "resources/cube.usdz"); 34 await model.ready; 35 }, `<model> resolves the ready promise when provided with a known resource.`); 36 26 37 </script> 27 38 </body> 28 </html> -
trunk/LayoutTests/platform/ios-simulator/TestExpectations
r285394 r286836 153 153 154 154 webkit.org/b/223949 crypto/crypto-random-values-oom.html [ Pass Timeout ] 155 156 # This test relies on ARQL APIs which are not available in the Simulator 157 model-element/model-element-ready.html [ Skip ] -
trunk/LayoutTests/platform/mac/TestExpectations
r286335 r286836 2283 2283 [ Monterey ] imported/w3c/web-platform-tests/fetch/connection-pool/network-partition-key.html [ Failure ] 2284 2284 2285 # webkit.org/b/228200 Setting multiple test expectations for Mon etery on OpenSource:2285 # webkit.org/b/228200 Setting multiple test expectations for Monterey on OpenSource: 2286 2286 [ Monterey ] model-element/model-element-graphics-layers-opacity.html [ Pass Failure ] 2287 2287 [ Monterey Debug arm64 ] imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-restartIce.https.html [ Pass Failure Crash ] … … 2429 2429 2430 2430 webkit.org/b/221230 [ BigSur+ ] imported/w3c/web-platform-tests/media-source/mediasource-addsourcebuffer.html [ Pass Failure ] 2431 2432 # <model> tests involving the ready promise can only work on Monterey and up 2433 [ Catalina BigSur ] model-element/model-element-ready.html [ Skip ] -
trunk/Source/WebCore/ChangeLog
r286835 r286836 1 2021-12-09 Antoine Quint <graouts@webkit.org> 2 3 [Model] Add load and error events to distinguish resource load from model readiness 4 https://bugs.webkit.org/show_bug.cgi?id=233706 5 rdar://85922697 6 7 Reviewed by Chris Dumez and Dean Jackson. 8 9 Test: model-element/model-element-error-and-load-events.html 10 11 Prior to this patch, <model> elements had a "ready" promise which resolved once the resource had been loaded. 12 However, this promise should be used when the <model> is fully ready, and this is done on macOS and iOS asynchronously 13 after the resource has been loaded by the supporting ARQL framework. So we need a way to monitor success or failure of 14 the resource load specifically. 15 16 To that end, and matching the <img> element, we dispatch "load" and "error" events on <model> elements and add a 17 "complete" property to indicate whether the resource is loaded. 18 19 Meanwhile, the "ready" promise is now resolved when the model is fully loaded by the supporting framework, indicating 20 that further APIs are safe to use. 21 22 Since creating the support ARQL object for macOS and iOS also requires the <model> element's renderer being available, 23 we opt into "custom style resolve callbacks" so that we may implement didAttachRenderers() on HTMLModelElement and keep 24 track of renderer availability before attempting to create the ModelPlayer. 25 26 * Modules/model-element/HTMLModelElement.cpp: 27 (WebCore::HTMLModelElement::HTMLModelElement): 28 (WebCore::HTMLModelElement::create): 29 (WebCore::HTMLModelElement::setSourceURL): 30 (WebCore::HTMLModelElement::didAttachRenderers): 31 (WebCore::HTMLModelElement::notifyFinished): 32 (WebCore::HTMLModelElement::modelDidChange): 33 (WebCore::HTMLModelElement::createModelPlayer): 34 (WebCore::HTMLModelElement::didFinishLoading): 35 (WebCore::HTMLModelElement::didFailLoading): 36 (WebCore::HTMLModelElement::activeDOMObjectName const): 37 (WebCore::HTMLModelElement::virtualHasPendingActivity const): 38 * Modules/model-element/HTMLModelElement.h: 39 * Modules/model-element/HTMLModelElement.idl: 40 1 41 2021-12-10 Said Abou-Hallawa <said@apple.com> 2 42 -
trunk/Source/WebCore/Modules/model-element/HTMLModelElement.cpp
r286406 r286836 66 66 HTMLModelElement::HTMLModelElement(const QualifiedName& tagName, Document& document) 67 67 : HTMLElement(tagName, document) 68 , ActiveDOMObject(document) 68 69 , m_readyPromise { makeUniqueRef<ReadyPromise>(*this, &HTMLModelElement::readyPromiseResolve) } 69 70 { 71 setHasCustomStyleResolveCallbacks(); 70 72 } 71 73 … … 80 82 Ref<HTMLModelElement> HTMLModelElement::create(const QualifiedName& tagName, Document& document) 81 83 { 82 return adoptRef(*new HTMLModelElement(tagName, document)); 84 auto model = adoptRef(*new HTMLModelElement(tagName, document)); 85 model->suspendIfNeeded(); 86 return model; 83 87 } 84 88 … … 132 136 133 137 m_readyPromise = makeUniqueRef<ReadyPromise>(*this, &HTMLModelElement::readyPromiseResolve); 134 135 if (m_sourceURL.isEmpty()) 136 return; 138 m_shouldCreateModelPlayerUponRendererAttachment = false; 139 140 if (m_sourceURL.isEmpty()) { 141 queueTaskToDispatchEvent(*this, TaskSource::DOMManipulation, Event::create(eventNames().errorEvent, Event::CanBubble::No, Event::IsCancelable::No)); 142 return; 143 } 137 144 138 145 ResourceLoaderOptions options = CachedResourceLoader::defaultCachedResourceOptions(); … … 146 153 auto resource = document().cachedResourceLoader().requestModelResource(WTFMove(request)); 147 154 if (!resource.has_value()) { 155 queueTaskToDispatchEvent(*this, TaskSource::DOMManipulation, Event::create(eventNames().errorEvent, Event::CanBubble::No, Event::IsCancelable::No)); 148 156 m_readyPromise->reject(Exception { NetworkError }); 149 157 return; … … 174 182 { 175 183 return createRenderer<RenderModel>(*this, WTFMove(style)); 184 } 185 186 void HTMLModelElement::didAttachRenderers() 187 { 188 if (!m_shouldCreateModelPlayerUponRendererAttachment) 189 return; 190 191 m_shouldCreateModelPlayerUponRendererAttachment = false; 192 createModelPlayer(); 176 193 } 177 194 … … 198 215 m_data = nullptr; 199 216 217 queueTaskToDispatchEvent(*this, TaskSource::DOMManipulation, Event::create(eventNames().errorEvent, Event::CanBubble::No, Event::IsCancelable::No)); 218 200 219 invalidateResourceHandleAndUpdateRenderer(); 201 220 … … 207 226 m_model = Model::create(m_data.releaseNonNull().get(), resource.mimeType(), resource.url()); 208 227 228 queueTaskToDispatchEvent(*this, TaskSource::DOMManipulation, Event::create(eventNames().loadEvent, Event::CanBubble::No, Event::IsCancelable::No)); 229 209 230 invalidateResourceHandleAndUpdateRenderer(); 210 231 211 m_readyPromise->resolve(*this);212 213 232 modelDidChange(); 214 233 } … … 218 237 void HTMLModelElement::modelDidChange() 219 238 { 220 // FIXME: For the early returns here, we should probably inform the page that things have 221 // failed to render. For the case of no-renderer, we should probably also build the model 222 // when/if a renderer is created. 223 224 auto page = document().page(); 225 if (!page) 226 return; 239 auto* page = document().page(); 240 if (!page) { 241 m_readyPromise->reject(Exception { AbortError }); 242 return; 243 } 227 244 228 245 auto* renderer = this->renderer(); 229 if (!renderer) 230 return; 231 232 m_modelPlayer = page->modelPlayerProvider().createModelPlayer(*this); 233 if (!m_modelPlayer) 234 return; 246 if (!renderer) { 247 m_shouldCreateModelPlayerUponRendererAttachment = true; 248 return; 249 } 250 251 createModelPlayer(); 252 } 253 254 void HTMLModelElement::createModelPlayer() 255 { 256 ASSERT(document().page()); 257 m_modelPlayer = document().page()->modelPlayerProvider().createModelPlayer(*this); 258 if (!m_modelPlayer) { 259 m_readyPromise->reject(Exception { AbortError }); 260 return; 261 } 235 262 236 263 // FIXME: We need to tell the player if the size changes as well, so passing this 237 264 // in with load probably doesn't make sense. 238 auto size = renderer->absoluteBoundingBoxRect(false).size(); 265 ASSERT(renderer()); 266 auto size = renderer()->absoluteBoundingBoxRect(false).size(); 239 267 m_modelPlayer->load(*m_model, size); 240 268 } … … 256 284 if (auto* renderer = this->renderer()) 257 285 renderer->updateFromElement(); 286 287 m_readyPromise->resolve(*this); 258 288 } 259 289 … … 261 291 { 262 292 ASSERT_UNUSED(modelPlayer, &modelPlayer == m_modelPlayer); 293 m_readyPromise->reject(Exception { AbortError }); 263 294 } 264 295 … … 553 584 } 554 585 586 const char* HTMLModelElement::activeDOMObjectName() const 587 { 588 return "HTMLModelElement"; 589 } 590 591 bool HTMLModelElement::virtualHasPendingActivity() const 592 { 593 // We need to ensure the JS wrapper is kept alive if a load is in progress and we may yet dispatch 594 // "load" or "error" events, ie. as long as we have a resource, meaning we are in the process of loading. 595 return m_resource; 596 } 597 555 598 #if PLATFORM(COCOA) 556 599 Vector<RetainPtr<id>> HTMLModelElement::accessibilityChildren() -
trunk/Source/WebCore/Modules/model-element/HTMLModelElement.h
r286406 r286836 28 28 #if ENABLE(MODEL_ELEMENT) 29 29 30 #include "ActiveDOMObject.h" 30 31 #include "CachedRawResource.h" 31 32 #include "CachedRawResourceClient.h" … … 50 51 template<typename IDLType> class DOMPromiseProxyWithResolveCallback; 51 52 52 class HTMLModelElement final : public HTMLElement, private CachedRawResourceClient, public ModelPlayerClient {53 class HTMLModelElement final : public HTMLElement, private CachedRawResourceClient, public ModelPlayerClient, public ActiveDOMObject { 53 54 WTF_MAKE_ISO_ALLOCATED(HTMLModelElement); 54 55 public: … … 58 59 void sourcesChanged(); 59 60 const URL& currentSrc() const { return m_sourceURL; } 61 bool complete() const { return m_dataComplete; } 60 62 61 63 // MARK: DOM Functions and Attributes … … 107 109 void setSourceURL(const URL&); 108 110 void modelDidChange(); 111 void createModelPlayer(); 109 112 110 113 HTMLModelElement& readyPromiseResolve(); 114 115 // ActiveDOMObject 116 const char* activeDOMObjectName() const final; 117 bool virtualHasPendingActivity() const final; 111 118 112 119 // DOM overrides. … … 115 122 // Rendering overrides. 116 123 RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final; 124 void didAttachRenderers() final; 117 125 118 126 // CachedRawResourceClient overrides. … … 139 147 bool m_dataComplete { false }; 140 148 bool m_isDragging { false }; 149 bool m_shouldCreateModelPlayerUponRendererAttachment { false }; 141 150 142 151 RefPtr<ModelPlayer> m_modelPlayer; -
trunk/Source/WebCore/Modules/model-element/HTMLModelElement.idl
r286643 r286836 31 31 [URL] readonly attribute USVString currentSrc; 32 32 33 readonly attribute boolean complete; 33 34 readonly attribute Promise<HTMLModelElement> ready; 34 35 -
trunk/Tools/ChangeLog
r286823 r286836 1 2021-12-09 Antoine Quint <graouts@webkit.org> 2 3 [Model] Add load and error events to distinguish resource load from model readiness 4 https://bugs.webkit.org/show_bug.cgi?id=233706 5 rdar://85922697 6 7 Reviewed by Chris Dumez and Dean Jackson. 8 9 Use the "load" event instead of the "ready" promise for this test which only requires monitoring 10 the <model> resource being loaded. 11 12 * TestWebKitAPI/Tests/ios/DragAndDropTestsIOS.mm: 13 (TestWebKitAPI::TEST): 14 1 15 2021-12-09 Aditya Keerthi <akeerthi@apple.com> 2 16 -
trunk/Tools/TestWebKitAPI/Tests/ios/DragAndDropTestsIOS.mm
r283563 r286836 2198 2198 2199 2199 auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get()]); 2200 [webView synchronouslyLoadHTMLString:@"<model><source src='model://cube.usdz'></model><script>document. getElementsByTagName('model')[0].ready.then(() => { window.webkit.messageHandlers.modelLoading.postMessage('READY') });</script>"];2200 [webView synchronouslyLoadHTMLString:@"<model><source src='model://cube.usdz'></model><script>document.querySelector('model').addEventListener('load', event => window.webkit.messageHandlers.modelLoading.postMessage('READY'));</script>"]; 2201 2201 2202 2202 while (![messageHandler didLoadModel])
Note: See TracChangeset
for help on using the changeset viewer.