12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/renderer_host/pepper/pepper_broker_message_filter.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_ppapi_host.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ipc/ipc_message_macros.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/dispatch_host_message.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserPpapiHost;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::RenderProcessHost;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chrome {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPepperBrokerMessageFilter::PepperBrokerMessageFilter(PP_Instance instance,
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                     BrowserPpapiHost* host)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : document_url_(host->GetDocumentURLForInstance(instance)) {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int unused;
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  host->GetRenderFrameIDsForInstance(instance, &render_process_id_, &unused);
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPepperBrokerMessageFilter::~PepperBrokerMessageFilter() {}
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<base::TaskRunner>
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PepperBrokerMessageFilter::OverrideTaskRunnerForMessage(
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const IPC::Message& message) {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t PepperBrokerMessageFilter::OnResourceMessageReceived(
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const IPC::Message& msg,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ppapi::host::HostMessageContext* context) {
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PPAPI_BEGIN_MESSAGE_MAP(PepperBrokerMessageFilter, msg)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_Broker_IsAllowed,
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                        OnIsAllowed)
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PPAPI_END_MESSAGE_MAP()
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PP_ERROR_FAILED;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t PepperBrokerMessageFilter::OnIsAllowed(
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ppapi::host::HostMessageContext* context) {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!document_url_.is_valid())
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_ERROR_FAILED;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderProcessHost* render_process_host =
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderProcessHost::FromID(render_process_id_);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!render_process_host)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_ERROR_FAILED;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile =
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Profile::FromBrowserContext(render_process_host->GetBrowserContext());
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HostContentSettingsMap* content_settings =
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      profile->GetHostContentSettingsMap();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentSetting setting =
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      content_settings->GetContentSetting(document_url_,
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                          document_url_,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          CONTENT_SETTINGS_TYPE_PPAPI_BROKER,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          std::string());
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (setting == CONTENT_SETTING_ALLOW)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_OK;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PP_ERROR_FAILED;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chrome
76