BrowserCdmManager: gets RenderFrameHost instance on the correct thread.

This does not work if task_runner_ is not the browser UI thread.

R=xhwang@chromium.org
BUG=388930
TEST=manually verified EME playback

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

Cr-Commit-Position: refs/heads/master@{#306907}
diff --git a/content/browser/media/cdm/browser_cdm_manager.cc b/content/browser/media/cdm/browser_cdm_manager.cc
index b8e9224..0e15c65 100644
--- a/content/browser/media/cdm/browser_cdm_manager.cc
+++ b/content/browser/media/cdm/browser_cdm_manager.cc
@@ -246,25 +246,12 @@
   }
   GURL security_origin = iter->second;
 
-  RenderFrameHost* rfh =
-      RenderFrameHost::FromID(render_process_id_, render_frame_id);
-  WebContents* web_contents = WebContents::FromRenderFrameHost(rfh);
-  DCHECK(web_contents);
-  GetContentClient()->browser()->RequestPermission(
-      content::PERMISSION_PROTECTED_MEDIA,
-      web_contents,
-      0,  // bridge id
-      security_origin,
-      // Only implemented for Android infobars which do not support
-      // user gestures.
-      true,
-      base::Bind(&BrowserCdmManager::CreateSessionIfPermitted,
-                 this,
-                 render_frame_id,
-                 cdm_id,
-                 session_id,
-                 mime_type,
-                 init_data));
+  RequestSessionPermission(render_frame_id,
+                           security_origin,
+                           cdm_id,
+                           session_id,
+                           mime_type,
+                           init_data);
 }
 
 void BrowserCdmManager::OnUpdateSession(
@@ -367,6 +354,49 @@
   }
 }
 
+void BrowserCdmManager::RequestSessionPermission(
+    int render_frame_id,
+    const GURL& security_origin,
+    int cdm_id,
+    uint32 session_id,
+    const std::string& content_type,
+    const std::vector<uint8>& init_data) {
+  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
+    BrowserThread::PostTask(
+        BrowserThread::UI,
+        FROM_HERE,
+        base::Bind(&BrowserCdmManager::RequestSessionPermission,
+                   this,
+                   render_frame_id,
+                   security_origin,
+                   cdm_id,
+                   session_id,
+                   content_type,
+                   init_data));
+    return;
+  }
+
+  RenderFrameHost* rfh =
+      RenderFrameHost::FromID(render_process_id_, render_frame_id);
+  WebContents* web_contents = WebContents::FromRenderFrameHost(rfh);
+  DCHECK(web_contents);
+  GetContentClient()->browser()->RequestPermission(
+      content::PERMISSION_PROTECTED_MEDIA,
+      web_contents,
+      0,  // bridge id
+      security_origin,
+      // Only implemented for Android infobars which do not support
+      // user gestures.
+      true,
+      base::Bind(&BrowserCdmManager::CreateSessionIfPermitted,
+                 this,
+                 render_frame_id,
+                 cdm_id,
+                 session_id,
+                 content_type,
+                 init_data));
+}
+
 void BrowserCdmManager::CreateSessionIfPermitted(
     int render_frame_id,
     int cdm_id,
diff --git a/content/browser/media/cdm/browser_cdm_manager.h b/content/browser/media/cdm/browser_cdm_manager.h
index c82d6f2..d5683bd 100644
--- a/content/browser/media/cdm/browser_cdm_manager.h
+++ b/content/browser/media/cdm/browser_cdm_manager.h
@@ -114,6 +114,14 @@
   // Removes the CDM with the specified id.
   void RemoveCdm(uint64 id);
 
+  // Requests permission for the given protected-media session (infobar).
+  void RequestSessionPermission(int render_frame_id,
+                                const GURL& security_origin,
+                                int cdm_id,
+                                uint32 session_id,
+                                const std::string& content_type,
+                                const std::vector<uint8>& init_data);
+
   // If |permitted| is false, it does nothing but send
   // |CdmMsg_SessionError| IPC message.
   // The primary use case is infobar permission callback, i.e., when infobar