| Index: content/browser/renderer_host/pepper/pepper_flash_browser_host.cc
|
| diff --git a/content/browser/renderer_host/pepper/pepper_flash_browser_host.cc b/content/browser/renderer_host/pepper/pepper_flash_browser_host.cc
|
| index c27dfb03d6074e34e24319993ee560147d82332e..07f14a69a043458f96e7de91009830ba9b43f789 100644
|
| --- a/content/browser/renderer_host/pepper/pepper_flash_browser_host.cc
|
| +++ b/content/browser/renderer_host/pepper/pepper_flash_browser_host.cc
|
| @@ -5,9 +5,16 @@
|
| #include "content/browser/renderer_host/pepper/pepper_flash_browser_host.h"
|
|
|
| #include "base/time.h"
|
| +#include "content/public/browser/browser_context.h"
|
| #include "content/public/browser/browser_ppapi_host.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/content_browser_client.h"
|
| +#include "content/public/browser/render_process_host.h"
|
| +#include "content/public/browser/resource_context.h"
|
| +#include "googleurl/src/gurl.h"
|
| #include "ipc/ipc_message_macros.h"
|
| #include "ppapi/c/pp_errors.h"
|
| +#include "ppapi/c/private/ppb_flash.h"
|
| #include "ppapi/host/dispatch_host_message.h"
|
| #include "ppapi/proxy/ppapi_messages.h"
|
| #include "ppapi/proxy/resource_message_params.h"
|
| @@ -21,11 +28,30 @@
|
|
|
| namespace content {
|
|
|
| +namespace {
|
| +
|
| +// Get the ResourceContext on the UI thread for the given render process ID.
|
| +ResourceContext* GetResourceContext(int render_process_id) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + RenderProcessHost* render_process_host = RenderProcessHost::FromID(
|
| + render_process_id);
|
| + if (render_process_host && render_process_host->GetBrowserContext())
|
| + return render_process_host->GetBrowserContext()->GetResourceContext();
|
| + return NULL;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| PepperFlashBrowserHost::PepperFlashBrowserHost(
|
| BrowserPpapiHost* host,
|
| PP_Instance instance,
|
| PP_Resource resource)
|
| - : ResourceHost(host->GetPpapiHost(), instance, resource) {
|
| + : ResourceHost(host->GetPpapiHost(), instance, resource),
|
| + host_(host),
|
| + resource_context_(NULL),
|
| + weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
|
| + int unused;
|
| + host->GetRenderViewIDsForInstance(instance, &render_process_id_, &unused);
|
| }
|
|
|
| PepperFlashBrowserHost::~PepperFlashBrowserHost() {
|
| @@ -39,6 +65,9 @@ int32_t PepperFlashBrowserHost::OnResourceMessageReceived(
|
| OnMsgUpdateActivity);
|
| PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Flash_GetLocalTimeZoneOffset,
|
| OnMsgGetLocalTimeZoneOffset);
|
| + PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(
|
| + PpapiHostMsg_Flash_GetLocalDataRestrictions,
|
| + OnMsgGetLocalDataRestrictions);
|
| IPC_END_MESSAGE_MAP()
|
| return PP_ERROR_FAILED;
|
| }
|
| @@ -72,4 +101,53 @@ int32_t PepperFlashBrowserHost::OnMsgGetLocalTimeZoneOffset(
|
| return PP_OK;
|
| }
|
|
|
| +int32_t PepperFlashBrowserHost::OnMsgGetLocalDataRestrictions(
|
| + ppapi::host::HostMessageContext* context) {
|
| + // Getting the LocalDataRestrictions needs to be done on the IO thread,
|
| + // however it relies on the ResourceContext which can only be accessed from
|
| + // the UI thread. We lazily initialize |resource_context_| by grabbing the
|
| + // pointer from the UI thread and then call |GetLocalDataRestrictions| with
|
| + // it.
|
| + GURL document_url = host_->GetDocumentURLForInstance(pp_instance());
|
| + GURL plugin_url = host_->GetPluginURLForInstance(pp_instance());
|
| + if (resource_context_) {
|
| + GetLocalDataRestrictions(context->MakeReplyMessageContext(), document_url,
|
| + plugin_url, resource_context_);
|
| + } else {
|
| + BrowserThread::PostTaskAndReplyWithResult(BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&GetResourceContext, render_process_id_),
|
| + base::Bind(&PepperFlashBrowserHost::GetLocalDataRestrictions,
|
| + weak_factory_.GetWeakPtr(),
|
| + context->MakeReplyMessageContext(),
|
| + document_url, plugin_url));
|
| + }
|
| + return PP_OK_COMPLETIONPENDING;
|
| +}
|
| +
|
| +void PepperFlashBrowserHost::GetLocalDataRestrictions(
|
| + ppapi::host::ReplyMessageContext reply_context,
|
| + const GURL& document_url,
|
| + const GURL& plugin_url,
|
| + ResourceContext* resource_context) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + // Note that the resource context lives on the IO thread and is owned by the
|
| + // browser profile so its lifetime should outlast ours.
|
| + if (!resource_context_)
|
| + resource_context_ = resource_context;
|
| +
|
| + PP_FlashLSORestrictions restrictions = PP_FLASHLSORESTRICTIONS_NONE;
|
| + if (resource_context_ && document_url.is_valid() && plugin_url.is_valid()) {
|
| + ContentBrowserClient* client = GetContentClient()->browser();
|
| + if (!client->AllowPluginLocalDataAccess(document_url, plugin_url,
|
| + resource_context_)) {
|
| + restrictions = PP_FLASHLSORESTRICTIONS_BLOCK;
|
| + } else if (client->AllowPluginLocalDataSessionOnly(plugin_url,
|
| + resource_context_)) {
|
| + restrictions = PP_FLASHLSORESTRICTIONS_IN_MEMORY;
|
| + }
|
| + }
|
| + SendReply(reply_context, PpapiPluginMsg_Flash_GetLocalDataRestrictionsReply(
|
| + static_cast<int32_t>(restrictions)));
|
| +}
|
| +
|
| } // namespace content
|
|
|