<model> should only be draggable on iOS
https://bugs.webkit.org/show_bug.cgi?id=235697

Reviewed by Dean Jackson.

Source/WebCore:

As part of bug 229246 we added support for dragging <model> elements. However, it only
worked on iOS in practice so we make that explicit so that other platforms that do not
have complete support for <model> dragging do not have that feature.

This is also important leading up to bug 227621, where we'll implement the "interactive"
HTML attribute and IDL property, since disabling dragging over a <model> element to adjust
the camera would trigger a crash under Pasteboard::write() on macOS due to not having an
image set on the pasteboard data.

* Modules/model-element/HTMLModelElement.cpp:
(WebCore::HTMLModelElement::supportsDragging const):
(WebCore::HTMLModelElement::isDraggableIgnoringAttributes const):
* Modules/model-element/HTMLModelElement.h:
* Modules/model-element/ModelPlayer.cpp:
(WebCore::ModelPlayer::supportsDragging):
* Modules/model-element/ModelPlayer.h:
* page/DragController.cpp:
(WebCore::modelElementIsDraggable):

Source/WebKit:

Override the ModelPlayer method to enable <model> dragging on iOS.

* WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.h:
* WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.mm:
(WebKit::ARKitInlinePreviewModelPlayerIOS::supportsDragging):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@288670 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index f1bfded..43fd952 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,29 @@
+2022-01-27  Antoine Quint  <graouts@webkit.org>
+
+        <model> should only be draggable on iOS
+        https://bugs.webkit.org/show_bug.cgi?id=235697
+
+        Reviewed by Dean Jackson.
+
+        As part of bug 229246 we added support for dragging <model> elements. However, it only
+        worked on iOS in practice so we make that explicit so that other platforms that do not
+        have complete support for <model> dragging do not have that feature.
+
+        This is also important leading up to bug 227621, where we'll implement the "interactive"
+        HTML attribute and IDL property, since disabling dragging over a <model> element to adjust
+        the camera would trigger a crash under Pasteboard::write() on macOS due to not having an
+        image set on the pasteboard data.
+
+        * Modules/model-element/HTMLModelElement.cpp:
+        (WebCore::HTMLModelElement::supportsDragging const):
+        (WebCore::HTMLModelElement::isDraggableIgnoringAttributes const):
+        * Modules/model-element/HTMLModelElement.h:
+        * Modules/model-element/ModelPlayer.cpp:
+        (WebCore::ModelPlayer::supportsDragging):
+        * Modules/model-element/ModelPlayer.h:
+        * page/DragController.cpp:
+        (WebCore::modelElementIsDraggable):
+
 2022-01-27  Cameron McCormack  <heycam@apple.com>
 
         Avoid setting and clearing :active state when dispatching synthetic click events when possible
diff --git a/Source/WebCore/Modules/model-element/HTMLModelElement.cpp b/Source/WebCore/Modules/model-element/HTMLModelElement.cpp
index 9fea18c..3ac1902 100644
--- a/Source/WebCore/Modules/model-element/HTMLModelElement.cpp
+++ b/Source/WebCore/Modules/model-element/HTMLModelElement.cpp
@@ -321,6 +321,16 @@
 
 // MARK: - Interaction support.
 
+bool HTMLModelElement::supportsDragging() const
+{
+    return m_modelPlayer && m_modelPlayer->supportsDragging();
+}
+
+bool HTMLModelElement::isDraggableIgnoringAttributes() const
+{
+    return supportsDragging();
+}
+
 void HTMLModelElement::defaultEventHandler(Event& event)
 {
     if (!m_modelPlayer || !m_modelPlayer->supportsMouseInteraction())
diff --git a/Source/WebCore/Modules/model-element/HTMLModelElement.h b/Source/WebCore/Modules/model-element/HTMLModelElement.h
index 57ddf26..7468a33 100644
--- a/Source/WebCore/Modules/model-element/HTMLModelElement.h
+++ b/Source/WebCore/Modules/model-element/HTMLModelElement.h
@@ -97,7 +97,8 @@
     void isMuted(IsMutedPromise&&);
     void setIsMuted(bool, DOMPromiseDeferred<void>&&);
 
-    bool isDraggableIgnoringAttributes() const final { return true; }
+    bool supportsDragging() const;
+    bool isDraggableIgnoringAttributes() const final;
 
 #if PLATFORM(COCOA)
     Vector<RetainPtr<id>> accessibilityChildren();
diff --git a/Source/WebCore/Modules/model-element/ModelPlayer.cpp b/Source/WebCore/Modules/model-element/ModelPlayer.cpp
index 8838d66..9f0ec7c 100644
--- a/Source/WebCore/Modules/model-element/ModelPlayer.cpp
+++ b/Source/WebCore/Modules/model-element/ModelPlayer.cpp
@@ -35,4 +35,9 @@
     return false;
 }
 
+bool ModelPlayer::supportsDragging()
+{
+    return false;
+}
+
 }
diff --git a/Source/WebCore/Modules/model-element/ModelPlayer.h b/Source/WebCore/Modules/model-element/ModelPlayer.h
index 299c55f..892aa97 100644
--- a/Source/WebCore/Modules/model-element/ModelPlayer.h
+++ b/Source/WebCore/Modules/model-element/ModelPlayer.h
@@ -47,6 +47,7 @@
     virtual PlatformLayer* layer() = 0;
     virtual void enterFullscreen() = 0;
     virtual bool supportsMouseInteraction();
+    virtual bool supportsDragging();
     virtual void handleMouseDown(const LayoutPoint&, MonotonicTime) = 0;
     virtual void handleMouseMove(const LayoutPoint&, MonotonicTime) = 0;
     virtual void handleMouseUp(const LayoutPoint&, MonotonicTime) = 0;
diff --git a/Source/WebCore/page/DragController.cpp b/Source/WebCore/page/DragController.cpp
index f4b8c87..84b98bd 100644
--- a/Source/WebCore/page/DragController.cpp
+++ b/Source/WebCore/page/DragController.cpp
@@ -755,7 +755,7 @@
 
 static bool modelElementIsDraggable(const HTMLModelElement& modelElement)
 {
-    return !!modelElement.model();
+    return modelElement.supportsDragging() && !!modelElement.model();
 }
 
 #endif
diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog
index bdbed52..a60fdb9 100644
--- a/Source/WebKit/ChangeLog
+++ b/Source/WebKit/ChangeLog
@@ -1,3 +1,16 @@
+2022-01-27  Antoine Quint  <graouts@webkit.org>
+
+        <model> should only be draggable on iOS
+        https://bugs.webkit.org/show_bug.cgi?id=235697
+
+        Reviewed by Dean Jackson.
+
+        Override the ModelPlayer method to enable <model> dragging on iOS.
+
+        * WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.h:
+        * WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.mm:
+        (WebKit::ARKitInlinePreviewModelPlayerIOS::supportsDragging):
+
 2022-01-26  ChangSeok Oh  <changseok@webkit.org>
 
         [GTK] WTR: Native HTML form validation popover is not supported
diff --git a/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.h b/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.h
index 40a2595..afc2984 100644
--- a/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.h
+++ b/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.h
@@ -44,6 +44,7 @@
     std::optional<ModelIdentifier> modelIdentifier() override;
 
     // WebCore::ModelPlayer overrides.
+    bool supportsDragging() override;
     void enterFullscreen() override;
     void handleMouseDown(const WebCore::LayoutPoint&, MonotonicTime) override;
     void handleMouseMove(const WebCore::LayoutPoint&, MonotonicTime) override;
diff --git a/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.mm b/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.mm
index a99a34b..1386a4e 100644
--- a/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.mm
+++ b/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.mm
@@ -61,6 +61,11 @@
 
 // MARK: - WebCore::ModelPlayer overrides.
 
+bool ARKitInlinePreviewModelPlayerIOS::supportsDragging()
+{
+    return true;
+}
+
 void ARKitInlinePreviewModelPlayerIOS::enterFullscreen()
 {
     RefPtr strongPage = page();