| Index: chrome/browser/chrome_content_browser_client.cc | 
| diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc | 
| index 0ab93b3e5711dab3b2afa28c8c0f3f9a37d6c9c1..77bbae10a3d84d813cf2ed061b4950361560af40 100644 | 
| --- a/chrome/browser/chrome_content_browser_client.cc | 
| +++ b/chrome/browser/chrome_content_browser_client.cc | 
| @@ -108,6 +108,7 @@ | 
| #include "content/public/browser/child_process_data.h" | 
| #include "content/public/browser/child_process_security_policy.h" | 
| #include "content/public/browser/desktop_notification_delegate.h" | 
| +#include "content/public/browser/permission_type.h" | 
| #include "content/public/browser/render_frame_host.h" | 
| #include "content/public/browser/render_process_host.h" | 
| #include "content/public/browser/render_view_host.h" | 
| @@ -1817,39 +1818,6 @@ content::MediaObserver* ChromeContentBrowserClient::GetMediaObserver() { | 
| return MediaCaptureDevicesDispatcher::GetInstance(); | 
| } | 
|  | 
| -void ChromeContentBrowserClient::RequestDesktopNotificationPermission( | 
| -    const GURL& source_origin, | 
| -    content::RenderFrameHost* render_frame_host, | 
| -    const base::Callback<void(blink::WebNotificationPermission)>& callback) { | 
| -#if defined(ENABLE_NOTIFICATIONS) | 
| -  // Skip showing the infobar if the request comes from an extension, and that | 
| -  // extension has the 'notify' permission. (If the extension does not have the | 
| -  // permission, the user will still be prompted.) | 
| -  Profile* profile = Profile::FromBrowserContext( | 
| -      render_frame_host->GetSiteInstance()->GetBrowserContext()); | 
| -  DesktopNotificationService* notification_service = | 
| -      DesktopNotificationServiceFactory::GetForProfile(profile); | 
| -  WebContents* web_contents = WebContents::FromRenderFrameHost( | 
| -      render_frame_host); | 
| -  int render_process_id = render_frame_host->GetProcess()->GetID(); | 
| -  const PermissionRequestID request_id(render_process_id, | 
| -      web_contents->GetRoutingID(), | 
| -      -1 /* bridge id */, | 
| -      GURL()); | 
| - | 
| -  notification_service->RequestNotificationPermission( | 
| -      web_contents, | 
| -      request_id, | 
| -      source_origin, | 
| -      // TODO(peter): plumb user_gesture over IPC | 
| -      true, | 
| -      callback); | 
| - | 
| -#else | 
| -  NOTIMPLEMENTED(); | 
| -#endif | 
| -} | 
| - | 
| blink::WebNotificationPermission | 
| ChromeContentBrowserClient::CheckDesktopNotificationPermission( | 
| const GURL& source_origin, | 
| @@ -1918,7 +1886,8 @@ void ChromeContentBrowserClient::ShowDesktopNotification( | 
| #endif | 
| } | 
|  | 
| -void ChromeContentBrowserClient::RequestGeolocationPermission( | 
| +void ChromeContentBrowserClient::RequestPermission( | 
| +    content::PermissionType permission, | 
| content::WebContents* web_contents, | 
| int bridge_id, | 
| const GURL& requesting_frame, | 
| @@ -1926,19 +1895,67 @@ void ChromeContentBrowserClient::RequestGeolocationPermission( | 
| const base::Callback<void(bool)>& result_callback) { | 
| int render_process_id = web_contents->GetRenderProcessHost()->GetID(); | 
| int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID(); | 
| +  Profile* profile = | 
| +      Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 
|  | 
| const PermissionRequestID request_id(render_process_id, | 
| render_view_id, | 
| bridge_id, | 
| requesting_frame); | 
| -  GeolocationPermissionContextFactory::GetForProfile( | 
| -      Profile::FromBrowserContext(web_contents->GetBrowserContext()))-> | 
| -          RequestPermission(web_contents, request_id, | 
| -                            requesting_frame.GetOrigin(), user_gesture, | 
| -                            result_callback); | 
| + | 
| +  switch (permission) { | 
| +    case content::PERMISSION_MIDI_SYSEX: | 
| +      MidiPermissionContextFactory::GetForProfile(profile) | 
| +          ->RequestPermission(web_contents, | 
| +                              request_id, | 
| +                              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: | 
| +#if defined(OS_ANDROID) | 
| +      ProtectedMediaIdentifierPermissionContextFactory::GetForProfile(profile) | 
| +          ->RequestProtectedMediaIdentifierPermission( | 
| +              web_contents, requesting_frame, result_callback); | 
| +#else | 
| +      NOTIMPLEMENTED(); | 
| +#endif | 
| +      break; | 
| +    case content::PERMISSION_PUSH_MESSAGING: | 
| +      // Push messaging does not require this flow as it goes directly through | 
| +      // the push service implementation so there is no reason to | 
| +      // implement it here. | 
| +      NOTIMPLEMENTED() << "RequestPermission not implemented for " | 
| +                       << permission; | 
| +      break; | 
| +    case content::PERMISSION_NUM: | 
| +      NOTREACHED() << "Invalid RequestPermission for " << permission; | 
| +      break; | 
| +  } | 
| } | 
|  | 
| -void ChromeContentBrowserClient::CancelGeolocationPermissionRequest( | 
| +void ChromeContentBrowserClient::CancelPermissionRequest( | 
| +    content::PermissionType permission, | 
| content::WebContents* web_contents, | 
| int bridge_id, | 
| const GURL& requesting_frame) { | 
| @@ -1949,56 +1966,72 @@ void ChromeContentBrowserClient::CancelGeolocationPermissionRequest( | 
| render_view_id, | 
| bridge_id, | 
| requesting_frame); | 
| -  GeolocationPermissionContextFactory::GetForProfile( | 
| -        Profile::FromBrowserContext(web_contents->GetBrowserContext()))-> | 
| -            CancelPermissionRequest(web_contents, request_id); | 
| +  Profile* profile = | 
| +      Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 
| +  switch (permission) { | 
| +    case content::PERMISSION_MIDI_SYSEX: | 
| +      MidiPermissionContextFactory::GetForProfile(profile) | 
| +          ->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: | 
| +#if defined(OS_ANDROID) | 
| +      ProtectedMediaIdentifierPermissionContextFactory::GetForProfile(profile) | 
| +          ->CancelProtectedMediaIdentifierPermissionRequests( | 
| +              render_process_id, render_view_id, requesting_frame); | 
| +#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; | 
| +  } | 
| } | 
|  | 
| -void ChromeContentBrowserClient::RequestMidiSysExPermission( | 
| -    content::WebContents* web_contents, | 
| -    int bridge_id, | 
| -    const GURL& requesting_frame, | 
| -    bool user_gesture, | 
| -    base::Callback<void(bool)> result_callback, | 
| -    base::Closure* cancel_callback) { | 
| -  MidiPermissionContext* context = | 
| -      MidiPermissionContextFactory::GetForProfile( | 
| -          Profile::FromBrowserContext(web_contents->GetBrowserContext())); | 
| -  int renderer_id = web_contents->GetRenderProcessHost()->GetID(); | 
| -  int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID(); | 
| -  const PermissionRequestID id(renderer_id, render_view_id, bridge_id, GURL()); | 
| - | 
| -  context->RequestPermission(web_contents, id, requesting_frame, | 
| -                             user_gesture, result_callback); | 
| +// 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_NOTIFICATIONS: | 
| +      return CONTENT_SETTINGS_TYPE_NOTIFICATIONS; | 
| +    case content::PERMISSION_GEOLOCATION: | 
| +      return CONTENT_SETTINGS_TYPE_GEOLOCATION; | 
| +#if defined(OS_ANDROID) | 
| +    case content::PERMISSION_PROTECTED_MEDIA: | 
| +      return CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER; | 
| +#endif | 
| +    default: | 
| +      NOTREACHED() << "Unknown content setting for permission " << permission; | 
| +      return CONTENT_SETTINGS_TYPE_DEFAULT; | 
| +  } | 
| } | 
|  | 
| -void ChromeContentBrowserClient::DidUseGeolocationPermission( | 
| +void ChromeContentBrowserClient::RegisterPermissionUsage( | 
| +    content::PermissionType permission, | 
| content::WebContents* web_contents, | 
| const GURL& frame_url, | 
| const GURL& main_frame_url) { | 
| Profile::FromBrowserContext(web_contents->GetBrowserContext()) | 
| ->GetHostContentSettingsMap() | 
| ->UpdateLastUsage( | 
| -          frame_url, main_frame_url, CONTENT_SETTINGS_TYPE_GEOLOCATION); | 
| -} | 
| - | 
| -void ChromeContentBrowserClient::RequestProtectedMediaIdentifierPermission( | 
| -    content::WebContents* web_contents, | 
| -    const GURL& origin, | 
| -    base::Callback<void(bool)> result_callback, | 
| -    base::Closure* cancel_callback) { | 
| -#if defined(OS_ANDROID) | 
| -  ProtectedMediaIdentifierPermissionContext* context = | 
| -      ProtectedMediaIdentifierPermissionContextFactory::GetForProfile( | 
| -          Profile::FromBrowserContext(web_contents->GetBrowserContext())); | 
| -  context->RequestProtectedMediaIdentifierPermission(web_contents, | 
| -                                                     origin, | 
| -                                                     result_callback, | 
| -                                                     cancel_callback); | 
| -#else | 
| -  NOTIMPLEMENTED(); | 
| -  result_callback.Run(false); | 
| -#endif  // defined(OS_ANDROID) | 
| +          frame_url, main_frame_url, PermissionToContentSetting(permission)); | 
| } | 
|  | 
| bool ChromeContentBrowserClient::CanCreateWindow( | 
|  |