diff --git a/android_webview/browser/aw_permission_manager.cc b/android_webview/browser/aw_permission_manager.cc index f1f222ef22b5ed..249176a10563f6 100644 --- a/android_webview/browser/aw_permission_manager.cc +++ b/android_webview/browser/aw_permission_manager.cc @@ -448,8 +448,8 @@ PermissionStatus AwPermissionManager::GetPermissionStatusForFrame( int AwPermissionManager::SubscribePermissionStatusChange( PermissionType permission, + content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) { return content::PermissionController::kNoPendingOperation; } diff --git a/android_webview/browser/aw_permission_manager.h b/android_webview/browser/aw_permission_manager.h index 06c94e783e3b66..d6ab44abcab030 100644 --- a/android_webview/browser/aw_permission_manager.h +++ b/android_webview/browser/aw_permission_manager.h @@ -52,8 +52,8 @@ class AwPermissionManager : public content::PermissionControllerDelegate { const GURL& requesting_origin) override; int SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) override; void UnsubscribePermissionStatusChange(int subscription_id) override; diff --git a/chrome/browser/permissions/permission_manager.cc b/chrome/browser/permissions/permission_manager.cc index c3e0e0bfecc85e..042b3e159aa5f7 100644 --- a/chrome/browser/permissions/permission_manager.cc +++ b/chrome/browser/permissions/permission_manager.cc @@ -253,7 +253,8 @@ class PermissionManager::PermissionResponseCallback { struct PermissionManager::Subscription { ContentSettingsType permission; GURL requesting_origin; - GURL embedding_origin; + int render_frame_id = -1; + int render_process_id = -1; base::Callback callback; ContentSetting current_value; }; @@ -537,9 +538,7 @@ PermissionStatus PermissionManager::GetPermissionStatusForFrame( GURL embedding_origin = web_contents->GetLastCommittedURL().GetOrigin(); result = context->UpdatePermissionStatusWithDeviceStatus( result, GetCanonicalOrigin(requesting_origin, embedding_origin), - content::WebContents::FromRenderFrameHost(render_frame_host) - ->GetLastCommittedURL() - .GetOrigin()); + embedding_origin); } return ContentSettingToPermissionStatus(result.content_setting); @@ -547,8 +546,8 @@ PermissionStatus PermissionManager::GetPermissionStatusForFrame( int PermissionManager::SubscribePermissionStatusChange( PermissionType permission, + content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (subscriptions_.IsEmpty()) @@ -556,16 +555,33 @@ int PermissionManager::SubscribePermissionStatusChange( ContentSettingsType content_type = PermissionTypeToContentSetting(permission); auto subscription = std::make_unique(); + + // The RFH may be null if the request is for a worker. + GURL embedding_origin; + if (render_frame_host) { + content::WebContents* web_contents = + content::WebContents::FromRenderFrameHost(render_frame_host); + embedding_origin = web_contents->GetLastCommittedURL().GetOrigin(); + subscription->render_frame_id = render_frame_host->GetRoutingID(); + subscription->render_process_id = render_frame_host->GetProcess()->GetID(); + subscription->current_value = + GetPermissionStatusForFrame(content_type, render_frame_host, + requesting_origin) + .content_setting; + } else { + embedding_origin = requesting_origin; + subscription->render_frame_id = -1; + subscription->render_process_id = -1; + subscription->current_value = + GetPermissionStatus(content_type, requesting_origin, requesting_origin) + .content_setting; + } + subscription->permission = content_type; subscription->requesting_origin = GetCanonicalOrigin(requesting_origin, embedding_origin); - subscription->embedding_origin = embedding_origin; subscription->callback = base::Bind(&SubscriptionCallbackWrapper, callback); - subscription->current_value = - GetPermissionStatus(content_type, requesting_origin, embedding_origin) - .content_setting; - return subscriptions_.Add(std::move(subscription)); } @@ -599,18 +615,37 @@ void PermissionManager::OnContentSettingChanged( if (subscription->permission != content_type) continue; + // The RFH may be null if the request is for a worker. + content::RenderFrameHost* rfh = content::RenderFrameHost::FromID( + subscription->render_process_id, subscription->render_frame_id); + GURL embedding_origin; + if (rfh) { + content::WebContents* web_contents = + content::WebContents::FromRenderFrameHost(rfh); + embedding_origin = web_contents->GetLastCommittedURL().GetOrigin(); + } else { + embedding_origin = subscription->requesting_origin; + } + if (primary_pattern.IsValid() && !primary_pattern.Matches(subscription->requesting_origin)) continue; if (secondary_pattern.IsValid() && - !secondary_pattern.Matches(subscription->embedding_origin)) + !secondary_pattern.Matches(embedding_origin)) continue; - ContentSetting new_value = - GetPermissionStatus(subscription->permission, - subscription->requesting_origin, - subscription->embedding_origin) - .content_setting; + ContentSetting new_value; + if (rfh) { + new_value = GetPermissionStatusForFrame(subscription->permission, rfh, + subscription->requesting_origin) + .content_setting; + } else { + new_value = GetPermissionStatus(subscription->permission, + subscription->requesting_origin, + subscription->requesting_origin) + .content_setting; + } + if (subscription->current_value == new_value) continue; diff --git a/chrome/browser/permissions/permission_manager.h b/chrome/browser/permissions/permission_manager.h index beb9cae183d54a..223f67e98f95ce 100644 --- a/chrome/browser/permissions/permission_manager.h +++ b/chrome/browser/permissions/permission_manager.h @@ -108,8 +108,8 @@ class PermissionManager : public KeyedService, const GURL& requesting_origin) override; int SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) override; void UnsubscribePermissionStatusChange(int subscription_id) override; diff --git a/chrome/browser/permissions/permission_manager_unittest.cc b/chrome/browser/permissions/permission_manager_unittest.cc index 6cfbd058211fa5..8832ac64886f1d 100644 --- a/chrome/browser/permissions/permission_manager_unittest.cc +++ b/chrome/browser/permissions/permission_manager_unittest.cc @@ -140,6 +140,7 @@ class PermissionManagerTest : public ChromeRenderViewHostTestHarness { true /* has_android_location_permission */, true /* is_system_location_setting_enabled */); #endif + NavigateAndCommit(url()); } void TearDown() override { @@ -226,7 +227,7 @@ TEST_F(PermissionManagerTest, SubscriptionDestroyedCleanlyWithoutUnsubscribe) { // Test that the PermissionManager shuts down cleanly with subscriptions that // haven't been removed, crbug.com/720071. GetPermissionControllerDelegate()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, url(), url(), + PermissionType::GEOLOCATION, main_rfh(), url(), base::Bind(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); } @@ -234,7 +235,7 @@ TEST_F(PermissionManagerTest, SubscriptionDestroyedCleanlyWithoutUnsubscribe) { TEST_F(PermissionManagerTest, SameTypeChangeNotifies) { int subscription_id = GetPermissionControllerDelegate()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, url(), url(), + PermissionType::GEOLOCATION, main_rfh(), url(), base::Bind(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -252,7 +253,7 @@ TEST_F(PermissionManagerTest, SameTypeChangeNotifies) { TEST_F(PermissionManagerTest, DifferentTypeChangeDoesNotNotify) { int subscription_id = GetPermissionControllerDelegate()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, url(), url(), + PermissionType::GEOLOCATION, main_rfh(), url(), base::Bind(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -269,7 +270,7 @@ TEST_F(PermissionManagerTest, DifferentTypeChangeDoesNotNotify) { TEST_F(PermissionManagerTest, ChangeAfterUnsubscribeDoesNotNotify) { int subscription_id = GetPermissionControllerDelegate()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, url(), url(), + PermissionType::GEOLOCATION, main_rfh(), url(), base::Bind(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -286,7 +287,7 @@ TEST_F(PermissionManagerTest, ChangeAfterUnsubscribeDoesNotNotify) { TEST_F(PermissionManagerTest, DifferentPrimaryUrlDoesNotNotify) { int subscription_id = GetPermissionControllerDelegate()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, url(), url(), + PermissionType::GEOLOCATION, main_rfh(), url(), base::Bind(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -303,7 +304,7 @@ TEST_F(PermissionManagerTest, DifferentPrimaryUrlDoesNotNotify) { TEST_F(PermissionManagerTest, DifferentSecondaryUrlDoesNotNotify) { int subscription_id = GetPermissionControllerDelegate()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, url(), url(), + PermissionType::GEOLOCATION, main_rfh(), url(), base::Bind(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -320,7 +321,7 @@ TEST_F(PermissionManagerTest, DifferentSecondaryUrlDoesNotNotify) { TEST_F(PermissionManagerTest, WildCardPatternNotifies) { int subscription_id = GetPermissionControllerDelegate()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, url(), url(), + PermissionType::GEOLOCATION, main_rfh(), url(), base::Bind(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -341,7 +342,7 @@ TEST_F(PermissionManagerTest, ClearSettingsNotifies) { int subscription_id = GetPermissionControllerDelegate()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, url(), url(), + PermissionType::GEOLOCATION, main_rfh(), url(), base::Bind(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -358,7 +359,7 @@ TEST_F(PermissionManagerTest, ClearSettingsNotifies) { TEST_F(PermissionManagerTest, NewValueCorrectlyPassed) { int subscription_id = GetPermissionControllerDelegate()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, url(), url(), + PermissionType::GEOLOCATION, main_rfh(), url(), base::Bind(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -380,7 +381,7 @@ TEST_F(PermissionManagerTest, ChangeWithoutPermissionChangeDoesNotNotify) { int subscription_id = GetPermissionControllerDelegate()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, url(), url(), + PermissionType::GEOLOCATION, main_rfh(), url(), base::Bind(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -401,7 +402,38 @@ TEST_F(PermissionManagerTest, ChangesBackAndForth) { int subscription_id = GetPermissionControllerDelegate()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, url(), url(), + PermissionType::GEOLOCATION, main_rfh(), url(), + base::Bind(&PermissionManagerTest::OnPermissionChange, + base::Unretained(this))); + + GetHostContentSettingsMap()->SetContentSettingDefaultScope( + url(), url(), CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string(), + CONTENT_SETTING_ALLOW); + + EXPECT_TRUE(callback_called()); + EXPECT_EQ(PermissionStatus::GRANTED, callback_result()); + + Reset(); + + GetHostContentSettingsMap()->SetContentSettingDefaultScope( + url(), url(), CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string(), + CONTENT_SETTING_ASK); + + EXPECT_TRUE(callback_called()); + EXPECT_EQ(PermissionStatus::ASK, callback_result()); + + GetPermissionControllerDelegate()->UnsubscribePermissionStatusChange( + subscription_id); +} + +TEST_F(PermissionManagerTest, ChangesBackAndForthWorker) { + GetHostContentSettingsMap()->SetContentSettingDefaultScope( + url(), url(), CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string(), + CONTENT_SETTING_ASK); + + int subscription_id = + GetPermissionControllerDelegate()->SubscribePermissionStatusChange( + PermissionType::GEOLOCATION, nullptr, url(), base::Bind(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -428,7 +460,7 @@ TEST_F(PermissionManagerTest, ChangesBackAndForth) { TEST_F(PermissionManagerTest, SubscribeMIDIPermission) { int subscription_id = GetPermissionControllerDelegate()->SubscribePermissionStatusChange( - PermissionType::MIDI, url(), url(), + PermissionType::MIDI, main_rfh(), url(), base::Bind(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); diff --git a/chromecast/browser/cast_permission_manager.cc b/chromecast/browser/cast_permission_manager.cc index bb878a2dc6f044..3e616509bb23c0 100644 --- a/chromecast/browser/cast_permission_manager.cc +++ b/chromecast/browser/cast_permission_manager.cc @@ -65,8 +65,8 @@ CastPermissionManager::GetPermissionStatusForFrame( int CastPermissionManager::SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) { return content::PermissionController::kNoPendingOperation; } diff --git a/chromecast/browser/cast_permission_manager.h b/chromecast/browser/cast_permission_manager.h index 82809fce71ea55..585f998f4c171e 100644 --- a/chromecast/browser/cast_permission_manager.h +++ b/chromecast/browser/cast_permission_manager.h @@ -46,8 +46,8 @@ class CastPermissionManager : public content::PermissionControllerDelegate { const GURL& requesting_origin) override; int SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) override; void UnsubscribePermissionStatusChange(int subscription_id) override; diff --git a/components/domain_reliability/service_unittest.cc b/components/domain_reliability/service_unittest.cc index a115f15791bc0a..877fc046d9a113 100644 --- a/components/domain_reliability/service_unittest.cc +++ b/components/domain_reliability/service_unittest.cc @@ -102,8 +102,8 @@ class TestPermissionManager : public content::PermissionControllerDelegate { int SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) override { NOTIMPLEMENTED(); diff --git a/content/browser/permissions/permission_controller_impl.cc b/content/browser/permissions/permission_controller_impl.cc index 75ccdf0efb4274..965cfcbaeb5dbe 100644 --- a/content/browser/permissions/permission_controller_impl.cc +++ b/content/browser/permissions/permission_controller_impl.cc @@ -101,15 +101,15 @@ void PermissionControllerImpl::ResetPermission(PermissionType permission, int PermissionControllerImpl::SubscribePermissionStatusChange( PermissionType permission, + RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) { PermissionControllerDelegate* delegate = browser_context_->GetPermissionControllerDelegate(); if (!delegate) return kNoPendingOperation; return delegate->SubscribePermissionStatusChange( - permission, requesting_origin, embedding_origin, callback); + permission, render_frame_host, requesting_origin, callback); } void PermissionControllerImpl::UnsubscribePermissionStatusChange( diff --git a/content/browser/permissions/permission_controller_impl.h b/content/browser/permissions/permission_controller_impl.h index 460f033513a997..3b9de91634714b 100644 --- a/content/browser/permissions/permission_controller_impl.h +++ b/content/browser/permissions/permission_controller_impl.h @@ -55,8 +55,8 @@ class CONTENT_EXPORT PermissionControllerImpl : public PermissionController { int SubscribePermissionStatusChange( PermissionType permission, + RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback); void UnsubscribePermissionStatusChange(int subscription_id); diff --git a/content/browser/permissions/permission_service_context.cc b/content/browser/permissions/permission_service_context.cc index 05cd21bd9ec3f6..e644dd0758060f 100644 --- a/content/browser/permissions/permission_service_context.cc +++ b/content/browser/permissions/permission_service_context.cc @@ -97,15 +97,10 @@ void PermissionServiceContext::CreateSubscription( auto subscription = std::make_unique(this, std::move(observer)); GURL requesting_origin(origin.Serialize()); - GURL embedding_origin = GetEmbeddingOrigin(); int subscription_id = PermissionControllerImpl::FromBrowserContext(browser_context) ->SubscribePermissionStatusChange( - permission_type, requesting_origin, - // If the embedding_origin is empty, we'll use the |origin| - // instead. - embedding_origin.is_empty() ? requesting_origin - : embedding_origin, + permission_type, render_frame_host_, requesting_origin, base::Bind(&PermissionSubscription::OnPermissionStatusChanged, base::Unretained(subscription.get()))); subscription->set_id(subscription_id); diff --git a/content/public/browser/permission_controller_delegate.h b/content/public/browser/permission_controller_delegate.h index 2a81ed3d815121..98eb65187d384d 100644 --- a/content/public/browser/permission_controller_delegate.h +++ b/content/public/browser/permission_controller_delegate.h @@ -77,13 +77,13 @@ class CONTENT_EXPORT PermissionControllerDelegate { const GURL& embedding_origin) = 0; // Runs the given |callback| whenever the |permission| associated with the - // pair { requesting_origin, embedding_origin } changes. - // Returns the subscription_id to be used to unsubscribe. Can be - // kNoPendingOperation if the subscribe was not successful. + // 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( - PermissionType permission, + content::PermissionType permission, + content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) = 0; // Unregisters from permission status change notifications. diff --git a/content/public/test/mock_permission_manager.cc b/content/public/test/mock_permission_manager.cc index 9157b1b556d9c1..32f1ef91e0f5e0 100644 --- a/content/public/test/mock_permission_manager.cc +++ b/content/public/test/mock_permission_manager.cc @@ -34,8 +34,8 @@ int MockPermissionManager::RequestPermissions( int MockPermissionManager::SubscribePermissionStatusChange( PermissionType permission, + RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) { // Return a fake subscription_id. return 0; diff --git a/content/public/test/mock_permission_manager.h b/content/public/test/mock_permission_manager.h index b140a499dc3cee..d7da1d88dd2bf2 100644 --- a/content/public/test/mock_permission_manager.h +++ b/content/public/test/mock_permission_manager.h @@ -52,8 +52,8 @@ class MockPermissionManager : public PermissionControllerDelegate { const GURL& embedding_origin) override {} int SubscribePermissionStatusChange( PermissionType permission, + RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) override; void UnsubscribePermissionStatusChange(int subscription_id) override {} diff --git a/content/shell/browser/layout_test/layout_test_permission_manager.cc b/content/shell/browser/layout_test/layout_test_permission_manager.cc index 7cccc6f561f587..a6ad4ea997c2c5 100644 --- a/content/shell/browser/layout_test/layout_test_permission_manager.cc +++ b/content/shell/browser/layout_test/layout_test_permission_manager.cc @@ -156,11 +156,19 @@ LayoutTestPermissionManager::GetPermissionStatusForFrame( int LayoutTestPermissionManager::SubscribePermissionStatusChange( PermissionType permission, + RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); + // If the request is from a worker, it won't have a RFH. + GURL embedding_origin = requesting_origin; + if (render_frame_host) { + WebContents* web_contents = + WebContents::FromRenderFrameHost(render_frame_host); + embedding_origin = web_contents->GetLastCommittedURL().GetOrigin(); + } + auto subscription = std::make_unique(); subscription->permission = PermissionDescription(permission, requesting_origin, embedding_origin); diff --git a/content/shell/browser/layout_test/layout_test_permission_manager.h b/content/shell/browser/layout_test/layout_test_permission_manager.h index a54e80f3222cbf..e182e35ee1427a 100644 --- a/content/shell/browser/layout_test/layout_test_permission_manager.h +++ b/content/shell/browser/layout_test/layout_test_permission_manager.h @@ -51,8 +51,8 @@ class LayoutTestPermissionManager : public PermissionControllerDelegate { const GURL& requesting_origin) override; int SubscribePermissionStatusChange( PermissionType permission, + RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) override; void UnsubscribePermissionStatusChange(int subscription_id) override; diff --git a/content/shell/browser/shell_permission_manager.cc b/content/shell/browser/shell_permission_manager.cc index 25d33b9143cda1..3cfcbaa1d31bbe 100644 --- a/content/shell/browser/shell_permission_manager.cc +++ b/content/shell/browser/shell_permission_manager.cc @@ -103,8 +103,8 @@ ShellPermissionManager::GetPermissionStatusForFrame( int ShellPermissionManager::SubscribePermissionStatusChange( PermissionType permission, + RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) { return PermissionController::kNoPendingOperation; } diff --git a/content/shell/browser/shell_permission_manager.h b/content/shell/browser/shell_permission_manager.h index b054b925288e9d..844939e5288b3a 100644 --- a/content/shell/browser/shell_permission_manager.h +++ b/content/shell/browser/shell_permission_manager.h @@ -45,8 +45,8 @@ class ShellPermissionManager : public PermissionControllerDelegate { const GURL& requesting_origin) override; int SubscribePermissionStatusChange( PermissionType permission, + RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) override; void UnsubscribePermissionStatusChange(int subscription_id) override; diff --git a/headless/lib/browser/headless_permission_manager.cc b/headless/lib/browser/headless_permission_manager.cc index ce2b687e60d6f8..46fa0038350a3f 100644 --- a/headless/lib/browser/headless_permission_manager.cc +++ b/headless/lib/browser/headless_permission_manager.cc @@ -73,8 +73,8 @@ HeadlessPermissionManager::GetPermissionStatusForFrame( int HeadlessPermissionManager::SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) { return content::PermissionController::kNoPendingOperation; } diff --git a/headless/lib/browser/headless_permission_manager.h b/headless/lib/browser/headless_permission_manager.h index 86488a0a7d16b9..95cadf7209a9d1 100644 --- a/headless/lib/browser/headless_permission_manager.h +++ b/headless/lib/browser/headless_permission_manager.h @@ -49,8 +49,8 @@ class HeadlessPermissionManager : public content::PermissionControllerDelegate { const GURL& requesting_origin) override; int SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, - const GURL& embedding_origin, const base::Callback& callback) override; void UnsubscribePermissionStatusChange(int subscription_id) override;