diff options
author | Balazs Engedy <engedy@chromium.org> | 2021-03-31 07:47:19 +0000 |
---|---|---|
committer | Michael BrĂ¼ning <michael.bruning@qt.io> | 2021-04-16 16:28:27 +0000 |
commit | 53a608aff9c39b18cbcaf6cc9784420410fa587f (patch) | |
tree | 9b834ca3f59e2fa0f18a761937026a19fe143aab | |
parent | 6764c29f7c5aaf9ecbe6532f9e2b845604c926a5 (diff) |
[Backport] CVE-2021-21201: Use after free in permissions
Partial backport of patch originally reviewed on
https://chromium-review.googlesource.com/c/chromium/src/+/2791431:
Use IDType for permission change subscriptions.
Bug: 1025683
Change-Id: I3b44ba7833138e8a657a4192e1a36c978695db32
Reviewed-by: Richard Coles <torne@chromium.org>
Reviewed-by: Yuchen Liu <yucliu@chromium.org>
Reviewed-by: Nasko Oskov <nasko@chromium.org>
Reviewed-by: Andrey Kosyakov <caseq@chromium.org>
Reviewed-by: Fabrice de Gans-Riberi <fdegans@chromium.org>
Reviewed-by: Arthur Sonzogni <arthursonzogni@chromium.org>
Reviewed-by: Illia Klimov <elklm@google.com>
Auto-Submit: Balazs Engedy <engedy@chromium.org>
Commit-Queue: Balazs Engedy <engedy@chromium.org>
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
14 files changed, 129 insertions, 67 deletions
diff --git a/chromium/components/permissions/permission_manager.cc b/chromium/components/permissions/permission_manager.cc index d5ed9f78abb..9146f6f2761 100644 --- a/chromium/components/permissions/permission_manager.cc +++ b/chromium/components/permissions/permission_manager.cc @@ -536,14 +536,14 @@ bool PermissionManager::IsPermissionOverridableByDevTools( origin->GetURL()); } -int PermissionManager::SubscribePermissionStatusChange( +PermissionManager::SubscriptionId PermissionManager::SubscribePermissionStatusChange( PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(PermissionStatus)> callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (is_shutting_down_) - return 0; + return SubscriptionId(); if (subscriptions_.IsEmpty()) PermissionsClient::Get() @@ -580,16 +580,20 @@ int PermissionManager::SubscribePermissionStatusChange( subscription->callback = base::BindRepeating(&SubscriptionCallbackWrapper, std::move(callback)); - return subscriptions_.Add(std::move(subscription)); + auto id = subscription_id_generator_.GenerateNextId(); + subscriptions_.AddWithID(std::move(subscription), id); + return id; } -void PermissionManager::UnsubscribePermissionStatusChange(int subscription_id) { +void PermissionManager::UnsubscribePermissionStatusChange( + SubscriptionId subscription_id) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (is_shutting_down_) return; - // Whether |subscription_id| is known will be checked by the Remove() call. - subscriptions_.Remove(subscription_id); + if (subscriptions_.Lookup(subscription_id)) { + subscriptions_.Remove(subscription_id); + } if (subscriptions_.IsEmpty()) { PermissionsClient::Get() diff --git a/chromium/components/permissions/permission_manager.h b/chromium/components/permissions/permission_manager.h index d11fb4b2c4a..03ca801a7ae 100644 --- a/chromium/components/permissions/permission_manager.h +++ b/chromium/components/permissions/permission_manager.h @@ -114,13 +114,13 @@ class PermissionManager : public KeyedService, bool IsPermissionOverridableByDevTools( content::PermissionType permission, const base::Optional<url::Origin>& origin) override; - int SubscribePermissionStatusChange( + SubscriptionId SubscribePermissionStatusChange( content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) override; - void UnsubscribePermissionStatusChange(int subscription_id) override; + void UnsubscribePermissionStatusChange(SubscriptionId subscription_id) override; // TODO(raymes): Rather than exposing this, use the denial reason from // GetPermissionStatus in callers to determine whether a permission is @@ -153,7 +153,8 @@ class PermissionManager : public KeyedService, class PermissionResponseCallback; struct Subscription; - using SubscriptionsMap = base::IDMap<std::unique_ptr<Subscription>>; + using SubscriptionsMap = + base::IDMap<std::unique_ptr<Subscription>, SubscriptionId>; PermissionContextBase* GetPermissionContext(ContentSettingsType type); @@ -186,6 +187,7 @@ class PermissionManager : public KeyedService, content::BrowserContext* browser_context_; PendingRequestsMap pending_requests_; SubscriptionsMap subscriptions_; + SubscriptionId::Generator subscription_id_generator_; PermissionContextMap permission_contexts_; using ContentSettingsTypeOverrides = diff --git a/chromium/content/browser/permissions/permission_controller_impl.cc b/chromium/content/browser/permissions/permission_controller_impl.cc index ddd6656e035..3a6e38178c1 100644 --- a/chromium/content/browser/permissions/permission_controller_impl.cc +++ b/chromium/content/browser/permissions/permission_controller_impl.cc @@ -133,7 +133,8 @@ struct PermissionControllerImpl::Subscription { int render_frame_id = -1; int render_process_id = -1; base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback; - int delegate_subscription_id; + // This is default-initialized to an invalid ID. + PermissionControllerDelegate::SubscriptionId delegate_subscription_id; }; PermissionControllerImpl::~PermissionControllerImpl() { @@ -389,7 +390,8 @@ void PermissionControllerImpl::OnDelegatePermissionStatusChange( subscription->callback.Run(status); } -int PermissionControllerImpl::SubscribePermissionStatusChange( +PermissionControllerImpl::SubscriptionId +PermissionControllerImpl::SubscribePermissionStatusChange( PermissionType permission, RenderFrameHost* render_frame_host, const GURL& requesting_origin, @@ -423,22 +425,22 @@ int PermissionControllerImpl::SubscribePermissionStatusChange( base::BindRepeating( &PermissionControllerImpl::OnDelegatePermissionStatusChange, base::Unretained(this), subscription.get())); - } else { - subscription->delegate_subscription_id = kNoPendingOperation; } - return subscriptions_.Add(std::move(subscription)); + + auto id = subscription_id_generator_.GenerateNextId(); + subscriptions_.AddWithID(std::move(subscription), id); + return id; } void PermissionControllerImpl::UnsubscribePermissionStatusChange( - int subscription_id) { + SubscriptionId subscription_id) { Subscription* subscription = subscriptions_.Lookup(subscription_id); if (!subscription) return; PermissionControllerDelegate* delegate = browser_context_->GetPermissionControllerDelegate(); - if (delegate && - subscription->delegate_subscription_id != kNoPendingOperation) { - delegate->UnsubscribePermissionStatusChange( + if (delegate) { + delegate->UnsubscribePermissionStatusChange( subscription->delegate_subscription_id); } subscriptions_.Remove(subscription_id); diff --git a/chromium/content/browser/permissions/permission_controller_impl.h b/chromium/content/browser/permissions/permission_controller_impl.h index 7ebf3c48a0e..d85788867f7 100644 --- a/chromium/content/browser/permissions/permission_controller_impl.h +++ b/chromium/content/browser/permissions/permission_controller_impl.h @@ -72,18 +72,19 @@ class CONTENT_EXPORT PermissionControllerImpl : public PermissionController { const GURL& requesting_origin, const GURL& embedding_origin); - int SubscribePermissionStatusChange( + SubscriptionId SubscribePermissionStatusChange( PermissionType permission, RenderFrameHost* render_frame_host, const GURL& requesting_origin, const base::RepeatingCallback<void(blink::mojom::PermissionStatus)>& callback); - void UnsubscribePermissionStatusChange(int subscription_id); + void UnsubscribePermissionStatusChange(SubscriptionId subscription_id); private: struct Subscription; - using SubscriptionsMap = base::IDMap<std::unique_ptr<Subscription>>; + using SubscriptionsMap = + base::IDMap<std::unique_ptr<Subscription>, SubscriptionId>; using SubscriptionsStatusMap = base::flat_map<SubscriptionsMap::KeyType, blink::mojom::PermissionStatus>; @@ -98,7 +99,13 @@ class CONTENT_EXPORT PermissionControllerImpl : public PermissionController { const base::Optional<url::Origin>& origin); DevToolsPermissionOverrides devtools_permission_overrides_; + + // Note that SubscriptionId is distinct from + // PermissionControllerDelegate::SubscriptionId, and the concrete ID values + // may be different as well. SubscriptionsMap subscriptions_; + SubscriptionId::Generator subscription_id_generator_; + BrowserContext* browser_context_; DISALLOW_COPY_AND_ASSIGN(PermissionControllerImpl); diff --git a/chromium/content/browser/permissions/permission_service_context.cc b/chromium/content/browser/permissions/permission_service_context.cc index c3ab81294ed..cb409a27cd0 100644 --- a/chromium/content/browser/permissions/permission_service_context.cc +++ b/chromium/content/browser/permissions/permission_service_context.cc @@ -32,7 +32,7 @@ class PermissionServiceContext::PermissionSubscription { PermissionSubscription& operator=(const PermissionSubscription&) = delete; ~PermissionSubscription() { - DCHECK_NE(id_, 0); + DCHECK(id_); BrowserContext* browser_context = context_->GetBrowserContext(); if (browser_context) { PermissionControllerImpl::FromBrowserContext(browser_context) @@ -41,7 +41,7 @@ class PermissionServiceContext::PermissionSubscription { } void OnConnectionError() { - DCHECK_NE(id_, 0); + DCHECK(id_); context_->ObserverHadConnectionError(id_); } @@ -49,12 +49,12 @@ class PermissionServiceContext::PermissionSubscription { observer_->OnPermissionStatusChange(status); } - void set_id(int id) { id_ = id; } + void set_id(PermissionController::SubscriptionId id) { id_ = id; } private: PermissionServiceContext* const context_; mojo::Remote<blink::mojom::PermissionObserver> observer_; - int id_ = 0; + PermissionController::SubscriptionId id_; }; PermissionServiceContext::PermissionServiceContext( @@ -108,7 +108,7 @@ void PermissionServiceContext::CreateSubscription( } GURL requesting_origin(origin.Serialize()); - int subscription_id = + auto subscription_id = PermissionControllerImpl::FromBrowserContext(browser_context) ->SubscribePermissionStatusChange( permission_type, render_frame_host_, requesting_origin, @@ -119,7 +119,8 @@ void PermissionServiceContext::CreateSubscription( subscriptions_[subscription_id] = std::move(subscription); } -void PermissionServiceContext::ObserverHadConnectionError(int subscription_id) { +void PermissionServiceContext::ObserverHadConnectionError( + PermissionController::SubscriptionId subscription_id) { size_t erased = subscriptions_.erase(subscription_id); DCHECK_EQ(1u, erased); } diff --git a/chromium/content/browser/permissions/permission_service_context.h b/chromium/content/browser/permissions/permission_service_context.h index 4f93be504fd..0680c70c8ee 100644 --- a/chromium/content/browser/permissions/permission_service_context.h +++ b/chromium/content/browser/permissions/permission_service_context.h @@ -9,6 +9,7 @@ #include <unordered_map> #include "content/common/content_export.h" +#include "content/public/browser/permission_controller.h" #include "content/public/browser/permission_type.h" #include "content/public/browser/web_contents_observer.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -52,7 +53,8 @@ class CONTENT_EXPORT PermissionServiceContext : public WebContentsObserver { mojo::PendingRemote<blink::mojom::PermissionObserver> observer); // Called when the connection to a PermissionObserver has an error. - void ObserverHadConnectionError(int subscription_id); + void ObserverHadConnectionError( + PermissionController::SubscriptionId subscription_id); // May return nullptr during teardown, or when showing an interstitial. BrowserContext* GetBrowserContext() const; @@ -78,7 +80,8 @@ class CONTENT_EXPORT PermissionServiceContext : public WebContentsObserver { RenderFrameHost* const render_frame_host_; RenderProcessHost* const render_process_host_; mojo::UniqueReceiverSet<blink::mojom::PermissionService> services_; - std::unordered_map<int, std::unique_ptr<PermissionSubscription>> + std::unordered_map<PermissionController::SubscriptionId, + std::unique_ptr<PermissionSubscription>> subscriptions_; }; diff --git a/chromium/content/browser/renderer_host/media/media_stream_manager.cc b/chromium/content/browser/renderer_host/media/media_stream_manager.cc index 884eb393ba0..c627d893110 100644 --- a/chromium/content/browser/renderer_host/media/media_stream_manager.cc +++ b/chromium/content/browser/renderer_host/media/media_stream_manager.cc @@ -668,9 +668,9 @@ class MediaStreamManager::DeviceRequest { std::string tab_capture_device_id; - int audio_subscription_id = PermissionControllerImpl::kNoPendingOperation; + PermissionController::SubscriptionId audio_subscription_id; - int video_subscription_id = PermissionControllerImpl::kNoPendingOperation; + PermissionController::SubscriptionId video_subscription_id; private: std::vector<MediaRequestState> state_; @@ -2686,8 +2686,8 @@ void MediaStreamManager::SubscribeToPermissionControllerOnUIThread( if (!controller) return; - int audio_subscription_id = PermissionControllerImpl::kNoPendingOperation; - int video_subscription_id = PermissionControllerImpl::kNoPendingOperation; + PermissionController::SubscriptionId audio_subscription_id; + PermissionController::SubscriptionId video_subscription_id; if (is_audio_request) { // It is safe to bind base::Unretained(this) because MediaStreamManager is @@ -2729,8 +2729,8 @@ void MediaStreamManager::SetPermissionSubscriptionIDs( const std::string& label, int requesting_process_id, int requesting_frame_id, - int audio_subscription_id, - int video_subscription_id) { + PermissionController::SubscriptionId audio_subscription_id, + PermissionController::SubscriptionId video_subscription_id) { DCHECK_CURRENTLY_ON(BrowserThread::IO); DeviceRequest* const request = FindRequest(label); @@ -2757,8 +2757,8 @@ void MediaStreamManager::SetPermissionSubscriptionIDs( void MediaStreamManager::UnsubscribeFromPermissionControllerOnUIThread( int requesting_process_id, int requesting_frame_id, - int audio_subscription_id, - int video_subscription_id) { + PermissionController::SubscriptionId audio_subscription_id, + PermissionController::SubscriptionId video_subscription_id) { DCHECK_CURRENTLY_ON(BrowserThread::UI); PermissionControllerImpl* controller = diff --git a/chromium/content/browser/renderer_host/media/media_stream_manager.h b/chromium/content/browser/renderer_host/media/media_stream_manager.h index 045e5f5c00d..7898abfbf99 100644 --- a/chromium/content/browser/renderer_host/media/media_stream_manager.h +++ b/chromium/content/browser/renderer_host/media/media_stream_manager.h @@ -50,6 +50,7 @@ #include "content/public/browser/desktop_media_id.h" #include "content/public/browser/media_request_state.h" #include "content/public/browser/media_stream_request.h" +#include "content/public/browser/permission_controller.h" #include "media/base/video_facing.h" #include "third_party/blink/public/common/mediastream/media_devices.h" #include "third_party/blink/public/common/mediastream/media_stream_controls.h" @@ -557,19 +558,20 @@ class CONTENT_EXPORT MediaStreamManager // Store the subscription ids on a DeviceRequest in order to allow // unsubscribing when the request is deleted. - void SetPermissionSubscriptionIDs(const std::string& label, - int requesting_process_id, - int requesting_frame_id, - int audio_subscription_id, - int video_subscription_id); + void SetPermissionSubscriptionIDs( + const std::string& label, + int requesting_process_id, + int requesting_frame_id, + PermissionController::SubscriptionId audio_subscription_id, + PermissionController::SubscriptionId video_subscription_id); // Unsubscribe from following permission updates for the two specified // subscription IDs. Called when a request is deleted. static void UnsubscribeFromPermissionControllerOnUIThread( int requesting_process_id, int requesting_frame_id, - int audio_subscription_id, - int video_subscription_id); + PermissionController::SubscriptionId audio_subscription_id, + PermissionController::SubscriptionId video_subscription_id); // Callback that the PermissionController calls when a permission is updated. void PermissionChangedCallback(int requesting_process_id, diff --git a/chromium/content/public/browser/permission_controller.h b/chromium/content/public/browser/permission_controller.h index b9b42def49b..77fe96a1c33 100644 --- a/chromium/content/public/browser/permission_controller.h +++ b/chromium/content/public/browser/permission_controller.h @@ -6,6 +6,7 @@ #define CONTENT_PUBLIC_BROWSER_PERMISSION_CONTROLLER_H_ #include "base/supports_user_data.h" +#include "base/util/type_safety/id_type.h" #include "content/common/content_export.h" #include "content/public/browser/permission_type.h" #include "third_party/blink/public/mojom/permissions/permission_status.mojom.h" @@ -20,8 +21,13 @@ class RenderFrameHost; class CONTENT_EXPORT PermissionController : public base::SupportsUserData::Data { public: - // Constant retured when registering and subscribing if - // cancelling/unsubscribing at a later stage would have no effect. + // Identifier for an active subscription. This is intentionally a distinct + // type from PermissionControllerDelegate::SubscriptionId as the concrete + // identifier values may be different. + using SubscriptionId = util::IdType64<PermissionController>; + + // Constant returned when requesting a permission if cancelling at a later + // stage would have no effect. static const int kNoPendingOperation = -1; ~PermissionController() override {} @@ -48,4 +54,17 @@ class CONTENT_EXPORT PermissionController } // namespace content +namespace std { + +template <> +struct hash<content::PermissionController::SubscriptionId> { + std::size_t operator()( + const content::PermissionController::SubscriptionId& v) const { + content::PermissionController::SubscriptionId::Hasher hasher; + return hasher(v); + } +}; + +} // namespace std + #endif // CONTENT_PUBLIC_BROWSER_PERMISSION_CONTROLLER_H_ diff --git a/chromium/content/public/browser/permission_controller_delegate.h b/chromium/content/public/browser/permission_controller_delegate.h index e47de2a278e..82a1d4f0efd 100644 --- a/chromium/content/public/browser/permission_controller_delegate.h +++ b/chromium/content/public/browser/permission_controller_delegate.h @@ -5,6 +5,7 @@ #ifndef CONTENT_PUBLIC_BROWSER_PERMISSION_CONTROLLER_DELEGATE_H_ #define CONTENT_PUBLIC_BROWSER_PERMISSION_CONTROLLER_DELEGATE_H_ +#include "base/util/type_safety/id_type.h" #include "content/common/content_export.h" #include "content/public/browser/devtools_permission_overrides.h" #include "third_party/blink/public/mojom/permissions/permission_status.mojom.h" @@ -18,6 +19,10 @@ class RenderFrameHost; class CONTENT_EXPORT PermissionControllerDelegate { public: using PermissionOverrides = DevToolsPermissionOverrides::PermissionOverrides; + + // Identifier for an active subscription. + using SubscriptionId = util::IdType64<PermissionControllerDelegate>; + virtual ~PermissionControllerDelegate() = default; // Requests a permission on behalf of a frame identified by @@ -80,21 +85,21 @@ class CONTENT_EXPORT PermissionControllerDelegate { // Runs the given |callback| whenever the |permission| associated with the // given RenderFrameHost changes. A nullptr should be passed if the request - // is from a worker. Returns the subscription_id to be used to unsubscribe. - // Can be kNoPendingOperation if the subscribe was not successful. - virtual int SubscribePermissionStatusChange( + // is from a worker. Returns the ID to be used to unsubscribe, which can be + // `is_null()` if the subscribe was not successful. + virtual SubscriptionId SubscribePermissionStatusChange( content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) = 0; - // Unregisters from permission status change notifications. - // The |subscription_id| must match the value returned by the - // SubscribePermissionStatusChange call. Unsubscribing - // an already unsubscribed |subscription_id| or providing the - // |subscription_id| kNoPendingOperation is a no-op. - virtual void UnsubscribePermissionStatusChange(int subscription_id) = 0; + // Unregisters from permission status change notifications. The + // |subscription_id| must match the value returned by the + // SubscribePermissionStatusChange call. Unsubscribing an already + // unsubscribed |subscription_id| or an `is_null()` ID is a no-op. + virtual void UnsubscribePermissionStatusChange( + SubscriptionId subscription_id) = 0; // Manually overrides default permission settings of delegate, if overrides // are tracked by the delegate. This method should only be called by the @@ -116,4 +121,17 @@ class CONTENT_EXPORT PermissionControllerDelegate { } // namespace content +namespace std { + +template <> +struct hash<content::PermissionControllerDelegate::SubscriptionId> { + std::size_t operator()( + const content::PermissionControllerDelegate::SubscriptionId& v) const { + content::PermissionControllerDelegate::SubscriptionId::Hasher hasher; + return hasher(v); + } +}; + +} // namespace std + #endif // CONTENT_PUBLIC_BROWSER_PERMISSION_CONTROLLER_DELEGATE_H_ diff --git a/chromium/fuchsia/engine/browser/web_engine_permission_delegate.cc b/chromium/fuchsia/engine/browser/web_engine_permission_delegate.cc index 98592f05b6d..c18b8be7cdf 100644 --- a/chromium/fuchsia/engine/browser/web_engine_permission_delegate.cc +++ b/chromium/fuchsia/engine/browser/web_engine_permission_delegate.cc @@ -83,20 +83,21 @@ WebEnginePermissionDelegate::GetPermissionStatusForFrame( permission, url::Origin::Create(requesting_origin)); } -int WebEnginePermissionDelegate::SubscribePermissionStatusChange( +WebEnginePermissionDelegate::SubscriptionId +WebEnginePermissionDelegate::SubscribePermissionStatusChange( content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) { // TODO(crbug.com/1063094): Implement permission status subscription. It's // used in blink to emit PermissionStatus.onchange notifications. - NOTIMPLEMENTED() << ": " << static_cast<int>(permission); - return content::PermissionController::kNoPendingOperation; + NOTIMPLEMENTED_LOG_ONCE() << ": " << static_cast<int>(permission); + return SubscriptionId(); } void WebEnginePermissionDelegate::UnsubscribePermissionStatusChange( - int subscription_id) { + SubscriptionId subscription_id) { // TODO(crbug.com/1063094): Implement permission status subscription. It's // used in blink to emit PermissionStatus.onchange notifications. - NOTREACHED(); + NOTIMPLEMENTED_LOG_ONCE(); } diff --git a/chromium/fuchsia/engine/browser/web_engine_permission_delegate.h b/chromium/fuchsia/engine/browser/web_engine_permission_delegate.h index 036207b75d3..c39989b471c 100644 --- a/chromium/fuchsia/engine/browser/web_engine_permission_delegate.h +++ b/chromium/fuchsia/engine/browser/web_engine_permission_delegate.h @@ -45,13 +45,14 @@ class WebEnginePermissionDelegate content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin) override; - int SubscribePermissionStatusChange( + SubscriptionId SubscribePermissionStatusChange( content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) override; - void UnsubscribePermissionStatusChange(int subscription_id) override; + void UnsubscribePermissionStatusChange( + SubscriptionId subscription_id) override; }; #endif // FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_PERMISSION_DELEGATE_H_ diff --git a/chromium/headless/lib/browser/headless_permission_manager.cc b/chromium/headless/lib/browser/headless_permission_manager.cc index 5d4d609fc0c..359ecdc4b72 100644 --- a/chromium/headless/lib/browser/headless_permission_manager.cc +++ b/chromium/headless/lib/browser/headless_permission_manager.cc @@ -71,15 +71,16 @@ HeadlessPermissionManager::GetPermissionStatusForFrame( return blink::mojom::PermissionStatus::ASK; } -int HeadlessPermissionManager::SubscribePermissionStatusChange( +HeadlessPermissionManager::SubscriptionId +HeadlessPermissionManager::SubscribePermissionStatusChange( content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) { - return content::PermissionController::kNoPendingOperation; + return SubscriptionId(); } void HeadlessPermissionManager::UnsubscribePermissionStatusChange( - int subscription_id) {} + SubscriptionId subscription_id) {} } // namespace headless diff --git a/chromium/headless/lib/browser/headless_permission_manager.h b/chromium/headless/lib/browser/headless_permission_manager.h index 4b83309ab3a..ac30670cb38 100644 --- a/chromium/headless/lib/browser/headless_permission_manager.h +++ b/chromium/headless/lib/browser/headless_permission_manager.h @@ -46,13 +46,14 @@ class HeadlessPermissionManager : public content::PermissionControllerDelegate { content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin) override; - int SubscribePermissionStatusChange( + SubscriptionId SubscribePermissionStatusChange( content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) override; - void UnsubscribePermissionStatusChange(int subscription_id) override; + void UnsubscribePermissionStatusChange( + SubscriptionId subscription_id) override; private: content::BrowserContext* browser_context_; |