Home | History | Annotate | Download | only in pepper
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/renderer_host/pepper/pepper_broker_message_filter.h"
      6 
      7 #include <string>
      8 
      9 #include "chrome/browser/content_settings/host_content_settings_map.h"
     10 #include "chrome/browser/profiles/profile.h"
     11 #include "chrome/common/content_settings.h"
     12 #include "content/public/browser/browser_ppapi_host.h"
     13 #include "content/public/browser/browser_thread.h"
     14 #include "content/public/browser/render_process_host.h"
     15 #include "ipc/ipc_message_macros.h"
     16 #include "ppapi/c/pp_errors.h"
     17 #include "ppapi/host/dispatch_host_message.h"
     18 #include "ppapi/proxy/ppapi_messages.h"
     19 #include "url/gurl.h"
     20 
     21 using content::BrowserPpapiHost;
     22 using content::BrowserThread;
     23 using content::RenderProcessHost;
     24 
     25 namespace chrome {
     26 
     27 PepperBrokerMessageFilter::PepperBrokerMessageFilter(
     28     PP_Instance instance,
     29     BrowserPpapiHost* host)
     30     : document_url_(host->GetDocumentURLForInstance(instance)) {
     31   int unused;
     32   host->GetRenderViewIDsForInstance(instance, &render_process_id_, &unused);
     33 }
     34 
     35 PepperBrokerMessageFilter::~PepperBrokerMessageFilter() {
     36 }
     37 
     38 scoped_refptr<base::TaskRunner>
     39 PepperBrokerMessageFilter::OverrideTaskRunnerForMessage(
     40     const IPC::Message& message) {
     41   return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
     42 }
     43 
     44 int32_t PepperBrokerMessageFilter::OnResourceMessageReceived(
     45     const IPC::Message& msg,
     46     ppapi::host::HostMessageContext* context) {
     47   IPC_BEGIN_MESSAGE_MAP(PepperBrokerMessageFilter, msg)
     48     PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_Broker_IsAllowed,
     49                                         OnIsAllowed)
     50   IPC_END_MESSAGE_MAP()
     51   return PP_ERROR_FAILED;
     52 }
     53 
     54 int32_t PepperBrokerMessageFilter::OnIsAllowed(
     55     ppapi::host::HostMessageContext* context) {
     56   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     57   if (!document_url_.is_valid())
     58     return PP_ERROR_FAILED;
     59   RenderProcessHost* render_process_host =
     60       RenderProcessHost::FromID(render_process_id_);
     61   if (!render_process_host)
     62     return PP_ERROR_FAILED;
     63   Profile* profile =
     64       Profile::FromBrowserContext(render_process_host->GetBrowserContext());
     65   HostContentSettingsMap* content_settings =
     66       profile->GetHostContentSettingsMap();
     67   ContentSetting setting =
     68       content_settings->GetContentSetting(document_url_, document_url_,
     69                                           CONTENT_SETTINGS_TYPE_PPAPI_BROKER,
     70                                           std::string());
     71   if (setting == CONTENT_SETTING_ALLOW)
     72     return PP_OK;
     73   return PP_ERROR_FAILED;
     74 }
     75 
     76 }  // namespace chrome
     77