Diff
Modified: trunk/Source/WebCore/CMakeLists.txt (218529 => 218530)
--- trunk/Source/WebCore/CMakeLists.txt 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/CMakeLists.txt 2017-06-20 04:18:47 UTC (rev 218530)
@@ -964,7 +964,6 @@
Modules/mediastream/MediaDeviceInfo.cpp
Modules/mediastream/MediaDevices.cpp
Modules/mediastream/MediaDevicesEnumerationRequest.cpp
- Modules/mediastream/MediaDevicesRequest.cpp
Modules/mediastream/MediaEndpointPeerConnection.cpp
Modules/mediastream/MediaEndpointSessionDescription.cpp
Modules/mediastream/MediaStream.cpp
Modified: trunk/Source/WebCore/ChangeLog (218529 => 218530)
--- trunk/Source/WebCore/ChangeLog 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/ChangeLog 2017-06-20 04:18:47 UTC (rev 218530)
@@ -1,3 +1,83 @@
+2017-06-19 Darin Adler <da...@apple.com>
+
+ Merge MediaDevicesRequest and MediaDevicesEnumerationRequest to tighten up code and object lifetime
+ https://bugs.webkit.org/show_bug.cgi?id=173527
+
+ Reviewed by Sam Weinig.
+
+ * CMakeLists.txt: Removed MediaDevicesRequest.cpp.
+
+ * Modules/mediastream/MediaDeviceInfo.cpp:
+ (WebCore::MediaDeviceInfo::MediaDeviceInfo): Removed unneeded ScriptExecutionContext.
+ (WebCore::MediaDeviceInfo::create): Ditto.
+ * Modules/mediastream/MediaDeviceInfo.h: Removed unnecessary derivation from
+ ContextDestructionObserver and ScriptExecutionContext arguments. Also removed
+ unused MediaDeviceInfoVector typedef.
+ * Modules/mediastream/MediaDeviceInfo.idl: Added ImplementationLacksVTable.
+
+ * Modules/mediastream/MediaDevices.cpp:
+ (WebCore::MediaDevices::enumerateDevices): Call MediaDevicesEnumerationRequest
+ directly here instead of going through MediaDevicesRequest.
+
+ * Modules/mediastream/MediaDevicesEnumerationRequest.cpp: Moved code from
+ MediaDevicesRequest in here. Put the typical counts at the top of the file.
+ (WebCore::MediaDevicesEnumerationRequest::MediaDevicesEnumerationRequest):
+ Marked inline and changed to take a DOM promise directly rather than having
+ a separate class do the mapping to DOM promises.
+ (WebCore::MediaDevicesEnumerationRequest::start): Replaced the create function
+ with this. The caller doesn't actually keep a reference to the object.
+ Added a FIXME about the behavior, not new, where we neither resolve nor reject
+ the promise if there is no page object present. Updated to use the new version
+ of UserMediaController::from.
+ (WebCore::MediaDevicesEnumerationRequest::~MediaDevicesEnumerationRequest):
+ Added a FIXME about the issue that we don't resolve or reject the promise if
+ the client drops the last reference to the request without calling setDeviceInfo.
+ (WebCore::MediaDevicesEnumerationRequest::document): Added. Private helper.
+ Returns nullptr if the request is no longer active.
+ (WebCore::MediaDevicesEnumerationRequest::frame): Added. For use by a caller
+ that was getting to the frame. Uses the document function so it will return
+ nullptr if the request is no longer active.
+ (WebCore::MediaDevicesEnumerationRequest::userMediaDocumentOrigin): Changed
+ to do the work using the document function.
+ (WebCore::MediaDevicesEnumerationRequest::topLevelDocumentOrigin): Ditto.
+ (WebCore::MediaDevicesEnumerationRequest::contextDestroyed): Simplified. We
+ now can simply set a boolean when the context is destroyed, so there are no
+ side effects and the code is simpler.
+ (WebCore::removeAtypicalDevices): Renamed and tightened up the code a bit.
+ (WebCore::MediaDevicesEnumerationRequest::setDeviceInfo): Moved the code
+ here from MediaDevicesEnumerationRequest to pass the devices along.
+
+ * Modules/mediastream/MediaDevicesEnumerationRequest.h: Made the
+ ContextDestructionObserver use private inheritance. Cut down the includes
+ and removed various unneeded functions.
+
+ * Modules/mediastream/MediaDevicesRequest.cpp: Removed.
+ * Modules/mediastream/MediaDevicesRequest.h: Removed.
+
+ * Modules/mediastream/UserMediaController.cpp:
+ (WebCore::UserMediaController::UserMediaController): Use reference rather
+ than pointer for the client.
+ (WebCore::UserMediaController::~UserMediaController): Ditto.
+ (WebCore::provideUserMediaTo): Ditto.
+
+ * Modules/mediastream/UserMediaController.h:
+ Changed constructor to take a refeference, removed client function, and
+ changed data member to be a reference rather than a pointer.
+ (WebCore::UserMediaController::from): Take and return a reference rather
+ than taking a pointer that is checked for null.
+ (WebCore::UserMediaController::requestUserMediaAccess): Use reference.
+ (WebCore::UserMediaController::cancelUserMediaAccessRequest): Ditto.
+ (WebCore::UserMediaController::enumerateMediaDevices): Ditto.
+ (WebCore::UserMediaController::cancelMediaDevicesEnumerationRequest): Ditto.
+
+ * Modules/mediastream/UserMediaRequest.cpp:
+ (WebCore::UserMediaRequest::start): Updated to use the new version
+ of UserMediaController::from.
+
+ * WebCore.xcodeproj/project.pbxproj: Updated for file removals.
+
+ * testing/Internals.cpp: Removed unneeded include of UserMediaController.h.
+
2017-06-19 Sam Weinig <s...@webkit.org>
[WebIDL] Move Touch related bindings in Document to their own IDL file
Modified: trunk/Source/WebCore/Modules/mediastream/MediaDeviceInfo.cpp (218529 => 218530)
--- trunk/Source/WebCore/Modules/mediastream/MediaDeviceInfo.cpp 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDeviceInfo.cpp 2017-06-20 04:18:47 UTC (rev 218530)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -30,9 +30,8 @@
namespace WebCore {
-inline MediaDeviceInfo::MediaDeviceInfo(ScriptExecutionContext* context, const String& label, const String& deviceId, const String& groupId, Kind kind)
- : ContextDestructionObserver(context)
- , m_label(label)
+inline MediaDeviceInfo::MediaDeviceInfo(const String& label, const String& deviceId, const String& groupId, Kind kind)
+ : m_label(label)
, m_deviceId(deviceId)
, m_groupId(groupId)
, m_kind(kind)
@@ -39,9 +38,9 @@
{
}
-Ref<MediaDeviceInfo> MediaDeviceInfo::create(ScriptExecutionContext* context, const String& label, const String& deviceId, const String& groupId, Kind kind)
+Ref<MediaDeviceInfo> MediaDeviceInfo::create(const String& label, const String& deviceId, const String& groupId, Kind kind)
{
- return adoptRef(*new MediaDeviceInfo(context, label, deviceId, groupId, kind));
+ return adoptRef(*new MediaDeviceInfo(label, deviceId, groupId, kind));
}
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/mediastream/MediaDeviceInfo.h (218529 => 218530)
--- trunk/Source/WebCore/Modules/mediastream/MediaDeviceInfo.h 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDeviceInfo.h 2017-06-20 04:18:47 UTC (rev 218530)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -27,17 +27,16 @@
#if ENABLE(MEDIA_STREAM)
-#include "ContextDestructionObserver.h"
#include "ScriptWrappable.h"
#include <wtf/text/WTFString.h>
namespace WebCore {
-class MediaDeviceInfo : public RefCounted<MediaDeviceInfo>, public ScriptWrappable, private ContextDestructionObserver {
+class MediaDeviceInfo : public RefCounted<MediaDeviceInfo>, public ScriptWrappable {
public:
enum class Kind { Audioinput, Audiooutput, Videoinput };
- static Ref<MediaDeviceInfo> create(ScriptExecutionContext*, const String&, const String&, const String&, Kind);
+ static Ref<MediaDeviceInfo> create(const String& label, const String& deviceId, const String& groupId, Kind);
const String& label() const { return m_label; }
const String& deviceId() const { return m_deviceId; }
@@ -45,7 +44,7 @@
Kind kind() const { return m_kind; }
private:
- MediaDeviceInfo(ScriptExecutionContext*, const String&, const String&, const String&, Kind);
+ MediaDeviceInfo(const String& label, const String& deviceId, const String& groupId, Kind);
const String m_label;
const String m_deviceId;
@@ -53,8 +52,6 @@
const Kind m_kind;
};
-typedef Vector<RefPtr<MediaDeviceInfo>> MediaDeviceInfoVector;
-
}
#endif
Modified: trunk/Source/WebCore/Modules/mediastream/MediaDeviceInfo.idl (218529 => 218530)
--- trunk/Source/WebCore/Modules/mediastream/MediaDeviceInfo.idl 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDeviceInfo.idl 2017-06-20 04:18:47 UTC (rev 218530)
@@ -1,5 +1,5 @@
/*
-* Copyright (C) 2015 Apple Inc. All rights reserved.
+* Copyright (C) 2015-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -25,6 +25,7 @@
[
Conditional=MEDIA_STREAM,
+ ImplementationLacksVTable,
JSGenerateToJSObject,
] interface MediaDeviceInfo {
readonly attribute DOMString deviceId;
Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp (218529 => 218530)
--- trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp 2017-06-20 04:18:47 UTC (rev 218530)
@@ -37,7 +37,7 @@
#include "Document.h"
#include "Event.h"
#include "EventNames.h"
-#include "MediaDevicesRequest.h"
+#include "MediaDevicesEnumerationRequest.h"
#include "MediaTrackSupportedConstraints.h"
#include "UserMediaRequest.h"
#include <wtf/RandomNumber.h>
@@ -109,7 +109,7 @@
auto* document = this->document();
if (!document)
return;
- MediaDevicesRequest::create(*document, WTFMove(promise))->start();
+ MediaDevicesEnumerationRequest::start(*document, WTFMove(promise));
}
MediaTrackSupportedConstraints MediaDevices::getSupportedConstraints()
Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevicesEnumerationRequest.cpp (218529 => 218530)
--- trunk/Source/WebCore/Modules/mediastream/MediaDevicesEnumerationRequest.cpp 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevicesEnumerationRequest.cpp 2017-06-20 04:18:47 UTC (rev 218530)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -29,77 +29,143 @@
#if ENABLE(MEDIA_STREAM)
-#include "CaptureDevice.h"
#include "Document.h"
-#include "MainFrame.h"
-#include "SecurityOrigin.h"
+#include "JSMediaDeviceInfo.h"
+#include "RealtimeMediaSourceCenter.h"
#include "UserMediaController.h"
+#if PLATFORM(COCOA)
+#define REMOVE_ATYPICAL_DEVICES 1
+#else
+#define REMOVE_ATYPICAL_DEVICES 0
+#endif
+
+#if PLATFORM(COCOA)
+const int typicalMicrophoneCount = 1;
+#endif
+
+#if PLATFORM(IOS)
+const int typicalCameraCount = 2;
+#endif
+
+#if PLATFORM(MAC)
+const int typicalCameraCount = 1;
+#endif
+
namespace WebCore {
-Ref<MediaDevicesEnumerationRequest> MediaDevicesEnumerationRequest::create(Document& document, CompletionHandler&& completionHandler)
+inline MediaDevicesEnumerationRequest::MediaDevicesEnumerationRequest(Document& document, Promise&& promise)
+ : ContextDestructionObserver(&document)
+ , m_promise(WTFMove(promise))
{
- return adoptRef(*new MediaDevicesEnumerationRequest(document, WTFMove(completionHandler)));
}
-MediaDevicesEnumerationRequest::MediaDevicesEnumerationRequest(ScriptExecutionContext& context, CompletionHandler&& completionHandler)
- : ContextDestructionObserver(&context)
- , m_completionHandler(WTFMove(completionHandler))
+void MediaDevicesEnumerationRequest::start(Document& document, Promise&& promise)
{
+ auto* page = document.page();
+ if (!page) {
+ // FIXME: Should we resolve or reject the promise here instead of leaving the website waiting?
+ return;
+ }
+
+ UserMediaController::from(*page).enumerateMediaDevices(adoptRef(*new MediaDevicesEnumerationRequest(document, WTFMove(promise))));
}
MediaDevicesEnumerationRequest::~MediaDevicesEnumerationRequest()
{
+ // We will get here with m_isActive true if the client drops the request without ever calling setDeviceInfo.
+ // FIXME: Should we resolve or reject the promise in that case instead of leaving the website waiting?
}
-SecurityOrigin* MediaDevicesEnumerationRequest::userMediaDocumentOrigin() const
+Document* MediaDevicesEnumerationRequest::document()
{
- if (!scriptExecutionContext())
- return nullptr;
+ return m_promise ? downcast<Document>(scriptExecutionContext()) : nullptr;
+}
- return scriptExecutionContext()->securityOrigin();
+Frame* MediaDevicesEnumerationRequest::frame()
+{
+ auto* document = this->document();
+ return document ? document->frame() : nullptr;
}
-SecurityOrigin* MediaDevicesEnumerationRequest::topLevelDocumentOrigin() const
+SecurityOrigin* MediaDevicesEnumerationRequest::userMediaDocumentOrigin()
{
- if (!scriptExecutionContext())
- return nullptr;
+ auto* document = this->document();
+ return document ? &document->securityOrigin() : nullptr;
+}
- return &scriptExecutionContext()->topOrigin();
+SecurityOrigin* MediaDevicesEnumerationRequest::topLevelDocumentOrigin()
+{
+ auto* document = this->document();
+ return document ? &document->topOrigin() : nullptr;
}
void MediaDevicesEnumerationRequest::contextDestroyed()
{
- // Calling cancel() may destroy ourselves.
- Ref<MediaDevicesEnumerationRequest> protectedThis(*this);
+ // FIXME: Should we be calling UserMediaController::cancelMediaDevicesEnumerationRequest here?
+ // If not, then why does that function exist? If we decide that we want to call that cancel
+ // function here, then there may be a problem, because it's hard to get from the document to
+ // the page to the user media controller while the document is being destroyed.
- cancel();
+ m_promise = std::nullopt;
ContextDestructionObserver::contextDestroyed();
}
-void MediaDevicesEnumerationRequest::start()
+#if REMOVE_ATYPICAL_DEVICES
+
+// To reduce the value of media devices for fingerprinting, filter devices that go beyond the typical number.
+static inline void removeAtypicalDevices(Vector<RefPtr<MediaDeviceInfo>>& devices)
{
- ASSERT(scriptExecutionContext());
+ int cameraCount = 0;
+ int microphoneCount = 0;
+ devices.removeAllMatching([&cameraCount, µphoneCount] (const RefPtr<MediaDeviceInfo>& device) {
+ if (device->kind() == MediaDeviceInfo::Kind::Videoinput && ++cameraCount > typicalCameraCount)
+ return true;
+ if (device->kind() == MediaDeviceInfo::Kind::Audioinput && ++microphoneCount > typicalMicrophoneCount)
+ return true;
+ return false;
+ });
+}
- auto& document = downcast<Document>(*scriptExecutionContext());
- auto* controller = UserMediaController::from(document.page());
- if (!controller)
+#endif
+
+void MediaDevicesEnumerationRequest::setDeviceInfo(const Vector<CaptureDevice>& captureDevices, const String& deviceIdentifierHashSalt, bool originHasPersistentAccess)
+{
+ if (!m_promise)
return;
+ auto promise = WTFMove(m_promise.value());
+ ASSERT(!m_promise);
- Ref<MediaDevicesEnumerationRequest> protectedThis(*this);
- controller->enumerateMediaDevices(*this);
-}
+ auto& document = downcast<Document>(*scriptExecutionContext());
-void MediaDevicesEnumerationRequest::cancel()
-{
- m_completionHandler = nullptr;
-}
+ // Policy about including some of the more sensitive information about capture devices.
+ bool includeLabels = originHasPersistentAccess || document.hasHadActiveMediaStreamTrack();
+#if REMOVE_ATYPICAL_DEVICES
+ bool includeAtypicalDevices = includeLabels;
+#endif
-void MediaDevicesEnumerationRequest::setDeviceInfo(const Vector<CaptureDevice>& deviceList, const String& deviceIdentifierHashSalt, bool originHasPersistentAccess)
-{
- if (m_completionHandler)
- m_completionHandler(deviceList, deviceIdentifierHashSalt, originHasPersistentAccess);
- m_completionHandler = nullptr;
+ Vector<RefPtr<MediaDeviceInfo>> devices;
+
+ document.setDeviceIDHashSalt(deviceIdentifierHashSalt);
+
+ for (auto& captureDevice : captureDevices) {
+ auto id = RealtimeMediaSourceCenter::singleton().hashStringWithSalt(captureDevice.persistentId(), deviceIdentifierHashSalt);
+ if (id.isEmpty())
+ continue;
+
+ auto label = includeLabels ? captureDevice.label() : emptyString();
+ auto groupId = RealtimeMediaSourceCenter::singleton().hashStringWithSalt(captureDevice.groupId(), deviceIdentifierHashSalt);
+ auto deviceType = captureDevice.type() == CaptureDevice::DeviceType::Audio ? MediaDeviceInfo::Kind::Audioinput : MediaDeviceInfo::Kind::Videoinput;
+
+ devices.append(MediaDeviceInfo::create(label, id, groupId, deviceType));
+ }
+
+#if REMOVE_ATYPICAL_DEVICES
+ if (!includeAtypicalDevices)
+ removeAtypicalDevices(devices);
+#endif
+
+ promise.resolve(devices);
}
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevicesEnumerationRequest.h (218529 => 218530)
--- trunk/Source/WebCore/Modules/mediastream/MediaDevicesEnumerationRequest.h 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevicesEnumerationRequest.h 2017-06-20 04:18:47 UTC (rev 218530)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -28,41 +28,34 @@
#if ENABLE(MEDIA_STREAM)
-#include "ActiveDOMObject.h"
-#include <wtf/Function.h>
-#include <wtf/text/WTFString.h>
+#include "JSDOMPromiseDeferred.h"
namespace WebCore {
class CaptureDevice;
-class Document;
+class Frame;
+class MediaDeviceInfo;
class SecurityOrigin;
-class MediaDevicesEnumerationRequest final : public ContextDestructionObserver, public RefCounted<MediaDevicesEnumerationRequest> {
+class MediaDevicesEnumerationRequest final : public RefCounted<MediaDevicesEnumerationRequest>, private ContextDestructionObserver {
public:
- using CompletionHandler = WTF::Function<void(const Vector<CaptureDevice>&, const String& deviceIdentifierHashSalt, bool originHasPersistentAccess)>;
+ using Promise = DOMPromiseDeferred<IDLSequence<IDLInterface<MediaDeviceInfo>>>;
+ static void start(Document&, Promise&&);
- static Ref<MediaDevicesEnumerationRequest> create(Document&, CompletionHandler&&);
-
virtual ~MediaDevicesEnumerationRequest();
- void start();
- void cancel();
-
- bool wasCanceled() const { return !m_completionHandler; }
-
WEBCORE_EXPORT void setDeviceInfo(const Vector<CaptureDevice>&, const String& deviceIdentifierHashSalt, bool originHasPersistentAccess);
- WEBCORE_EXPORT SecurityOrigin* userMediaDocumentOrigin() const;
- WEBCORE_EXPORT SecurityOrigin* topLevelDocumentOrigin() const;
+ WEBCORE_EXPORT Frame* frame();
+ WEBCORE_EXPORT SecurityOrigin* userMediaDocumentOrigin();
+ WEBCORE_EXPORT SecurityOrigin* topLevelDocumentOrigin();
private:
- MediaDevicesEnumerationRequest(ScriptExecutionContext&, CompletionHandler&&);
-
- // ContextDestructionObserver
+ MediaDevicesEnumerationRequest(Document&, Promise&&);
+ Document* document();
void contextDestroyed() final;
- CompletionHandler m_completionHandler;
+ std::optional<Promise> m_promise;
};
} // namespace WebCore
Deleted: trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp (218529 => 218530)
--- trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp 2017-06-20 04:18:47 UTC (rev 218530)
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#include "config.h"
-#include "MediaDevicesRequest.h"
-
-#if ENABLE(MEDIA_STREAM)
-
-#include "CaptureDevice.h"
-#include "Document.h"
-#include "Frame.h"
-#include "JSMediaDeviceInfo.h"
-#include "MediaDevicesEnumerationRequest.h"
-#include "RealtimeMediaSourceCenter.h"
-#include "SecurityOrigin.h"
-#include "UserMediaController.h"
-#include <wtf/MainThread.h>
-#include <wtf/SHA1.h>
-
-namespace WebCore {
-
-inline MediaDevicesRequest::MediaDevicesRequest(Document& document, MediaDevices::EnumerateDevicesPromise&& promise)
- : ContextDestructionObserver(&document)
- , m_promise(WTFMove(promise))
-{
-}
-
-Ref<MediaDevicesRequest> MediaDevicesRequest::create(Document& document, MediaDevices::EnumerateDevicesPromise&& promise)
-{
- return adoptRef(*new MediaDevicesRequest(document, WTFMove(promise)));
-}
-
-MediaDevicesRequest::~MediaDevicesRequest()
-{
- // This should only get destroyed after the enumeration request has completed or has been canceled.
- ASSERT(!m_enumerationRequest || m_enumerationRequest->wasCanceled());
-}
-
-SecurityOrigin* MediaDevicesRequest::securityOrigin() const
-{
- if (scriptExecutionContext())
- return scriptExecutionContext()->securityOrigin();
-
- return nullptr;
-}
-
-void MediaDevicesRequest::contextDestroyed()
-{
- // The call to m_enumerationRequest->cancel() might delete this.
- auto protectedThis = makeRef(*this);
-
- if (m_enumerationRequest) {
- m_enumerationRequest->cancel();
- m_enumerationRequest = nullptr;
- }
- ContextDestructionObserver::contextDestroyed();
-}
-
-void MediaDevicesRequest::filterDeviceList(Vector<RefPtr<MediaDeviceInfo>>& devices)
-{
-#if !PLATFORM(COCOA)
- UNUSED_PARAM(devices);
-#else
-
-#if PLATFORM(IOS)
- static const int defaultCameraCount = 2;
-#endif
-#if PLATFORM(MAC)
- static const int defaultCameraCount = 1;
-#endif
- static const int defaultMicrophoneCount = 1;
-
- int cameraCount = 0;
- int microphoneCount = 0;
- devices.removeAllMatching([&](const RefPtr<MediaDeviceInfo>& device) -> bool {
- if (device->kind() == MediaDeviceInfo::Kind::Videoinput && ++cameraCount > defaultCameraCount)
- return true;
- if (device->kind() == MediaDeviceInfo::Kind::Audioinput && ++microphoneCount > defaultMicrophoneCount)
- return true;
-
- return false;
- });
-
-#endif
-}
-
-void MediaDevicesRequest::start()
-{
- // This lambda keeps |this| alive until the request completes or is canceled.
- auto completion = [this, protectedThis = makeRef(*this)] (const Vector<CaptureDevice>& captureDevices, const String& deviceIdentifierHashSalt, bool originHasPersistentAccess) mutable {
-
- m_enumerationRequest = nullptr;
-
- if (!scriptExecutionContext())
- return;
-
- Document& document = downcast<Document>(*scriptExecutionContext());
- document.setDeviceIDHashSalt(deviceIdentifierHashSalt);
-
- Vector<RefPtr<MediaDeviceInfo>> devices;
- for (auto& deviceInfo : captureDevices) {
- auto label = emptyString();
- if (originHasPersistentAccess || document.hasHadActiveMediaStreamTrack())
- label = deviceInfo.label();
-
- auto id = RealtimeMediaSourceCenter::singleton().hashStringWithSalt(deviceInfo.persistentId(), deviceIdentifierHashSalt);
- if (id.isEmpty())
- continue;
-
- auto groupId = RealtimeMediaSourceCenter::singleton().hashStringWithSalt(deviceInfo.groupId(), deviceIdentifierHashSalt);
- auto deviceType = deviceInfo.type() == CaptureDevice::DeviceType::Audio ? MediaDeviceInfo::Kind::Audioinput : MediaDeviceInfo::Kind::Videoinput;
- devices.append(MediaDeviceInfo::create(scriptExecutionContext(), label, id, groupId, deviceType));
- }
-
- if (!originHasPersistentAccess && !document.hasHadActiveMediaStreamTrack())
- filterDeviceList(devices);
-
- callOnMainThread([protectedThis = makeRef(*this), devices = WTFMove(devices)]() mutable {
- protectedThis->m_promise.resolve(devices);
- });
- };
-
- m_enumerationRequest = MediaDevicesEnumerationRequest::create(*downcast<Document>(scriptExecutionContext()), WTFMove(completion));
- m_enumerationRequest->start();
-}
-
-} // namespace WebCore
-
-#endif // ENABLE(MEDIA_STREAM)
Deleted: trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.h (218529 => 218530)
--- trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.h 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.h 2017-06-20 04:18:47 UTC (rev 218530)
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#pragma once
-
-#if ENABLE(MEDIA_STREAM)
-
-#include "MediaDevices.h"
-
-namespace WebCore {
-
-class Document;
-class MediaDevicesEnumerationRequest;
-class SecurityOrigin;
-
-class MediaDevicesRequest : public RefCounted<MediaDevicesRequest>, private ContextDestructionObserver {
-public:
- static Ref<MediaDevicesRequest> create(Document&, MediaDevices::EnumerateDevicesPromise&&);
-
- virtual ~MediaDevicesRequest();
-
- void start();
-
- SecurityOrigin* securityOrigin() const;
-
-private:
- MediaDevicesRequest(Document&, MediaDevices::EnumerateDevicesPromise&&);
-
- void contextDestroyed() final;
-
- void filterDeviceList(Vector<RefPtr<MediaDeviceInfo>>&);
-
- MediaDevices::EnumerateDevicesPromise m_promise;
- RefPtr<MediaDevicesRequest> m_protector;
- RefPtr<MediaDevicesEnumerationRequest> m_enumerationRequest;
-};
-
-} // namespace WebCore
-
-#endif // ENABLE(MEDIA_STREAM)
Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaController.cpp (218529 => 218530)
--- trunk/Source/WebCore/Modules/mediastream/UserMediaController.cpp 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaController.cpp 2017-06-20 04:18:47 UTC (rev 218530)
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -36,7 +37,7 @@
return "UserMediaController";
}
-UserMediaController::UserMediaController(UserMediaClient* client)
+inline UserMediaController::UserMediaController(UserMediaClient& client)
: m_client(client)
{
}
@@ -43,12 +44,12 @@
UserMediaController::~UserMediaController()
{
- m_client->pageDestroyed();
+ m_client.pageDestroyed();
}
void provideUserMediaTo(Page* page, UserMediaClient* client)
{
- UserMediaController::provideTo(page, UserMediaController::supplementName(), std::make_unique<UserMediaController>(client));
+ UserMediaController::provideTo(page, UserMediaController::supplementName(), std::make_unique<UserMediaController>(*client));
}
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaController.h (218529 => 218530)
--- trunk/Source/WebCore/Modules/mediastream/UserMediaController.h 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaController.h 2017-06-20 04:18:47 UTC (rev 218530)
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -36,11 +36,9 @@
class UserMediaController : public Supplement<Page> {
public:
- explicit UserMediaController(UserMediaClient*);
+ explicit UserMediaController(UserMediaClient&);
~UserMediaController();
- UserMediaClient* client() const { return m_client; }
-
void requestUserMediaAccess(UserMediaRequest&);
void cancelUserMediaAccessRequest(UserMediaRequest&);
@@ -48,30 +46,30 @@
void cancelMediaDevicesEnumerationRequest(MediaDevicesEnumerationRequest&);
WEBCORE_EXPORT static const char* supplementName();
- static UserMediaController* from(Page* page) { return static_cast<UserMediaController*>(Supplement<Page>::from(page, supplementName())); }
+ static UserMediaController& from(Page& page) { return *static_cast<UserMediaController*>(Supplement<Page>::from(&page, supplementName())); }
private:
- UserMediaClient* m_client;
+ UserMediaClient& m_client;
};
inline void UserMediaController::requestUserMediaAccess(UserMediaRequest& request)
{
- m_client->requestUserMediaAccess(request);
+ m_client.requestUserMediaAccess(request);
}
inline void UserMediaController::cancelUserMediaAccessRequest(UserMediaRequest& request)
{
- m_client->cancelUserMediaAccessRequest(request);
+ m_client.cancelUserMediaAccessRequest(request);
}
inline void UserMediaController::enumerateMediaDevices(MediaDevicesEnumerationRequest& request)
{
- m_client->enumerateMediaDevices(request);
+ m_client.enumerateMediaDevices(request);
}
inline void UserMediaController::cancelMediaDevicesEnumerationRequest(MediaDevicesEnumerationRequest& request)
{
- m_client->cancelMediaDevicesEnumerationRequest(request);
+ m_client.cancelMediaDevicesEnumerationRequest(request);
}
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (218529 => 218530)
--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp 2017-06-20 04:18:47 UTC (rev 218530)
@@ -52,8 +52,8 @@
ExceptionOr<void> UserMediaRequest::start(Document& document, MediaConstraints&& audioConstraints, MediaConstraints&& videoConstraints, DOMPromiseDeferred<IDLInterface<MediaStream>>&& promise)
{
- auto* userMedia = UserMediaController::from(document.page());
- if (!userMedia)
+ auto* page = document.page();
+ if (!page)
return Exception { NOT_SUPPORTED_ERR }; // FIXME: Why is it better to return an exception here instead of rejecting the promise as we do just below?
if (!audioConstraints.isValid && !videoConstraints.isValid) {
@@ -61,7 +61,7 @@
return { };
}
- adoptRef(*new UserMediaRequest(document, *userMedia, WTFMove(audioConstraints), WTFMove(videoConstraints), WTFMove(promise)))->start();
+ adoptRef(*new UserMediaRequest(document, UserMediaController::from(*page), WTFMove(audioConstraints), WTFMove(videoConstraints), WTFMove(promise)))->start();
return { };
}
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (218529 => 218530)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2017-06-20 04:18:47 UTC (rev 218530)
@@ -140,8 +140,6 @@
073794FA19F5864E00E5A045 /* RTCDataChannelHandlerMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 073794F419F5864E00E5A045 /* RTCDataChannelHandlerMock.h */; };
073794FD19F5864E00E5A045 /* RTCNotifiersMock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 073794F719F5864E00E5A045 /* RTCNotifiersMock.cpp */; };
073794FE19F5864E00E5A045 /* RTCNotifiersMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 073794F819F5864E00E5A045 /* RTCNotifiersMock.h */; };
- 07394EC81BAB2CCD00BE99CD /* MediaDevicesRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07394EC71BAB2CCD00BE99CD /* MediaDevicesRequest.cpp */; };
- 07394ECA1BAB2CD700BE99CD /* MediaDevicesRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 07394EC91BAB2CD700BE99CD /* MediaDevicesRequest.h */; settings = {ATTRIBUTES = (Private, ); }; };
073B87661E4385AC0071C0EC /* AudioSampleBufferList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 073B87621E43859D0071C0EC /* AudioSampleBufferList.cpp */; };
073B87671E4385AC0071C0EC /* AudioSampleBufferList.h in Headers */ = {isa = PBXBuildFile; fileRef = 073B87631E43859D0071C0EC /* AudioSampleBufferList.h */; };
073B87681E4385AC0071C0EC /* AudioSampleDataSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 073B87641E43859D0071C0EC /* AudioSampleDataSource.mm */; };
@@ -7599,8 +7597,6 @@
073794F419F5864E00E5A045 /* RTCDataChannelHandlerMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCDataChannelHandlerMock.h; sourceTree = "<group>"; };
073794F719F5864E00E5A045 /* RTCNotifiersMock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RTCNotifiersMock.cpp; sourceTree = "<group>"; };
073794F819F5864E00E5A045 /* RTCNotifiersMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCNotifiersMock.h; sourceTree = "<group>"; };
- 07394EC71BAB2CCD00BE99CD /* MediaDevicesRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaDevicesRequest.cpp; sourceTree = "<group>"; };
- 07394EC91BAB2CD700BE99CD /* MediaDevicesRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaDevicesRequest.h; sourceTree = "<group>"; };
073B87561E40DCE50071C0EC /* AudioStreamDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioStreamDescription.h; sourceTree = "<group>"; };
073B87571E40DCFD0071C0EC /* CAAudioStreamDescription.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CAAudioStreamDescription.cpp; sourceTree = "<group>"; };
073B87581E40DCFD0071C0EC /* CAAudioStreamDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAAudioStreamDescription.h; sourceTree = "<group>"; };
@@ -16132,8 +16128,6 @@
5EA725CF1ACABCD900EAD17B /* MediaDevices.idl */,
07ABEF6B1D8A1C5800F21972 /* MediaDevicesEnumerationRequest.cpp */,
07ABEF6D1D8A1C7600F21972 /* MediaDevicesEnumerationRequest.h */,
- 07394EC71BAB2CCD00BE99CD /* MediaDevicesRequest.cpp */,
- 07394EC91BAB2CD700BE99CD /* MediaDevicesRequest.h */,
5E16A2E21BFA64FB0029A21E /* MediaEndpointPeerConnection.cpp */,
5E16A2E31BFA64FB0029A21E /* MediaEndpointPeerConnection.h */,
5E4EAB021D07164C0006A184 /* MediaEndpointSessionDescription.cpp */,
@@ -28709,7 +28703,6 @@
15145B901B3A1CE000662BF7 /* MediaDeviceInfo.h in Headers */,
5EA725D31ACABD4700EAD17B /* MediaDevices.h in Headers */,
07ABEF6E1D8A1C7600F21972 /* MediaDevicesEnumerationRequest.h in Headers */,
- 07394ECA1BAB2CD700BE99CD /* MediaDevicesRequest.h in Headers */,
97205AB81239291000B17380 /* MediaDocument.h in Headers */,
FD6F252D13F5EF0E0065165F /* MediaElementAudioSourceNode.h in Headers */,
07FE99DD18807A7D00256648 /* MediaElementSession.h in Headers */,
@@ -32748,7 +32741,6 @@
159AE82B1B3A402F0037478B /* MediaDeviceInfo.cpp in Sources */,
5EA725D21ACABD4700EAD17B /* MediaDevices.cpp in Sources */,
07ABEF6C1D8A1C5800F21972 /* MediaDevicesEnumerationRequest.cpp in Sources */,
- 07394EC81BAB2CCD00BE99CD /* MediaDevicesRequest.cpp in Sources */,
97205AB71239291000B17380 /* MediaDocument.cpp in Sources */,
FD6F252C13F5EF0E0065165F /* MediaElementAudioSourceNode.cpp in Sources */,
07FE99DC18807A7D00256648 /* MediaElementSession.cpp in Sources */,
Modified: trunk/Source/WebCore/testing/Internals.cpp (218529 => 218530)
--- trunk/Source/WebCore/testing/Internals.cpp 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebCore/testing/Internals.cpp 2017-06-20 04:18:47 UTC (rev 218530)
@@ -137,12 +137,8 @@
#include "TreeScope.h"
#include "TypeConversions.h"
#include "UserGestureIndicator.h"
-#include "UserMediaController.h"
#include "ViewportArguments.h"
#include "WebCoreJSClientData.h"
-#if ENABLE(WEBGL)
-#include "WebGLRenderingContext.h"
-#endif
#include "WorkerThread.h"
#include "WritingDirection.h"
#include "XMLHttpRequest.h"
@@ -189,6 +185,10 @@
#include "TimeRanges.h"
#endif
+#if ENABLE(WEBGL)
+#include "WebGLRenderingContext.h"
+#endif
+
#if ENABLE(SPEECH_SYNTHESIS)
#include "DOMWindowSpeechSynthesis.h"
#include "PlatformSpeechSynthesizerMock.h"
Modified: trunk/Source/WebKit2/ChangeLog (218529 => 218530)
--- trunk/Source/WebKit2/ChangeLog 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebKit2/ChangeLog 2017-06-20 04:18:47 UTC (rev 218530)
@@ -1,3 +1,17 @@
+2017-06-19 Darin Adler <da...@apple.com>
+
+ Merge MediaDevicesRequest and MediaDevicesEnumerationRequest to tighten up code and object lifetime
+ https://bugs.webkit.org/show_bug.cgi?id=173527
+
+ Reviewed by Sam Weinig.
+
+ * UIProcess/API/C/WKUserMediaPermissionCheck.h: Fixed incorrect file name in comment.
+
+ * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp:
+ (WebKit::UserMediaPermissionRequestManager::enumerateMediaDevices): Use the new frame
+ function from MediaDevicesEnumerationRequest rather than finding the frame with our
+ own code.
+
2017-06-19 Chris Dumez <cdu...@apple.com>
Regression(r217570): com.apple.WebKit.Networking crash at com.apple.WebKit: WebKit::ChildProcess::didReceiveInvalidMessage (Breaks 32-bit apps)
@@ -167,6 +181,8 @@
* WebProcess/cocoa/UserMediaCaptureManager.cpp:
(WebKit::UserMediaCaptureManager::Source::setStorage):
+ * WebProcess/WebCoreSupport/WebUserMediaClient.cpp: Removed unneeded include of UserMediaController.h.
+
2017-06-19 Carlos Garcia Campos <cgar...@igalia.com>
[GTK] Move GTK+ API files that could be shared to glib dirs
Modified: trunk/Source/WebKit2/UIProcess/API/C/WKUserMediaPermissionCheck.h (218529 => 218530)
--- trunk/Source/WebKit2/UIProcess/API/C/WKUserMediaPermissionCheck.h 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKUserMediaPermissionCheck.h 2017-06-20 04:18:47 UTC (rev 218530)
@@ -41,4 +41,4 @@
}
#endif
-#endif /* WKMediaDevicesRequest_h */
+#endif /* WKUserMediaPermissionCheck_h */
Modified: trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp (218529 => 218530)
--- trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp 2017-06-20 04:18:47 UTC (rev 218530)
@@ -168,9 +168,7 @@
void UserMediaPermissionRequestManager::enumerateMediaDevices(MediaDevicesEnumerationRequest& request)
{
- auto* document = downcast<Document>(request.scriptExecutionContext());
- auto* frame = document ? document->frame() : nullptr;
-
+ auto* frame = request.frame();
if (!frame) {
request.setDeviceInfo(Vector<CaptureDevice>(), emptyString(), false);
return;
Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp (218529 => 218530)
--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp 2017-06-20 03:25:45 UTC (rev 218529)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebUserMediaClient.cpp 2017-06-20 04:18:47 UTC (rev 218530)
@@ -24,7 +24,6 @@
#include "UserMediaPermissionRequestManager.h"
#include "WebPage.h"
-#include <WebCore/UserMediaController.h>
#include <WebCore/UserMediaRequest.h>
using namespace WebCore;