Title: [259315] trunk/Source
Revision
259315
Author
[email protected]
Date
2020-03-31 15:09:46 -0700 (Tue, 31 Mar 2020)

Log Message

Regression(r253357) DeviceMotionEvent acceleration and rotationRate are null
https://bugs.webkit.org/show_bug.cgi?id=209831
<rdar://problem/60720953>

Reviewed by Darin Adler.

Source/WebCore:

The issue was that DeviceMotionClientIOS::motionChanged() would only initialize the
acceleration and rotationRate if [m_motionManager gyroAvailable] returned YES. After
r253357, m_motionManager is nil because we get motion data from the UIProcess so
[m_motionManager gyroAvailable] would always resolve to NO.

To address the issue, I made the rotationRate parameters to motionChanged() optional
and we rely on them being set to know if gyro data is available. Note that I did not
make the acceleration optional because according to [1], all devices have an
accelerometer.

[1] https://developer.apple.com/documentation/coremotion/cmmotionmanager/1616094-devicemotionavailable?language=objc

* platform/ios/DeviceMotionClientIOS.h:
* platform/ios/DeviceMotionClientIOS.mm:
(WebCore::DeviceMotionClientIOS::motionChanged):
* platform/ios/DeviceOrientationUpdateProvider.h:
* platform/ios/MotionManagerClient.h:
(WebCore::MotionManagerClient::motionChanged):
* platform/ios/WebCoreMotionManager.mm:
(-[WebCoreMotionManager sendAccelerometerData:]):

Source/WebKit:

* UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.h:
* UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.mm:
(WebKit::WebDeviceOrientationUpdateProviderProxy::motionChanged):
* WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.cpp:
(WebKit::WebDeviceOrientationUpdateProvider::deviceMotionChanged):
* WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.h:
* WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.messages.in:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (259314 => 259315)


--- trunk/Source/WebCore/ChangeLog	2020-03-31 22:07:32 UTC (rev 259314)
+++ trunk/Source/WebCore/ChangeLog	2020-03-31 22:09:46 UTC (rev 259315)
@@ -1,3 +1,32 @@
+2020-03-31  Chris Dumez  <[email protected]>
+
+        Regression(r253357) DeviceMotionEvent acceleration and rotationRate are null
+        https://bugs.webkit.org/show_bug.cgi?id=209831
+        <rdar://problem/60720953>
+
+        Reviewed by Darin Adler.
+
+        The issue was that DeviceMotionClientIOS::motionChanged() would only initialize the
+        acceleration and rotationRate if [m_motionManager gyroAvailable] returned YES. After
+        r253357, m_motionManager is nil because we get motion data from the UIProcess so
+        [m_motionManager gyroAvailable] would always resolve to NO.
+
+        To address the issue, I made the rotationRate parameters to motionChanged() optional
+        and we rely on them being set to know if gyro data is available. Note that I did not
+        make the acceleration optional because according to [1], all devices have an
+        accelerometer.
+
+        [1] https://developer.apple.com/documentation/coremotion/cmmotionmanager/1616094-devicemotionavailable?language=objc
+
+        * platform/ios/DeviceMotionClientIOS.h:
+        * platform/ios/DeviceMotionClientIOS.mm:
+        (WebCore::DeviceMotionClientIOS::motionChanged):
+        * platform/ios/DeviceOrientationUpdateProvider.h:
+        * platform/ios/MotionManagerClient.h:
+        (WebCore::MotionManagerClient::motionChanged):
+        * platform/ios/WebCoreMotionManager.mm:
+        (-[WebCoreMotionManager sendAccelerometerData:]):
+
 2020-03-31  Antoine Quint  <[email protected]>
 
         [iPadOS] Unable to scrub videos on nba.com

Modified: trunk/Source/WebCore/platform/ios/DeviceMotionClientIOS.h (259314 => 259315)


--- trunk/Source/WebCore/platform/ios/DeviceMotionClientIOS.h	2020-03-31 22:07:32 UTC (rev 259314)
+++ trunk/Source/WebCore/platform/ios/DeviceMotionClientIOS.h	2020-03-31 22:09:46 UTC (rev 259315)
@@ -48,7 +48,7 @@
     DeviceMotionData* lastMotion() const override;
     void deviceMotionControllerDestroyed() override;
 
-    void motionChanged(double, double, double, double, double, double, double, double, double) override;
+    void motionChanged(double, double, double, double, double, double, Optional<double>, Optional<double>, Optional<double>) override;
 
 private:
     WebCoreMotionManager* m_motionManager { nullptr };

Modified: trunk/Source/WebCore/platform/ios/DeviceMotionClientIOS.mm (259314 => 259315)


--- trunk/Source/WebCore/platform/ios/DeviceMotionClientIOS.mm	2020-03-31 22:07:32 UTC (rev 259314)
+++ trunk/Source/WebCore/platform/ios/DeviceMotionClientIOS.mm	2020-03-31 22:09:46 UTC (rev 259315)
@@ -91,7 +91,7 @@
     [m_motionManager removeMotionClient:this];
 }
 
-void DeviceMotionClientIOS::motionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, double xRotationRate, double yRotationRate, double zRotationRate)
+void DeviceMotionClientIOS::motionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, Optional<double> xRotationRate, Optional<double> yRotationRate, Optional<double> zRotationRate)
 {
     if (!m_updating)
         return;
@@ -113,12 +113,11 @@
 #else
     auto accelerationIncludingGravity = DeviceMotionData::Acceleration::create(xAccelerationIncludingGravity, yAccelerationIncludingGravity, zAccelerationIncludingGravity);
 
-    RefPtr<DeviceMotionData::Acceleration> acceleration;
+    RefPtr<DeviceMotionData::Acceleration> acceleration = DeviceMotionData::Acceleration::create(xAcceleration, yAcceleration, zAcceleration);
     RefPtr<DeviceMotionData::RotationRate> rotationRate;
-    if ([m_motionManager gyroAvailable]) {
-        acceleration = DeviceMotionData::Acceleration::create(xAcceleration, yAcceleration, zAcceleration);
-        rotationRate = DeviceMotionData::RotationRate::create(xRotationRate, yRotationRate, zRotationRate);
-    }
+    // Not all devices have a gyroscope.
+    if (xRotationRate && yRotationRate && zRotationRate)
+        rotationRate = DeviceMotionData::RotationRate::create(*xRotationRate, *yRotationRate, *zRotationRate);
 #endif // PLATFORM(IOS_FAMILY_SIMULATOR)
 
     m_currentDeviceMotionData = DeviceMotionData::create(WTFMove(acceleration), WTFMove(accelerationIncludingGravity), WTFMove(rotationRate), kMotionUpdateInterval);

Modified: trunk/Source/WebCore/platform/ios/DeviceOrientationUpdateProvider.h (259314 => 259315)


--- trunk/Source/WebCore/platform/ios/DeviceOrientationUpdateProvider.h	2020-03-31 22:07:32 UTC (rev 259314)
+++ trunk/Source/WebCore/platform/ios/DeviceOrientationUpdateProvider.h	2020-03-31 22:09:46 UTC (rev 259315)
@@ -44,7 +44,7 @@
     virtual void stopUpdatingDeviceMotion(MotionManagerClient&) = 0;
 
     virtual void deviceOrientationChanged(double, double, double, double, double) = 0;
-    virtual void deviceMotionChanged(double, double, double, double, double, double, double, double, double) = 0;
+    virtual void deviceMotionChanged(double, double, double, double, double, double, Optional<double>, Optional<double>, Optional<double>) = 0;
     
 protected:
     DeviceOrientationUpdateProvider() = default;

Modified: trunk/Source/WebCore/platform/ios/MotionManagerClient.h (259314 => 259315)


--- trunk/Source/WebCore/platform/ios/MotionManagerClient.h	2020-03-31 22:07:32 UTC (rev 259314)
+++ trunk/Source/WebCore/platform/ios/MotionManagerClient.h	2020-03-31 22:09:46 UTC (rev 259315)
@@ -36,7 +36,7 @@
     virtual ~MotionManagerClient() { };
 
     virtual void orientationChanged(double, double, double, double, double) { }
-    virtual void motionChanged(double, double, double, double, double, double, double, double, double) { }
+    virtual void motionChanged(double, double, double, double, double, double, Optional<double>, Optional<double>, Optional<double>) { }
 };
 
 };

Modified: trunk/Source/WebCore/platform/ios/WebCoreMotionManager.mm (259314 => 259315)


--- trunk/Source/WebCore/platform/ios/WebCoreMotionManager.mm	2020-03-31 22:07:32 UTC (rev 259314)
+++ trunk/Source/WebCore/platform/ios/WebCoreMotionManager.mm	2020-03-31 22:09:46 UTC (rev 259315)
@@ -232,7 +232,7 @@
 
         for (auto& client : motionClients) {
             if (client)
-                client->motionChanged(0, 0, 0, accel.x * kGravity, accel.y * kGravity, accel.z * kGravity, 0, 0, 0);
+                client->motionChanged(0, 0, 0, accel.x * kGravity, accel.y * kGravity, accel.z * kGravity, WTF::nullopt, WTF::nullopt, WTF::nullopt);
         }
     });
 }

Modified: trunk/Source/WebKit/ChangeLog (259314 => 259315)


--- trunk/Source/WebKit/ChangeLog	2020-03-31 22:07:32 UTC (rev 259314)
+++ trunk/Source/WebKit/ChangeLog	2020-03-31 22:09:46 UTC (rev 259315)
@@ -1,3 +1,19 @@
+2020-03-31  Chris Dumez  <[email protected]>
+
+        Regression(r253357) DeviceMotionEvent acceleration and rotationRate are null
+        https://bugs.webkit.org/show_bug.cgi?id=209831
+        <rdar://problem/60720953>
+
+        Reviewed by Darin Adler.
+
+        * UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.h:
+        * UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.mm:
+        (WebKit::WebDeviceOrientationUpdateProviderProxy::motionChanged):
+        * WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.cpp:
+        (WebKit::WebDeviceOrientationUpdateProvider::deviceMotionChanged):
+        * WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.h:
+        * WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.messages.in:
+
 2020-03-31  Alex Christensen  <[email protected]>
 
         Add SPI WKWebpagePreferences._userContentController

Modified: trunk/Source/WebKit/UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.h (259314 => 259315)


--- trunk/Source/WebKit/UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.h	2020-03-31 22:07:32 UTC (rev 259314)
+++ trunk/Source/WebKit/UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.h	2020-03-31 22:09:46 UTC (rev 259315)
@@ -49,7 +49,7 @@
 private:
     // WebCore::WebCoreMotionManagerClient
     void orientationChanged(double, double, double, double, double) final;
-    void motionChanged(double, double, double, double, double, double, double, double, double) final;
+    void motionChanged(double, double, double, double, double, double, Optional<double>, Optional<double>, Optional<double>) final;
 
     // IPC::MessageReceiver
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;

Modified: trunk/Source/WebKit/UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.mm (259314 => 259315)


--- trunk/Source/WebKit/UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.mm	2020-03-31 22:07:32 UTC (rev 259314)
+++ trunk/Source/WebKit/UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.mm	2020-03-31 22:09:46 UTC (rev 259315)
@@ -72,7 +72,7 @@
     m_page.send(Messages::WebDeviceOrientationUpdateProvider::DeviceOrientationChanged(alpha, beta, gamma, compassHeading, compassAccuracy));
 }
 
-void WebDeviceOrientationUpdateProviderProxy::motionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, double xRotationRate, double yRotationRate, double zRotationRate)
+void WebDeviceOrientationUpdateProviderProxy::motionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, Optional<double> xRotationRate, Optional<double> yRotationRate, Optional<double> zRotationRate)
 {
     m_page.send(Messages::WebDeviceOrientationUpdateProvider::DeviceMotionChanged(xAcceleration, yAcceleration, zAcceleration, xAccelerationIncludingGravity, yAccelerationIncludingGravity, zAccelerationIncludingGravity, xRotationRate, yRotationRate, zRotationRate));
 }

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.cpp (259314 => 259315)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.cpp	2020-03-31 22:07:32 UTC (rev 259314)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.cpp	2020-03-31 22:09:46 UTC (rev 259315)
@@ -93,7 +93,7 @@
     }
 }
 
-void WebDeviceOrientationUpdateProvider::deviceMotionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, double xRotationRate, double yRotationRate, double zRotationRate)
+void WebDeviceOrientationUpdateProvider::deviceMotionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, Optional<double> xRotationRate, Optional<double> yRotationRate, Optional<double> zRotationRate)
 {
     Vector<WeakPtr<WebCore::MotionManagerClient>> clients;
     for (auto& client : m_deviceMotionClients)

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.h (259314 => 259315)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.h	2020-03-31 22:07:32 UTC (rev 259314)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.h	2020-03-31 22:09:46 UTC (rev 259315)
@@ -51,7 +51,7 @@
     void startUpdatingDeviceMotion(WebCore::MotionManagerClient&) final;
     void stopUpdatingDeviceMotion(WebCore::MotionManagerClient&) final;
     void deviceOrientationChanged(double, double, double, double, double) final;
-    void deviceMotionChanged(double, double, double, double, double, double, double, double, double) final;
+    void deviceMotionChanged(double, double, double, double, double, double, Optional<double>, Optional<double>, Optional<double>) final;
 
     // IPC::MessageReceiver.
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.messages.in (259314 => 259315)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.messages.in	2020-03-31 22:07:32 UTC (rev 259314)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.messages.in	2020-03-31 22:09:46 UTC (rev 259315)
@@ -23,6 +23,6 @@
 #if PLATFORM(IOS_FAMILY) && ENABLE(DEVICE_ORIENTATION)
 messages -> WebDeviceOrientationUpdateProvider {
     DeviceOrientationChanged(double alpha, double beta, double gamma, double compassHeading, double compassAccuracy)
-    DeviceMotionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, double xRotationRate, double yRotationRate, double zRotationRate)
+    DeviceMotionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, Optional<double> xRotationRate, Optional<double> yRotationRate, Optional<double> zRotationRate)
 }
 #endif
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to