Commit 3d4b61cf authored by timvolodine's avatar timvolodine Committed by Commit bot

Clean-up refactoring of chrome_content_browser_client to use GetPermissionContext consistently.

Eliminate some duplicate code now that PermissionContextBase is the base class
for all other permission contexts and we have a helper function
GetPermissionContext to obtain the proper permission context class depending
on permission type. Also move PermissionToContentSetting to anonymous namespace.

BUG=

Review URL: https://codereview.chromium.org/896173002

Cr-Commit-Position: refs/heads/master@{#314866}
parent a86ffa06
...@@ -632,6 +632,7 @@ PermissionContextBase* GetPermissionContext(Profile* profile, ...@@ -632,6 +632,7 @@ PermissionContextBase* GetPermissionContext(Profile* profile,
return DesktopNotificationServiceFactory::GetForProfile(profile); return DesktopNotificationServiceFactory::GetForProfile(profile);
#else #else
NOTIMPLEMENTED(); NOTIMPLEMENTED();
break;
#endif #endif
case content::PERMISSION_GEOLOCATION: case content::PERMISSION_GEOLOCATION:
return GeolocationPermissionContextFactory::GetForProfile(profile); return GeolocationPermissionContextFactory::GetForProfile(profile);
...@@ -652,6 +653,28 @@ PermissionContextBase* GetPermissionContext(Profile* profile, ...@@ -652,6 +653,28 @@ PermissionContextBase* GetPermissionContext(Profile* profile,
return nullptr; return nullptr;
} }
// Helper method to translate from Permissions to ContentSettings
ContentSettingsType PermissionToContentSetting(
content::PermissionType permission) {
switch (permission) {
case content::PERMISSION_MIDI_SYSEX:
return CONTENT_SETTINGS_TYPE_MIDI_SYSEX;
case content::PERMISSION_PUSH_MESSAGING:
return CONTENT_SETTINGS_TYPE_PUSH_MESSAGING;
case content::PERMISSION_NOTIFICATIONS:
return CONTENT_SETTINGS_TYPE_NOTIFICATIONS;
case content::PERMISSION_GEOLOCATION:
return CONTENT_SETTINGS_TYPE_GEOLOCATION;
#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
case content::PERMISSION_PROTECTED_MEDIA_IDENTIFIER:
return CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER;
#endif
default:
NOTREACHED() << "Unknown content setting for permission " << permission;
return CONTENT_SETTINGS_TYPE_DEFAULT;
}
}
} // namespace } // namespace
namespace chrome { namespace chrome {
...@@ -1908,67 +1931,19 @@ void ChromeContentBrowserClient::RequestPermission( ...@@ -1908,67 +1931,19 @@ void ChromeContentBrowserClient::RequestPermission(
const base::Callback<void(bool)>& result_callback) { const base::Callback<void(bool)>& result_callback) {
int render_process_id = web_contents->GetRenderProcessHost()->GetID(); int render_process_id = web_contents->GetRenderProcessHost()->GetID();
int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID(); int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID();
Profile* profile =
Profile::FromBrowserContext(web_contents->GetBrowserContext());
const PermissionRequestID request_id(render_process_id, const PermissionRequestID request_id(render_process_id,
render_view_id, render_view_id,
bridge_id, bridge_id,
requesting_frame); requesting_frame);
Profile* profile =
Profile::FromBrowserContext(web_contents->GetBrowserContext());
PermissionContextBase* context = GetPermissionContext(profile, permission);
switch (permission) { if (!context)
case content::PERMISSION_MIDI_SYSEX: return;
MidiPermissionContextFactory::GetForProfile(profile)
->RequestPermission(web_contents, context->RequestPermission(web_contents, request_id, requesting_frame,
request_id, user_gesture, result_callback);
requesting_frame,
user_gesture,
result_callback);
break;
case content::PERMISSION_NOTIFICATIONS:
#if defined(ENABLE_NOTIFICATIONS)
DesktopNotificationServiceFactory::GetForProfile(profile)
->RequestNotificationPermission(web_contents,
request_id,
requesting_frame,
user_gesture,
result_callback);
#else
NOTIMPLEMENTED();
#endif
break;
case content::PERMISSION_GEOLOCATION:
GeolocationPermissionContextFactory::GetForProfile(profile)
->RequestPermission(web_contents,
request_id,
requesting_frame.GetOrigin(),
user_gesture,
result_callback);
break;
case content::PERMISSION_PROTECTED_MEDIA_IDENTIFIER:
#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
ProtectedMediaIdentifierPermissionContextFactory::GetForProfile(profile)
->RequestPermission(web_contents,
request_id,
requesting_frame.GetOrigin(),
user_gesture,
result_callback);
#else
NOTIMPLEMENTED();
#endif
break;
case content::PERMISSION_PUSH_MESSAGING:
gcm::PushMessagingPermissionContextFactory::GetForProfile(profile)
->RequestPermission(web_contents,
request_id,
requesting_frame.GetOrigin(),
user_gesture,
result_callback);
break;
case content::PERMISSION_NUM:
NOTREACHED() << "Invalid RequestPermission for " << permission;
break;
}
} }
content::PermissionStatus ChromeContentBrowserClient::GetPermissionStatus( content::PermissionStatus ChromeContentBrowserClient::GetPermissionStatus(
...@@ -2011,67 +1986,16 @@ void ChromeContentBrowserClient::CancelPermissionRequest( ...@@ -2011,67 +1986,16 @@ void ChromeContentBrowserClient::CancelPermissionRequest(
const GURL& requesting_frame) { const GURL& requesting_frame) {
int render_process_id = web_contents->GetRenderProcessHost()->GetID(); int render_process_id = web_contents->GetRenderProcessHost()->GetID();
int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID(); int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID();
const PermissionRequestID request_id(render_process_id, const PermissionRequestID request_id(render_process_id,
render_view_id, render_view_id,
bridge_id, bridge_id,
requesting_frame); requesting_frame);
Profile* profile = Profile* profile =
Profile::FromBrowserContext(web_contents->GetBrowserContext()); Profile::FromBrowserContext(web_contents->GetBrowserContext());
switch (permission) { PermissionContextBase* context = GetPermissionContext(profile, permission);
case content::PERMISSION_MIDI_SYSEX: if (!context)
MidiPermissionContextFactory::GetForProfile(profile) return;
->CancelPermissionRequest(web_contents, request_id); context->CancelPermissionRequest(web_contents, request_id);
break;
case content::PERMISSION_NOTIFICATIONS:
#if defined(ENABLE_NOTIFICATIONS)
DesktopNotificationServiceFactory::GetForProfile(profile)
->CancelPermissionRequest(web_contents, request_id);
#else
NOTIMPLEMENTED();
#endif
break;
case content::PERMISSION_GEOLOCATION:
GeolocationPermissionContextFactory::GetForProfile(profile)
->CancelPermissionRequest(web_contents, request_id);
break;
case content::PERMISSION_PROTECTED_MEDIA_IDENTIFIER:
#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
ProtectedMediaIdentifierPermissionContextFactory::GetForProfile(profile)
->CancelPermissionRequest(web_contents, request_id);
#else
NOTIMPLEMENTED();
#endif
break;
case content::PERMISSION_PUSH_MESSAGING:
NOTIMPLEMENTED() << "CancelPermission not implemented for " << permission;
break;
case content::PERMISSION_NUM:
NOTREACHED() << "Invalid CancelPermission for " << permission;
break;
}
}
// Helper method to translate from Permissions to ContentSettings
static ContentSettingsType PermissionToContentSetting(
content::PermissionType permission) {
switch (permission) {
case content::PERMISSION_MIDI_SYSEX:
return CONTENT_SETTINGS_TYPE_MIDI_SYSEX;
case content::PERMISSION_PUSH_MESSAGING:
return CONTENT_SETTINGS_TYPE_PUSH_MESSAGING;
case content::PERMISSION_NOTIFICATIONS:
return CONTENT_SETTINGS_TYPE_NOTIFICATIONS;
case content::PERMISSION_GEOLOCATION:
return CONTENT_SETTINGS_TYPE_GEOLOCATION;
#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
case content::PERMISSION_PROTECTED_MEDIA_IDENTIFIER:
return CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER;
#endif
default:
NOTREACHED() << "Unknown content setting for permission " << permission;
return CONTENT_SETTINGS_TYPE_DEFAULT;
}
} }
void ChromeContentBrowserClient::RegisterPermissionUsage( void ChromeContentBrowserClient::RegisterPermissionUsage(
......
...@@ -63,6 +63,12 @@ ContentSetting PushMessagingPermissionContext::GetPermissionStatus( ...@@ -63,6 +63,12 @@ ContentSetting PushMessagingPermissionContext::GetPermissionStatus(
#endif #endif
} }
void PushMessagingPermissionContext::CancelPermissionRequest(
content::WebContents* web_contents, const PermissionRequestID& id) {
// TODO(peter): consider implementing this method.
NOTIMPLEMENTED() << "CancelPermission not implemented for push messaging";
}
// Unlike other permissions, push is decided by the following algorithm // Unlike other permissions, push is decided by the following algorithm
// - You need to request it from a top level domain // - You need to request it from a top level domain
// - You need to have notification permission granted. // - You need to have notification permission granted.
......
...@@ -25,6 +25,9 @@ class PushMessagingPermissionContext : public PermissionContextBase { ...@@ -25,6 +25,9 @@ class PushMessagingPermissionContext : public PermissionContextBase {
const GURL& requesting_origin, const GURL& requesting_origin,
const GURL& embedding_origin) const override; const GURL& embedding_origin) const override;
void CancelPermissionRequest(content::WebContents* web_contents,
const PermissionRequestID& id) override;
protected: protected:
// PermissionContextBase: // PermissionContextBase:
void DecidePermission(content::WebContents* web_contents, void DecidePermission(content::WebContents* web_contents,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment