Changeset 259315 in webkit


Ignore:
Timestamp:
Mar 31, 2020 3:09:46 PM (4 years ago)
Author:
Chris Dumez
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:
Location:
trunk/Source
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r259313 r259315  
     12020-03-31  Chris Dumez  <cdumez@apple.com>
     2
     3        Regression(r253357) DeviceMotionEvent acceleration and rotationRate are null
     4        https://bugs.webkit.org/show_bug.cgi?id=209831
     5        <rdar://problem/60720953>
     6
     7        Reviewed by Darin Adler.
     8
     9        The issue was that DeviceMotionClientIOS::motionChanged() would only initialize the
     10        acceleration and rotationRate if [m_motionManager gyroAvailable] returned YES. After
     11        r253357, m_motionManager is nil because we get motion data from the UIProcess so
     12        [m_motionManager gyroAvailable] would always resolve to NO.
     13
     14        To address the issue, I made the rotationRate parameters to motionChanged() optional
     15        and we rely on them being set to know if gyro data is available. Note that I did not
     16        make the acceleration optional because according to [1], all devices have an
     17        accelerometer.
     18
     19        [1] https://developer.apple.com/documentation/coremotion/cmmotionmanager/1616094-devicemotionavailable?language=objc
     20
     21        * platform/ios/DeviceMotionClientIOS.h:
     22        * platform/ios/DeviceMotionClientIOS.mm:
     23        (WebCore::DeviceMotionClientIOS::motionChanged):
     24        * platform/ios/DeviceOrientationUpdateProvider.h:
     25        * platform/ios/MotionManagerClient.h:
     26        (WebCore::MotionManagerClient::motionChanged):
     27        * platform/ios/WebCoreMotionManager.mm:
     28        (-[WebCoreMotionManager sendAccelerometerData:]):
     29
    1302020-03-31  Antoine Quint  <graouts@apple.com>
    231
  • trunk/Source/WebCore/platform/ios/DeviceMotionClientIOS.h

    r253357 r259315  
    4949    void deviceMotionControllerDestroyed() override;
    5050
    51     void motionChanged(double, double, double, double, double, double, double, double, double) override;
     51    void motionChanged(double, double, double, double, double, double, Optional<double>, Optional<double>, Optional<double>) override;
    5252
    5353private:
  • trunk/Source/WebCore/platform/ios/DeviceMotionClientIOS.mm

    r253357 r259315  
    9292}
    9393
    94 void DeviceMotionClientIOS::motionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, double xRotationRate, double yRotationRate, double zRotationRate)
     94void DeviceMotionClientIOS::motionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, Optional<double> xRotationRate, Optional<double> yRotationRate, Optional<double> zRotationRate)
    9595{
    9696    if (!m_updating)
     
    114114    auto accelerationIncludingGravity = DeviceMotionData::Acceleration::create(xAccelerationIncludingGravity, yAccelerationIncludingGravity, zAccelerationIncludingGravity);
    115115
    116     RefPtr<DeviceMotionData::Acceleration> acceleration;
     116    RefPtr<DeviceMotionData::Acceleration> acceleration = DeviceMotionData::Acceleration::create(xAcceleration, yAcceleration, zAcceleration);
    117117    RefPtr<DeviceMotionData::RotationRate> rotationRate;
    118     if ([m_motionManager gyroAvailable]) {
    119         acceleration = DeviceMotionData::Acceleration::create(xAcceleration, yAcceleration, zAcceleration);
    120         rotationRate = DeviceMotionData::RotationRate::create(xRotationRate, yRotationRate, zRotationRate);
    121     }
     118    // Not all devices have a gyroscope.
     119    if (xRotationRate && yRotationRate && zRotationRate)
     120        rotationRate = DeviceMotionData::RotationRate::create(*xRotationRate, *yRotationRate, *zRotationRate);
    122121#endif // PLATFORM(IOS_FAMILY_SIMULATOR)
    123122
  • trunk/Source/WebCore/platform/ios/DeviceOrientationUpdateProvider.h

    r253357 r259315  
    4545
    4646    virtual void deviceOrientationChanged(double, double, double, double, double) = 0;
    47     virtual void deviceMotionChanged(double, double, double, double, double, double, double, double, double) = 0;
     47    virtual void deviceMotionChanged(double, double, double, double, double, double, Optional<double>, Optional<double>, Optional<double>) = 0;
    4848   
    4949protected:
  • trunk/Source/WebCore/platform/ios/MotionManagerClient.h

    r253357 r259315  
    3737
    3838    virtual void orientationChanged(double, double, double, double, double) { }
    39     virtual void motionChanged(double, double, double, double, double, double, double, double, double) { }
     39    virtual void motionChanged(double, double, double, double, double, double, Optional<double>, Optional<double>, Optional<double>) { }
    4040};
    4141
  • trunk/Source/WebCore/platform/ios/WebCoreMotionManager.mm

    r253357 r259315  
    233233        for (auto& client : motionClients) {
    234234            if (client)
    235                 client->motionChanged(0, 0, 0, accel.x * kGravity, accel.y * kGravity, accel.z * kGravity, 0, 0, 0);
     235                client->motionChanged(0, 0, 0, accel.x * kGravity, accel.y * kGravity, accel.z * kGravity, WTF::nullopt, WTF::nullopt, WTF::nullopt);
    236236        }
    237237    });
  • trunk/Source/WebKit/ChangeLog

    r259307 r259315  
     12020-03-31  Chris Dumez  <cdumez@apple.com>
     2
     3        Regression(r253357) DeviceMotionEvent acceleration and rotationRate are null
     4        https://bugs.webkit.org/show_bug.cgi?id=209831
     5        <rdar://problem/60720953>
     6
     7        Reviewed by Darin Adler.
     8
     9        * UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.h:
     10        * UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.mm:
     11        (WebKit::WebDeviceOrientationUpdateProviderProxy::motionChanged):
     12        * WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.cpp:
     13        (WebKit::WebDeviceOrientationUpdateProvider::deviceMotionChanged):
     14        * WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.h:
     15        * WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.messages.in:
     16
    1172020-03-31  Alex Christensen  <achristensen@webkit.org>
    218
  • trunk/Source/WebKit/UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.h

    r253357 r259315  
    5050    // WebCore::WebCoreMotionManagerClient
    5151    void orientationChanged(double, double, double, double, double) final;
    52     void motionChanged(double, double, double, double, double, double, double, double, double) final;
     52    void motionChanged(double, double, double, double, double, double, Optional<double>, Optional<double>, Optional<double>) final;
    5353
    5454    // IPC::MessageReceiver
  • trunk/Source/WebKit/UIProcess/ios/WebDeviceOrientationUpdateProviderProxy.mm

    r253357 r259315  
    7373}
    7474
    75 void WebDeviceOrientationUpdateProviderProxy::motionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, double xRotationRate, double yRotationRate, double zRotationRate)
     75void WebDeviceOrientationUpdateProviderProxy::motionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, Optional<double> xRotationRate, Optional<double> yRotationRate, Optional<double> zRotationRate)
    7676{
    7777    m_page.send(Messages::WebDeviceOrientationUpdateProvider::DeviceMotionChanged(xAcceleration, yAcceleration, zAcceleration, xAccelerationIncludingGravity, yAccelerationIncludingGravity, zAccelerationIncludingGravity, xRotationRate, yRotationRate, zRotationRate));
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.cpp

    r253357 r259315  
    9494}
    9595
    96 void WebDeviceOrientationUpdateProvider::deviceMotionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, double xRotationRate, double yRotationRate, double zRotationRate)
     96void WebDeviceOrientationUpdateProvider::deviceMotionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, Optional<double> xRotationRate, Optional<double> yRotationRate, Optional<double> zRotationRate)
    9797{
    9898    Vector<WeakPtr<WebCore::MotionManagerClient>> clients;
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.h

    r253357 r259315  
    5252    void stopUpdatingDeviceMotion(WebCore::MotionManagerClient&) final;
    5353    void deviceOrientationChanged(double, double, double, double, double) final;
    54     void deviceMotionChanged(double, double, double, double, double, double, double, double, double) final;
     54    void deviceMotionChanged(double, double, double, double, double, double, Optional<double>, Optional<double>, Optional<double>) final;
    5555
    5656    // IPC::MessageReceiver.
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebDeviceOrientationUpdateProvider.messages.in

    r253357 r259315  
    2424messages -> WebDeviceOrientationUpdateProvider {
    2525    DeviceOrientationChanged(double alpha, double beta, double gamma, double compassHeading, double compassAccuracy)
    26     DeviceMotionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, double xRotationRate, double yRotationRate, double zRotationRate)
     26    DeviceMotionChanged(double xAcceleration, double yAcceleration, double zAcceleration, double xAccelerationIncludingGravity, double yAccelerationIncludingGravity, double zAccelerationIncludingGravity, Optional<double> xRotationRate, Optional<double> yRotationRate, Optional<double> zRotationRate)
    2727}
    2828#endif
Note: See TracChangeset for help on using the changeset viewer.