[Flash] Delete PPB_Broker_Trusted, PPP_Broker APIs
- Removes PPB_Broker_Trusted and PPP_Broker APIs. - Removes Broker related messages and browser implementation. - Removes kPpapiBrokerProcess and kPpapiFlashArgs content flags. - Removes kPpapiBrokerProcess Sandbox flag. No plugin processes can generate executable code. - Removes PluginGlobals::GetCmdLine method. Bug: chromium:1064652,chromium:1133894,chromium:1133887 Change-Id: I697aeae388f1d14edcb737579830a35fcac390f1 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2473438 Reviewed-by: Scott Violet <sky@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Bill Budge <bbudge@chromium.org> Cr-Commit-Position: refs/heads/master@{#817905}
This commit is contained in:
chrome
components/metrics
content
app
browser
plugin_service_impl.ccplugin_service_impl.hplugin_service_impl_unittest.ccppapi_plugin_process_host.ccppapi_plugin_process_host.h
renderer_host
web_contents
common
android
ppapi_plugin
public
renderer
BUILD.gn
pepper
test
ppapi
BUILD.gn
api
c
cpp
native_client
src
untrusted
pnacl_irt_shim
proxy
BUILD.gnbroker_dispatcher.ccbroker_dispatcher.hbroker_resource.ccbroker_resource.hinterface_list.ccplugin_globals.ccplugin_globals.hppapi_messages.hppb_broker_proxy.ccppb_broker_proxy.hppb_instance_proxy.ccresource_creation_proxy.ccresource_creation_proxy.h
shared_impl
tests
thunk
sandbox/policy
@@ -266,8 +266,7 @@ void AdjustLinuxOOMScore(const std::string& process_type) {
|
|||||||
score = content::kPluginOomScore;
|
score = content::kPluginOomScore;
|
||||||
} else if (process_type == switches::kUtilityProcess ||
|
} else if (process_type == switches::kUtilityProcess ||
|
||||||
process_type == switches::kGpuProcess ||
|
process_type == switches::kGpuProcess ||
|
||||||
process_type == switches::kCloudPrintServiceProcess ||
|
process_type == switches::kCloudPrintServiceProcess) {
|
||||||
process_type == switches::kPpapiBrokerProcess) {
|
|
||||||
score = content::kMiscOomScore;
|
score = content::kMiscOomScore;
|
||||||
#if BUILDFLAG(ENABLE_NACL)
|
#if BUILDFLAG(ENABLE_NACL)
|
||||||
} else if (process_type == switches::kNaClLoaderProcess ||
|
} else if (process_type == switches::kNaClLoaderProcess ||
|
||||||
@@ -311,7 +310,6 @@ bool SubprocessNeedsResourceBundle(const std::string& process_type) {
|
|||||||
process_type == switches::kNaClLoaderProcess ||
|
process_type == switches::kNaClLoaderProcess ||
|
||||||
#endif
|
#endif
|
||||||
process_type == switches::kPpapiPluginProcess ||
|
process_type == switches::kPpapiPluginProcess ||
|
||||||
process_type == switches::kPpapiBrokerProcess ||
|
|
||||||
process_type == switches::kGpuProcess ||
|
process_type == switches::kGpuProcess ||
|
||||||
#endif
|
#endif
|
||||||
process_type == switches::kRendererProcess ||
|
process_type == switches::kRendererProcess ||
|
||||||
@@ -980,14 +978,12 @@ void ChromeMainDelegate::PreSandboxStartup() {
|
|||||||
DCHECK(command_line.HasSwitch(switches::kLang) ||
|
DCHECK(command_line.HasSwitch(switches::kLang) ||
|
||||||
process_type == switches::kZygoteProcess ||
|
process_type == switches::kZygoteProcess ||
|
||||||
process_type == switches::kGpuProcess ||
|
process_type == switches::kGpuProcess ||
|
||||||
process_type == switches::kPpapiBrokerProcess ||
|
|
||||||
process_type == switches::kPpapiPluginProcess);
|
process_type == switches::kPpapiPluginProcess);
|
||||||
#else
|
#else
|
||||||
DCHECK(command_line.HasSwitch(switches::kLang) ||
|
DCHECK(command_line.HasSwitch(switches::kLang) ||
|
||||||
process_type == switches::kZygoteProcess ||
|
process_type == switches::kZygoteProcess ||
|
||||||
process_type == switches::kGpuProcess ||
|
process_type == switches::kGpuProcess ||
|
||||||
process_type == switches::kNaClLoaderProcess ||
|
process_type == switches::kNaClLoaderProcess ||
|
||||||
process_type == switches::kPpapiBrokerProcess ||
|
|
||||||
process_type == switches::kPpapiPluginProcess);
|
process_type == switches::kPpapiPluginProcess);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -5825,8 +5825,6 @@ static_library("browser") {
|
|||||||
"renderer_host/pepper/device_id_fetcher.h",
|
"renderer_host/pepper/device_id_fetcher.h",
|
||||||
"renderer_host/pepper/monitor_finder_mac.h",
|
"renderer_host/pepper/monitor_finder_mac.h",
|
||||||
"renderer_host/pepper/monitor_finder_mac.mm",
|
"renderer_host/pepper/monitor_finder_mac.mm",
|
||||||
"renderer_host/pepper/pepper_broker_message_filter.cc",
|
|
||||||
"renderer_host/pepper/pepper_broker_message_filter.h",
|
|
||||||
"renderer_host/pepper/pepper_isolated_file_system_message_filter.cc",
|
"renderer_host/pepper/pepper_isolated_file_system_message_filter.cc",
|
||||||
"renderer_host/pepper/pepper_isolated_file_system_message_filter.h",
|
"renderer_host/pepper/pepper_isolated_file_system_message_filter.h",
|
||||||
]
|
]
|
||||||
|
@@ -2359,7 +2359,6 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches(
|
|||||||
embedder_support::kOriginTrialDisabledFeatures,
|
embedder_support::kOriginTrialDisabledFeatures,
|
||||||
embedder_support::kOriginTrialDisabledTokens,
|
embedder_support::kOriginTrialDisabledTokens,
|
||||||
embedder_support::kOriginTrialPublicKey,
|
embedder_support::kOriginTrialPublicKey,
|
||||||
switches::kPpapiFlashArgs,
|
|
||||||
switches::kPpapiFlashPath,
|
switches::kPpapiFlashPath,
|
||||||
switches::kPpapiFlashVersion,
|
switches::kPpapiFlashVersion,
|
||||||
switches::kReaderModeHeuristics,
|
switches::kReaderModeHeuristics,
|
||||||
|
@@ -125,7 +125,6 @@ void DeriveCommandLine(const GURL& start_url,
|
|||||||
::switches::kGpuSandboxStartEarly,
|
::switches::kGpuSandboxStartEarly,
|
||||||
::switches::kNumRasterThreads,
|
::switches::kNumRasterThreads,
|
||||||
::switches::kPlatformDisallowsChromeOSDirectVideoDecoder,
|
::switches::kPlatformDisallowsChromeOSDirectVideoDecoder,
|
||||||
::switches::kPpapiFlashArgs,
|
|
||||||
::switches::kPpapiFlashPath,
|
::switches::kPpapiFlashPath,
|
||||||
::switches::kPpapiFlashVersion,
|
::switches::kPpapiFlashVersion,
|
||||||
::switches::kPpapiInProcess,
|
::switches::kPpapiInProcess,
|
||||||
|
@@ -105,8 +105,6 @@ std::map<uint32_t, Process> ProcessTypeCollector::ParseProcessTypes(
|
|||||||
process = Process::ZYGOTE_PROCESS;
|
process = Process::ZYGOTE_PROCESS;
|
||||||
} else if (type == switches::kPpapiPluginProcess) {
|
} else if (type == switches::kPpapiPluginProcess) {
|
||||||
process = Process::PPAPI_PLUGIN_PROCESS;
|
process = Process::PPAPI_PLUGIN_PROCESS;
|
||||||
} else if (type == switches::kPpapiBrokerProcess) {
|
|
||||||
process = Process::PPAPI_BROKER_PROCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
process_types.emplace(pid, process);
|
process_types.emplace(pid, process);
|
||||||
|
@@ -22,7 +22,6 @@ void GetExampleProcessTypeDataset(std::string* ps_output,
|
|||||||
4000 /opt/google/chrome/chrome --log-level=1 --type=utility
|
4000 /opt/google/chrome/chrome --log-level=1 --type=utility
|
||||||
5000 /opt/google/chrome/chrome --type=zygote
|
5000 /opt/google/chrome/chrome --type=zygote
|
||||||
6000 /opt/google/chrome/chrome --type=ppapi
|
6000 /opt/google/chrome/chrome --type=ppapi
|
||||||
7000 /opt/google/chrome/chrome --type=ppapi-broker
|
|
||||||
7100 /opt/google/chrome/chrome --type=random-type
|
7100 /opt/google/chrome/chrome --type=random-type
|
||||||
7200 /opt/google/chrome/chrome --no_type
|
7200 /opt/google/chrome/chrome --no_type
|
||||||
129000 /opt/google/chrome/chrome --ppapi-flash-path=..../libpepflashplayer.so
|
129000 /opt/google/chrome/chrome --ppapi-flash-path=..../libpepflashplayer.so
|
||||||
@@ -41,8 +40,6 @@ void GetExampleProcessTypeDataset(std::string* ps_output,
|
|||||||
5000, Process::ZYGOTE_PROCESS));
|
5000, Process::ZYGOTE_PROCESS));
|
||||||
process_types->insert(google::protobuf::MapPair<uint32_t, Process>(
|
process_types->insert(google::protobuf::MapPair<uint32_t, Process>(
|
||||||
6000, Process::PPAPI_PLUGIN_PROCESS));
|
6000, Process::PPAPI_PLUGIN_PROCESS));
|
||||||
process_types->insert(google::protobuf::MapPair<uint32_t, Process>(
|
|
||||||
7000, Process::PPAPI_BROKER_PROCESS));
|
|
||||||
process_types->insert(google::protobuf::MapPair<uint32_t, Process>(
|
process_types->insert(google::protobuf::MapPair<uint32_t, Process>(
|
||||||
7100, Process::OTHER_PROCESS));
|
7100, Process::OTHER_PROCESS));
|
||||||
process_types->insert(google::protobuf::MapPair<uint32_t, Process>(
|
process_types->insert(google::protobuf::MapPair<uint32_t, Process>(
|
||||||
|
@@ -5,7 +5,6 @@
|
|||||||
#include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h"
|
#include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h"
|
||||||
|
|
||||||
#include "build/build_config.h"
|
#include "build/build_config.h"
|
||||||
#include "chrome/browser/renderer_host/pepper/pepper_broker_message_filter.h"
|
|
||||||
#include "chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.h"
|
#include "chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.h"
|
||||||
#include "content/public/browser/browser_ppapi_host.h"
|
#include "content/public/browser/browser_ppapi_host.h"
|
||||||
#include "ppapi/host/message_filter_host.h"
|
#include "ppapi/host/message_filter_host.h"
|
||||||
@@ -36,19 +35,6 @@ ChromeBrowserPepperHostFactory::CreateResourceHost(
|
|||||||
if (!host_->IsValidInstance(instance))
|
if (!host_->IsValidInstance(instance))
|
||||||
return std::unique_ptr<ResourceHost>();
|
return std::unique_ptr<ResourceHost>();
|
||||||
|
|
||||||
// Private interfaces.
|
|
||||||
if (host_->GetPpapiHost()->permissions().HasPermission(
|
|
||||||
ppapi::PERMISSION_PRIVATE)) {
|
|
||||||
switch (message.type()) {
|
|
||||||
case PpapiHostMsg_Broker_Create::ID: {
|
|
||||||
scoped_refptr<ResourceMessageFilter> broker_filter(
|
|
||||||
new PepperBrokerMessageFilter(instance, host_));
|
|
||||||
return std::unique_ptr<ResourceHost>(new MessageFilterHost(
|
|
||||||
host_->GetPpapiHost(), instance, resource, broker_filter));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Permissions for the following interfaces will be checked at the
|
// Permissions for the following interfaces will be checked at the
|
||||||
// time of the corresponding instance's methods calls (because
|
// time of the corresponding instance's methods calls (because
|
||||||
// permission check can be performed only on the UI
|
// permission check can be performed only on the UI
|
||||||
|
@@ -1,71 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "chrome/browser/renderer_host/pepper/pepper_broker_message_filter.h"
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
|
|
||||||
#include "chrome/browser/profiles/profile.h"
|
|
||||||
#include "components/content_settings/core/browser/host_content_settings_map.h"
|
|
||||||
#include "components/content_settings/core/common/content_settings.h"
|
|
||||||
#include "content/public/browser/browser_ppapi_host.h"
|
|
||||||
#include "content/public/browser/browser_task_traits.h"
|
|
||||||
#include "content/public/browser/browser_thread.h"
|
|
||||||
#include "content/public/browser/render_process_host.h"
|
|
||||||
#include "ipc/ipc_message_macros.h"
|
|
||||||
#include "ppapi/c/pp_errors.h"
|
|
||||||
#include "ppapi/host/dispatch_host_message.h"
|
|
||||||
#include "ppapi/proxy/ppapi_messages.h"
|
|
||||||
#include "url/gurl.h"
|
|
||||||
|
|
||||||
using content::BrowserPpapiHost;
|
|
||||||
using content::BrowserThread;
|
|
||||||
using content::RenderProcessHost;
|
|
||||||
|
|
||||||
PepperBrokerMessageFilter::PepperBrokerMessageFilter(PP_Instance instance,
|
|
||||||
BrowserPpapiHost* host)
|
|
||||||
: document_url_(host->GetDocumentURLForInstance(instance)) {
|
|
||||||
int unused;
|
|
||||||
host->GetRenderFrameIDsForInstance(instance, &render_process_id_, &unused);
|
|
||||||
}
|
|
||||||
|
|
||||||
PepperBrokerMessageFilter::~PepperBrokerMessageFilter() {}
|
|
||||||
|
|
||||||
scoped_refptr<base::SequencedTaskRunner>
|
|
||||||
PepperBrokerMessageFilter::OverrideTaskRunnerForMessage(
|
|
||||||
const IPC::Message& message) {
|
|
||||||
return content::GetUIThreadTaskRunner({});
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t PepperBrokerMessageFilter::OnResourceMessageReceived(
|
|
||||||
const IPC::Message& msg,
|
|
||||||
ppapi::host::HostMessageContext* context) {
|
|
||||||
PPAPI_BEGIN_MESSAGE_MAP(PepperBrokerMessageFilter, msg)
|
|
||||||
PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_Broker_IsAllowed,
|
|
||||||
OnIsAllowed)
|
|
||||||
PPAPI_END_MESSAGE_MAP()
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t PepperBrokerMessageFilter::OnIsAllowed(
|
|
||||||
ppapi::host::HostMessageContext* context) {
|
|
||||||
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
|
||||||
if (!document_url_.is_valid())
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
RenderProcessHost* render_process_host =
|
|
||||||
RenderProcessHost::FromID(render_process_id_);
|
|
||||||
if (!render_process_host)
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
Profile* profile =
|
|
||||||
Profile::FromBrowserContext(render_process_host->GetBrowserContext());
|
|
||||||
HostContentSettingsMap* content_settings =
|
|
||||||
HostContentSettingsMapFactory::GetForProfile(profile);
|
|
||||||
ContentSetting setting = content_settings->GetContentSetting(
|
|
||||||
document_url_, document_url_, ContentSettingsType::PPAPI_BROKER,
|
|
||||||
std::string());
|
|
||||||
if (setting == CONTENT_SETTING_ALLOW)
|
|
||||||
return PP_OK;
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
}
|
|
@@ -1,50 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#ifndef CHROME_BROWSER_RENDERER_HOST_PEPPER_PEPPER_BROKER_MESSAGE_FILTER_H_
|
|
||||||
#define CHROME_BROWSER_RENDERER_HOST_PEPPER_PEPPER_BROKER_MESSAGE_FILTER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "base/compiler_specific.h"
|
|
||||||
#include "base/macros.h"
|
|
||||||
#include "ppapi/c/pp_instance.h"
|
|
||||||
#include "ppapi/host/resource_message_filter.h"
|
|
||||||
#include "url/gurl.h"
|
|
||||||
|
|
||||||
namespace content {
|
|
||||||
class BrowserPpapiHost;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace ppapi {
|
|
||||||
namespace host {
|
|
||||||
struct HostMessageContext;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This filter handles messages for the PepperBrokerHost on the UI thread.
|
|
||||||
class PepperBrokerMessageFilter : public ppapi::host::ResourceMessageFilter {
|
|
||||||
public:
|
|
||||||
PepperBrokerMessageFilter(PP_Instance instance,
|
|
||||||
content::BrowserPpapiHost* host);
|
|
||||||
|
|
||||||
private:
|
|
||||||
~PepperBrokerMessageFilter() override;
|
|
||||||
|
|
||||||
// ppapi::host::ResourceMessageFilter overrides.
|
|
||||||
scoped_refptr<base::SequencedTaskRunner> OverrideTaskRunnerForMessage(
|
|
||||||
const IPC::Message& message) override;
|
|
||||||
int32_t OnResourceMessageReceived(
|
|
||||||
const IPC::Message& msg,
|
|
||||||
ppapi::host::HostMessageContext* context) override;
|
|
||||||
|
|
||||||
int32_t OnIsAllowed(ppapi::host::HostMessageContext* context);
|
|
||||||
|
|
||||||
int render_process_id_;
|
|
||||||
GURL document_url_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(PepperBrokerMessageFilter);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // CHROME_BROWSER_RENDERER_HOST_PEPPER_PEPPER_BROKER_MESSAGE_FILTER_H_
|
|
@@ -43,7 +43,6 @@ static bool IsBoringSwitch(const std::string& flag) {
|
|||||||
// crash_reporter separately informs the crash server if it is doing
|
// crash_reporter separately informs the crash server if it is doing
|
||||||
// crash-loop handling.
|
// crash-loop handling.
|
||||||
crash_reporter::switches::kCrashLoopBefore,
|
crash_reporter::switches::kCrashLoopBefore,
|
||||||
switches::kPpapiFlashArgs,
|
|
||||||
switches::kPpapiFlashPath,
|
switches::kPpapiFlashPath,
|
||||||
switches::kRegisterPepperPlugins,
|
switches::kRegisterPepperPlugins,
|
||||||
switches::kUseGL,
|
switches::kUseGL,
|
||||||
|
@@ -85,7 +85,6 @@
|
|||||||
#include "ppapi/c/private/ppb_udp_socket_private.h"
|
#include "ppapi/c/private/ppb_udp_socket_private.h"
|
||||||
#include "ppapi/c/private/ppb_uma_private.h"
|
#include "ppapi/c/private/ppb_uma_private.h"
|
||||||
#include "ppapi/c/private/ppb_x509_certificate_private.h"
|
#include "ppapi/c/private/ppb_x509_certificate_private.h"
|
||||||
#include "ppapi/c/trusted/ppb_broker_trusted.h"
|
|
||||||
#include "ppapi/c/trusted/ppb_browser_font_trusted.h"
|
#include "ppapi/c/trusted/ppb_browser_font_trusted.h"
|
||||||
#include "ppapi/c/trusted/ppb_char_set_trusted.h"
|
#include "ppapi/c/trusted/ppb_char_set_trusted.h"
|
||||||
#include "ppapi/c/trusted/ppb_file_chooser_trusted.h"
|
#include "ppapi/c/trusted/ppb_file_chooser_trusted.h"
|
||||||
|
@@ -55,8 +55,5 @@ metrics::CallStackProfileParams::Process GetProfileParamsProcess(
|
|||||||
if (process_type == switches::kPpapiPluginProcess)
|
if (process_type == switches::kPpapiPluginProcess)
|
||||||
return metrics::CallStackProfileParams::PPAPI_PLUGIN_PROCESS;
|
return metrics::CallStackProfileParams::PPAPI_PLUGIN_PROCESS;
|
||||||
|
|
||||||
if (process_type == switches::kPpapiBrokerProcess)
|
|
||||||
return metrics::CallStackProfileParams::PPAPI_BROKER_PROCESS;
|
|
||||||
|
|
||||||
return metrics::CallStackProfileParams::UNKNOWN_PROCESS;
|
return metrics::CallStackProfileParams::UNKNOWN_PROCESS;
|
||||||
}
|
}
|
||||||
|
@@ -88,10 +88,3 @@ TEST_F(ThreadProfilerProcessTypeTest, GetProfileParamsProcess_PpapiPlugin) {
|
|||||||
EXPECT_EQ(metrics::CallStackProfileParams::PPAPI_PLUGIN_PROCESS,
|
EXPECT_EQ(metrics::CallStackProfileParams::PPAPI_PLUGIN_PROCESS,
|
||||||
GetProfileParamsProcess(command_line()));
|
GetProfileParamsProcess(command_line()));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ThreadProfilerProcessTypeTest, GetProfileParamsProcess_PpapiBroker) {
|
|
||||||
command_line().AppendSwitchASCII(switches::kProcessType,
|
|
||||||
switches::kPpapiBrokerProcess);
|
|
||||||
EXPECT_EQ(metrics::CallStackProfileParams::PPAPI_BROKER_PROCESS,
|
|
||||||
GetProfileParamsProcess(command_line()));
|
|
||||||
}
|
|
||||||
|
@@ -27,8 +27,6 @@ Process ToExecutionContextProcess(CallStackProfileParams::Process process) {
|
|||||||
return SANDBOX_HELPER_PROCESS;
|
return SANDBOX_HELPER_PROCESS;
|
||||||
case CallStackProfileParams::PPAPI_PLUGIN_PROCESS:
|
case CallStackProfileParams::PPAPI_PLUGIN_PROCESS:
|
||||||
return PPAPI_PLUGIN_PROCESS;
|
return PPAPI_PLUGIN_PROCESS;
|
||||||
case CallStackProfileParams::PPAPI_BROKER_PROCESS:
|
|
||||||
return PPAPI_BROKER_PROCESS;
|
|
||||||
}
|
}
|
||||||
NOTREACHED();
|
NOTREACHED();
|
||||||
return UNKNOWN_PROCESS;
|
return UNKNOWN_PROCESS;
|
||||||
|
@@ -21,7 +21,6 @@ struct CallStackProfileParams {
|
|||||||
ZYGOTE_PROCESS,
|
ZYGOTE_PROCESS,
|
||||||
SANDBOX_HELPER_PROCESS,
|
SANDBOX_HELPER_PROCESS,
|
||||||
PPAPI_PLUGIN_PROCESS,
|
PPAPI_PLUGIN_PROCESS,
|
||||||
PPAPI_BROKER_PROCESS,
|
|
||||||
NETWORK_SERVICE_PROCESS,
|
NETWORK_SERVICE_PROCESS,
|
||||||
|
|
||||||
MAX_PROCESS = NETWORK_SERVICE_PROCESS,
|
MAX_PROCESS = NETWORK_SERVICE_PROCESS,
|
||||||
|
@@ -135,7 +135,6 @@ bool IsSubprocess() {
|
|||||||
auto type = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
|
auto type = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
|
||||||
switches::kProcessType);
|
switches::kProcessType);
|
||||||
return type == switches::kGpuProcess ||
|
return type == switches::kGpuProcess ||
|
||||||
type == switches::kPpapiBrokerProcess ||
|
|
||||||
type == switches::kPpapiPluginProcess ||
|
type == switches::kPpapiPluginProcess ||
|
||||||
type == switches::kRendererProcess ||
|
type == switches::kRendererProcess ||
|
||||||
type == switches::kUtilityProcess || type == switches::kZygoteProcess;
|
type == switches::kUtilityProcess || type == switches::kZygoteProcess;
|
||||||
|
@@ -172,7 +172,6 @@ namespace content {
|
|||||||
extern int GpuMain(const content::MainFunctionParams&);
|
extern int GpuMain(const content::MainFunctionParams&);
|
||||||
#if BUILDFLAG(ENABLE_PLUGINS)
|
#if BUILDFLAG(ENABLE_PLUGINS)
|
||||||
extern int PpapiPluginMain(const MainFunctionParams&);
|
extern int PpapiPluginMain(const MainFunctionParams&);
|
||||||
extern int PpapiBrokerMain(const MainFunctionParams&);
|
|
||||||
#endif
|
#endif
|
||||||
extern int RendererMain(const content::MainFunctionParams&);
|
extern int RendererMain(const content::MainFunctionParams&);
|
||||||
extern int UtilityMain(const MainFunctionParams&);
|
extern int UtilityMain(const MainFunctionParams&);
|
||||||
@@ -515,7 +514,6 @@ int RunOtherNamedProcessTypeMain(const std::string& process_type,
|
|||||||
static const MainFunction kMainFunctions[] = {
|
static const MainFunction kMainFunctions[] = {
|
||||||
#if BUILDFLAG(ENABLE_PLUGINS)
|
#if BUILDFLAG(ENABLE_PLUGINS)
|
||||||
{switches::kPpapiPluginProcess, PpapiPluginMain},
|
{switches::kPpapiPluginProcess, PpapiPluginMain},
|
||||||
{switches::kPpapiBrokerProcess, PpapiBrokerMain},
|
|
||||||
#endif // ENABLE_PLUGINS
|
#endif // ENABLE_PLUGINS
|
||||||
{switches::kUtilityProcess, UtilityMain},
|
{switches::kUtilityProcess, UtilityMain},
|
||||||
{switches::kRendererProcess, RendererMain},
|
{switches::kRendererProcess, RendererMain},
|
||||||
|
@@ -69,18 +69,6 @@ void WillLoadPluginsCallback(base::SequenceChecker* sequence_checker) {
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
// static
|
|
||||||
void PluginServiceImpl::RecordBrokerUsage(int render_process_id,
|
|
||||||
int render_frame_id) {
|
|
||||||
RenderFrameHostImpl* rfh =
|
|
||||||
RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
|
|
||||||
if (!rfh)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ukm::SourceId source_id = rfh->GetPageUkmSourceId();
|
|
||||||
ukm::builders::Pepper_Broker(source_id).Record(ukm::UkmRecorder::Get());
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
// static
|
||||||
PluginService* PluginService::GetInstance() {
|
PluginService* PluginService::GetInstance() {
|
||||||
return PluginServiceImpl::GetInstance();
|
return PluginServiceImpl::GetInstance();
|
||||||
@@ -156,16 +144,6 @@ int PluginServiceImpl::CountPpapiPluginProcessesForProfile(
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
PpapiPluginProcessHost* PluginServiceImpl::FindPpapiBrokerProcess(
|
|
||||||
const base::FilePath& broker_path) {
|
|
||||||
for (PpapiBrokerProcessHostIterator iter; !iter.Done(); ++iter) {
|
|
||||||
if (iter->plugin_path() == broker_path)
|
|
||||||
return *iter;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiPluginProcess(
|
PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiPluginProcess(
|
||||||
int render_process_id,
|
int render_process_id,
|
||||||
const url::Origin& embedder_origin,
|
const url::Origin& embedder_origin,
|
||||||
@@ -268,29 +246,6 @@ PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiPluginProcess(
|
|||||||
return plugin_host;
|
return plugin_host;
|
||||||
}
|
}
|
||||||
|
|
||||||
PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiBrokerProcess(
|
|
||||||
int render_process_id,
|
|
||||||
const base::FilePath& plugin_path) {
|
|
||||||
DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
|
||||||
|
|
||||||
if (filter_ && !filter_->CanLoadPlugin(render_process_id, plugin_path))
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
PpapiPluginProcessHost* plugin_host = FindPpapiBrokerProcess(plugin_path);
|
|
||||||
if (plugin_host)
|
|
||||||
return plugin_host;
|
|
||||||
|
|
||||||
// Validate that the plugin is actually registered.
|
|
||||||
const PepperPluginInfo* info = GetRegisteredPpapiPluginInfo(plugin_path);
|
|
||||||
if (!info)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
DCHECK(info->is_out_of_process);
|
|
||||||
|
|
||||||
// This broker isn't loaded by any broker process, so create a new process.
|
|
||||||
return PpapiPluginProcessHost::CreateBrokerHost(*info);
|
|
||||||
}
|
|
||||||
|
|
||||||
void PluginServiceImpl::OpenChannelToPpapiPlugin(
|
void PluginServiceImpl::OpenChannelToPpapiPlugin(
|
||||||
int render_process_id,
|
int render_process_id,
|
||||||
const url::Origin& embedder_origin,
|
const url::Origin& embedder_origin,
|
||||||
@@ -309,25 +264,6 @@ void PluginServiceImpl::OpenChannelToPpapiPlugin(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginServiceImpl::OpenChannelToPpapiBroker(
|
|
||||||
int render_process_id,
|
|
||||||
int render_frame_id,
|
|
||||||
const base::FilePath& path,
|
|
||||||
PpapiPluginProcessHost::BrokerClient* client) {
|
|
||||||
GetUIThreadTaskRunner({})->PostTask(
|
|
||||||
FROM_HERE, base::BindOnce(&PluginServiceImpl::RecordBrokerUsage,
|
|
||||||
render_process_id, render_frame_id));
|
|
||||||
|
|
||||||
PpapiPluginProcessHost* plugin_host = FindOrStartPpapiBrokerProcess(
|
|
||||||
render_process_id, path);
|
|
||||||
if (plugin_host) {
|
|
||||||
plugin_host->OpenChannelToPlugin(client);
|
|
||||||
} else {
|
|
||||||
// Send error.
|
|
||||||
client->OnPpapiChannelOpened(IPC::ChannelHandle(), base::kNullProcessId, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PluginServiceImpl::GetPluginInfoArray(
|
bool PluginServiceImpl::GetPluginInfoArray(
|
||||||
const GURL& url,
|
const GURL& url,
|
||||||
const std::string& mime_type,
|
const std::string& mime_type,
|
||||||
|
@@ -91,8 +91,6 @@ class CONTENT_EXPORT PluginServiceImpl : public PluginService {
|
|||||||
const base::FilePath& plugin_path,
|
const base::FilePath& plugin_path,
|
||||||
const base::FilePath& profile_data_directory,
|
const base::FilePath& profile_data_directory,
|
||||||
const base::Optional<url::Origin>& origin_lock);
|
const base::Optional<url::Origin>& origin_lock);
|
||||||
PpapiPluginProcessHost* FindOrStartPpapiBrokerProcess(
|
|
||||||
int render_process_id, const base::FilePath& plugin_path);
|
|
||||||
|
|
||||||
// Opens a channel to a plugin process for the given mime type, starting
|
// Opens a channel to a plugin process for the given mime type, starting
|
||||||
// a new plugin process if necessary. This must be called on the IO thread
|
// a new plugin process if necessary. This must be called on the IO thread
|
||||||
@@ -103,10 +101,6 @@ class CONTENT_EXPORT PluginServiceImpl : public PluginService {
|
|||||||
const base::FilePath& profile_data_directory,
|
const base::FilePath& profile_data_directory,
|
||||||
const base::Optional<url::Origin>& origin_lock,
|
const base::Optional<url::Origin>& origin_lock,
|
||||||
PpapiPluginProcessHost::PluginClient* client);
|
PpapiPluginProcessHost::PluginClient* client);
|
||||||
void OpenChannelToPpapiBroker(int render_process_id,
|
|
||||||
int render_frame_id,
|
|
||||||
const base::FilePath& path,
|
|
||||||
PpapiPluginProcessHost::BrokerClient* client);
|
|
||||||
|
|
||||||
// Used to monitor plugin stability.
|
// Used to monitor plugin stability.
|
||||||
void RegisterPluginCrash(const base::FilePath& plugin_path);
|
void RegisterPluginCrash(const base::FilePath& plugin_path);
|
||||||
@@ -122,9 +116,6 @@ class CONTENT_EXPORT PluginServiceImpl : public PluginService {
|
|||||||
// Pulled out of the air, seems reasonable.
|
// Pulled out of the air, seems reasonable.
|
||||||
static constexpr int kDefaultMaxPpapiProcessesPerProfile = 15;
|
static constexpr int kDefaultMaxPpapiProcessesPerProfile = 15;
|
||||||
|
|
||||||
// Helper for recording URLs to UKM.
|
|
||||||
static void RecordBrokerUsage(int render_process_id, int render_frame_id);
|
|
||||||
|
|
||||||
// Creates the PluginServiceImpl object, but doesn't actually build the plugin
|
// Creates the PluginServiceImpl object, but doesn't actually build the plugin
|
||||||
// list yet. It's generated lazily.
|
// list yet. It's generated lazily.
|
||||||
PluginServiceImpl();
|
PluginServiceImpl();
|
||||||
@@ -137,8 +128,6 @@ class CONTENT_EXPORT PluginServiceImpl : public PluginService {
|
|||||||
const base::FilePath& plugin_path,
|
const base::FilePath& plugin_path,
|
||||||
const base::FilePath& profile_data_directory,
|
const base::FilePath& profile_data_directory,
|
||||||
const base::Optional<url::Origin>& origin_lock);
|
const base::Optional<url::Origin>& origin_lock);
|
||||||
PpapiPluginProcessHost* FindPpapiBrokerProcess(
|
|
||||||
const base::FilePath& broker_path);
|
|
||||||
|
|
||||||
void RegisterPepperPlugins();
|
void RegisterPepperPlugins();
|
||||||
|
|
||||||
|
@@ -1,114 +0,0 @@
|
|||||||
// Copyright 2017 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "content/browser/plugin_service_impl.h"
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
#include "build/build_config.h"
|
|
||||||
#include "components/ukm/test_ukm_recorder.h"
|
|
||||||
#include "content/browser/ppapi_plugin_process_host.h"
|
|
||||||
#include "content/browser/web_contents/web_contents_impl.h"
|
|
||||||
#include "content/public/browser/browser_thread.h"
|
|
||||||
#include "content/public/browser/render_frame_host.h"
|
|
||||||
#include "content/public/browser/render_process_host.h"
|
|
||||||
#include "content/public/browser/web_contents.h"
|
|
||||||
#include "content/public/test/navigation_simulator.h"
|
|
||||||
#include "content/public/test/test_renderer_host.h"
|
|
||||||
#include "content/public/test/test_utils.h"
|
|
||||||
#include "services/metrics/public/cpp/ukm_source.h"
|
|
||||||
#include "testing/gtest/include/gtest/gtest.h"
|
|
||||||
|
|
||||||
namespace content {
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
constexpr char kURL1[] = "http://google.com/";
|
|
||||||
constexpr char kURL2[] = "http://youtube.com/";
|
|
||||||
constexpr char kPepperBrokerEvent[] = "Pepper.Broker";
|
|
||||||
|
|
||||||
class TestBrokerClient : public PpapiPluginProcessHost::BrokerClient {
|
|
||||||
public:
|
|
||||||
void GetPpapiChannelInfo(base::ProcessHandle* renderer_handle,
|
|
||||||
int* renderer_id) override {}
|
|
||||||
void OnPpapiChannelOpened(const IPC::ChannelHandle& channel_handle,
|
|
||||||
base::ProcessId plugin_pid,
|
|
||||||
int plugin_child_id) override {}
|
|
||||||
bool Incognito() override { return false; }
|
|
||||||
};
|
|
||||||
|
|
||||||
} // anonymous namespace
|
|
||||||
|
|
||||||
class PluginServiceImplTest : public RenderViewHostTestHarness {
|
|
||||||
public:
|
|
||||||
PluginServiceImplTest() = default;
|
|
||||||
~PluginServiceImplTest() override = default;
|
|
||||||
|
|
||||||
void SetUp() override {
|
|
||||||
RenderViewHostTestHarness::SetUp();
|
|
||||||
|
|
||||||
test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if count events were recorded and if they were all recorded with
|
|
||||||
// the specified source_id.
|
|
||||||
bool RecordedBrokerEvents(ukm::SourceId source_id, size_t count) {
|
|
||||||
RunAllPendingInMessageLoop(BrowserThread::UI);
|
|
||||||
auto entries = test_ukm_recorder_->GetEntriesByName(kPepperBrokerEvent);
|
|
||||||
if (entries.size() != count)
|
|
||||||
return false;
|
|
||||||
for (const auto* const entry : entries) {
|
|
||||||
if (entry->source_id != source_id)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResetUKM() {
|
|
||||||
test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::unique_ptr<ukm::TestUkmRecorder> test_ukm_recorder_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(PluginServiceImplTest);
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_F(PluginServiceImplTest, RecordBrokerUsage) {
|
|
||||||
TestBrokerClient client;
|
|
||||||
|
|
||||||
NavigateAndCommit(GURL(kURL1));
|
|
||||||
ukm::SourceId source_id = static_cast<WebContentsImpl*>(web_contents())
|
|
||||||
->GetMainFrame()
|
|
||||||
->GetPageUkmSourceId();
|
|
||||||
PluginServiceImpl* service = PluginServiceImpl::GetInstance();
|
|
||||||
|
|
||||||
// Internal usage of the broker should not record metrics. Internal usage will
|
|
||||||
// not pass a RFH.
|
|
||||||
service->OpenChannelToPpapiBroker(0, 0, base::FilePath(), &client);
|
|
||||||
EXPECT_TRUE(RecordedBrokerEvents(source_id, 0));
|
|
||||||
|
|
||||||
// Top level frame usage should be recorded.
|
|
||||||
int render_process_id = main_rfh()->GetProcess()->GetID();
|
|
||||||
int render_frame_id = main_rfh()->GetRoutingID();
|
|
||||||
service->OpenChannelToPpapiBroker(render_process_id, render_frame_id,
|
|
||||||
base::FilePath(), &client);
|
|
||||||
EXPECT_TRUE(RecordedBrokerEvents(source_id, 1));
|
|
||||||
|
|
||||||
ResetUKM();
|
|
||||||
|
|
||||||
// Iframe usage should be recorded under the top level frame origin.
|
|
||||||
RenderFrameHost* child_frame =
|
|
||||||
RenderFrameHostTester::For(main_rfh())->AppendChild("child");
|
|
||||||
child_frame = NavigationSimulator::NavigateAndCommitFromDocument(GURL(kURL2),
|
|
||||||
child_frame);
|
|
||||||
EXPECT_EQ(GURL(kURL2), child_frame->GetLastCommittedURL());
|
|
||||||
render_process_id = child_frame->GetProcess()->GetID();
|
|
||||||
render_frame_id = child_frame->GetRoutingID();
|
|
||||||
service->OpenChannelToPpapiBroker(render_process_id, render_frame_id,
|
|
||||||
base::FilePath(), &client);
|
|
||||||
EXPECT_TRUE(RecordedBrokerEvents(source_id, 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace content
|
|
@@ -61,14 +61,9 @@ class PpapiPluginSandboxedProcessLauncherDelegate
|
|||||||
: public content::SandboxedProcessLauncherDelegate {
|
: public content::SandboxedProcessLauncherDelegate {
|
||||||
public:
|
public:
|
||||||
PpapiPluginSandboxedProcessLauncherDelegate(
|
PpapiPluginSandboxedProcessLauncherDelegate(
|
||||||
bool is_broker,
|
|
||||||
const ppapi::PpapiPermissions& permissions)
|
const ppapi::PpapiPermissions& permissions)
|
||||||
#if BUILDFLAG(USE_ZYGOTE_HANDLE) || defined(OS_WIN)
|
|
||||||
: is_broker_(is_broker)
|
|
||||||
#endif
|
|
||||||
#if defined(OS_WIN)
|
#if defined(OS_WIN)
|
||||||
,
|
: permissions_(permissions)
|
||||||
permissions_(permissions)
|
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -77,9 +72,6 @@ class PpapiPluginSandboxedProcessLauncherDelegate
|
|||||||
|
|
||||||
#if defined(OS_WIN)
|
#if defined(OS_WIN)
|
||||||
bool PreSpawnTarget(sandbox::TargetPolicy* policy) override {
|
bool PreSpawnTarget(sandbox::TargetPolicy* policy) override {
|
||||||
if (is_broker_)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// The Pepper process is as locked-down as a renderer except that it can
|
// The Pepper process is as locked-down as a renderer except that it can
|
||||||
// create the server side of Chrome pipes.
|
// create the server side of Chrome pipes.
|
||||||
sandbox::ResultCode result;
|
sandbox::ResultCode result;
|
||||||
@@ -106,13 +98,11 @@ class PpapiPluginSandboxedProcessLauncherDelegate
|
|||||||
if (!sid.empty())
|
if (!sid.empty())
|
||||||
sandbox::policy::SandboxWin::AddAppContainerPolicy(policy, sid.c_str());
|
sandbox::policy::SandboxWin::AddAppContainerPolicy(policy, sid.c_str());
|
||||||
|
|
||||||
// Only Flash needs to be able to execute dynamic code.
|
// No plugins can generate executable code.
|
||||||
if (!permissions_.HasPermission(ppapi::PERMISSION_FLASH)) {
|
|
||||||
sandbox::MitigationFlags flags = policy->GetDelayedProcessMitigations();
|
sandbox::MitigationFlags flags = policy->GetDelayedProcessMitigations();
|
||||||
flags |= sandbox::MITIGATION_DYNAMIC_CODE_DISABLE;
|
flags |= sandbox::MITIGATION_DYNAMIC_CODE_DISABLE;
|
||||||
if (sandbox::SBOX_ALL_OK != policy->SetDelayedProcessMitigations(flags))
|
if (sandbox::SBOX_ALL_OK != policy->SetDelayedProcessMitigations(flags))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -124,17 +114,13 @@ class PpapiPluginSandboxedProcessLauncherDelegate
|
|||||||
*base::CommandLine::ForCurrentProcess();
|
*base::CommandLine::ForCurrentProcess();
|
||||||
base::CommandLine::StringType plugin_launcher = browser_command_line
|
base::CommandLine::StringType plugin_launcher = browser_command_line
|
||||||
.GetSwitchValueNative(switches::kPpapiPluginLauncher);
|
.GetSwitchValueNative(switches::kPpapiPluginLauncher);
|
||||||
if (is_broker_ || !plugin_launcher.empty())
|
if (!plugin_launcher.empty())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
return GetGenericZygote();
|
return GetGenericZygote();
|
||||||
}
|
}
|
||||||
#endif // BUILDFLAG(USE_ZYGOTE_HANDLE)
|
#endif // BUILDFLAG(USE_ZYGOTE_HANDLE)
|
||||||
|
|
||||||
sandbox::policy::SandboxType GetSandboxType() override {
|
sandbox::policy::SandboxType GetSandboxType() override {
|
||||||
#if defined(OS_WIN)
|
|
||||||
if (is_broker_)
|
|
||||||
return sandbox::policy::SandboxType::kNoSandbox;
|
|
||||||
#endif // OS_WIN
|
|
||||||
return sandbox::policy::SandboxType::kPpapi;
|
return sandbox::policy::SandboxType::kPpapi;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,9 +129,6 @@ class PpapiPluginSandboxedProcessLauncherDelegate
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#if BUILDFLAG(USE_ZYGOTE_HANDLE) || defined(OS_WIN)
|
|
||||||
const bool is_broker_;
|
|
||||||
#endif
|
|
||||||
#if defined(OS_WIN)
|
#if defined(OS_WIN)
|
||||||
const ppapi::PpapiPermissions permissions_;
|
const ppapi::PpapiPermissions permissions_;
|
||||||
#endif
|
#endif
|
||||||
@@ -187,7 +170,7 @@ class PpapiPluginProcessHost::PluginNetworkObserver
|
|||||||
};
|
};
|
||||||
|
|
||||||
PpapiPluginProcessHost::~PpapiPluginProcessHost() {
|
PpapiPluginProcessHost::~PpapiPluginProcessHost() {
|
||||||
DVLOG(1) << "PpapiPluginProcessHost" << (is_broker_ ? "[broker]" : "")
|
DVLOG(1) << "PpapiPluginProcessHost"
|
||||||
<< "~PpapiPluginProcessHost()";
|
<< "~PpapiPluginProcessHost()";
|
||||||
CancelRequests();
|
CancelRequests();
|
||||||
}
|
}
|
||||||
@@ -206,18 +189,6 @@ PpapiPluginProcessHost* PpapiPluginProcessHost::CreatePluginHost(
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
|
||||||
PpapiPluginProcessHost* PpapiPluginProcessHost::CreateBrokerHost(
|
|
||||||
const PepperPluginInfo& info) {
|
|
||||||
PpapiPluginProcessHost* plugin_host =
|
|
||||||
new PpapiPluginProcessHost();
|
|
||||||
if (plugin_host->Init(info))
|
|
||||||
return plugin_host;
|
|
||||||
|
|
||||||
NOTREACHED(); // Init is not expected to fail.
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
// static
|
||||||
void PpapiPluginProcessHost::DidCreateOutOfProcessInstance(
|
void PpapiPluginProcessHost::DidCreateOutOfProcessInstance(
|
||||||
int plugin_process_id,
|
int plugin_process_id,
|
||||||
@@ -308,8 +279,7 @@ PpapiPluginProcessHost::PpapiPluginProcessHost(
|
|||||||
const base::FilePath& profile_data_directory,
|
const base::FilePath& profile_data_directory,
|
||||||
const base::Optional<url::Origin>& origin_lock)
|
const base::Optional<url::Origin>& origin_lock)
|
||||||
: profile_data_directory_(profile_data_directory),
|
: profile_data_directory_(profile_data_directory),
|
||||||
origin_lock_(origin_lock),
|
origin_lock_(origin_lock) {
|
||||||
is_broker_(false) {
|
|
||||||
uint32_t base_permissions = info.permissions;
|
uint32_t base_permissions = info.permissions;
|
||||||
|
|
||||||
// We don't have to do any whitelisting for APIs in this process host, so
|
// We don't have to do any whitelisting for APIs in this process host, so
|
||||||
@@ -337,18 +307,6 @@ PpapiPluginProcessHost::PpapiPluginProcessHost(
|
|||||||
network_observer_ = std::make_unique<PluginNetworkObserver>(this);
|
network_observer_ = std::make_unique<PluginNetworkObserver>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
PpapiPluginProcessHost::PpapiPluginProcessHost() : is_broker_(true) {
|
|
||||||
process_ = std::make_unique<BrowserChildProcessHostImpl>(
|
|
||||||
PROCESS_TYPE_PPAPI_BROKER, this, ChildProcessHost::IpcMode::kNormal);
|
|
||||||
|
|
||||||
ppapi::PpapiPermissions permissions; // No permissions.
|
|
||||||
// The plugin name, path and profile data directory shouldn't be needed for
|
|
||||||
// the broker.
|
|
||||||
host_impl_ = std::make_unique<BrowserPpapiHostImpl>(
|
|
||||||
this, permissions, std::string(), base::FilePath(), base::FilePath(),
|
|
||||||
false /* in_process */, false /* external_plugin */);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PpapiPluginProcessHost::Init(const PepperPluginInfo& info) {
|
bool PpapiPluginProcessHost::Init(const PepperPluginInfo& info) {
|
||||||
plugin_path_ = info.path;
|
plugin_path_ = info.path;
|
||||||
if (info.name.empty()) {
|
if (info.name.empty()) {
|
||||||
@@ -367,12 +325,8 @@ bool PpapiPluginProcessHost::Init(const PepperPluginInfo& info) {
|
|||||||
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
|
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
|
||||||
int flags = plugin_launcher.empty() ? ChildProcessHost::CHILD_ALLOW_SELF :
|
int flags = plugin_launcher.empty() ? ChildProcessHost::CHILD_ALLOW_SELF :
|
||||||
ChildProcessHost::CHILD_NORMAL;
|
ChildProcessHost::CHILD_NORMAL;
|
||||||
#elif defined(OS_MAC)
|
|
||||||
// Flash needs to JIT, but other plugins do not.
|
|
||||||
int flags = permissions_.HasPermission(ppapi::PERMISSION_FLASH)
|
|
||||||
? ChildProcessHost::CHILD_PLUGIN
|
|
||||||
: ChildProcessHost::CHILD_NORMAL;
|
|
||||||
#else
|
#else
|
||||||
|
// Plugins can't generate executable code.
|
||||||
int flags = ChildProcessHost::CHILD_NORMAL;
|
int flags = ChildProcessHost::CHILD_NORMAL;
|
||||||
#endif
|
#endif
|
||||||
base::FilePath exe_path = ChildProcessHost::GetChildPath(flags);
|
base::FilePath exe_path = ChildProcessHost::GetChildPath(flags);
|
||||||
@@ -384,24 +338,21 @@ bool PpapiPluginProcessHost::Init(const PepperPluginInfo& info) {
|
|||||||
std::unique_ptr<base::CommandLine> cmd_line =
|
std::unique_ptr<base::CommandLine> cmd_line =
|
||||||
std::make_unique<base::CommandLine>(exe_path);
|
std::make_unique<base::CommandLine>(exe_path);
|
||||||
cmd_line->AppendSwitchASCII(switches::kProcessType,
|
cmd_line->AppendSwitchASCII(switches::kProcessType,
|
||||||
is_broker_ ? switches::kPpapiBrokerProcess
|
switches::kPpapiPluginProcess);
|
||||||
: switches::kPpapiPluginProcess);
|
|
||||||
BrowserChildProcessHostImpl::CopyFeatureAndFieldTrialFlags(cmd_line.get());
|
BrowserChildProcessHostImpl::CopyFeatureAndFieldTrialFlags(cmd_line.get());
|
||||||
BrowserChildProcessHostImpl::CopyTraceStartupFlags(cmd_line.get());
|
BrowserChildProcessHostImpl::CopyTraceStartupFlags(cmd_line.get());
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
#if defined(OS_WIN)
|
||||||
cmd_line->AppendArg(is_broker_ ? switches::kPrefetchArgumentPpapiBroker
|
cmd_line->AppendArg(switches::kPrefetchArgumentPpapi);
|
||||||
: switches::kPrefetchArgumentPpapi);
|
|
||||||
#endif // defined(OS_WIN)
|
#endif // defined(OS_WIN)
|
||||||
|
|
||||||
// These switches are forwarded to both plugin and broker pocesses.
|
// These switches are forwarded to plugin pocesses.
|
||||||
static const char* const kCommonForwardSwitches[] = {
|
static const char* const kCommonForwardSwitches[] = {
|
||||||
switches::kVModule
|
switches::kVModule
|
||||||
};
|
};
|
||||||
cmd_line->CopySwitchesFrom(browser_command_line, kCommonForwardSwitches,
|
cmd_line->CopySwitchesFrom(browser_command_line, kCommonForwardSwitches,
|
||||||
base::size(kCommonForwardSwitches));
|
base::size(kCommonForwardSwitches));
|
||||||
|
|
||||||
if (!is_broker_) {
|
|
||||||
static const char* const kPluginForwardSwitches[] = {
|
static const char* const kPluginForwardSwitches[] = {
|
||||||
sandbox::policy::switches::kDisableSeccompFilterSandbox,
|
sandbox::policy::switches::kDisableSeccompFilterSandbox,
|
||||||
sandbox::policy::switches::kNoSandbox,
|
sandbox::policy::switches::kNoSandbox,
|
||||||
@@ -413,14 +364,6 @@ bool PpapiPluginProcessHost::Init(const PepperPluginInfo& info) {
|
|||||||
cmd_line->CopySwitchesFrom(browser_command_line, kPluginForwardSwitches,
|
cmd_line->CopySwitchesFrom(browser_command_line, kPluginForwardSwitches,
|
||||||
base::size(kPluginForwardSwitches));
|
base::size(kPluginForwardSwitches));
|
||||||
|
|
||||||
// Copy any flash args over if necessary.
|
|
||||||
// TODO(vtl): Stop passing flash args in the command line, or windows is
|
|
||||||
// going to explode.
|
|
||||||
std::string existing_args =
|
|
||||||
browser_command_line.GetSwitchValueASCII(switches::kPpapiFlashArgs);
|
|
||||||
cmd_line->AppendSwitchASCII(switches::kPpapiFlashArgs, existing_args);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string locale = GetContentClient()->browser()->GetApplicationLocale();
|
std::string locale = GetContentClient()->browser()->GetApplicationLocale();
|
||||||
if (!locale.empty()) {
|
if (!locale.empty()) {
|
||||||
// Pass on the locale so the plugin will know what language we're using.
|
// Pass on the locale so the plugin will know what language we're using.
|
||||||
@@ -443,12 +386,12 @@ bool PpapiPluginProcessHost::Init(const PepperPluginInfo& info) {
|
|||||||
if (!plugin_launcher.empty())
|
if (!plugin_launcher.empty())
|
||||||
cmd_line->PrependWrapper(plugin_launcher);
|
cmd_line->PrependWrapper(plugin_launcher);
|
||||||
|
|
||||||
// On posix, never use the zygote for the broker. Also, only use the zygote if
|
// On posix, only use the zygote if we are not using a plugin launcher -
|
||||||
// we are not using a plugin launcher - having a plugin launcher means we need
|
// having a plugin launcher means we need to use another process instead of
|
||||||
// to use another process instead of just forking the zygote.
|
// just forking the zygote.
|
||||||
process_->Launch(
|
process_->Launch(
|
||||||
std::make_unique<PpapiPluginSandboxedProcessLauncherDelegate>(
|
std::make_unique<PpapiPluginSandboxedProcessLauncherDelegate>(
|
||||||
is_broker_, permissions_),
|
permissions_),
|
||||||
std::move(cmd_line), true);
|
std::move(cmd_line), true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -518,7 +461,7 @@ void PpapiPluginProcessHost::OnChannelConnected(int32_t peer_pid) {
|
|||||||
// Called when the browser <--> plugin channel has an error. This normally
|
// Called when the browser <--> plugin channel has an error. This normally
|
||||||
// means the plugin has crashed.
|
// means the plugin has crashed.
|
||||||
void PpapiPluginProcessHost::OnChannelError() {
|
void PpapiPluginProcessHost::OnChannelError() {
|
||||||
VLOG(1) << "PpapiPluginProcessHost" << (is_broker_ ? "[broker]" : "")
|
VLOG(1) << "PpapiPluginProcessHost"
|
||||||
<< "::OnChannelError()";
|
<< "::OnChannelError()";
|
||||||
// We don't need to notify the renderers that were communicating with the
|
// We don't need to notify the renderers that were communicating with the
|
||||||
// plugin since they have their own channels which will go into the error
|
// plugin since they have their own channels which will go into the error
|
||||||
@@ -528,7 +471,7 @@ void PpapiPluginProcessHost::OnChannelError() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PpapiPluginProcessHost::CancelRequests() {
|
void PpapiPluginProcessHost::CancelRequests() {
|
||||||
DVLOG(1) << "PpapiPluginProcessHost" << (is_broker_ ? "[broker]" : "")
|
DVLOG(1) << "PpapiPluginProcessHost"
|
||||||
<< "CancelRequests()";
|
<< "CancelRequests()";
|
||||||
for (size_t i = 0; i < pending_requests_.size(); i++) {
|
for (size_t i = 0; i < pending_requests_.size(); i++) {
|
||||||
pending_requests_[i]->OnPpapiChannelOpened(IPC::ChannelHandle(),
|
pending_requests_[i]->OnPpapiChannelOpened(IPC::ChannelHandle(),
|
||||||
|
@@ -30,8 +30,7 @@ namespace content {
|
|||||||
class BrowserChildProcessHostImpl;
|
class BrowserChildProcessHostImpl;
|
||||||
struct PepperPluginInfo;
|
struct PepperPluginInfo;
|
||||||
|
|
||||||
// Process host for PPAPI plugin and broker processes.
|
// Process host for PPAPI plugin processes.
|
||||||
// When used for the broker, interpret all references to "plugin" with "broker".
|
|
||||||
class PpapiPluginProcessHost : public BrowserChildProcessHostDelegate,
|
class PpapiPluginProcessHost : public BrowserChildProcessHostDelegate,
|
||||||
public IPC::Sender {
|
public IPC::Sender {
|
||||||
public:
|
public:
|
||||||
@@ -65,11 +64,6 @@ class PpapiPluginProcessHost : public BrowserChildProcessHostDelegate,
|
|||||||
~PluginClient() override {}
|
~PluginClient() override {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class BrokerClient : public Client {
|
|
||||||
protected:
|
|
||||||
~BrokerClient() override {}
|
|
||||||
};
|
|
||||||
|
|
||||||
~PpapiPluginProcessHost() override;
|
~PpapiPluginProcessHost() override;
|
||||||
|
|
||||||
static PpapiPluginProcessHost* CreatePluginHost(
|
static PpapiPluginProcessHost* CreatePluginHost(
|
||||||
@@ -77,9 +71,6 @@ class PpapiPluginProcessHost : public BrowserChildProcessHostDelegate,
|
|||||||
const base::FilePath& profile_data_directory,
|
const base::FilePath& profile_data_directory,
|
||||||
const base::Optional<url::Origin>& origin_lock);
|
const base::Optional<url::Origin>& origin_lock);
|
||||||
|
|
||||||
static PpapiPluginProcessHost* CreateBrokerHost(
|
|
||||||
const PepperPluginInfo& info);
|
|
||||||
|
|
||||||
// Notification that a PP_Instance has been created and the associated
|
// Notification that a PP_Instance has been created and the associated
|
||||||
// renderer related data including the RenderView/Process pair for the given
|
// renderer related data including the RenderView/Process pair for the given
|
||||||
// plugin. This is necessary so that when the plugin calls us with a
|
// plugin. This is necessary so that when the plugin calls us with a
|
||||||
@@ -126,12 +117,11 @@ class PpapiPluginProcessHost : public BrowserChildProcessHostDelegate,
|
|||||||
private:
|
private:
|
||||||
class PluginNetworkObserver;
|
class PluginNetworkObserver;
|
||||||
|
|
||||||
// Constructors for plugin and broker process hosts, respectively.
|
// Constructors for plugin process hosts.
|
||||||
// You must call Init before doing anything else.
|
// You must call Init before doing anything else.
|
||||||
PpapiPluginProcessHost(const PepperPluginInfo& info,
|
PpapiPluginProcessHost(const PepperPluginInfo& info,
|
||||||
const base::FilePath& profile_data_directory,
|
const base::FilePath& profile_data_directory,
|
||||||
const base::Optional<url::Origin>& origin_lock);
|
const base::Optional<url::Origin>& origin_lock);
|
||||||
PpapiPluginProcessHost();
|
|
||||||
|
|
||||||
// Actually launches the process with the given plugin info. Returns true
|
// Actually launches the process with the given plugin info. Returns true
|
||||||
// on success (the process was spawned).
|
// on success (the process was spawned).
|
||||||
@@ -178,8 +168,6 @@ class PpapiPluginProcessHost : public BrowserChildProcessHostDelegate,
|
|||||||
// re-use the plugin host.
|
// re-use the plugin host.
|
||||||
const base::Optional<url::Origin> origin_lock_;
|
const base::Optional<url::Origin> origin_lock_;
|
||||||
|
|
||||||
const bool is_broker_;
|
|
||||||
|
|
||||||
std::unique_ptr<BrowserChildProcessHostImpl> process_;
|
std::unique_ptr<BrowserChildProcessHostImpl> process_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(PpapiPluginProcessHost);
|
DISALLOW_COPY_AND_ASSIGN(PpapiPluginProcessHost);
|
||||||
@@ -194,15 +182,6 @@ class PpapiPluginProcessHostIterator
|
|||||||
PpapiPluginProcessHost>(PROCESS_TYPE_PPAPI_PLUGIN) {}
|
PpapiPluginProcessHost>(PROCESS_TYPE_PPAPI_PLUGIN) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class PpapiBrokerProcessHostIterator
|
|
||||||
: public BrowserChildProcessHostTypeIterator<
|
|
||||||
PpapiPluginProcessHost> {
|
|
||||||
public:
|
|
||||||
PpapiBrokerProcessHostIterator()
|
|
||||||
: BrowserChildProcessHostTypeIterator<
|
|
||||||
PpapiPluginProcessHost>(PROCESS_TYPE_PPAPI_BROKER) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace content
|
} // namespace content
|
||||||
|
|
||||||
#endif // CONTENT_BROWSER_PPAPI_PLUGIN_PROCESS_HOST_H_
|
#endif // CONTENT_BROWSER_PPAPI_PLUGIN_PROCESS_HOST_H_
|
||||||
|
@@ -135,39 +135,6 @@ class RenderMessageCompletionCallback {
|
|||||||
|
|
||||||
#if BUILDFLAG(ENABLE_PLUGINS)
|
#if BUILDFLAG(ENABLE_PLUGINS)
|
||||||
|
|
||||||
class RenderFrameMessageFilter::OpenChannelToPpapiBrokerCallback
|
|
||||||
: public PpapiPluginProcessHost::BrokerClient {
|
|
||||||
public:
|
|
||||||
OpenChannelToPpapiBrokerCallback(RenderFrameMessageFilter* filter,
|
|
||||||
int routing_id)
|
|
||||||
: filter_(filter), routing_id_(routing_id) {}
|
|
||||||
|
|
||||||
~OpenChannelToPpapiBrokerCallback() override {}
|
|
||||||
|
|
||||||
void GetPpapiChannelInfo(base::ProcessHandle* renderer_handle,
|
|
||||||
int* renderer_id) override {
|
|
||||||
// base::kNullProcessHandle indicates that the channel will be used by the
|
|
||||||
// browser itself. Make sure we never output that value here.
|
|
||||||
CHECK_NE(base::kNullProcessHandle, filter_->PeerHandle());
|
|
||||||
*renderer_handle = filter_->PeerHandle();
|
|
||||||
*renderer_id = filter_->render_process_id_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnPpapiChannelOpened(const IPC::ChannelHandle& channel_handle,
|
|
||||||
base::ProcessId plugin_pid,
|
|
||||||
int /* plugin_child_id */) override {
|
|
||||||
filter_->Send(new ViewMsg_PpapiBrokerChannelCreated(routing_id_, plugin_pid,
|
|
||||||
channel_handle));
|
|
||||||
delete this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Incognito() override { return filter_->incognito_; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
scoped_refptr<RenderFrameMessageFilter> filter_;
|
|
||||||
int routing_id_;
|
|
||||||
};
|
|
||||||
|
|
||||||
class RenderFrameMessageFilter::OpenChannelToPpapiPluginCallback
|
class RenderFrameMessageFilter::OpenChannelToPpapiPluginCallback
|
||||||
: public RenderMessageCompletionCallback,
|
: public RenderMessageCompletionCallback,
|
||||||
public PpapiPluginProcessHost::PluginClient {
|
public PpapiPluginProcessHost::PluginClient {
|
||||||
@@ -236,8 +203,6 @@ bool RenderFrameMessageFilter::OnMessageReceived(const IPC::Message& message) {
|
|||||||
OnDidCreateOutOfProcessPepperInstance)
|
OnDidCreateOutOfProcessPepperInstance)
|
||||||
IPC_MESSAGE_HANDLER(FrameHostMsg_DidDeleteOutOfProcessPepperInstance,
|
IPC_MESSAGE_HANDLER(FrameHostMsg_DidDeleteOutOfProcessPepperInstance,
|
||||||
OnDidDeleteOutOfProcessPepperInstance)
|
OnDidDeleteOutOfProcessPepperInstance)
|
||||||
IPC_MESSAGE_HANDLER(FrameHostMsg_OpenChannelToPpapiBroker,
|
|
||||||
OnOpenChannelToPpapiBroker)
|
|
||||||
IPC_MESSAGE_HANDLER(FrameHostMsg_PluginInstanceThrottleStateChange,
|
IPC_MESSAGE_HANDLER(FrameHostMsg_PluginInstanceThrottleStateChange,
|
||||||
OnPluginInstanceThrottleStateChange)
|
OnPluginInstanceThrottleStateChange)
|
||||||
#endif // ENABLE_PLUGINS
|
#endif // ENABLE_PLUGINS
|
||||||
@@ -374,14 +339,6 @@ void RenderFrameMessageFilter::OnDidDeleteOutOfProcessPepperInstance(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderFrameMessageFilter::OnOpenChannelToPpapiBroker(
|
|
||||||
int routing_id,
|
|
||||||
const base::FilePath& path) {
|
|
||||||
plugin_service_->OpenChannelToPpapiBroker(
|
|
||||||
render_process_id_, routing_id, path,
|
|
||||||
new OpenChannelToPpapiBrokerCallback(this, routing_id));
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderFrameMessageFilter::OnPluginInstanceThrottleStateChange(
|
void RenderFrameMessageFilter::OnPluginInstanceThrottleStateChange(
|
||||||
int plugin_child_id,
|
int plugin_child_id,
|
||||||
int32_t pp_instance,
|
int32_t pp_instance,
|
||||||
|
@@ -1143,17 +1143,7 @@ bool WebContentsImpl::OnMessageReceived(RenderViewHostImpl* render_view_host,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_PLUGINS)
|
|
||||||
bool handled = true;
|
|
||||||
IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(WebContentsImpl, message, render_view_host)
|
|
||||||
IPC_MESSAGE_HANDLER(ViewHostMsg_RequestPpapiBrokerPermission,
|
|
||||||
OnRequestPpapiBrokerPermission)
|
|
||||||
IPC_MESSAGE_UNHANDLED(handled = false)
|
|
||||||
IPC_END_MESSAGE_MAP()
|
|
||||||
return handled;
|
|
||||||
#else
|
|
||||||
return false;
|
return false;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WebContentsImpl::OnMessageReceived(RenderFrameHostImpl* render_frame_host,
|
bool WebContentsImpl::OnMessageReceived(RenderFrameHostImpl* render_frame_host,
|
||||||
@@ -6176,40 +6166,6 @@ void WebContentsImpl::OnPluginCrashed(RenderFrameHostImpl* source,
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebContentsImpl::OnRequestPpapiBrokerPermission(
|
|
||||||
RenderViewHostImpl* source,
|
|
||||||
int ppb_broker_route_id,
|
|
||||||
const GURL& url,
|
|
||||||
const base::FilePath& plugin_path) {
|
|
||||||
OPTIONAL_TRACE_EVENT1("content",
|
|
||||||
"WebContentsImpl::OnRequestPpapiBrokerPermission",
|
|
||||||
"render_view_host", source);
|
|
||||||
base::OnceCallback<void(bool)> permission_result_callback = base::BindOnce(
|
|
||||||
&WebContentsImpl::SendPpapiBrokerPermissionResult, base::Unretained(this),
|
|
||||||
source->GetProcess()->GetID(), ppb_broker_route_id);
|
|
||||||
if (!delegate_) {
|
|
||||||
std::move(permission_result_callback).Run(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate_->RequestPpapiBrokerPermission(
|
|
||||||
this, url, plugin_path, std::move(permission_result_callback));
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebContentsImpl::SendPpapiBrokerPermissionResult(int process_id,
|
|
||||||
int ppb_broker_route_id,
|
|
||||||
bool result) {
|
|
||||||
OPTIONAL_TRACE_EVENT2(
|
|
||||||
"content", "WebContentsImpl::SendPpapiBrokerPermissionResult",
|
|
||||||
"process_id", process_id, "ppb_broker_route_id", ppb_broker_route_id);
|
|
||||||
RenderProcessHost* rph = RenderProcessHost::FromID(process_id);
|
|
||||||
if (rph) {
|
|
||||||
// TODO(nick): Convert this from ViewMsg_ to a Ppapi msg, since it
|
|
||||||
// is not routed to a RenderView.
|
|
||||||
rph->Send(
|
|
||||||
new ViewMsg_PpapiBrokerPermissionResult(ppb_broker_route_id, result));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // BUILDFLAG(ENABLE_PLUGINS)
|
#endif // BUILDFLAG(ENABLE_PLUGINS)
|
||||||
|
|
||||||
void WebContentsImpl::UpdateFaviconURL(
|
void WebContentsImpl::UpdateFaviconURL(
|
||||||
|
@@ -1512,16 +1512,6 @@ class CONTENT_EXPORT WebContentsImpl : public WebContents,
|
|||||||
void OnPluginCrashed(RenderFrameHostImpl* source,
|
void OnPluginCrashed(RenderFrameHostImpl* source,
|
||||||
const base::FilePath& plugin_path,
|
const base::FilePath& plugin_path,
|
||||||
base::ProcessId plugin_pid);
|
base::ProcessId plugin_pid);
|
||||||
void OnRequestPpapiBrokerPermission(RenderViewHostImpl* source,
|
|
||||||
int ppb_broker_route_id,
|
|
||||||
const GURL& url,
|
|
||||||
const base::FilePath& plugin_path);
|
|
||||||
|
|
||||||
// Callback function when requesting permission to access the PPAPI broker.
|
|
||||||
// |result| is true if permission was granted.
|
|
||||||
void SendPpapiBrokerPermissionResult(int process_id,
|
|
||||||
int ppb_broker_route_id,
|
|
||||||
bool result);
|
|
||||||
#endif // BUILDFLAG(ENABLE_PLUGINS)
|
#endif // BUILDFLAG(ENABLE_PLUGINS)
|
||||||
void OnShowValidationMessage(RenderViewHostImpl* source,
|
void OnShowValidationMessage(RenderViewHostImpl* source,
|
||||||
const gfx::Rect& anchor_in_root_view,
|
const gfx::Rect& anchor_in_root_view,
|
||||||
|
@@ -74,8 +74,6 @@ ProcessTypeForUma CurrentProcessType() {
|
|||||||
return ProcessTypeForUma::kGpu;
|
return ProcessTypeForUma::kGpu;
|
||||||
if (process_type == switches::kPpapiPluginProcess)
|
if (process_type == switches::kPpapiPluginProcess)
|
||||||
return ProcessTypeForUma::kPpapiPlugin;
|
return ProcessTypeForUma::kPpapiPlugin;
|
||||||
if (process_type == switches::kPpapiBrokerProcess)
|
|
||||||
return ProcessTypeForUma::kPpapiBroker;
|
|
||||||
NOTREACHED() << "Unexpected process type: " << process_type;
|
NOTREACHED() << "Unexpected process type: " << process_type;
|
||||||
return ProcessTypeForUma::kUnknown;
|
return ProcessTypeForUma::kUnknown;
|
||||||
}
|
}
|
||||||
|
@@ -31,7 +31,6 @@ source_set("ppapi_plugin_sources") {
|
|||||||
"plugin_process_dispatcher.h",
|
"plugin_process_dispatcher.h",
|
||||||
"ppapi_blink_platform_impl.cc",
|
"ppapi_blink_platform_impl.cc",
|
||||||
"ppapi_blink_platform_impl.h",
|
"ppapi_blink_platform_impl.h",
|
||||||
"ppapi_broker_main.cc",
|
|
||||||
"ppapi_plugin_main.cc",
|
"ppapi_plugin_main.cc",
|
||||||
"ppapi_thread.cc",
|
"ppapi_thread.cc",
|
||||||
"ppapi_thread.h",
|
"ppapi_thread.h",
|
||||||
|
@@ -1,41 +0,0 @@
|
|||||||
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "base/run_loop.h"
|
|
||||||
#include "base/task/single_thread_task_executor.h"
|
|
||||||
#include "base/threading/platform_thread.h"
|
|
||||||
#include "build/build_config.h"
|
|
||||||
#include "content/child/child_process.h"
|
|
||||||
#include "content/common/content_constants_internal.h"
|
|
||||||
#include "content/common/content_switches_internal.h"
|
|
||||||
#include "content/ppapi_plugin/ppapi_thread.h"
|
|
||||||
#include "content/public/common/content_switches.h"
|
|
||||||
#include "content/public/common/main_function_params.h"
|
|
||||||
|
|
||||||
namespace content {
|
|
||||||
|
|
||||||
// Main function for starting the PPAPI broker process.
|
|
||||||
int PpapiBrokerMain(const MainFunctionParams& parameters) {
|
|
||||||
const base::CommandLine& command_line = parameters.command_line;
|
|
||||||
if (command_line.HasSwitch(switches::kPpapiStartupDialog))
|
|
||||||
WaitForDebugger("PpapiBroker");
|
|
||||||
|
|
||||||
base::SingleThreadTaskExecutor main_thread_task_executor;
|
|
||||||
base::PlatformThread::SetName("CrPPAPIBrokerMain");
|
|
||||||
base::trace_event::TraceLog::GetInstance()->set_process_name(
|
|
||||||
"PPAPI Broker Process");
|
|
||||||
base::trace_event::TraceLog::GetInstance()->SetProcessSortIndex(
|
|
||||||
kTraceEventPpapiBrokerProcessSortIndex);
|
|
||||||
|
|
||||||
ChildProcess ppapi_broker_process;
|
|
||||||
base::RunLoop run_loop;
|
|
||||||
ppapi_broker_process.set_main_thread(new PpapiThread(
|
|
||||||
run_loop.QuitClosure(), parameters.command_line, true /* Broker */));
|
|
||||||
|
|
||||||
run_loop.Run();
|
|
||||||
DVLOG(1) << "PpapiBrokerMain exiting";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace content
|
|
@@ -128,9 +128,8 @@ int PpapiPluginMain(const MainFunctionParams& parameters) {
|
|||||||
|
|
||||||
ChildProcess ppapi_process;
|
ChildProcess ppapi_process;
|
||||||
base::RunLoop run_loop;
|
base::RunLoop run_loop;
|
||||||
ppapi_process.set_main_thread(new PpapiThread(run_loop.QuitClosure(),
|
ppapi_process.set_main_thread(
|
||||||
parameters.command_line,
|
new PpapiThread(run_loop.QuitClosure(), parameters.command_line));
|
||||||
false /* Not a broker */));
|
|
||||||
|
|
||||||
#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MAC)
|
#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MAC)
|
||||||
// Startup tracing is usually enabled earlier, but if we forked from a zygote,
|
// Startup tracing is usually enabled earlier, but if we forked from a zygote,
|
||||||
|
@@ -86,32 +86,22 @@ static void WarmupWindowsLocales(const ppapi::PpapiPermissions& permissions) {
|
|||||||
|
|
||||||
namespace content {
|
namespace content {
|
||||||
|
|
||||||
typedef int32_t (*InitializeBrokerFunc)
|
|
||||||
(PP_ConnectInstance_Func* connect_instance_func);
|
|
||||||
|
|
||||||
PpapiThread::PpapiThread(base::RepeatingClosure quit_closure,
|
PpapiThread::PpapiThread(base::RepeatingClosure quit_closure,
|
||||||
const base::CommandLine& command_line,
|
const base::CommandLine& command_line)
|
||||||
bool is_broker)
|
|
||||||
: ChildThreadImpl(std::move(quit_closure)),
|
: ChildThreadImpl(std::move(quit_closure)),
|
||||||
is_broker_(is_broker),
|
|
||||||
plugin_globals_(GetIOTaskRunner()),
|
plugin_globals_(GetIOTaskRunner()),
|
||||||
connect_instance_func_(nullptr),
|
|
||||||
local_pp_module_(base::RandInt(0, std::numeric_limits<PP_Module>::max())),
|
local_pp_module_(base::RandInt(0, std::numeric_limits<PP_Module>::max())),
|
||||||
next_plugin_dispatcher_id_(1) {
|
next_plugin_dispatcher_id_(1) {
|
||||||
plugin_globals_.SetPluginProxyDelegate(this);
|
plugin_globals_.SetPluginProxyDelegate(this);
|
||||||
plugin_globals_.set_command_line(
|
|
||||||
command_line.GetSwitchValueASCII(switches::kPpapiFlashArgs));
|
|
||||||
|
|
||||||
blink_platform_impl_.reset(new PpapiBlinkPlatformImpl);
|
blink_platform_impl_.reset(new PpapiBlinkPlatformImpl);
|
||||||
blink::Platform::CreateMainThreadAndInitialize(blink_platform_impl_.get());
|
blink::Platform::CreateMainThreadAndInitialize(blink_platform_impl_.get());
|
||||||
|
|
||||||
if (!is_broker_) {
|
|
||||||
scoped_refptr<ppapi::proxy::PluginMessageFilter> plugin_filter(
|
scoped_refptr<ppapi::proxy::PluginMessageFilter> plugin_filter(
|
||||||
new ppapi::proxy::PluginMessageFilter(
|
new ppapi::proxy::PluginMessageFilter(
|
||||||
nullptr, plugin_globals_.resource_reply_thread_registrar()));
|
nullptr, plugin_globals_.resource_reply_thread_registrar()));
|
||||||
channel()->AddFilter(plugin_filter.get());
|
channel()->AddFilter(plugin_filter.get());
|
||||||
plugin_globals_.RegisterResourceMessageFilters(plugin_filter.get());
|
plugin_globals_.RegisterResourceMessageFilters(plugin_filter.get());
|
||||||
}
|
|
||||||
|
|
||||||
// In single process, browser main loop set up the discardable memory
|
// In single process, browser main loop set up the discardable memory
|
||||||
// allocator.
|
// allocator.
|
||||||
@@ -167,10 +157,6 @@ bool PpapiThread::OnControlMessageReceived(const IPC::Message& msg) {
|
|||||||
|
|
||||||
void PpapiThread::OnChannelConnected(int32_t peer_pid) {
|
void PpapiThread::OnChannelConnected(int32_t peer_pid) {
|
||||||
ChildThreadImpl::OnChannelConnected(peer_pid);
|
ChildThreadImpl::OnChannelConnected(peer_pid);
|
||||||
#if defined(OS_WIN)
|
|
||||||
if (is_broker_)
|
|
||||||
peer_handle_.Set(::OpenProcess(PROCESS_DUP_HANDLE, FALSE, peer_pid));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
base::SingleThreadTaskRunner* PpapiThread::GetIPCTaskRunner() {
|
base::SingleThreadTaskRunner* PpapiThread::GetIPCTaskRunner() {
|
||||||
@@ -313,16 +299,12 @@ void PpapiThread::OnLoadPlugin(const base::FilePath& path,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The ShutdownModule/ShutdownBroker function is optional.
|
// The ShutdownModule function is optional.
|
||||||
plugin_entry_points_.shutdown_module =
|
plugin_entry_points_.shutdown_module =
|
||||||
is_broker_ ?
|
|
||||||
reinterpret_cast<PP_ShutdownModule_Func>(
|
|
||||||
library.GetFunctionPointer("PPP_ShutdownBroker")) :
|
|
||||||
reinterpret_cast<PP_ShutdownModule_Func>(
|
reinterpret_cast<PP_ShutdownModule_Func>(
|
||||||
library.GetFunctionPointer("PPP_ShutdownModule"));
|
library.GetFunctionPointer("PPP_ShutdownModule"));
|
||||||
|
|
||||||
if (!is_broker_) {
|
// Get the InitializeModule function.
|
||||||
// Get the InitializeModule function (required for non-broker code).
|
|
||||||
plugin_entry_points_.initialize_module =
|
plugin_entry_points_.initialize_module =
|
||||||
reinterpret_cast<PP_InitializeModule_Func>(
|
reinterpret_cast<PP_InitializeModule_Func>(
|
||||||
library.GetFunctionPointer("PPP_InitializeModule"));
|
library.GetFunctionPointer("PPP_InitializeModule"));
|
||||||
@@ -331,7 +313,6 @@ void PpapiThread::OnLoadPlugin(const base::FilePath& path,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
#if defined(OS_WIN)
|
||||||
// If code subsequently tries to exit using abort(), force a crash (since
|
// If code subsequently tries to exit using abort(), force a crash (since
|
||||||
@@ -372,33 +353,12 @@ void PpapiThread::OnLoadPlugin(const base::FilePath& path,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (is_broker_) {
|
|
||||||
// Get the InitializeBroker function (required).
|
|
||||||
InitializeBrokerFunc init_broker =
|
|
||||||
reinterpret_cast<InitializeBrokerFunc>(
|
|
||||||
library.GetFunctionPointer("PPP_InitializeBroker"));
|
|
||||||
if (!init_broker) {
|
|
||||||
LOG(WARNING) << "No PPP_InitializeBroker in plugin library";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t init_error = init_broker(&connect_instance_func_);
|
|
||||||
if (init_error != PP_OK) {
|
|
||||||
LOG(WARNING) << "InitBroker failed with error " << init_error;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!connect_instance_func_) {
|
|
||||||
LOG(WARNING) << "InitBroker did not provide PP_ConnectInstance_Func";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
int32_t init_error = plugin_entry_points_.initialize_module(
|
int32_t init_error = plugin_entry_points_.initialize_module(
|
||||||
local_pp_module_, &ppapi::proxy::PluginDispatcher::GetBrowserInterface);
|
local_pp_module_, &ppapi::proxy::PluginDispatcher::GetBrowserInterface);
|
||||||
if (init_error != PP_OK) {
|
if (init_error != PP_OK) {
|
||||||
LOG(WARNING) << "InitModule failed with error " << init_error;
|
LOG(WARNING) << "InitModule failed with error " << init_error;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Initialization succeeded, so keep the plugin DLL loaded.
|
// Initialization succeeded, so keep the plugin DLL loaded.
|
||||||
library_ = std::move(library);
|
library_ = std::move(library);
|
||||||
@@ -453,12 +413,10 @@ bool PpapiThread::SetupChannel(base::ProcessId renderer_pid,
|
|||||||
int renderer_child_id,
|
int renderer_child_id,
|
||||||
bool incognito,
|
bool incognito,
|
||||||
IPC::ChannelHandle* handle) {
|
IPC::ChannelHandle* handle) {
|
||||||
DCHECK(is_broker_ == (connect_instance_func_ != nullptr));
|
|
||||||
mojo::MessagePipe pipe;
|
mojo::MessagePipe pipe;
|
||||||
|
|
||||||
ppapi::proxy::ProxyChannel* dispatcher = nullptr;
|
ppapi::proxy::ProxyChannel* dispatcher = nullptr;
|
||||||
bool init_result = false;
|
bool init_result = false;
|
||||||
DCHECK(!is_broker_);
|
|
||||||
DCHECK_NE(base::kNullProcessId, renderer_pid);
|
DCHECK_NE(base::kNullProcessId, renderer_pid);
|
||||||
PluginProcessDispatcher* plugin_dispatcher = new PluginProcessDispatcher(
|
PluginProcessDispatcher* plugin_dispatcher = new PluginProcessDispatcher(
|
||||||
plugin_entry_points_.get_interface, permissions_, incognito);
|
plugin_entry_points_.get_interface, permissions_, incognito);
|
||||||
|
@@ -19,7 +19,6 @@
|
|||||||
#include "content/child/child_thread_impl.h"
|
#include "content/child/child_thread_impl.h"
|
||||||
#include "content/public/common/pepper_plugin_info.h"
|
#include "content/public/common/pepper_plugin_info.h"
|
||||||
#include "ppapi/c/pp_module.h"
|
#include "ppapi/c/pp_module.h"
|
||||||
#include "ppapi/c/trusted/ppp_broker.h"
|
|
||||||
#include "ppapi/proxy/connection.h"
|
#include "ppapi/proxy/connection.h"
|
||||||
#include "ppapi/proxy/plugin_dispatcher.h"
|
#include "ppapi/proxy/plugin_dispatcher.h"
|
||||||
#include "ppapi/proxy/plugin_globals.h"
|
#include "ppapi/proxy/plugin_globals.h"
|
||||||
@@ -51,8 +50,7 @@ class PpapiThread : public ChildThreadImpl,
|
|||||||
public ppapi::proxy::PluginProxyDelegate {
|
public ppapi::proxy::PluginProxyDelegate {
|
||||||
public:
|
public:
|
||||||
PpapiThread(base::RepeatingClosure quit_closure,
|
PpapiThread(base::RepeatingClosure quit_closure,
|
||||||
const base::CommandLine& command_line,
|
const base::CommandLine& command_line);
|
||||||
bool is_broker);
|
|
||||||
~PpapiThread() override;
|
~PpapiThread() override;
|
||||||
void Shutdown() override;
|
void Shutdown() override;
|
||||||
|
|
||||||
@@ -113,9 +111,6 @@ class PpapiThread : public ChildThreadImpl,
|
|||||||
// Sets up the name of the plugin for logging using the given path.
|
// Sets up the name of the plugin for logging using the given path.
|
||||||
void SavePluginName(const base::FilePath& path);
|
void SavePluginName(const base::FilePath& path);
|
||||||
|
|
||||||
// True if running in a broker process rather than a normal plugin process.
|
|
||||||
bool is_broker_;
|
|
||||||
|
|
||||||
base::ScopedNativeLibrary library_;
|
base::ScopedNativeLibrary library_;
|
||||||
|
|
||||||
ppapi::PpapiPermissions permissions_;
|
ppapi::PpapiPermissions permissions_;
|
||||||
@@ -126,10 +121,6 @@ class PpapiThread : public ChildThreadImpl,
|
|||||||
// Storage for plugin entry points.
|
// Storage for plugin entry points.
|
||||||
PepperPluginInfo::EntryPoints plugin_entry_points_;
|
PepperPluginInfo::EntryPoints plugin_entry_points_;
|
||||||
|
|
||||||
// Callback to call when a new instance connects to the broker.
|
|
||||||
// Used only when is_broker_.
|
|
||||||
PP_ConnectInstance_Func connect_instance_func_;
|
|
||||||
|
|
||||||
// Local concept of the module ID. Some functions take this. It's necessary
|
// Local concept of the module ID. Some functions take this. It's necessary
|
||||||
// for the in-process PPAPI to handle this properly, but for proxied it's
|
// for the in-process PPAPI to handle this properly, but for proxied it's
|
||||||
// unnecessary. The proxy talking to multiple renderers means that each
|
// unnecessary. The proxy talking to multiple renderers means that each
|
||||||
@@ -148,11 +139,6 @@ class PpapiThread : public ChildThreadImpl,
|
|||||||
// The BlinkPlatformImpl implementation.
|
// The BlinkPlatformImpl implementation.
|
||||||
std::unique_ptr<PpapiBlinkPlatformImpl> blink_platform_impl_;
|
std::unique_ptr<PpapiBlinkPlatformImpl> blink_platform_impl_;
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
// Caches the handle to the peer process if this is a broker.
|
|
||||||
base::win::ScopedHandle peer_handle_;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
std::unique_ptr<discardable_memory::ClientDiscardableSharedMemoryManager>
|
std::unique_ptr<discardable_memory::ClientDiscardableSharedMemoryManager>
|
||||||
discardable_shared_memory_manager_;
|
discardable_shared_memory_manager_;
|
||||||
|
|
||||||
|
@@ -584,12 +584,6 @@ const char kNumRasterThreads[] = "num-raster-threads";
|
|||||||
const char kOverridePluginPowerSaverForTesting[] =
|
const char kOverridePluginPowerSaverForTesting[] =
|
||||||
"override-plugin-power-saver-for-testing";
|
"override-plugin-power-saver-for-testing";
|
||||||
|
|
||||||
// Argument to the process type that indicates a PPAPI broker process type.
|
|
||||||
const char kPpapiBrokerProcess[] = "ppapi-broker";
|
|
||||||
|
|
||||||
// "Command-line" arguments for the PPAPI Flash; used for debugging options.
|
|
||||||
const char kPpapiFlashArgs[] = "ppapi-flash-args";
|
|
||||||
|
|
||||||
// Runs PPAPI (Pepper) plugins in-process.
|
// Runs PPAPI (Pepper) plugins in-process.
|
||||||
const char kPpapiInProcess[] = "ppapi-in-process";
|
const char kPpapiInProcess[] = "ppapi-in-process";
|
||||||
|
|
||||||
|
@@ -172,8 +172,6 @@ CONTENT_EXPORT extern const char kNoZygote[];
|
|||||||
extern const char kNoV8UntrustedCodeMitigations[];
|
extern const char kNoV8UntrustedCodeMitigations[];
|
||||||
CONTENT_EXPORT extern const char kNumRasterThreads[];
|
CONTENT_EXPORT extern const char kNumRasterThreads[];
|
||||||
CONTENT_EXPORT extern const char kOverridePluginPowerSaverForTesting[];
|
CONTENT_EXPORT extern const char kOverridePluginPowerSaverForTesting[];
|
||||||
CONTENT_EXPORT extern const char kPpapiBrokerProcess[];
|
|
||||||
CONTENT_EXPORT extern const char kPpapiFlashArgs[];
|
|
||||||
CONTENT_EXPORT extern const char kPpapiInProcess[];
|
CONTENT_EXPORT extern const char kPpapiInProcess[];
|
||||||
extern const char kPpapiPluginLauncher[];
|
extern const char kPpapiPluginLauncher[];
|
||||||
CONTENT_EXPORT extern const char kPpapiPluginProcess[];
|
CONTENT_EXPORT extern const char kPpapiPluginProcess[];
|
||||||
|
@@ -466,8 +466,6 @@ target(link_target_type, "renderer") {
|
|||||||
"pepper/pepper_audio_input_host.h",
|
"pepper/pepper_audio_input_host.h",
|
||||||
"pepper/pepper_audio_output_host.cc",
|
"pepper/pepper_audio_output_host.cc",
|
||||||
"pepper/pepper_audio_output_host.h",
|
"pepper/pepper_audio_output_host.h",
|
||||||
"pepper/pepper_broker.cc",
|
|
||||||
"pepper/pepper_broker.h",
|
|
||||||
"pepper/pepper_browser_connection.cc",
|
"pepper/pepper_browser_connection.cc",
|
||||||
"pepper/pepper_browser_connection.h",
|
"pepper/pepper_browser_connection.h",
|
||||||
"pepper/pepper_camera_device_host.cc",
|
"pepper/pepper_camera_device_host.cc",
|
||||||
@@ -532,8 +530,6 @@ target(link_target_type, "renderer") {
|
|||||||
"pepper/ppapi_preferences_builder.h",
|
"pepper/ppapi_preferences_builder.h",
|
||||||
"pepper/ppb_audio_impl.cc",
|
"pepper/ppb_audio_impl.cc",
|
||||||
"pepper/ppb_audio_impl.h",
|
"pepper/ppb_audio_impl.h",
|
||||||
"pepper/ppb_broker_impl.cc",
|
|
||||||
"pepper/ppb_broker_impl.h",
|
|
||||||
"pepper/ppb_buffer_impl.cc",
|
"pepper/ppb_buffer_impl.cc",
|
||||||
"pepper/ppb_buffer_impl.h",
|
"pepper/ppb_buffer_impl.h",
|
||||||
"pepper/ppb_graphics_3d_impl.cc",
|
"pepper/ppb_graphics_3d_impl.cc",
|
||||||
|
@@ -133,11 +133,6 @@ PP_Module HostGlobals::GetModuleForInstance(PP_Instance instance) {
|
|||||||
return inst->module()->pp_module();
|
return inst->module()->pp_module();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string HostGlobals::GetCmdLine() {
|
|
||||||
return base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
|
|
||||||
switches::kPpapiFlashArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void HostGlobals::PreCacheFontForFlash(const void* logfontw) {
|
void HostGlobals::PreCacheFontForFlash(const void* logfontw) {
|
||||||
// Not implemented in-process.
|
// Not implemented in-process.
|
||||||
}
|
}
|
||||||
|
@@ -40,7 +40,6 @@ class HostGlobals : public ppapi::PpapiGlobals {
|
|||||||
ppapi::thunk::ResourceCreationAPI* GetResourceCreationAPI(
|
ppapi::thunk::ResourceCreationAPI* GetResourceCreationAPI(
|
||||||
PP_Instance instance) override;
|
PP_Instance instance) override;
|
||||||
PP_Module GetModuleForInstance(PP_Instance instance) override;
|
PP_Module GetModuleForInstance(PP_Instance instance) override;
|
||||||
std::string GetCmdLine() override;
|
|
||||||
void PreCacheFontForFlash(const void* logfontw) override;
|
void PreCacheFontForFlash(const void* logfontw) override;
|
||||||
void LogWithSource(PP_Instance instance,
|
void LogWithSource(PP_Instance instance,
|
||||||
PP_LogLevel level,
|
PP_LogLevel level,
|
||||||
|
@@ -1,254 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "content/renderer/pepper/pepper_broker.h"
|
|
||||||
|
|
||||||
#include "build/build_config.h"
|
|
||||||
#include "content/renderer/pepper/pepper_proxy_channel_delegate_impl.h"
|
|
||||||
#include "content/renderer/pepper/plugin_module.h"
|
|
||||||
#include "content/renderer/pepper/ppb_broker_impl.h"
|
|
||||||
#include "content/renderer/pepper/renderer_restrict_dispatch_group.h"
|
|
||||||
#include "ipc/ipc_channel_handle.h"
|
|
||||||
#include "ppapi/proxy/broker_dispatcher.h"
|
|
||||||
#include "ppapi/proxy/ppapi_messages.h"
|
|
||||||
#include "ppapi/shared_impl/platform_file.h"
|
|
||||||
|
|
||||||
#if defined(OS_POSIX)
|
|
||||||
#include "base/posix/eintr_wrapper.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
#include <windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace content {
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
base::SyncSocket::Handle DuplicateHandle(base::SyncSocket::Handle handle) {
|
|
||||||
base::SyncSocket::Handle out_handle = base::SyncSocket::kInvalidHandle;
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
DWORD options = DUPLICATE_SAME_ACCESS;
|
|
||||||
if (!::DuplicateHandle(::GetCurrentProcess(),
|
|
||||||
handle,
|
|
||||||
::GetCurrentProcess(),
|
|
||||||
&out_handle,
|
|
||||||
0,
|
|
||||||
FALSE,
|
|
||||||
options)) {
|
|
||||||
out_handle = base::SyncSocket::kInvalidHandle;
|
|
||||||
}
|
|
||||||
#elif defined(OS_POSIX)
|
|
||||||
// If asked to close the source, we can simply re-use the source fd instead of
|
|
||||||
// dup()ing and close()ing.
|
|
||||||
out_handle = HANDLE_EINTR(::dup(handle));
|
|
||||||
#else
|
|
||||||
#error Not implemented.
|
|
||||||
#endif
|
|
||||||
return out_handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
PepperBrokerDispatcherWrapper::PepperBrokerDispatcherWrapper() {}
|
|
||||||
|
|
||||||
PepperBrokerDispatcherWrapper::~PepperBrokerDispatcherWrapper() {}
|
|
||||||
|
|
||||||
bool PepperBrokerDispatcherWrapper::Init(
|
|
||||||
base::ProcessId broker_pid,
|
|
||||||
const IPC::ChannelHandle& channel_handle) {
|
|
||||||
if (!channel_handle.is_mojo_channel_handle())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
dispatcher_delegate_.reset(new PepperProxyChannelDelegateImpl);
|
|
||||||
dispatcher_.reset(new ppapi::proxy::BrokerHostDispatcher());
|
|
||||||
|
|
||||||
if (!dispatcher_->InitBrokerWithChannel(dispatcher_delegate_.get(),
|
|
||||||
broker_pid,
|
|
||||||
channel_handle,
|
|
||||||
true)) { // Client.
|
|
||||||
dispatcher_.reset();
|
|
||||||
dispatcher_delegate_.reset();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
dispatcher_->channel()->SetRestrictDispatchChannelGroup(
|
|
||||||
kRendererRestrictDispatchGroup_Pepper);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Does not take ownership of the local pipe.
|
|
||||||
int32_t PepperBrokerDispatcherWrapper::SendHandleToBroker(
|
|
||||||
PP_Instance instance,
|
|
||||||
base::SyncSocket::Handle handle) {
|
|
||||||
IPC::PlatformFileForTransit foreign_socket_handle =
|
|
||||||
dispatcher_->ShareHandleWithRemote(handle, false);
|
|
||||||
if (foreign_socket_handle == IPC::InvalidPlatformFileForTransit())
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
|
|
||||||
int32_t result = PP_ERROR_FAILED;
|
|
||||||
if (!dispatcher_->Send(new PpapiMsg_ConnectToPlugin(
|
|
||||||
instance, foreign_socket_handle, &result))) {
|
|
||||||
// The plugin did not receive the handle, so it must be closed.
|
|
||||||
// The easiest way to clean it up is to just put it in an object
|
|
||||||
// and then close it. This failure case is not performance critical.
|
|
||||||
// The handle could still leak if Send succeeded but the IPC later failed.
|
|
||||||
base::SyncSocket temp_socket(
|
|
||||||
IPC::PlatformFileForTransitToPlatformFile(foreign_socket_handle));
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
PepperBroker::PepperBroker(PluginModule* plugin_module)
|
|
||||||
: plugin_module_(plugin_module) {
|
|
||||||
DCHECK(plugin_module_);
|
|
||||||
|
|
||||||
plugin_module_->SetBroker(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
PepperBroker::~PepperBroker() {
|
|
||||||
ReportFailureToClients(PP_ERROR_ABORTED);
|
|
||||||
plugin_module_->SetBroker(nullptr);
|
|
||||||
plugin_module_ = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the channel is not ready, queue the connection.
|
|
||||||
void PepperBroker::AddPendingConnect(PPB_Broker_Impl* client) {
|
|
||||||
DCHECK(pending_connects_.find(client) == pending_connects_.end())
|
|
||||||
<< "Connect was already called for this client";
|
|
||||||
|
|
||||||
// Ensure this object and the associated broker exist as long as the
|
|
||||||
// client exists. There is a corresponding Release() call in Disconnect(),
|
|
||||||
// which is called when the PPB_Broker_Impl is destroyed. The only other
|
|
||||||
// possible reference is in pending_connect_broker_, which only holds a
|
|
||||||
// transient reference. This ensures the broker is available as long as the
|
|
||||||
// plugin needs it and allows the plugin to release the broker when it is no
|
|
||||||
// longer using it.
|
|
||||||
AddRef();
|
|
||||||
|
|
||||||
pending_connects_[client].client = client->AsWeakPtr();
|
|
||||||
}
|
|
||||||
|
|
||||||
void PepperBroker::Disconnect(PPB_Broker_Impl* client) {
|
|
||||||
// Remove the pending connect if one exists. This class will not call client's
|
|
||||||
// callback.
|
|
||||||
pending_connects_.erase(client);
|
|
||||||
|
|
||||||
// TODO(ddorwin): Send message disconnect message using dispatcher_.
|
|
||||||
|
|
||||||
// Release the reference added in Connect().
|
|
||||||
// This must be the last statement because it may delete this object.
|
|
||||||
Release();
|
|
||||||
}
|
|
||||||
|
|
||||||
void PepperBroker::OnBrokerChannelConnected(
|
|
||||||
base::ProcessId broker_pid,
|
|
||||||
const IPC::ChannelHandle& channel_handle) {
|
|
||||||
std::unique_ptr<PepperBrokerDispatcherWrapper> dispatcher(
|
|
||||||
new PepperBrokerDispatcherWrapper);
|
|
||||||
if (!dispatcher->Init(broker_pid, channel_handle)) {
|
|
||||||
ReportFailureToClients(PP_ERROR_FAILED);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dispatcher_.reset(dispatcher.release());
|
|
||||||
|
|
||||||
// Process all pending channel requests from the plugins.
|
|
||||||
for (auto i = pending_connects_.begin(); i != pending_connects_.end();) {
|
|
||||||
base::WeakPtr<PPB_Broker_Impl>& weak_ptr = i->second.client;
|
|
||||||
if (!i->second.is_authorized) {
|
|
||||||
++i;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (weak_ptr.get())
|
|
||||||
ConnectPluginToBroker(weak_ptr.get());
|
|
||||||
|
|
||||||
pending_connects_.erase(i++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PepperBroker::OnBrokerPermissionResult(PPB_Broker_Impl* client,
|
|
||||||
bool result) {
|
|
||||||
auto entry = pending_connects_.find(client);
|
|
||||||
if (entry == pending_connects_.end())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!entry->second.client.get()) {
|
|
||||||
// Client has gone away.
|
|
||||||
pending_connects_.erase(entry);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!result) {
|
|
||||||
// Report failure.
|
|
||||||
client->BrokerConnected(
|
|
||||||
ppapi::PlatformFileToInt(base::SyncSocket::kInvalidHandle),
|
|
||||||
PP_ERROR_NOACCESS);
|
|
||||||
pending_connects_.erase(entry);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dispatcher_) {
|
|
||||||
ConnectPluginToBroker(client);
|
|
||||||
pending_connects_.erase(entry);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mark the request as authorized, continue waiting for the broker
|
|
||||||
// connection.
|
|
||||||
DCHECK(!entry->second.is_authorized);
|
|
||||||
entry->second.is_authorized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
PepperBroker::PendingConnection::PendingConnection() : is_authorized(false) {}
|
|
||||||
|
|
||||||
PepperBroker::PendingConnection::PendingConnection(
|
|
||||||
const PendingConnection& other) = default;
|
|
||||||
|
|
||||||
PepperBroker::PendingConnection::~PendingConnection() {}
|
|
||||||
|
|
||||||
void PepperBroker::ReportFailureToClients(int error_code) {
|
|
||||||
DCHECK_NE(PP_OK, error_code);
|
|
||||||
for (auto i = pending_connects_.begin(); i != pending_connects_.end(); ++i) {
|
|
||||||
base::WeakPtr<PPB_Broker_Impl>& weak_ptr = i->second.client;
|
|
||||||
if (weak_ptr.get()) {
|
|
||||||
weak_ptr->BrokerConnected(
|
|
||||||
ppapi::PlatformFileToInt(base::SyncSocket::kInvalidHandle),
|
|
||||||
error_code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pending_connects_.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void PepperBroker::ConnectPluginToBroker(PPB_Broker_Impl* client) {
|
|
||||||
base::SyncSocket::Handle plugin_handle = base::SyncSocket::kInvalidHandle;
|
|
||||||
int32_t result = PP_OK;
|
|
||||||
|
|
||||||
// The socket objects will be deleted when this function exits, closing the
|
|
||||||
// handles. Any uses of the socket must duplicate them.
|
|
||||||
std::unique_ptr<base::SyncSocket> broker_socket(new base::SyncSocket());
|
|
||||||
std::unique_ptr<base::SyncSocket> plugin_socket(new base::SyncSocket());
|
|
||||||
if (base::SyncSocket::CreatePair(broker_socket.get(), plugin_socket.get())) {
|
|
||||||
result = dispatcher_->SendHandleToBroker(client->pp_instance(),
|
|
||||||
broker_socket->handle());
|
|
||||||
|
|
||||||
// If the broker has its pipe handle, duplicate the plugin's handle.
|
|
||||||
// Otherwise, the plugin's handle will be automatically closed.
|
|
||||||
if (result == PP_OK)
|
|
||||||
plugin_handle = DuplicateHandle(plugin_socket->handle());
|
|
||||||
} else {
|
|
||||||
result = PP_ERROR_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO(ddorwin): Change the IPC to asynchronous: Queue an object containing
|
|
||||||
// client and plugin_socket.release(), then return.
|
|
||||||
// That message handler will then call client->BrokerConnected() with the
|
|
||||||
// saved pipe handle.
|
|
||||||
// Temporarily, just call back.
|
|
||||||
client->BrokerConnected(ppapi::PlatformFileToInt(plugin_handle), result);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace content
|
|
@@ -1,107 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#ifndef CONTENT_RENDERER_PEPPER_PEPPER_BROKER_H_
|
|
||||||
#define CONTENT_RENDERER_PEPPER_PEPPER_BROKER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "base/macros.h"
|
|
||||||
#include "base/memory/ref_counted.h"
|
|
||||||
#include "base/process/process.h"
|
|
||||||
#include "base/sync_socket.h"
|
|
||||||
#include "content/common/content_export.h"
|
|
||||||
#include "content/renderer/pepper/ppb_broker_impl.h"
|
|
||||||
#include "ppapi/proxy/proxy_channel.h"
|
|
||||||
|
|
||||||
namespace IPC {
|
|
||||||
struct ChannelHandle;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace ppapi {
|
|
||||||
namespace proxy {
|
|
||||||
class BrokerDispatcher;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace content {
|
|
||||||
|
|
||||||
class PluginModule;
|
|
||||||
|
|
||||||
// This object is NOT thread-safe.
|
|
||||||
class CONTENT_EXPORT PepperBrokerDispatcherWrapper {
|
|
||||||
public:
|
|
||||||
PepperBrokerDispatcherWrapper();
|
|
||||||
~PepperBrokerDispatcherWrapper();
|
|
||||||
|
|
||||||
bool Init(base::ProcessId broker_pid,
|
|
||||||
const IPC::ChannelHandle& channel_handle);
|
|
||||||
|
|
||||||
int32_t SendHandleToBroker(PP_Instance instance,
|
|
||||||
base::SyncSocket::Handle handle);
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::unique_ptr<ppapi::proxy::BrokerDispatcher> dispatcher_;
|
|
||||||
std::unique_ptr<ppapi::proxy::ProxyChannel::Delegate> dispatcher_delegate_;
|
|
||||||
};
|
|
||||||
|
|
||||||
class PepperBroker : public base::RefCountedThreadSafe<PepperBroker> {
|
|
||||||
public:
|
|
||||||
explicit PepperBroker(PluginModule* plugin_module);
|
|
||||||
|
|
||||||
// Decrements the references to the broker.
|
|
||||||
// When there are no more references, this renderer's dispatcher is
|
|
||||||
// destroyed, allowing the broker to shutdown if appropriate.
|
|
||||||
// Callers should not reference this object after calling Disconnect().
|
|
||||||
void Disconnect(PPB_Broker_Impl* client);
|
|
||||||
|
|
||||||
// Adds a pending connection to the broker. Balances out Disconnect() calls.
|
|
||||||
void AddPendingConnect(PPB_Broker_Impl* client);
|
|
||||||
|
|
||||||
// Called when the channel to the broker has been established.
|
|
||||||
void OnBrokerChannelConnected(base::ProcessId broker_pid,
|
|
||||||
const IPC::ChannelHandle& channel_handle);
|
|
||||||
|
|
||||||
// Called when we know whether permission to access the PPAPI broker was
|
|
||||||
// granted.
|
|
||||||
void OnBrokerPermissionResult(PPB_Broker_Impl* client, bool result);
|
|
||||||
|
|
||||||
private:
|
|
||||||
friend class base::RefCountedThreadSafe<PepperBroker>;
|
|
||||||
|
|
||||||
struct PendingConnection {
|
|
||||||
PendingConnection();
|
|
||||||
PendingConnection(const PendingConnection& other);
|
|
||||||
~PendingConnection();
|
|
||||||
|
|
||||||
bool is_authorized;
|
|
||||||
base::WeakPtr<PPB_Broker_Impl> client;
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual ~PepperBroker();
|
|
||||||
|
|
||||||
// Reports failure to all clients that had pending operations.
|
|
||||||
void ReportFailureToClients(int error_code);
|
|
||||||
|
|
||||||
// Connects the plugin to the broker via a pipe.
|
|
||||||
void ConnectPluginToBroker(PPB_Broker_Impl* client);
|
|
||||||
|
|
||||||
std::unique_ptr<PepperBrokerDispatcherWrapper> dispatcher_;
|
|
||||||
|
|
||||||
// A map of pointers to objects that have requested a connection to the weak
|
|
||||||
// pointer we can use to reference them. The mapping is needed so we can clean
|
|
||||||
// up entries for objects that may have been deleted.
|
|
||||||
typedef std::map<PPB_Broker_Impl*, PendingConnection> ClientMap;
|
|
||||||
ClientMap pending_connects_;
|
|
||||||
|
|
||||||
// Pointer to the associated plugin module.
|
|
||||||
// Always set and cleared at the same time as the module's pointer to this.
|
|
||||||
PluginModule* plugin_module_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(PepperBroker);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace content
|
|
||||||
|
|
||||||
#endif // CONTENT_RENDERER_PEPPER_PEPPER_BROKER_H_
|
|
@@ -1,51 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "content/renderer/pepper/pepper_broker.h"
|
|
||||||
|
|
||||||
#if defined(OS_POSIX)
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#endif // defined(OS_POSIX)
|
|
||||||
|
|
||||||
#include "base/test/task_environment.h"
|
|
||||||
#include "build/build_config.h"
|
|
||||||
#include "content/renderer/render_process.h"
|
|
||||||
#include "testing/gtest/include/gtest/gtest.h"
|
|
||||||
|
|
||||||
namespace content {
|
|
||||||
|
|
||||||
class PepperBrokerTest : public ::testing::Test {
|
|
||||||
protected:
|
|
||||||
PepperBrokerTest()
|
|
||||||
: task_environment_(base::test::TaskEnvironment::MainThreadType::IO) {}
|
|
||||||
base::test::TaskEnvironment task_environment_;
|
|
||||||
// We need a render process for ppapi::proxy::ProxyChannel to work.
|
|
||||||
RenderProcess process_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Try to initialize PepperBrokerDispatcherWrapper with invalid ChannelHandle.
|
|
||||||
// Initialization should fail.
|
|
||||||
TEST_F(PepperBrokerTest, InitFailure) {
|
|
||||||
PepperBrokerDispatcherWrapper dispatcher_wrapper;
|
|
||||||
IPC::ChannelHandle invalid_channel; // Invalid by default.
|
|
||||||
|
|
||||||
// An invalid handle should result in a failure (false) without a LOG(FATAL),
|
|
||||||
// such as the one in CreatePipe(). Call it twice because without the invalid
|
|
||||||
// handle check, the posix code would hit a one-time path due to a static
|
|
||||||
// variable and go through the LOG(FATAL) path.
|
|
||||||
EXPECT_FALSE(dispatcher_wrapper.Init(base::kNullProcessId, invalid_channel));
|
|
||||||
EXPECT_FALSE(dispatcher_wrapper.Init(base::kNullProcessId, invalid_channel));
|
|
||||||
}
|
|
||||||
|
|
||||||
// On valid ChannelHandle, initialization should succeed.
|
|
||||||
TEST_F(PepperBrokerTest, InitSuccess) {
|
|
||||||
PepperBrokerDispatcherWrapper dispatcher_wrapper;
|
|
||||||
mojo::MessagePipe pipe;
|
|
||||||
IPC::ChannelHandle valid_channel(pipe.handle0.release());
|
|
||||||
|
|
||||||
EXPECT_TRUE(dispatcher_wrapper.Init(base::kNullProcessId, valid_channel));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace content
|
|
@@ -2544,7 +2544,6 @@ ppapi::Resource* PepperPluginInstanceImpl::GetSingletonResource(
|
|||||||
ppapi::SingletonResourceID id) {
|
ppapi::SingletonResourceID id) {
|
||||||
// Flash APIs and some others aren't implemented in-process.
|
// Flash APIs and some others aren't implemented in-process.
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case ppapi::BROKER_SINGLETON_ID:
|
|
||||||
case ppapi::BROWSER_FONT_SINGLETON_ID:
|
case ppapi::BROWSER_FONT_SINGLETON_ID:
|
||||||
case ppapi::FLASH_FULLSCREEN_SINGLETON_ID:
|
case ppapi::FLASH_FULLSCREEN_SINGLETON_ID:
|
||||||
case ppapi::ISOLATED_FILESYSTEM_SINGLETON_ID:
|
case ppapi::ISOLATED_FILESYSTEM_SINGLETON_ID:
|
||||||
|
@@ -118,7 +118,6 @@
|
|||||||
#include "ppapi/c/private/ppb_udp_socket_private.h"
|
#include "ppapi/c/private/ppb_udp_socket_private.h"
|
||||||
#include "ppapi/c/private/ppb_uma_private.h"
|
#include "ppapi/c/private/ppb_uma_private.h"
|
||||||
#include "ppapi/c/private/ppb_x509_certificate_private.h"
|
#include "ppapi/c/private/ppb_x509_certificate_private.h"
|
||||||
#include "ppapi/c/trusted/ppb_broker_trusted.h"
|
|
||||||
#include "ppapi/c/trusted/ppb_browser_font_trusted.h"
|
#include "ppapi/c/trusted/ppb_browser_font_trusted.h"
|
||||||
#include "ppapi/c/trusted/ppb_char_set_trusted.h"
|
#include "ppapi/c/trusted/ppb_char_set_trusted.h"
|
||||||
#include "ppapi/c/trusted/ppb_file_chooser_trusted.h"
|
#include "ppapi/c/trusted/ppb_file_chooser_trusted.h"
|
||||||
@@ -485,7 +484,6 @@ PluginModule::PluginModule(const std::string& name,
|
|||||||
: callback_tracker_(new ppapi::CallbackTracker),
|
: callback_tracker_(new ppapi::CallbackTracker),
|
||||||
is_in_destructor_(false),
|
is_in_destructor_(false),
|
||||||
is_crashed_(false),
|
is_crashed_(false),
|
||||||
broker_(nullptr),
|
|
||||||
library_(nullptr),
|
library_(nullptr),
|
||||||
name_(name),
|
name_(name),
|
||||||
version_(version),
|
version_(version),
|
||||||
@@ -690,13 +688,6 @@ bool PluginModule::ReserveInstanceID(PP_Instance instance) {
|
|||||||
return true; // Instance ID is usable.
|
return true; // Instance ID is usable.
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginModule::SetBroker(PepperBroker* broker) {
|
|
||||||
DCHECK(!broker_ || !broker);
|
|
||||||
broker_ = broker;
|
|
||||||
}
|
|
||||||
|
|
||||||
PepperBroker* PluginModule::GetBroker() { return broker_; }
|
|
||||||
|
|
||||||
RendererPpapiHostImpl* PluginModule::CreateOutOfProcessModule(
|
RendererPpapiHostImpl* PluginModule::CreateOutOfProcessModule(
|
||||||
RenderFrameImpl* render_frame,
|
RenderFrameImpl* render_frame,
|
||||||
const base::FilePath& path,
|
const base::FilePath& path,
|
||||||
|
@@ -50,7 +50,6 @@ class WebPluginContainer;
|
|||||||
namespace content {
|
namespace content {
|
||||||
class HostDispatcherWrapper;
|
class HostDispatcherWrapper;
|
||||||
class PepperPluginInstanceImpl;
|
class PepperPluginInstanceImpl;
|
||||||
class PepperBroker;
|
|
||||||
class RendererPpapiHostImpl;
|
class RendererPpapiHostImpl;
|
||||||
class RenderFrameImpl;
|
class RenderFrameImpl;
|
||||||
struct WebPluginInfo;
|
struct WebPluginInfo;
|
||||||
@@ -183,10 +182,6 @@ class CONTENT_EXPORT PluginModule : public base::RefCounted<PluginModule>,
|
|||||||
void SetReserveInstanceIDCallback(PP_Bool (*reserve)(PP_Module, PP_Instance));
|
void SetReserveInstanceIDCallback(PP_Bool (*reserve)(PP_Module, PP_Instance));
|
||||||
bool ReserveInstanceID(PP_Instance instance);
|
bool ReserveInstanceID(PP_Instance instance);
|
||||||
|
|
||||||
// These should only be called from the main thread.
|
|
||||||
void SetBroker(PepperBroker* broker);
|
|
||||||
PepperBroker* GetBroker();
|
|
||||||
|
|
||||||
// Create a new HostDispatcher for proxying, hook it to the PluginModule,
|
// Create a new HostDispatcher for proxying, hook it to the PluginModule,
|
||||||
// and perform other common initialization.
|
// and perform other common initialization.
|
||||||
RendererPpapiHostImpl* CreateOutOfProcessModule(
|
RendererPpapiHostImpl* CreateOutOfProcessModule(
|
||||||
@@ -249,10 +244,6 @@ class CONTENT_EXPORT PluginModule : public base::RefCounted<PluginModule>,
|
|||||||
// entry_points_ aren't valid.
|
// entry_points_ aren't valid.
|
||||||
std::unique_ptr<HostDispatcherWrapper> host_dispatcher_wrapper_;
|
std::unique_ptr<HostDispatcherWrapper> host_dispatcher_wrapper_;
|
||||||
|
|
||||||
// Non-owning pointer to the broker for this plugin module, if one exists.
|
|
||||||
// It is populated and cleared in the main thread.
|
|
||||||
PepperBroker* broker_;
|
|
||||||
|
|
||||||
// Holds a reference to the base::NativeLibrary handle if this PluginModule
|
// Holds a reference to the base::NativeLibrary handle if this PluginModule
|
||||||
// instance wraps functions loaded from a library. Can be NULL. If
|
// instance wraps functions loaded from a library. Can be NULL. If
|
||||||
// |library_| is non-NULL, PluginModule will attempt to unload the library
|
// |library_| is non-NULL, PluginModule will attempt to unload the library
|
||||||
|
@@ -1,151 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "content/renderer/pepper/ppb_broker_impl.h"
|
|
||||||
|
|
||||||
#include "base/check.h"
|
|
||||||
#include "base/metrics/histogram_macros.h"
|
|
||||||
#include "content/common/frame_messages.h"
|
|
||||||
#include "content/common/view_messages.h"
|
|
||||||
#include "content/renderer/pepper/host_globals.h"
|
|
||||||
#include "content/renderer/pepper/pepper_broker.h"
|
|
||||||
#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
|
|
||||||
#include "content/renderer/pepper/plugin_module.h"
|
|
||||||
#include "content/renderer/render_thread_impl.h"
|
|
||||||
#include "content/renderer/render_view_impl.h"
|
|
||||||
#include "ppapi/c/pp_errors.h"
|
|
||||||
#include "ppapi/shared_impl/platform_file.h"
|
|
||||||
#include "third_party/blink/public/web/web_document.h"
|
|
||||||
#include "third_party/blink/public/web/web_plugin_container.h"
|
|
||||||
|
|
||||||
using ppapi::PlatformFileToInt;
|
|
||||||
using ppapi::thunk::PPB_Broker_API;
|
|
||||||
using ppapi::TrackedCallback;
|
|
||||||
|
|
||||||
namespace content {
|
|
||||||
|
|
||||||
enum class PepperBrokerAction { CREATE = 0, CONNECT = 1, NUM };
|
|
||||||
|
|
||||||
// PPB_Broker_Impl ------------------------------------------------------
|
|
||||||
|
|
||||||
PPB_Broker_Impl::PPB_Broker_Impl(PP_Instance instance)
|
|
||||||
: Resource(ppapi::OBJECT_IS_IMPL, instance),
|
|
||||||
broker_(nullptr),
|
|
||||||
connect_callback_(),
|
|
||||||
pipe_handle_(PlatformFileToInt(base::SyncSocket::kInvalidHandle)),
|
|
||||||
routing_id_(RenderThreadImpl::current()->GenerateRoutingID()) {
|
|
||||||
ChildThreadImpl::current()->GetRouter()->AddRoute(routing_id_, this);
|
|
||||||
|
|
||||||
UMA_HISTOGRAM_ENUMERATION("Pepper.BrokerAction", PepperBrokerAction::CREATE,
|
|
||||||
PepperBrokerAction::NUM);
|
|
||||||
}
|
|
||||||
|
|
||||||
PPB_Broker_Impl::~PPB_Broker_Impl() {
|
|
||||||
if (broker_) {
|
|
||||||
broker_->Disconnect(this);
|
|
||||||
broker_ = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The plugin owns the handle.
|
|
||||||
pipe_handle_ = PlatformFileToInt(base::SyncSocket::kInvalidHandle);
|
|
||||||
ChildThreadImpl::current()->GetRouter()->RemoveRoute(routing_id_);
|
|
||||||
}
|
|
||||||
|
|
||||||
PPB_Broker_API* PPB_Broker_Impl::AsPPB_Broker_API() { return this; }
|
|
||||||
|
|
||||||
int32_t PPB_Broker_Impl::Connect(
|
|
||||||
scoped_refptr<TrackedCallback> connect_callback) {
|
|
||||||
// TODO(ddorwin): Return PP_ERROR_FAILED if plugin is in-process.
|
|
||||||
|
|
||||||
if (broker_) {
|
|
||||||
// May only be called once.
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
PepperPluginInstanceImpl* plugin_instance =
|
|
||||||
HostGlobals::Get()->GetInstance(pp_instance());
|
|
||||||
if (!plugin_instance)
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
PluginModule* module = plugin_instance->module();
|
|
||||||
const base::FilePath& broker_path = module->path();
|
|
||||||
|
|
||||||
// The callback must be populated now in case we are connected to the broker
|
|
||||||
// and BrokerConnected is called before ConnectToBroker returns.
|
|
||||||
// Because it must be created now, it must be aborted and cleared if
|
|
||||||
// ConnectToBroker fails.
|
|
||||||
connect_callback_ = connect_callback;
|
|
||||||
|
|
||||||
broker_ = module->GetBroker();
|
|
||||||
if (!broker_) {
|
|
||||||
broker_ = new PepperBroker(module);
|
|
||||||
|
|
||||||
// Have the browser start the broker process for us.
|
|
||||||
RenderThreadImpl::current()->Send(
|
|
||||||
new FrameHostMsg_OpenChannelToPpapiBroker(routing_id_, broker_path));
|
|
||||||
}
|
|
||||||
|
|
||||||
RenderThreadImpl::current()->Send(
|
|
||||||
new ViewHostMsg_RequestPpapiBrokerPermission(
|
|
||||||
plugin_instance->render_frame()->render_view()->GetRoutingID(),
|
|
||||||
routing_id_,
|
|
||||||
GetDocumentUrl(),
|
|
||||||
broker_path));
|
|
||||||
|
|
||||||
// Adds a reference, ensuring that the broker is not deleted when
|
|
||||||
// |broker| goes out of scope.
|
|
||||||
broker_->AddPendingConnect(this);
|
|
||||||
|
|
||||||
return PP_OK_COMPLETIONPENDING;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t PPB_Broker_Impl::GetHandle(int32_t* handle) {
|
|
||||||
if (pipe_handle_ == PlatformFileToInt(base::SyncSocket::kInvalidHandle))
|
|
||||||
return PP_ERROR_FAILED; // Handle not set yet.
|
|
||||||
*handle = pipe_handle_;
|
|
||||||
return PP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
GURL PPB_Broker_Impl::GetDocumentUrl() {
|
|
||||||
PepperPluginInstanceImpl* plugin_instance =
|
|
||||||
HostGlobals::Get()->GetInstance(pp_instance());
|
|
||||||
return plugin_instance->container()->GetDocument().Url();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfers ownership of the handle to the plugin.
|
|
||||||
void PPB_Broker_Impl::BrokerConnected(int32_t handle, int32_t result) {
|
|
||||||
DCHECK(pipe_handle_ == PlatformFileToInt(base::SyncSocket::kInvalidHandle));
|
|
||||||
DCHECK(result == PP_OK ||
|
|
||||||
handle == PlatformFileToInt(base::SyncSocket::kInvalidHandle));
|
|
||||||
|
|
||||||
pipe_handle_ = handle;
|
|
||||||
|
|
||||||
// Synchronous calls are not supported.
|
|
||||||
DCHECK(TrackedCallback::IsPending(connect_callback_));
|
|
||||||
|
|
||||||
connect_callback_->Run(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PPB_Broker_Impl::OnMessageReceived(const IPC::Message& message) {
|
|
||||||
bool handled = true;
|
|
||||||
IPC_BEGIN_MESSAGE_MAP(PPB_Broker_Impl, message)
|
|
||||||
IPC_MESSAGE_HANDLER(ViewMsg_PpapiBrokerChannelCreated,
|
|
||||||
OnPpapiBrokerChannelCreated)
|
|
||||||
IPC_MESSAGE_HANDLER(ViewMsg_PpapiBrokerPermissionResult,
|
|
||||||
OnPpapiBrokerPermissionResult)
|
|
||||||
IPC_MESSAGE_UNHANDLED(handled = false)
|
|
||||||
IPC_END_MESSAGE_MAP()
|
|
||||||
return handled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PPB_Broker_Impl::OnPpapiBrokerChannelCreated(
|
|
||||||
base::ProcessId broker_pid,
|
|
||||||
const IPC::ChannelHandle& handle) {
|
|
||||||
broker_->OnBrokerChannelConnected(broker_pid, handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
void PPB_Broker_Impl::OnPpapiBrokerPermissionResult(bool result) {
|
|
||||||
broker_->OnBrokerPermissionResult(this, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace content
|
|
@@ -1,79 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#ifndef CONTENT_RENDERER_PEPPER_PPB_BROKER_IMPL_H_
|
|
||||||
#define CONTENT_RENDERER_PEPPER_PPB_BROKER_IMPL_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "base/compiler_specific.h"
|
|
||||||
#include "base/macros.h"
|
|
||||||
#include "base/memory/weak_ptr.h"
|
|
||||||
#include "base/process/process.h"
|
|
||||||
#include "ipc/ipc_listener.h"
|
|
||||||
#include "ppapi/c/pp_completion_callback.h"
|
|
||||||
#include "ppapi/c/trusted/ppb_broker_trusted.h"
|
|
||||||
#include "ppapi/shared_impl/resource.h"
|
|
||||||
#include "ppapi/shared_impl/tracked_callback.h"
|
|
||||||
#include "ppapi/thunk/ppb_broker_api.h"
|
|
||||||
|
|
||||||
class GURL;
|
|
||||||
|
|
||||||
namespace IPC {
|
|
||||||
struct ChannelHandle;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace content {
|
|
||||||
class PepperBroker;
|
|
||||||
|
|
||||||
class PPB_Broker_Impl : public ppapi::Resource,
|
|
||||||
public ppapi::thunk::PPB_Broker_API,
|
|
||||||
public IPC::Listener,
|
|
||||||
public base::SupportsWeakPtr<PPB_Broker_Impl> {
|
|
||||||
public:
|
|
||||||
explicit PPB_Broker_Impl(PP_Instance instance);
|
|
||||||
|
|
||||||
// Resource override.
|
|
||||||
ppapi::thunk::PPB_Broker_API* AsPPB_Broker_API() override;
|
|
||||||
|
|
||||||
// PPB_BrokerTrusted implementation.
|
|
||||||
int32_t Connect(
|
|
||||||
scoped_refptr<ppapi::TrackedCallback> connect_callback) override;
|
|
||||||
int32_t GetHandle(int32_t* handle) override;
|
|
||||||
|
|
||||||
// Returns the URL of the document this plugin runs in. This is necessary to
|
|
||||||
// decide whether to grant access to the PPAPI broker.
|
|
||||||
GURL GetDocumentUrl();
|
|
||||||
|
|
||||||
void BrokerConnected(int32_t handle, int32_t result);
|
|
||||||
|
|
||||||
private:
|
|
||||||
~PPB_Broker_Impl() override;
|
|
||||||
|
|
||||||
// IPC::Listener implementation.
|
|
||||||
bool OnMessageReceived(const IPC::Message& message) override;
|
|
||||||
|
|
||||||
void OnPpapiBrokerChannelCreated(base::ProcessId broker_pid,
|
|
||||||
const IPC::ChannelHandle& handle);
|
|
||||||
void OnPpapiBrokerPermissionResult(bool result);
|
|
||||||
|
|
||||||
// PluginDelegate ppapi broker object.
|
|
||||||
// We don't own this pointer but are responsible for calling Disconnect on it.
|
|
||||||
PepperBroker* broker_;
|
|
||||||
|
|
||||||
// Callback invoked from BrokerConnected.
|
|
||||||
scoped_refptr<ppapi::TrackedCallback> connect_callback_;
|
|
||||||
|
|
||||||
// Pipe handle for the plugin instance to use to communicate with the broker.
|
|
||||||
// Never owned by this object.
|
|
||||||
int32_t pipe_handle_;
|
|
||||||
|
|
||||||
int routing_id_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(PPB_Broker_Impl);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace content
|
|
||||||
|
|
||||||
#endif // CONTENT_RENDERER_PEPPER_PPB_BROKER_IMPL_H_
|
|
@@ -7,7 +7,6 @@
|
|||||||
#include "build/build_config.h"
|
#include "build/build_config.h"
|
||||||
#include "content/common/content_switches_internal.h"
|
#include "content/common/content_switches_internal.h"
|
||||||
#include "content/renderer/pepper/ppb_audio_impl.h"
|
#include "content/renderer/pepper/ppb_audio_impl.h"
|
||||||
#include "content/renderer/pepper/ppb_broker_impl.h"
|
|
||||||
#include "content/renderer/pepper/ppb_buffer_impl.h"
|
#include "content/renderer/pepper/ppb_buffer_impl.h"
|
||||||
#include "content/renderer/pepper/ppb_graphics_3d_impl.h"
|
#include "content/renderer/pepper/ppb_graphics_3d_impl.h"
|
||||||
#include "content/renderer/pepper/ppb_image_data_impl.h"
|
#include "content/renderer/pepper/ppb_image_data_impl.h"
|
||||||
@@ -72,10 +71,6 @@ PP_Resource ResourceCreationImpl::CreateAudioOutput(PP_Instance instance) {
|
|||||||
return 0; // Not supported in-process.
|
return 0; // Not supported in-process.
|
||||||
}
|
}
|
||||||
|
|
||||||
PP_Resource ResourceCreationImpl::CreateBroker(PP_Instance instance) {
|
|
||||||
return (new PPB_Broker_Impl(instance))->GetReference();
|
|
||||||
}
|
|
||||||
|
|
||||||
PP_Resource ResourceCreationImpl::CreateBuffer(PP_Instance instance,
|
PP_Resource ResourceCreationImpl::CreateBuffer(PP_Instance instance,
|
||||||
uint32_t size) {
|
uint32_t size) {
|
||||||
return PPB_Buffer_Impl::Create(instance, size);
|
return PPB_Buffer_Impl::Create(instance, size);
|
||||||
|
@@ -39,7 +39,6 @@ class ResourceCreationImpl : public ppapi::thunk::ResourceCreationAPI {
|
|||||||
uint32_t sample_frame_count) override;
|
uint32_t sample_frame_count) override;
|
||||||
PP_Resource CreateAudioInput(PP_Instance instance) override;
|
PP_Resource CreateAudioInput(PP_Instance instance) override;
|
||||||
PP_Resource CreateAudioOutput(PP_Instance instance) override;
|
PP_Resource CreateAudioOutput(PP_Instance instance) override;
|
||||||
PP_Resource CreateBroker(PP_Instance instance) override;
|
|
||||||
PP_Resource CreateBuffer(PP_Instance instance, uint32_t size) override;
|
PP_Resource CreateBuffer(PP_Instance instance, uint32_t size) override;
|
||||||
PP_Resource CreateCameraDevicePrivate(PP_Instance instance) override;
|
PP_Resource CreateCameraDevicePrivate(PP_Instance instance) override;
|
||||||
PP_Resource CreateFlashFontFile(
|
PP_Resource CreateFlashFontFile(
|
||||||
|
@@ -2285,7 +2285,6 @@ test("content_unittests") {
|
|||||||
if (enable_plugins) {
|
if (enable_plugins) {
|
||||||
sources += [
|
sources += [
|
||||||
"../browser/plugin_content_origin_allowlist_unittest.cc",
|
"../browser/plugin_content_origin_allowlist_unittest.cc",
|
||||||
"../browser/plugin_service_impl_unittest.cc",
|
|
||||||
"../browser/renderer_host/pepper/browser_ppapi_host_test.cc",
|
"../browser/renderer_host/pepper/browser_ppapi_host_test.cc",
|
||||||
"../browser/renderer_host/pepper/browser_ppapi_host_test.h",
|
"../browser/renderer_host/pepper/browser_ppapi_host_test.h",
|
||||||
"../browser/renderer_host/pepper/pepper_file_system_browser_host_unittest.cc",
|
"../browser/renderer_host/pepper/pepper_file_system_browser_host_unittest.cc",
|
||||||
@@ -2296,7 +2295,6 @@ test("content_unittests") {
|
|||||||
"../renderer/pepper/event_conversion_unittest.cc",
|
"../renderer/pepper/event_conversion_unittest.cc",
|
||||||
"../renderer/pepper/host_var_tracker_unittest.cc",
|
"../renderer/pepper/host_var_tracker_unittest.cc",
|
||||||
"../renderer/pepper/mock_resource.h",
|
"../renderer/pepper/mock_resource.h",
|
||||||
"../renderer/pepper/pepper_broker_unittest.cc",
|
|
||||||
"../renderer/pepper/plugin_instance_throttler_impl_unittest.cc",
|
"../renderer/pepper/plugin_instance_throttler_impl_unittest.cc",
|
||||||
"../renderer/pepper/v8_var_converter_unittest.cc",
|
"../renderer/pepper/v8_var_converter_unittest.cc",
|
||||||
]
|
]
|
||||||
|
@@ -163,8 +163,6 @@ copy("copy_test_files2") {
|
|||||||
source_set("ppapi_tests_sources") {
|
source_set("ppapi_tests_sources") {
|
||||||
sources = test_common_source_files
|
sources = test_common_source_files
|
||||||
sources += [
|
sources += [
|
||||||
"tests/test_broker.cc",
|
|
||||||
"tests/test_broker.h",
|
|
||||||
"tests/test_browser_font.cc",
|
"tests/test_browser_font.cc",
|
||||||
"tests/test_browser_font.h",
|
"tests/test_browser_font.h",
|
||||||
"tests/test_buffer.cc",
|
"tests/test_buffer.cc",
|
||||||
|
@@ -1,77 +0,0 @@
|
|||||||
/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
* Use of this source code is governed by a BSD-style license that can be
|
|
||||||
* found in the LICENSE file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file defines the PPB_BrokerTrusted interface, which provides
|
|
||||||
* access to a trusted broker with greater privileges than the plugin.
|
|
||||||
*/
|
|
||||||
|
|
||||||
label Chrome {
|
|
||||||
M14 = 0.2,
|
|
||||||
M25 = 0.3
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The PPB_BrokerTrusted interface provides access to a trusted broker
|
|
||||||
* with greater privileges than the plugin. The interface only supports
|
|
||||||
* out-of-process plugins and is to be used by proxy implementations. All
|
|
||||||
* functions should be called from the main thread only.
|
|
||||||
*
|
|
||||||
* A PPB_BrokerTrusted resource represents a connection to the broker. Its
|
|
||||||
* lifetime controls the lifetime of the broker, regardless of whether the
|
|
||||||
* handle is closed. The handle should be closed before the resource is
|
|
||||||
* released.
|
|
||||||
*/
|
|
||||||
[macro="PPB_BROKER_TRUSTED_INTERFACE"]
|
|
||||||
interface PPB_BrokerTrusted {
|
|
||||||
/**
|
|
||||||
* Returns a trusted broker resource.
|
|
||||||
*/
|
|
||||||
PP_Resource CreateTrusted([in] PP_Instance instance);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the resource is a trusted broker.
|
|
||||||
*/
|
|
||||||
PP_Bool IsBrokerTrusted([in] PP_Resource resource);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Connects to the trusted broker. It may have already
|
|
||||||
* been launched by another instance.
|
|
||||||
* The plugin takes ownership of the handle once the callback has been called
|
|
||||||
* with a result of PP_OK. The plugin should immediately call GetHandle and
|
|
||||||
* begin managing it. If the result is not PP_OK, the browser still owns the
|
|
||||||
* handle.
|
|
||||||
*
|
|
||||||
* Returns PP_ERROR_WOULD_BLOCK on success, and invokes
|
|
||||||
* the |connect_callback| asynchronously to complete.
|
|
||||||
* As this function should always be invoked from the main thread,
|
|
||||||
* do not use the blocking variant of PP_CompletionCallback.
|
|
||||||
* Returns PP_ERROR_FAILED if called from an in-process plugin.
|
|
||||||
*/
|
|
||||||
int32_t Connect([in] PP_Resource broker,
|
|
||||||
[in] PP_CompletionCallback connect_callback);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the handle to the pipe. Use once Connect has completed. Each instance
|
|
||||||
* of this interface has its own pipe.
|
|
||||||
*
|
|
||||||
* Returns PP_OK on success, and places the result into the given output
|
|
||||||
* parameter. The handle is only set when returning PP_OK. Calling this
|
|
||||||
* before connect has completed will return PP_ERROR_FAILED.
|
|
||||||
*/
|
|
||||||
int32_t GetHandle([in] PP_Resource broker, [out] int32_t handle);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns PP_TRUE if the plugin has permission to launch the broker. A user
|
|
||||||
* must explicitly grant permission to launch the broker for a particular
|
|
||||||
* website. This is done through an infobar that is displayed when |Connect|
|
|
||||||
* is called. This function returns PP_TRUE if the user has already granted
|
|
||||||
* permission to launch the broker for the website containing this plugin
|
|
||||||
* instance. Returns PP_FALSE otherwise.
|
|
||||||
*/
|
|
||||||
[version=0.3]
|
|
||||||
PP_Bool IsAllowed([in] PP_Resource broker);
|
|
||||||
};
|
|
||||||
|
|
@@ -1,94 +0,0 @@
|
|||||||
/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
* Use of this source code is governed by a BSD-style license that can be
|
|
||||||
* found in the LICENSE file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file defines functions that your module must implement to support a
|
|
||||||
* broker.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#inline c
|
|
||||||
// {PENDING: undefine PP_EXPORT?}
|
|
||||||
|
|
||||||
#include "ppapi/c/pp_instance.h"
|
|
||||||
#include "ppapi/c/pp_stdint.h"
|
|
||||||
|
|
||||||
|
|
||||||
#if __GNUC__ >= 4
|
|
||||||
|
|
||||||
#define PP_EXPORT __attribute__ ((visibility("default")))
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
#define PP_EXPORT __declspec(dllexport)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* We don't want name mangling for these external functions. We only need
|
|
||||||
* 'extern "C"' if we're compiling with a C++ compiler.
|
|
||||||
*/
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup Typedefs
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PP_ConnectInstance_Func defines the signature that you implement to
|
|
||||||
* receive notifications when a plugin instance connects to the broker.
|
|
||||||
* The broker should listen on the socket before returning.
|
|
||||||
*
|
|
||||||
* @param[in] instance The plugin instance connecting to the broker.
|
|
||||||
* @param[in] handle Handle to a socket the broker can use to communicate with
|
|
||||||
* the plugin.
|
|
||||||
* @return PP_OK on success. Any other value on failure.
|
|
||||||
*/
|
|
||||||
typedef int32_t (*PP_ConnectInstance_Func)(PP_Instance instance,
|
|
||||||
int32_t handle);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PPP_InitializeBroker() is the entry point for a broker and is
|
|
||||||
* called by the browser when your module loads. Your code must implement this
|
|
||||||
* function.
|
|
||||||
*
|
|
||||||
* Failure indicates to the browser that this broker can not be used. In this
|
|
||||||
* case, the broker will be unloaded.
|
|
||||||
*
|
|
||||||
* @param[out] connect_instance_func A pointer to a connect instance function.
|
|
||||||
* @return PP_OK on success. Any other value on failure.
|
|
||||||
*/
|
|
||||||
PP_EXPORT int32_t PPP_InitializeBroker(
|
|
||||||
PP_ConnectInstance_Func* connect_instance_func);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** PPP_ShutdownBroker() is called before the broker is unloaded.
|
|
||||||
*/
|
|
||||||
PP_EXPORT void PPP_ShutdownBroker();
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endinl
|
|
||||||
|
|
@@ -143,11 +143,9 @@ source_set("c") {
|
|||||||
"dev/ppp_class_deprecated.h",
|
"dev/ppp_class_deprecated.h",
|
||||||
|
|
||||||
# Trusted interfaces.
|
# Trusted interfaces.
|
||||||
"trusted/ppb_broker_trusted.h",
|
|
||||||
"trusted/ppb_browser_font_trusted.h",
|
"trusted/ppb_browser_font_trusted.h",
|
||||||
"trusted/ppb_char_set_trusted.h",
|
"trusted/ppb_char_set_trusted.h",
|
||||||
"trusted/ppb_file_chooser_trusted.h",
|
"trusted/ppb_file_chooser_trusted.h",
|
||||||
"trusted/ppb_url_loader_trusted.h",
|
"trusted/ppb_url_loader_trusted.h",
|
||||||
"trusted/ppp_broker.h",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@@ -1,103 +0,0 @@
|
|||||||
/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
* Use of this source code is governed by a BSD-style license that can be
|
|
||||||
* found in the LICENSE file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* From trusted/ppb_broker_trusted.idl modified Mon Dec 3 11:10:40 2012. */
|
|
||||||
|
|
||||||
#ifndef PPAPI_C_TRUSTED_PPB_BROKER_TRUSTED_H_
|
|
||||||
#define PPAPI_C_TRUSTED_PPB_BROKER_TRUSTED_H_
|
|
||||||
|
|
||||||
#include "ppapi/c/pp_bool.h"
|
|
||||||
#include "ppapi/c/pp_completion_callback.h"
|
|
||||||
#include "ppapi/c/pp_instance.h"
|
|
||||||
#include "ppapi/c/pp_macros.h"
|
|
||||||
#include "ppapi/c/pp_resource.h"
|
|
||||||
#include "ppapi/c/pp_stdint.h"
|
|
||||||
|
|
||||||
#define PPB_BROKER_TRUSTED_INTERFACE_0_2 "PPB_BrokerTrusted;0.2"
|
|
||||||
#define PPB_BROKER_TRUSTED_INTERFACE_0_3 "PPB_BrokerTrusted;0.3"
|
|
||||||
#define PPB_BROKER_TRUSTED_INTERFACE PPB_BROKER_TRUSTED_INTERFACE_0_3
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* This file defines the PPB_BrokerTrusted interface, which provides
|
|
||||||
* access to a trusted broker with greater privileges than the plugin.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup Interfaces
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* The PPB_BrokerTrusted interface provides access to a trusted broker
|
|
||||||
* with greater privileges than the plugin. The interface only supports
|
|
||||||
* out-of-process plugins and is to be used by proxy implementations. All
|
|
||||||
* functions should be called from the main thread only.
|
|
||||||
*
|
|
||||||
* A PPB_BrokerTrusted resource represents a connection to the broker. Its
|
|
||||||
* lifetime controls the lifetime of the broker, regardless of whether the
|
|
||||||
* handle is closed. The handle should be closed before the resource is
|
|
||||||
* released.
|
|
||||||
*/
|
|
||||||
struct PPB_BrokerTrusted_0_3 {
|
|
||||||
/**
|
|
||||||
* Returns a trusted broker resource.
|
|
||||||
*/
|
|
||||||
PP_Resource (*CreateTrusted)(PP_Instance instance);
|
|
||||||
/**
|
|
||||||
* Returns true if the resource is a trusted broker.
|
|
||||||
*/
|
|
||||||
PP_Bool (*IsBrokerTrusted)(PP_Resource resource);
|
|
||||||
/**
|
|
||||||
* Connects to the trusted broker. It may have already
|
|
||||||
* been launched by another instance.
|
|
||||||
* The plugin takes ownership of the handle once the callback has been called
|
|
||||||
* with a result of PP_OK. The plugin should immediately call GetHandle and
|
|
||||||
* begin managing it. If the result is not PP_OK, the browser still owns the
|
|
||||||
* handle.
|
|
||||||
*
|
|
||||||
* Returns PP_ERROR_WOULD_BLOCK on success, and invokes
|
|
||||||
* the |connect_callback| asynchronously to complete.
|
|
||||||
* As this function should always be invoked from the main thread,
|
|
||||||
* do not use the blocking variant of PP_CompletionCallback.
|
|
||||||
* Returns PP_ERROR_FAILED if called from an in-process plugin.
|
|
||||||
*/
|
|
||||||
int32_t (*Connect)(PP_Resource broker,
|
|
||||||
struct PP_CompletionCallback connect_callback);
|
|
||||||
/**
|
|
||||||
* Gets the handle to the pipe. Use once Connect has completed. Each instance
|
|
||||||
* of this interface has its own pipe.
|
|
||||||
*
|
|
||||||
* Returns PP_OK on success, and places the result into the given output
|
|
||||||
* parameter. The handle is only set when returning PP_OK. Calling this
|
|
||||||
* before connect has completed will return PP_ERROR_FAILED.
|
|
||||||
*/
|
|
||||||
int32_t (*GetHandle)(PP_Resource broker, int32_t* handle);
|
|
||||||
/**
|
|
||||||
* Returns PP_TRUE if the plugin has permission to launch the broker. A user
|
|
||||||
* must explicitly grant permission to launch the broker for a particular
|
|
||||||
* website. This is done through an infobar that is displayed when |Connect|
|
|
||||||
* is called. This function returns PP_TRUE if the user has already granted
|
|
||||||
* permission to launch the broker for the website containing this plugin
|
|
||||||
* instance. Returns PP_FALSE otherwise.
|
|
||||||
*/
|
|
||||||
PP_Bool (*IsAllowed)(PP_Resource broker);
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct PPB_BrokerTrusted_0_3 PPB_BrokerTrusted;
|
|
||||||
|
|
||||||
struct PPB_BrokerTrusted_0_2 {
|
|
||||||
PP_Resource (*CreateTrusted)(PP_Instance instance);
|
|
||||||
PP_Bool (*IsBrokerTrusted)(PP_Resource resource);
|
|
||||||
int32_t (*Connect)(PP_Resource broker,
|
|
||||||
struct PP_CompletionCallback connect_callback);
|
|
||||||
int32_t (*GetHandle)(PP_Resource broker, int32_t* handle);
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* PPAPI_C_TRUSTED_PPB_BROKER_TRUSTED_H_ */
|
|
||||||
|
|
@@ -1,102 +0,0 @@
|
|||||||
/* Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
|
||||||
* Use of this source code is governed by a BSD-style license that can be
|
|
||||||
* found in the LICENSE file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* From trusted/ppp_broker.idl modified Sat Jul 16 16:51:03 2011. */
|
|
||||||
|
|
||||||
#ifndef PPAPI_C_TRUSTED_PPP_BROKER_H_
|
|
||||||
#define PPAPI_C_TRUSTED_PPP_BROKER_H_
|
|
||||||
|
|
||||||
#include "ppapi/c/pp_macros.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file
|
|
||||||
* This file defines functions that your module must implement to support a
|
|
||||||
* broker.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
// {PENDING: undefine PP_EXPORT?}
|
|
||||||
|
|
||||||
#include "ppapi/c/pp_instance.h"
|
|
||||||
#include "ppapi/c/pp_stdint.h"
|
|
||||||
|
|
||||||
|
|
||||||
#if __GNUC__ >= 4
|
|
||||||
|
|
||||||
#define PP_EXPORT __attribute__ ((visibility("default")))
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
#define PP_EXPORT __declspec(dllexport)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* We don't want name mangling for these external functions. We only need
|
|
||||||
* 'extern "C"' if we're compiling with a C++ compiler.
|
|
||||||
*/
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup Typedefs
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PP_ConnectInstance_Func defines the signature that you implement to
|
|
||||||
* receive notifications when a plugin instance connects to the broker.
|
|
||||||
* The broker should listen on the socket before returning.
|
|
||||||
*
|
|
||||||
* @param[in] instance The plugin instance connecting to the broker.
|
|
||||||
* @param[in] handle Handle to a socket the broker can use to communicate with
|
|
||||||
* the plugin.
|
|
||||||
* @return PP_OK on success. Any other value on failure.
|
|
||||||
*/
|
|
||||||
typedef int32_t (*PP_ConnectInstance_Func)(PP_Instance instance,
|
|
||||||
int32_t handle);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PPP_InitializeBroker() is the entry point for a broker and is
|
|
||||||
* called by the browser when your module loads. Your code must implement this
|
|
||||||
* function.
|
|
||||||
*
|
|
||||||
* Failure indicates to the browser that this broker can not be used. In this
|
|
||||||
* case, the broker will be unloaded.
|
|
||||||
*
|
|
||||||
* @param[out] connect_instance_func A pointer to a connect instance function.
|
|
||||||
* @return PP_OK on success. Any other value on failure.
|
|
||||||
*/
|
|
||||||
PP_EXPORT int32_t PPP_InitializeBroker(
|
|
||||||
PP_ConnectInstance_Func* connect_instance_func);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** PPP_ShutdownBroker() is called before the broker is unloaded.
|
|
||||||
*/
|
|
||||||
PP_EXPORT void PPP_ShutdownBroker();
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* PPAPI_C_TRUSTED_PPP_BROKER_H_ */
|
|
||||||
|
|
@@ -22,19 +22,6 @@ class Module;
|
|||||||
/// failure. Upon failure, the module will be unloaded.
|
/// failure. Upon failure, the module will be unloaded.
|
||||||
pp::Module* CreateModule();
|
pp::Module* CreateModule();
|
||||||
|
|
||||||
/// Sets the get interface function in the broker process.
|
|
||||||
///
|
|
||||||
/// This function is only relevant when you're using the PPB_Broker interface
|
|
||||||
/// in a trusted native plugin. In this case, you may need to implement
|
|
||||||
/// PPP_GetInterface when the plugin is loaded in the unsandboxed process.
|
|
||||||
/// Normally the C++ wrappers implement PPP_GetInterface for you but this
|
|
||||||
/// doesn't work in the context of the broker process.
|
|
||||||
//
|
|
||||||
/// So if you need to implement PPP_* interfaces in the broker process, call
|
|
||||||
/// this function in your PPP_InitializeBroker implementation which will set
|
|
||||||
/// up the given function as implementing PPP_GetInterface.
|
|
||||||
void SetBrokerGetInterfaceFunc(PP_GetInterface_Func broker_get_interface);
|
|
||||||
|
|
||||||
} // namespace pp
|
} // namespace pp
|
||||||
|
|
||||||
#endif // PPAPI_CPP_MODULE_EMBEDDER_H_
|
#endif // PPAPI_CPP_MODULE_EMBEDDER_H_
|
||||||
|
@@ -2453,10 +2453,6 @@ static void Pnacl_M14_PPP_Messaging_HandleMessage(PP_Instance instance, struct P
|
|||||||
|
|
||||||
/* Not generating wrapper methods for PPP_MouseLock_1_0 */
|
/* Not generating wrapper methods for PPP_MouseLock_1_0 */
|
||||||
|
|
||||||
/* Not generating wrapper methods for PPB_BrokerTrusted_0_2 */
|
|
||||||
|
|
||||||
/* Not generating wrapper methods for PPB_BrokerTrusted_0_3 */
|
|
||||||
|
|
||||||
/* Not generating wrapper methods for PPB_BrowserFont_Trusted_1_0 */
|
/* Not generating wrapper methods for PPB_BrowserFont_Trusted_1_0 */
|
||||||
|
|
||||||
/* Not generating wrapper methods for PPB_CharSet_Trusted_1_0 */
|
/* Not generating wrapper methods for PPB_CharSet_Trusted_1_0 */
|
||||||
@@ -4399,10 +4395,6 @@ static const struct PPP_Messaging_1_0 Pnacl_Wrappers_PPP_Messaging_1_0 = {
|
|||||||
|
|
||||||
/* Not generating wrapper interface for PPP_MouseLock_1_0 */
|
/* Not generating wrapper interface for PPP_MouseLock_1_0 */
|
||||||
|
|
||||||
/* Not generating wrapper interface for PPB_BrokerTrusted_0_2 */
|
|
||||||
|
|
||||||
/* Not generating wrapper interface for PPB_BrokerTrusted_0_3 */
|
|
||||||
|
|
||||||
/* Not generating wrapper interface for PPB_BrowserFont_Trusted_1_0 */
|
/* Not generating wrapper interface for PPB_BrowserFont_Trusted_1_0 */
|
||||||
|
|
||||||
/* Not generating wrapper interface for PPB_CharSet_Trusted_1_0 */
|
/* Not generating wrapper interface for PPB_CharSet_Trusted_1_0 */
|
||||||
|
@@ -21,8 +21,6 @@ component("proxy") {
|
|||||||
"../utility/completion_callback_factory.h",
|
"../utility/completion_callback_factory.h",
|
||||||
"audio_buffer_resource.cc",
|
"audio_buffer_resource.cc",
|
||||||
"audio_buffer_resource.h",
|
"audio_buffer_resource.h",
|
||||||
"broker_resource.cc",
|
|
||||||
"broker_resource.h",
|
|
||||||
"camera_capabilities_resource.cc",
|
"camera_capabilities_resource.cc",
|
||||||
"camera_capabilities_resource.h",
|
"camera_capabilities_resource.h",
|
||||||
"camera_device_resource.cc",
|
"camera_device_resource.cc",
|
||||||
@@ -203,8 +201,6 @@ component("proxy") {
|
|||||||
"audio_input_resource.h",
|
"audio_input_resource.h",
|
||||||
"audio_output_resource.cc",
|
"audio_output_resource.cc",
|
||||||
"audio_output_resource.h",
|
"audio_output_resource.h",
|
||||||
"broker_dispatcher.cc",
|
|
||||||
"broker_dispatcher.h",
|
|
||||||
"browser_font_singleton_resource.cc",
|
"browser_font_singleton_resource.cc",
|
||||||
"browser_font_singleton_resource.h",
|
"browser_font_singleton_resource.h",
|
||||||
"device_enumeration_resource_helper.cc",
|
"device_enumeration_resource_helper.cc",
|
||||||
@@ -219,8 +215,6 @@ component("proxy") {
|
|||||||
"host_var_serialization_rules.h",
|
"host_var_serialization_rules.h",
|
||||||
"pdf_resource.cc",
|
"pdf_resource.cc",
|
||||||
"pdf_resource.h",
|
"pdf_resource.h",
|
||||||
"ppb_broker_proxy.cc",
|
|
||||||
"ppb_broker_proxy.h",
|
|
||||||
"ppb_buffer_proxy.cc",
|
"ppb_buffer_proxy.cc",
|
||||||
"ppb_buffer_proxy.h",
|
"ppb_buffer_proxy.h",
|
||||||
"ppb_var_deprecated_proxy.cc",
|
"ppb_var_deprecated_proxy.cc",
|
||||||
|
@@ -1,100 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "ppapi/proxy/broker_dispatcher.h"
|
|
||||||
|
|
||||||
#include "base/sync_socket.h"
|
|
||||||
#include "ppapi/c/pp_errors.h"
|
|
||||||
#include "ppapi/proxy/ppapi_messages.h"
|
|
||||||
#include "ppapi/shared_impl/platform_file.h"
|
|
||||||
|
|
||||||
namespace ppapi {
|
|
||||||
namespace proxy {
|
|
||||||
|
|
||||||
BrokerDispatcher::BrokerDispatcher(PP_ConnectInstance_Func connect_instance)
|
|
||||||
: connect_instance_(connect_instance) {
|
|
||||||
}
|
|
||||||
|
|
||||||
BrokerDispatcher::~BrokerDispatcher() {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool BrokerDispatcher::InitBrokerWithChannel(
|
|
||||||
ProxyChannel::Delegate* delegate,
|
|
||||||
base::ProcessId peer_pid,
|
|
||||||
const IPC::ChannelHandle& channel_handle,
|
|
||||||
bool is_client) {
|
|
||||||
return ProxyChannel::InitWithChannel(delegate, peer_pid, channel_handle,
|
|
||||||
is_client,
|
|
||||||
base::ThreadTaskRunnerHandle::Get());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool BrokerDispatcher::OnMessageReceived(const IPC::Message& msg) {
|
|
||||||
// Control messages.
|
|
||||||
if (msg.routing_id() == MSG_ROUTING_CONTROL) {
|
|
||||||
bool handled = true;
|
|
||||||
IPC_BEGIN_MESSAGE_MAP(BrokerDispatcher, msg)
|
|
||||||
IPC_MESSAGE_HANDLER(PpapiMsg_ConnectToPlugin, OnMsgConnectToPlugin)
|
|
||||||
IPC_MESSAGE_UNHANDLED(handled = false)
|
|
||||||
IPC_END_MESSAGE_MAP()
|
|
||||||
return handled;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfers ownership of the handle to the broker module.
|
|
||||||
void BrokerDispatcher::OnMsgConnectToPlugin(
|
|
||||||
PP_Instance instance,
|
|
||||||
IPC::PlatformFileForTransit handle,
|
|
||||||
int32_t* result) {
|
|
||||||
if (handle == IPC::InvalidPlatformFileForTransit()) {
|
|
||||||
*result = PP_ERROR_FAILED;
|
|
||||||
} else {
|
|
||||||
base::SyncSocket::Handle socket_handle =
|
|
||||||
IPC::PlatformFileForTransitToPlatformFile(handle);
|
|
||||||
|
|
||||||
if (connect_instance_) {
|
|
||||||
*result = connect_instance_(instance,
|
|
||||||
ppapi::PlatformFileToInt(socket_handle));
|
|
||||||
} else {
|
|
||||||
*result = PP_ERROR_FAILED;
|
|
||||||
// Close the handle since there is no other owner.
|
|
||||||
// The easiest way to clean it up is to just put it in an object
|
|
||||||
// and then close them. This failure case is not performance critical.
|
|
||||||
base::SyncSocket temp_socket(socket_handle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BrokerHostDispatcher::BrokerHostDispatcher()
|
|
||||||
: BrokerDispatcher(NULL) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void BrokerHostDispatcher::OnChannelError() {
|
|
||||||
DVLOG(1) << "BrokerHostDispatcher::OnChannelError()";
|
|
||||||
BrokerDispatcher::OnChannelError(); // Stop using the channel.
|
|
||||||
|
|
||||||
// Tell the host about the crash so it can clean up and display notification.
|
|
||||||
// TODO(ddorwin): Add BrokerCrashed() to PPB_Proxy_Private and call it.
|
|
||||||
// ppb_proxy_->BrokerCrashed(pp_module());
|
|
||||||
}
|
|
||||||
|
|
||||||
BrokerSideDispatcher::BrokerSideDispatcher(
|
|
||||||
PP_ConnectInstance_Func connect_instance)
|
|
||||||
: BrokerDispatcher(connect_instance) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void BrokerSideDispatcher::OnChannelError() {
|
|
||||||
DVLOG(1) << "BrokerSideDispatcher::OnChannelError()";
|
|
||||||
BrokerDispatcher::OnChannelError();
|
|
||||||
|
|
||||||
// The renderer has crashed or exited. This channel and all instances
|
|
||||||
// associated with it are no longer valid.
|
|
||||||
// TODO(ddorwin): This causes the broker process to exit, which may not be
|
|
||||||
// desirable in some use cases.
|
|
||||||
delete this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace proxy
|
|
||||||
} // namespace ppapi
|
|
@@ -1,68 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#ifndef PPAPI_PROXY_BROKER_DISPATCHER_H_
|
|
||||||
#define PPAPI_PROXY_BROKER_DISPATCHER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "base/compiler_specific.h"
|
|
||||||
#include "base/macros.h"
|
|
||||||
#include "ppapi/c/trusted/ppp_broker.h"
|
|
||||||
#include "ppapi/proxy/proxy_channel.h"
|
|
||||||
|
|
||||||
namespace ppapi {
|
|
||||||
namespace proxy {
|
|
||||||
|
|
||||||
class PPAPI_PROXY_EXPORT BrokerDispatcher : public ProxyChannel {
|
|
||||||
public:
|
|
||||||
~BrokerDispatcher() override;
|
|
||||||
|
|
||||||
// You must call this function before anything else. Returns true on success.
|
|
||||||
// The delegate pointer must outlive this class, ownership is not
|
|
||||||
// transferred.
|
|
||||||
virtual bool InitBrokerWithChannel(ProxyChannel::Delegate* delegate,
|
|
||||||
base::ProcessId peer_pid,
|
|
||||||
const IPC::ChannelHandle& channel_handle,
|
|
||||||
bool is_client);
|
|
||||||
|
|
||||||
// IPC::Listener implementation.
|
|
||||||
bool OnMessageReceived(const IPC::Message& msg) override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// You must call InitBrokerWithChannel after the constructor.
|
|
||||||
explicit BrokerDispatcher(PP_ConnectInstance_Func connect_instance);
|
|
||||||
|
|
||||||
void OnMsgConnectToPlugin(PP_Instance instance,
|
|
||||||
IPC::PlatformFileForTransit handle,
|
|
||||||
int32_t* result);
|
|
||||||
|
|
||||||
PP_ConnectInstance_Func connect_instance_;
|
|
||||||
|
|
||||||
private:
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(BrokerDispatcher);
|
|
||||||
};
|
|
||||||
|
|
||||||
// The dispatcher for the browser side of the broker channel.
|
|
||||||
class PPAPI_PROXY_EXPORT BrokerHostDispatcher : public BrokerDispatcher {
|
|
||||||
public:
|
|
||||||
BrokerHostDispatcher();
|
|
||||||
|
|
||||||
// IPC::Listener implementation.
|
|
||||||
void OnChannelError() override;
|
|
||||||
};
|
|
||||||
|
|
||||||
// The dispatcher for the broker side of the broker channel.
|
|
||||||
class PPAPI_PROXY_EXPORT BrokerSideDispatcher : public BrokerDispatcher {
|
|
||||||
public:
|
|
||||||
explicit BrokerSideDispatcher(PP_ConnectInstance_Func connect_instance);
|
|
||||||
|
|
||||||
// IPC::Listener implementation.
|
|
||||||
void OnChannelError() override;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace proxy
|
|
||||||
} // namespace ppapi
|
|
||||||
|
|
||||||
#endif // PPAPI_PROXY_BROKER_DISPATCHER_H_
|
|
@@ -1,34 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "ppapi/proxy/broker_resource.h"
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "ppapi/c/pp_bool.h"
|
|
||||||
#include "ppapi/proxy/ppapi_messages.h"
|
|
||||||
|
|
||||||
namespace ppapi {
|
|
||||||
namespace proxy {
|
|
||||||
|
|
||||||
BrokerResource::BrokerResource(Connection connection, PP_Instance instance)
|
|
||||||
: PluginResource(connection, instance) {
|
|
||||||
SendCreate(BROWSER, PpapiHostMsg_Broker_Create());
|
|
||||||
}
|
|
||||||
|
|
||||||
BrokerResource::~BrokerResource() {
|
|
||||||
}
|
|
||||||
|
|
||||||
thunk::PPB_Broker_Instance_API* BrokerResource::AsPPB_Broker_Instance_API() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
PP_Bool BrokerResource::IsAllowed() {
|
|
||||||
int32_t result =
|
|
||||||
SyncCall<IPC::Message>(BROWSER, PpapiHostMsg_Broker_IsAllowed());
|
|
||||||
return PP_FromBool(result == PP_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace proxy
|
|
||||||
} // namespace ppapi
|
|
@@ -1,36 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#ifndef PPAPI_PROXY_BROKER_RESOURCE_H_
|
|
||||||
#define PPAPI_PROXY_BROKER_RESOURCE_H_
|
|
||||||
|
|
||||||
#include "base/macros.h"
|
|
||||||
#include "ppapi/proxy/connection.h"
|
|
||||||
#include "ppapi/proxy/plugin_resource.h"
|
|
||||||
#include "ppapi/thunk/ppb_broker_api.h"
|
|
||||||
|
|
||||||
namespace ppapi {
|
|
||||||
namespace proxy {
|
|
||||||
|
|
||||||
class BrokerResource
|
|
||||||
: public PluginResource,
|
|
||||||
public thunk::PPB_Broker_Instance_API {
|
|
||||||
public:
|
|
||||||
BrokerResource(Connection connection, PP_Instance instance);
|
|
||||||
~BrokerResource() override;
|
|
||||||
|
|
||||||
// Resource override.
|
|
||||||
thunk::PPB_Broker_Instance_API* AsPPB_Broker_Instance_API() override;
|
|
||||||
|
|
||||||
// thunk::PPB_Broker_Instance_API implementation.
|
|
||||||
PP_Bool IsAllowed() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(BrokerResource);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace proxy
|
|
||||||
} // namespace ppapi
|
|
||||||
|
|
||||||
#endif // PPAPI_PROXY_BROKER_RESOURCE_H_
|
|
@@ -87,7 +87,6 @@
|
|||||||
#include "ppapi/c/private/ppb_udp_socket_private.h"
|
#include "ppapi/c/private/ppb_udp_socket_private.h"
|
||||||
#include "ppapi/c/private/ppb_uma_private.h"
|
#include "ppapi/c/private/ppb_uma_private.h"
|
||||||
#include "ppapi/c/private/ppb_x509_certificate_private.h"
|
#include "ppapi/c/private/ppb_x509_certificate_private.h"
|
||||||
#include "ppapi/c/trusted/ppb_broker_trusted.h"
|
|
||||||
#include "ppapi/c/trusted/ppb_browser_font_trusted.h"
|
#include "ppapi/c/trusted/ppb_browser_font_trusted.h"
|
||||||
#include "ppapi/c/trusted/ppb_char_set_trusted.h"
|
#include "ppapi/c/trusted/ppb_char_set_trusted.h"
|
||||||
#include "ppapi/c/trusted/ppb_file_chooser_trusted.h"
|
#include "ppapi/c/trusted/ppb_file_chooser_trusted.h"
|
||||||
@@ -96,7 +95,6 @@
|
|||||||
#include "ppapi/proxy/plugin_globals.h"
|
#include "ppapi/proxy/plugin_globals.h"
|
||||||
#include "ppapi/proxy/ppapi_messages.h"
|
#include "ppapi/proxy/ppapi_messages.h"
|
||||||
#include "ppapi/proxy/ppb_audio_proxy.h"
|
#include "ppapi/proxy/ppb_audio_proxy.h"
|
||||||
#include "ppapi/proxy/ppb_broker_proxy.h"
|
|
||||||
#include "ppapi/proxy/ppb_buffer_proxy.h"
|
#include "ppapi/proxy/ppb_buffer_proxy.h"
|
||||||
#include "ppapi/proxy/ppb_core_proxy.h"
|
#include "ppapi/proxy/ppb_core_proxy.h"
|
||||||
#include "ppapi/proxy/ppb_graphics_3d_proxy.h"
|
#include "ppapi/proxy/ppb_graphics_3d_proxy.h"
|
||||||
|
@@ -138,10 +138,6 @@ PP_Module PluginGlobals::GetModuleForInstance(PP_Instance instance) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string PluginGlobals::GetCmdLine() {
|
|
||||||
return command_line_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PluginGlobals::PreCacheFontForFlash(const void* logfontw) {
|
void PluginGlobals::PreCacheFontForFlash(const void* logfontw) {
|
||||||
ProxyAutoUnlock unlock;
|
ProxyAutoUnlock unlock;
|
||||||
plugin_proxy_delegate_->PreCacheFontForFlash(logfontw);
|
plugin_proxy_delegate_->PreCacheFontForFlash(logfontw);
|
||||||
|
@@ -70,7 +70,6 @@ class PPAPI_PROXY_EXPORT PluginGlobals : public PpapiGlobals {
|
|||||||
thunk::ResourceCreationAPI* GetResourceCreationAPI(
|
thunk::ResourceCreationAPI* GetResourceCreationAPI(
|
||||||
PP_Instance instance) override;
|
PP_Instance instance) override;
|
||||||
PP_Module GetModuleForInstance(PP_Instance instance) override;
|
PP_Module GetModuleForInstance(PP_Instance instance) override;
|
||||||
std::string GetCmdLine() override;
|
|
||||||
void PreCacheFontForFlash(const void* logfontw) override;
|
void PreCacheFontForFlash(const void* logfontw) override;
|
||||||
void LogWithSource(PP_Instance instance,
|
void LogWithSource(PP_Instance instance,
|
||||||
PP_LogLevel level,
|
PP_LogLevel level,
|
||||||
@@ -140,9 +139,6 @@ class PPAPI_PROXY_EXPORT PluginGlobals : public PpapiGlobals {
|
|||||||
// is known. This will be used for error logging.
|
// is known. This will be used for error logging.
|
||||||
void set_plugin_name(const std::string& name) { plugin_name_ = name; }
|
void set_plugin_name(const std::string& name) { plugin_name_ = name; }
|
||||||
|
|
||||||
// The embedder should call this function when the command line is known.
|
|
||||||
void set_command_line(const std::string& c) { command_line_ = c; }
|
|
||||||
|
|
||||||
ResourceReplyThreadRegistrar* resource_reply_thread_registrar() {
|
ResourceReplyThreadRegistrar* resource_reply_thread_registrar() {
|
||||||
return resource_reply_thread_registrar_.get();
|
return resource_reply_thread_registrar_.get();
|
||||||
}
|
}
|
||||||
@@ -177,10 +173,6 @@ class PPAPI_PROXY_EXPORT PluginGlobals : public PpapiGlobals {
|
|||||||
// set_plugin_name is called.
|
// set_plugin_name is called.
|
||||||
std::string plugin_name_;
|
std::string plugin_name_;
|
||||||
|
|
||||||
// Command line for the plugin. This will be empty until set_command_line is
|
|
||||||
// called.
|
|
||||||
std::string command_line_;
|
|
||||||
|
|
||||||
std::unique_ptr<BrowserSender> browser_sender_;
|
std::unique_ptr<BrowserSender> browser_sender_;
|
||||||
|
|
||||||
scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner_;
|
scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner_;
|
||||||
|
@@ -640,11 +640,6 @@ IPC_MESSAGE_CONTROL1(PpapiHostMsg_LogInterfaceUsage,
|
|||||||
IPC_MESSAGE_CONTROL1(PpapiMsg_SetNetworkState,
|
IPC_MESSAGE_CONTROL1(PpapiMsg_SetNetworkState,
|
||||||
bool /* online */)
|
bool /* online */)
|
||||||
|
|
||||||
// Broker Process.
|
|
||||||
IPC_SYNC_MESSAGE_CONTROL2_1(PpapiMsg_ConnectToPlugin,
|
|
||||||
PP_Instance /* instance */,
|
|
||||||
IPC::PlatformFileForTransit /* handle */,
|
|
||||||
int32_t /* result */)
|
|
||||||
#endif // !defined(OS_NACL) && !defined(NACL_WIN64)
|
#endif // !defined(OS_NACL) && !defined(NACL_WIN64)
|
||||||
|
|
||||||
// PPB_Audio.
|
// PPB_Audio.
|
||||||
@@ -869,13 +864,6 @@ IPC_MESSAGE_ROUTED2(PpapiMsg_PPPTextInput_RequestSurroundingText,
|
|||||||
uint32_t /* desired_number_of_characters */)
|
uint32_t /* desired_number_of_characters */)
|
||||||
|
|
||||||
#if !defined(OS_NACL) && !defined(NACL_WIN64)
|
#if !defined(OS_NACL) && !defined(NACL_WIN64)
|
||||||
// PPB_Broker.
|
|
||||||
IPC_MESSAGE_ROUTED3(
|
|
||||||
PpapiMsg_PPBBroker_ConnectComplete,
|
|
||||||
ppapi::HostResource /* broker */,
|
|
||||||
IPC::PlatformFileForTransit /* handle */,
|
|
||||||
int32_t /* result */)
|
|
||||||
|
|
||||||
// PPP_Instance_Private.
|
// PPP_Instance_Private.
|
||||||
IPC_SYNC_MESSAGE_ROUTED1_1(PpapiMsg_PPPInstancePrivate_GetInstanceObject,
|
IPC_SYNC_MESSAGE_ROUTED1_1(PpapiMsg_PPPInstancePrivate_GetInstanceObject,
|
||||||
PP_Instance /* instance */,
|
PP_Instance /* instance */,
|
||||||
@@ -1207,13 +1195,6 @@ IPC_SYNC_MESSAGE_ROUTED3_1(PpapiHostMsg_PPBVar_CreateObjectDeprecated,
|
|||||||
ppapi::proxy::SerializedVar /* result */)
|
ppapi::proxy::SerializedVar /* result */)
|
||||||
|
|
||||||
#if !defined(OS_NACL) && !defined(NACL_WIN64)
|
#if !defined(OS_NACL) && !defined(NACL_WIN64)
|
||||||
// PPB_Broker.
|
|
||||||
IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBBroker_Create,
|
|
||||||
PP_Instance /* instance */,
|
|
||||||
ppapi::HostResource /* result_resource */)
|
|
||||||
IPC_MESSAGE_ROUTED1(PpapiHostMsg_PPBBroker_Connect,
|
|
||||||
ppapi::HostResource /* broker */)
|
|
||||||
|
|
||||||
// PPB_Buffer.
|
// PPB_Buffer.
|
||||||
IPC_SYNC_MESSAGE_ROUTED2_2(
|
IPC_SYNC_MESSAGE_ROUTED2_2(
|
||||||
PpapiHostMsg_PPBBuffer_Create,
|
PpapiHostMsg_PPBBuffer_Create,
|
||||||
@@ -1399,14 +1380,6 @@ IPC_MESSAGE_ROUTED2(
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Messages for resources using call/reply above.
|
// Messages for resources using call/reply above.
|
||||||
|
|
||||||
// Broker ----------------------------------------------------------------------
|
|
||||||
IPC_MESSAGE_CONTROL0(PpapiHostMsg_Broker_Create)
|
|
||||||
|
|
||||||
// Queries whether the plugin has permission to connect to the Pepper broker.
|
|
||||||
// The response is contained in the error value of the
|
|
||||||
// ResourceMessageReplyParams in the reply message.
|
|
||||||
IPC_MESSAGE_CONTROL0(PpapiHostMsg_Broker_IsAllowed)
|
|
||||||
|
|
||||||
// UMA
|
// UMA
|
||||||
IPC_MESSAGE_CONTROL0(PpapiHostMsg_UMA_Create)
|
IPC_MESSAGE_CONTROL0(PpapiHostMsg_UMA_Create)
|
||||||
IPC_MESSAGE_CONTROL5(PpapiHostMsg_UMA_HistogramCustomTimes,
|
IPC_MESSAGE_CONTROL5(PpapiHostMsg_UMA_HistogramCustomTimes,
|
||||||
|
@@ -1,236 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "ppapi/proxy/ppb_broker_proxy.h"
|
|
||||||
|
|
||||||
#include "base/bind.h"
|
|
||||||
#include "base/macros.h"
|
|
||||||
#include "ppapi/c/pp_errors.h"
|
|
||||||
#include "ppapi/c/trusted/ppb_broker_trusted.h"
|
|
||||||
#include "ppapi/proxy/enter_proxy.h"
|
|
||||||
#include "ppapi/proxy/plugin_dispatcher.h"
|
|
||||||
#include "ppapi/proxy/ppapi_messages.h"
|
|
||||||
#include "ppapi/shared_impl/platform_file.h"
|
|
||||||
#include "ppapi/shared_impl/tracked_callback.h"
|
|
||||||
#include "ppapi/thunk/enter.h"
|
|
||||||
#include "ppapi/thunk/ppb_broker_api.h"
|
|
||||||
#include "ppapi/thunk/resource_creation_api.h"
|
|
||||||
#include "ppapi/thunk/thunk.h"
|
|
||||||
|
|
||||||
using ppapi::IntToPlatformFile;
|
|
||||||
using ppapi::PlatformFileToInt;
|
|
||||||
using ppapi::thunk::PPB_Broker_API;
|
|
||||||
|
|
||||||
namespace ppapi {
|
|
||||||
namespace proxy {
|
|
||||||
|
|
||||||
class Broker : public PPB_Broker_API, public Resource {
|
|
||||||
public:
|
|
||||||
explicit Broker(const HostResource& resource);
|
|
||||||
~Broker() override;
|
|
||||||
|
|
||||||
// Resource overrides.
|
|
||||||
PPB_Broker_API* AsPPB_Broker_API() override;
|
|
||||||
|
|
||||||
// PPB_Broker_API implementation.
|
|
||||||
int32_t Connect(scoped_refptr<TrackedCallback> connect_callback) override;
|
|
||||||
int32_t GetHandle(int32_t* handle) override;
|
|
||||||
|
|
||||||
// Called by the proxy when the host side has completed the request.
|
|
||||||
void ConnectComplete(IPC::PlatformFileForTransit socket_handle,
|
|
||||||
int32_t result);
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool called_connect_;
|
|
||||||
scoped_refptr<TrackedCallback> current_connect_callback_;
|
|
||||||
|
|
||||||
// The plugin module owns the handle.
|
|
||||||
// The host side transfers ownership of the handle to the plugin side when it
|
|
||||||
// sends the IPC. This member holds the handle value for the plugin module
|
|
||||||
// to read, but the plugin side of the proxy never takes ownership.
|
|
||||||
base::SyncSocket::Handle socket_handle_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(Broker);
|
|
||||||
};
|
|
||||||
|
|
||||||
Broker::Broker(const HostResource& resource)
|
|
||||||
: Resource(OBJECT_IS_PROXY, resource),
|
|
||||||
called_connect_(false),
|
|
||||||
socket_handle_(base::SyncSocket::kInvalidHandle) {
|
|
||||||
}
|
|
||||||
|
|
||||||
Broker::~Broker() {
|
|
||||||
socket_handle_ = base::SyncSocket::kInvalidHandle;
|
|
||||||
}
|
|
||||||
|
|
||||||
PPB_Broker_API* Broker::AsPPB_Broker_API() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t Broker::Connect(scoped_refptr<TrackedCallback> connect_callback) {
|
|
||||||
if (TrackedCallback::IsPending(current_connect_callback_))
|
|
||||||
return PP_ERROR_INPROGRESS;
|
|
||||||
else if (called_connect_)
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
|
|
||||||
current_connect_callback_ = connect_callback;
|
|
||||||
called_connect_ = true;
|
|
||||||
|
|
||||||
bool success = PluginDispatcher::GetForResource(this)->Send(
|
|
||||||
new PpapiHostMsg_PPBBroker_Connect(
|
|
||||||
API_ID_PPB_BROKER, host_resource()));
|
|
||||||
return success ? PP_OK_COMPLETIONPENDING : PP_ERROR_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t Broker::GetHandle(int32_t* handle) {
|
|
||||||
if (socket_handle_ == base::SyncSocket::kInvalidHandle)
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
*handle = PlatformFileToInt(socket_handle_);
|
|
||||||
return PP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Broker::ConnectComplete(IPC::PlatformFileForTransit socket_handle,
|
|
||||||
int32_t result) {
|
|
||||||
if (result == PP_OK) {
|
|
||||||
DCHECK(socket_handle_ == base::SyncSocket::kInvalidHandle);
|
|
||||||
socket_handle_ = IPC::PlatformFileForTransitToPlatformFile(socket_handle);
|
|
||||||
} else {
|
|
||||||
// The caller may still have given us a handle in the failure case.
|
|
||||||
// The easiest way to clean it up is to just put it in an object
|
|
||||||
// and then close them. This failure case is not performance critical.
|
|
||||||
base::SyncSocket temp_socket(
|
|
||||||
IPC::PlatformFileForTransitToPlatformFile(socket_handle));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!TrackedCallback::IsPending(current_connect_callback_)) {
|
|
||||||
// The handle might leak if the plugin never calls GetHandle().
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_connect_callback_->Run(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
PPB_Broker_Proxy::PPB_Broker_Proxy(Dispatcher* dispatcher)
|
|
||||||
: InterfaceProxy(dispatcher),
|
|
||||||
callback_factory_(this){
|
|
||||||
}
|
|
||||||
|
|
||||||
PPB_Broker_Proxy::~PPB_Broker_Proxy() {
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
PP_Resource PPB_Broker_Proxy::CreateProxyResource(PP_Instance instance) {
|
|
||||||
PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
|
|
||||||
if (!dispatcher)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
HostResource result;
|
|
||||||
dispatcher->Send(new PpapiHostMsg_PPBBroker_Create(
|
|
||||||
API_ID_PPB_BROKER, instance, &result));
|
|
||||||
if (result.is_null())
|
|
||||||
return 0;
|
|
||||||
return (new Broker(result))->GetReference();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PPB_Broker_Proxy::OnMessageReceived(const IPC::Message& msg) {
|
|
||||||
bool handled = true;
|
|
||||||
IPC_BEGIN_MESSAGE_MAP(PPB_Broker_Proxy, msg)
|
|
||||||
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBBroker_Create, OnMsgCreate)
|
|
||||||
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBBroker_Connect, OnMsgConnect)
|
|
||||||
IPC_MESSAGE_HANDLER(PpapiMsg_PPBBroker_ConnectComplete,
|
|
||||||
OnMsgConnectComplete)
|
|
||||||
IPC_MESSAGE_UNHANDLED(handled = false)
|
|
||||||
IPC_END_MESSAGE_MAP()
|
|
||||||
return handled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PPB_Broker_Proxy::OnMsgCreate(PP_Instance instance,
|
|
||||||
HostResource* result_resource) {
|
|
||||||
if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
|
|
||||||
return;
|
|
||||||
thunk::EnterResourceCreation enter(instance);
|
|
||||||
if (enter.succeeded()) {
|
|
||||||
result_resource->SetHostResource(
|
|
||||||
instance,
|
|
||||||
enter.functions()->CreateBroker(instance));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PPB_Broker_Proxy::OnMsgConnect(const HostResource& broker) {
|
|
||||||
if (!dispatcher()->permissions().HasPermission(PERMISSION_PRIVATE))
|
|
||||||
return;
|
|
||||||
EnterHostFromHostResourceForceCallback<PPB_Broker_API> enter(
|
|
||||||
broker, callback_factory_,
|
|
||||||
&PPB_Broker_Proxy::ConnectCompleteInHost, broker);
|
|
||||||
if (enter.succeeded())
|
|
||||||
enter.SetResult(enter.object()->Connect(enter.callback()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called in the plugin to handle the connect callback.
|
|
||||||
// The proxy owns the handle and transfers it to the Broker. At that point,
|
|
||||||
// the plugin owns the handle and is responsible for closing it.
|
|
||||||
// The caller guarantees that socket_handle is not valid if result is not PP_OK.
|
|
||||||
void PPB_Broker_Proxy::OnMsgConnectComplete(
|
|
||||||
const HostResource& resource,
|
|
||||||
IPC::PlatformFileForTransit socket_handle,
|
|
||||||
int32_t result) {
|
|
||||||
DCHECK(result == PP_OK ||
|
|
||||||
socket_handle == IPC::InvalidPlatformFileForTransit());
|
|
||||||
|
|
||||||
EnterPluginFromHostResource<PPB_Broker_API> enter(resource);
|
|
||||||
if (enter.failed()) {
|
|
||||||
// As in Broker::ConnectComplete, we need to close the resource on error.
|
|
||||||
base::SyncSocket temp_socket(
|
|
||||||
IPC::PlatformFileForTransitToPlatformFile(socket_handle));
|
|
||||||
} else {
|
|
||||||
static_cast<Broker*>(enter.object())->ConnectComplete(socket_handle,
|
|
||||||
result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Callback on the host side.
|
|
||||||
// Transfers ownership of the handle to the plugin side. This function must
|
|
||||||
// either successfully call the callback or close the handle.
|
|
||||||
void PPB_Broker_Proxy::ConnectCompleteInHost(int32_t result,
|
|
||||||
const HostResource& broker) {
|
|
||||||
IPC::PlatformFileForTransit foreign_socket_handle =
|
|
||||||
IPC::InvalidPlatformFileForTransit();
|
|
||||||
if (result == PP_OK) {
|
|
||||||
int32_t socket_handle = PlatformFileToInt(base::SyncSocket::kInvalidHandle);
|
|
||||||
EnterHostFromHostResource<PPB_Broker_API> enter(broker);
|
|
||||||
if (enter.succeeded())
|
|
||||||
result = enter.object()->GetHandle(&socket_handle);
|
|
||||||
DCHECK(result == PP_OK ||
|
|
||||||
socket_handle ==
|
|
||||||
PlatformFileToInt(base::SyncSocket::kInvalidHandle));
|
|
||||||
|
|
||||||
if (result == PP_OK) {
|
|
||||||
foreign_socket_handle =
|
|
||||||
dispatcher()->ShareHandleWithRemote(IntToPlatformFile(socket_handle),
|
|
||||||
true);
|
|
||||||
if (foreign_socket_handle == IPC::InvalidPlatformFileForTransit()) {
|
|
||||||
result = PP_ERROR_FAILED;
|
|
||||||
// Assume the local handle was closed even if the foreign handle could
|
|
||||||
// not be created.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DCHECK(result == PP_OK ||
|
|
||||||
foreign_socket_handle == IPC::InvalidPlatformFileForTransit());
|
|
||||||
|
|
||||||
bool success = dispatcher()->Send(new PpapiMsg_PPBBroker_ConnectComplete(
|
|
||||||
API_ID_PPB_BROKER, broker, foreign_socket_handle, result));
|
|
||||||
|
|
||||||
if (!success || result != PP_OK) {
|
|
||||||
// The plugin did not receive the handle, so it must be closed.
|
|
||||||
// The easiest way to clean it up is to just put it in an object
|
|
||||||
// and then close it. This failure case is not performance critical.
|
|
||||||
// The handle could still leak if Send succeeded but the IPC later failed.
|
|
||||||
base::SyncSocket temp_socket(
|
|
||||||
IPC::PlatformFileForTransitToPlatformFile(foreign_socket_handle));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace proxy
|
|
||||||
} // namespace ppapi
|
|
@@ -1,52 +0,0 @@
|
|||||||
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#ifndef PPAPI_PROXY_PPB_BROKER_PROXY_H_
|
|
||||||
#define PPAPI_PROXY_PPB_BROKER_PROXY_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "base/sync_socket.h"
|
|
||||||
#include "ipc/ipc_platform_file.h"
|
|
||||||
#include "ppapi/c/pp_instance.h"
|
|
||||||
#include "ppapi/proxy/interface_proxy.h"
|
|
||||||
#include "ppapi/proxy/proxy_completion_callback_factory.h"
|
|
||||||
#include "ppapi/utility/completion_callback_factory.h"
|
|
||||||
|
|
||||||
namespace ppapi {
|
|
||||||
|
|
||||||
class HostResource;
|
|
||||||
|
|
||||||
namespace proxy {
|
|
||||||
|
|
||||||
class PPB_Broker_Proxy : public InterfaceProxy {
|
|
||||||
public:
|
|
||||||
explicit PPB_Broker_Proxy(Dispatcher* dispatcher);
|
|
||||||
~PPB_Broker_Proxy() override;
|
|
||||||
|
|
||||||
static PP_Resource CreateProxyResource(PP_Instance instance);
|
|
||||||
|
|
||||||
// InterfaceProxy implementation.
|
|
||||||
bool OnMessageReceived(const IPC::Message& msg) override;
|
|
||||||
|
|
||||||
static const ApiID kApiID = API_ID_PPB_BROKER;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Message handlers.
|
|
||||||
void OnMsgCreate(PP_Instance instance, ppapi::HostResource* result_resource);
|
|
||||||
void OnMsgConnect(const ppapi::HostResource& broker);
|
|
||||||
void OnMsgConnectComplete(const ppapi::HostResource& broker,
|
|
||||||
IPC::PlatformFileForTransit foreign_socket_handle,
|
|
||||||
int32_t result);
|
|
||||||
|
|
||||||
void ConnectCompleteInHost(int32_t result,
|
|
||||||
const ppapi::HostResource& host_resource);
|
|
||||||
|
|
||||||
ProxyCompletionCallbackFactory<PPB_Broker_Proxy> callback_factory_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace proxy
|
|
||||||
} // namespace ppapi
|
|
||||||
|
|
||||||
#endif // PPAPI_PROXY_PPB_BROKER_PROXY_H_
|
|
@@ -18,7 +18,6 @@
|
|||||||
#include "ppapi/c/ppb_instance.h"
|
#include "ppapi/c/ppb_instance.h"
|
||||||
#include "ppapi/c/ppb_messaging.h"
|
#include "ppapi/c/ppb_messaging.h"
|
||||||
#include "ppapi/c/ppb_mouse_lock.h"
|
#include "ppapi/c/ppb_mouse_lock.h"
|
||||||
#include "ppapi/proxy/broker_resource.h"
|
|
||||||
#include "ppapi/proxy/browser_font_singleton_resource.h"
|
#include "ppapi/proxy/browser_font_singleton_resource.h"
|
||||||
#include "ppapi/proxy/enter_proxy.h"
|
#include "ppapi/proxy/enter_proxy.h"
|
||||||
#include "ppapi/proxy/flash_fullscreen_resource.h"
|
#include "ppapi/proxy/flash_fullscreen_resource.h"
|
||||||
@@ -345,9 +344,6 @@ Resource* PPB_Instance_Proxy::GetSingletonResource(PP_Instance instance,
|
|||||||
static_cast<PluginDispatcher*>(dispatcher())->sender());
|
static_cast<PluginDispatcher*>(dispatcher())->sender());
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case BROKER_SINGLETON_ID:
|
|
||||||
new_singleton = new BrokerResource(connection, instance);
|
|
||||||
break;
|
|
||||||
case GAMEPAD_SINGLETON_ID:
|
case GAMEPAD_SINGLETON_ID:
|
||||||
new_singleton = new GamepadResource(connection, instance);
|
new_singleton = new GamepadResource(connection, instance);
|
||||||
break;
|
break;
|
||||||
|
@@ -27,7 +27,6 @@
|
|||||||
#include "ppapi/proxy/plugin_resource_tracker.h"
|
#include "ppapi/proxy/plugin_resource_tracker.h"
|
||||||
#include "ppapi/proxy/ppapi_messages.h"
|
#include "ppapi/proxy/ppapi_messages.h"
|
||||||
#include "ppapi/proxy/ppb_audio_proxy.h"
|
#include "ppapi/proxy/ppb_audio_proxy.h"
|
||||||
#include "ppapi/proxy/ppb_broker_proxy.h"
|
|
||||||
#include "ppapi/proxy/ppb_buffer_proxy.h"
|
#include "ppapi/proxy/ppb_buffer_proxy.h"
|
||||||
#include "ppapi/proxy/ppb_graphics_3d_proxy.h"
|
#include "ppapi/proxy/ppb_graphics_3d_proxy.h"
|
||||||
#include "ppapi/proxy/ppb_image_data_proxy.h"
|
#include "ppapi/proxy/ppb_image_data_proxy.h"
|
||||||
@@ -391,10 +390,6 @@ PP_Resource ResourceCreationProxy::CreateAudioOutput(PP_Instance instance) {
|
|||||||
return (new AudioOutputResource(GetConnection(), instance))->GetReference();
|
return (new AudioOutputResource(GetConnection(), instance))->GetReference();
|
||||||
}
|
}
|
||||||
|
|
||||||
PP_Resource ResourceCreationProxy::CreateBroker(PP_Instance instance) {
|
|
||||||
return PPB_Broker_Proxy::CreateProxyResource(instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
PP_Resource ResourceCreationProxy::CreateBrowserFont(
|
PP_Resource ResourceCreationProxy::CreateBrowserFont(
|
||||||
PP_Instance instance,
|
PP_Instance instance,
|
||||||
const PP_BrowserFont_Trusted_Description* description) {
|
const PP_BrowserFont_Trusted_Description* description) {
|
||||||
|
@@ -156,7 +156,6 @@ class ResourceCreationProxy : public InterfaceProxy,
|
|||||||
#if !defined(OS_NACL)
|
#if !defined(OS_NACL)
|
||||||
PP_Resource CreateAudioInput(PP_Instance instance) override;
|
PP_Resource CreateAudioInput(PP_Instance instance) override;
|
||||||
PP_Resource CreateAudioOutput(PP_Instance instance) override;
|
PP_Resource CreateAudioOutput(PP_Instance instance) override;
|
||||||
PP_Resource CreateBroker(PP_Instance instance) override;
|
|
||||||
PP_Resource CreateBrowserFont(
|
PP_Resource CreateBrowserFont(
|
||||||
PP_Instance instance,
|
PP_Instance instance,
|
||||||
const PP_BrowserFont_Trusted_Description* description) override;
|
const PP_BrowserFont_Trusted_Description* description) override;
|
||||||
|
@@ -13,7 +13,6 @@ enum ApiID {
|
|||||||
// Zero is reserved for control messages.
|
// Zero is reserved for control messages.
|
||||||
API_ID_NONE = 0,
|
API_ID_NONE = 0,
|
||||||
API_ID_PPB_AUDIO = 1,
|
API_ID_PPB_AUDIO = 1,
|
||||||
API_ID_PPB_BROKER,
|
|
||||||
API_ID_PPB_BUFFER,
|
API_ID_PPB_BUFFER,
|
||||||
API_ID_PPB_CORE,
|
API_ID_PPB_CORE,
|
||||||
API_ID_PPB_FLASH_MESSAGELOOP,
|
API_ID_PPB_FLASH_MESSAGELOOP,
|
||||||
|
@@ -117,9 +117,6 @@ class PPAPI_SHARED_EXPORT PpapiGlobals {
|
|||||||
// in-process plugins.
|
// in-process plugins.
|
||||||
virtual base::TaskRunner* GetFileTaskRunner() = 0;
|
virtual base::TaskRunner* GetFileTaskRunner() = 0;
|
||||||
|
|
||||||
// Returns the command line for the process.
|
|
||||||
virtual std::string GetCmdLine() = 0;
|
|
||||||
|
|
||||||
// Preloads the font on Windows, does nothing on other platforms.
|
// Preloads the font on Windows, does nothing on other platforms.
|
||||||
// TODO(brettw) remove this by passing the instance into the API so we don't
|
// TODO(brettw) remove this by passing the instance into the API so we don't
|
||||||
// have to have it on the globals.
|
// have to have it on the globals.
|
||||||
|
@@ -25,8 +25,6 @@
|
|||||||
F(PPB_AudioInput_API) \
|
F(PPB_AudioInput_API) \
|
||||||
F(PPB_AudioOutput_API) \
|
F(PPB_AudioOutput_API) \
|
||||||
F(PPB_AudioTrusted_API) \
|
F(PPB_AudioTrusted_API) \
|
||||||
F(PPB_Broker_API) \
|
|
||||||
F(PPB_Broker_Instance_API) \
|
|
||||||
F(PPB_BrowserFont_Singleton_API) \
|
F(PPB_BrowserFont_Singleton_API) \
|
||||||
F(PPB_BrowserFont_Trusted_API) \
|
F(PPB_BrowserFont_Trusted_API) \
|
||||||
F(PPB_Buffer_API) \
|
F(PPB_Buffer_API) \
|
||||||
|
@@ -10,10 +10,6 @@ namespace ppapi {
|
|||||||
// These IDs are used to access singleton resource objects using
|
// These IDs are used to access singleton resource objects using
|
||||||
// PPB_Instance_API.GetSingletonResource.
|
// PPB_Instance_API.GetSingletonResource.
|
||||||
enum SingletonResourceID {
|
enum SingletonResourceID {
|
||||||
// TODO(raymes): The broker resource isn't really a singleton. This is only
|
|
||||||
// a hack until PPB_Broker trusted has been fully refactored to the new
|
|
||||||
// resource model.
|
|
||||||
BROKER_SINGLETON_ID,
|
|
||||||
BROWSER_FONT_SINGLETON_ID,
|
BROWSER_FONT_SINGLETON_ID,
|
||||||
FLASH_FULLSCREEN_SINGLETON_ID,
|
FLASH_FULLSCREEN_SINGLETON_ID,
|
||||||
GAMEPAD_SINGLETON_ID,
|
GAMEPAD_SINGLETON_ID,
|
||||||
|
@@ -40,8 +40,6 @@ thunk::ResourceCreationAPI* TestGlobals::GetResourceCreationAPI(
|
|||||||
|
|
||||||
PP_Module TestGlobals::GetModuleForInstance(PP_Instance instance) { return 0; }
|
PP_Module TestGlobals::GetModuleForInstance(PP_Instance instance) { return 0; }
|
||||||
|
|
||||||
std::string TestGlobals::GetCmdLine() { return std::string(); }
|
|
||||||
|
|
||||||
void TestGlobals::PreCacheFontForFlash(const void* /* logfontw */) {}
|
void TestGlobals::PreCacheFontForFlash(const void* /* logfontw */) {}
|
||||||
|
|
||||||
void TestGlobals::LogWithSource(PP_Instance instance,
|
void TestGlobals::LogWithSource(PP_Instance instance,
|
||||||
|
@@ -69,7 +69,6 @@ class TestGlobals : public PpapiGlobals {
|
|||||||
thunk::ResourceCreationAPI* GetResourceCreationAPI(
|
thunk::ResourceCreationAPI* GetResourceCreationAPI(
|
||||||
PP_Instance instance) override;
|
PP_Instance instance) override;
|
||||||
PP_Module GetModuleForInstance(PP_Instance instance) override;
|
PP_Module GetModuleForInstance(PP_Instance instance) override;
|
||||||
std::string GetCmdLine() override;
|
|
||||||
void PreCacheFontForFlash(const void* logfontw) override;
|
void PreCacheFontForFlash(const void* logfontw) override;
|
||||||
void LogWithSource(PP_Instance instance,
|
void LogWithSource(PP_Instance instance,
|
||||||
PP_LogLevel level,
|
PP_LogLevel level,
|
||||||
|
@@ -1,355 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "ppapi/tests/test_broker.h"
|
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#define OS_WIN 1
|
|
||||||
#include <windows.h>
|
|
||||||
#else
|
|
||||||
#define OS_POSIX 1
|
|
||||||
#include <errno.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstring>
|
|
||||||
#include <fstream>
|
|
||||||
#include <limits>
|
|
||||||
|
|
||||||
#include "ppapi/c/pp_errors.h"
|
|
||||||
#include "ppapi/c/trusted/ppb_broker_trusted.h"
|
|
||||||
#include "ppapi/c/trusted/ppp_broker.h"
|
|
||||||
#include "ppapi/tests/test_utils.h"
|
|
||||||
#include "ppapi/tests/testing_instance.h"
|
|
||||||
|
|
||||||
REGISTER_TEST_CASE(Broker);
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
const char kHelloMessage[] = "Hello Plugin! This is Broker!";
|
|
||||||
// Message sent from broker to plugin if the broker is unsandboxed.
|
|
||||||
const char kBrokerUnsandboxed[] = "Broker is Unsandboxed!";
|
|
||||||
// Message sent from broker to plugin if the broker is sandboxed. This message
|
|
||||||
// needs to be longer than |kBrokerUnsandboxed| because the plugin is expecting
|
|
||||||
// |kBrokerUnsandboxed|. If it's shorter and the broker doesn't close its handle
|
|
||||||
// properly the plugin will hang waiting for all data of |kBrokerUnsandboxed| to
|
|
||||||
// be read.
|
|
||||||
const char kBrokerSandboxed[] = "Broker is Sandboxed! Verification failed!";
|
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
typedef HANDLE PlatformFile;
|
|
||||||
const PlatformFile kInvalidPlatformFileValue = INVALID_HANDLE_VALUE;
|
|
||||||
const int32_t kInvalidHandle = static_cast<int32_t>(
|
|
||||||
reinterpret_cast<intptr_t>(INVALID_HANDLE_VALUE));
|
|
||||||
#elif defined(OS_POSIX)
|
|
||||||
typedef int PlatformFile;
|
|
||||||
const PlatformFile kInvalidPlatformFileValue = -1;
|
|
||||||
const int32_t kInvalidHandle = -1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PlatformFile IntToPlatformFile(int32_t handle) {
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
return reinterpret_cast<HANDLE>(static_cast<intptr_t>(handle));
|
|
||||||
#elif defined(OS_POSIX)
|
|
||||||
return handle;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(OS_POSIX)
|
|
||||||
|
|
||||||
#define HANDLE_EINTR(x) ({ \
|
|
||||||
decltype(x) eintr_wrapper_result; \
|
|
||||||
do { \
|
|
||||||
eintr_wrapper_result = (x); \
|
|
||||||
} while (eintr_wrapper_result == -1 && errno == EINTR); \
|
|
||||||
eintr_wrapper_result; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define IGNORE_EINTR(x) ({ \
|
|
||||||
decltype(x) eintr_wrapper_result; \
|
|
||||||
do { \
|
|
||||||
eintr_wrapper_result = (x); \
|
|
||||||
if (eintr_wrapper_result == -1 && errno == EINTR) { \
|
|
||||||
eintr_wrapper_result = 0; \
|
|
||||||
} \
|
|
||||||
} while (0); \
|
|
||||||
eintr_wrapper_result; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool ReadMessage(PlatformFile file, size_t message_len, char* message) {
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
assert(message_len < std::numeric_limits<DWORD>::max());
|
|
||||||
DWORD read = 0;
|
|
||||||
const DWORD size = static_cast<DWORD>(message_len);
|
|
||||||
return ::ReadFile(file, message, size, &read, NULL) && read == size;
|
|
||||||
#elif defined(OS_POSIX)
|
|
||||||
assert(message_len <
|
|
||||||
static_cast<size_t>(std::numeric_limits<ssize_t>::max()));
|
|
||||||
size_t total_read = 0;
|
|
||||||
while (total_read < message_len) {
|
|
||||||
ssize_t read = HANDLE_EINTR(::read(file, message + total_read,
|
|
||||||
message_len - total_read));
|
|
||||||
if (read <= 0)
|
|
||||||
break;
|
|
||||||
total_read += read;
|
|
||||||
}
|
|
||||||
return total_read == message_len;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WriteMessage(PlatformFile file, size_t message_len, const char* message) {
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
assert(message_len < std::numeric_limits<DWORD>::max());
|
|
||||||
DWORD written = 0;
|
|
||||||
const DWORD size = static_cast<DWORD>(message_len);
|
|
||||||
return ::WriteFile(file, message, size, &written, NULL) && written == size;
|
|
||||||
#elif defined(OS_POSIX)
|
|
||||||
assert(message_len <
|
|
||||||
static_cast<size_t>(std::numeric_limits<ssize_t>::max()));
|
|
||||||
size_t total_written = 0;
|
|
||||||
while (total_written < message_len) {
|
|
||||||
ssize_t written = HANDLE_EINTR(::write(file, message + total_written,
|
|
||||||
message_len - total_written));
|
|
||||||
if (written <= 0)
|
|
||||||
break;
|
|
||||||
total_written += written;
|
|
||||||
}
|
|
||||||
return total_written == message_len;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
bool VerifyMessage(PlatformFile file, size_t message_len, const char* message) {
|
|
||||||
char* message_received = new char[message_len];
|
|
||||||
bool success = ReadMessage(file, message_len, message_received) &&
|
|
||||||
!::strcmp(message_received, message);
|
|
||||||
delete [] message_received;
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ClosePlatformFile(PlatformFile file) {
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
return !!::CloseHandle(file);
|
|
||||||
#elif defined(OS_POSIX)
|
|
||||||
return !IGNORE_EINTR(::close(file));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
bool VerifyIsUnsandboxed() {
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
FILE* file = NULL;
|
|
||||||
wchar_t temp_path[MAX_PATH] = {'\0'};
|
|
||||||
wchar_t file_name[MAX_PATH] = {'\0'};
|
|
||||||
if (!::GetTempPath(MAX_PATH, temp_path) ||
|
|
||||||
!::GetTempFileName(temp_path, L"test_pepper_broker", 0, file_name) ||
|
|
||||||
::_wfopen_s(&file, file_name, L"w"))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (::fclose(file)) {
|
|
||||||
::DeleteFile(file_name);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return !!::DeleteFile(file_name);
|
|
||||||
#elif defined(OS_POSIX)
|
|
||||||
char file_name[] = "/tmp/test_pepper_broker_XXXXXX";
|
|
||||||
int fd = ::mkstemp(file_name);
|
|
||||||
if (-1 == fd)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (IGNORE_EINTR(::close(fd))) {
|
|
||||||
::remove(file_name);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return !::remove(file_name);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Callback in the broker when a new broker connection occurs.
|
|
||||||
int32_t OnInstanceConnected(PP_Instance instance, int32_t handle) {
|
|
||||||
PlatformFile file = IntToPlatformFile(handle);
|
|
||||||
if (file == kInvalidPlatformFileValue)
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
|
|
||||||
// Send hello message.
|
|
||||||
if (!WriteMessage(file, sizeof(kHelloMessage), kHelloMessage)) {
|
|
||||||
ClosePlatformFile(file);
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify broker is not sandboxed and send result to plugin over the pipe.
|
|
||||||
if (VerifyIsUnsandboxed()) {
|
|
||||||
if (!WriteMessage(file, sizeof(kBrokerUnsandboxed), kBrokerUnsandboxed)) {
|
|
||||||
ClosePlatformFile(file);
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!WriteMessage(file, sizeof(kBrokerSandboxed), kBrokerSandboxed)) {
|
|
||||||
ClosePlatformFile(file);
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ClosePlatformFile(file))
|
|
||||||
return PP_ERROR_FAILED;
|
|
||||||
|
|
||||||
return PP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
PP_EXPORT int32_t PPP_InitializeBroker(
|
|
||||||
PP_ConnectInstance_Func* connect_instance_func) {
|
|
||||||
*connect_instance_func = &OnInstanceConnected;
|
|
||||||
return PP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
PP_EXPORT void PPP_ShutdownBroker() {}
|
|
||||||
|
|
||||||
TestBroker::TestBroker(TestingInstance* instance)
|
|
||||||
: TestCase(instance),
|
|
||||||
broker_interface_(NULL) {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TestBroker::Init() {
|
|
||||||
broker_interface_ = static_cast<const PPB_BrokerTrusted*>(
|
|
||||||
pp::Module::Get()->GetBrowserInterface(PPB_BROKER_TRUSTED_INTERFACE));
|
|
||||||
return !!broker_interface_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TestBroker::RunTests(const std::string& filter) {
|
|
||||||
RUN_TEST(Create, filter);
|
|
||||||
RUN_TEST(Create, filter);
|
|
||||||
RUN_TEST(GetHandleFailure, filter);
|
|
||||||
RUN_TEST_FORCEASYNC_AND_NOT(ConnectFailure, filter);
|
|
||||||
RUN_TEST_FORCEASYNC_AND_NOT(ConnectAndPipe, filter);
|
|
||||||
|
|
||||||
// The following tests require special setup, so only run them if they're
|
|
||||||
// explicitly specified by the filter.
|
|
||||||
if (!ShouldRunAllTests(filter)) {
|
|
||||||
RUN_TEST(ConnectPermissionDenied, filter);
|
|
||||||
RUN_TEST(ConnectPermissionGranted, filter);
|
|
||||||
RUN_TEST(IsAllowedPermissionDenied, filter);
|
|
||||||
RUN_TEST(IsAllowedPermissionGranted, filter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string TestBroker::TestCreate() {
|
|
||||||
// Very simplistic test to make sure we can create a broker interface.
|
|
||||||
// TODO(raymes): All of the resources created in this file are leaked. Write
|
|
||||||
// a C++ wrapper for PPB_Broker_Trusted to avoid these leaks.
|
|
||||||
PP_Resource broker = broker_interface_->CreateTrusted(
|
|
||||||
instance_->pp_instance());
|
|
||||||
ASSERT_TRUE(broker);
|
|
||||||
|
|
||||||
ASSERT_FALSE(broker_interface_->IsBrokerTrusted(0));
|
|
||||||
ASSERT_TRUE(broker_interface_->IsBrokerTrusted(broker));
|
|
||||||
|
|
||||||
PASS();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test connection on invalid resource.
|
|
||||||
std::string TestBroker::TestConnectFailure() {
|
|
||||||
TestCompletionCallback callback(instance_->pp_instance(), callback_type());
|
|
||||||
callback.WaitForResult(broker_interface_->Connect(0,
|
|
||||||
callback.GetCallback().pp_completion_callback()));
|
|
||||||
CHECK_CALLBACK_BEHAVIOR(callback);
|
|
||||||
ASSERT_EQ(PP_ERROR_BADRESOURCE, callback.result());
|
|
||||||
|
|
||||||
PASS();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string TestBroker::TestGetHandleFailure() {
|
|
||||||
int32_t handle = kInvalidHandle;
|
|
||||||
|
|
||||||
// Test getting the handle for an invalid resource.
|
|
||||||
ASSERT_EQ(PP_ERROR_BADRESOURCE, broker_interface_->GetHandle(0, &handle));
|
|
||||||
|
|
||||||
// Connect hasn't been called so this should fail.
|
|
||||||
PP_Resource broker = broker_interface_->CreateTrusted(
|
|
||||||
instance_->pp_instance());
|
|
||||||
ASSERT_TRUE(broker);
|
|
||||||
ASSERT_EQ(PP_ERROR_FAILED, broker_interface_->GetHandle(broker, &handle));
|
|
||||||
|
|
||||||
PASS();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string TestBroker::TestConnectAndPipe() {
|
|
||||||
PP_Resource broker = broker_interface_->CreateTrusted(
|
|
||||||
instance_->pp_instance());
|
|
||||||
ASSERT_TRUE(broker);
|
|
||||||
|
|
||||||
TestCompletionCallback callback(instance_->pp_instance(), callback_type());
|
|
||||||
callback.WaitForResult(broker_interface_->Connect(broker,
|
|
||||||
callback.GetCallback().pp_completion_callback()));
|
|
||||||
CHECK_CALLBACK_BEHAVIOR(callback);
|
|
||||||
ASSERT_EQ(PP_OK, callback.result());
|
|
||||||
|
|
||||||
int32_t handle = kInvalidHandle;
|
|
||||||
ASSERT_EQ(PP_OK, broker_interface_->GetHandle(broker, &handle));
|
|
||||||
ASSERT_NE(kInvalidHandle, handle);
|
|
||||||
|
|
||||||
PlatformFile file = IntToPlatformFile(handle);
|
|
||||||
ASSERT_TRUE(VerifyMessage(file, sizeof(kHelloMessage), kHelloMessage));
|
|
||||||
ASSERT_TRUE(VerifyMessage(file, sizeof(kBrokerUnsandboxed),
|
|
||||||
kBrokerUnsandboxed));
|
|
||||||
|
|
||||||
ASSERT_TRUE(ClosePlatformFile(file));
|
|
||||||
|
|
||||||
PASS();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string TestBroker::TestConnectPermissionDenied() {
|
|
||||||
// This assumes that the browser side is set up to deny access to the broker.
|
|
||||||
PP_Resource broker = broker_interface_->CreateTrusted(
|
|
||||||
instance_->pp_instance());
|
|
||||||
ASSERT_TRUE(broker);
|
|
||||||
|
|
||||||
TestCompletionCallback callback(instance_->pp_instance(), callback_type());
|
|
||||||
callback.WaitForResult(broker_interface_->Connect(broker,
|
|
||||||
callback.GetCallback().pp_completion_callback()));
|
|
||||||
CHECK_CALLBACK_BEHAVIOR(callback);
|
|
||||||
ASSERT_EQ(PP_ERROR_NOACCESS, callback.result());
|
|
||||||
|
|
||||||
PASS();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string TestBroker::TestConnectPermissionGranted() {
|
|
||||||
// This assumes that the browser side is set up to allow access to the broker.
|
|
||||||
PP_Resource broker = broker_interface_->CreateTrusted(
|
|
||||||
instance_->pp_instance());
|
|
||||||
ASSERT_TRUE(broker);
|
|
||||||
|
|
||||||
TestCompletionCallback callback(instance_->pp_instance(), callback_type());
|
|
||||||
callback.WaitForResult(broker_interface_->Connect(broker,
|
|
||||||
callback.GetCallback().pp_completion_callback()));
|
|
||||||
CHECK_CALLBACK_BEHAVIOR(callback);
|
|
||||||
ASSERT_EQ(PP_OK, callback.result());
|
|
||||||
|
|
||||||
PASS();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string TestBroker::TestIsAllowedPermissionDenied() {
|
|
||||||
PP_Resource broker = broker_interface_->CreateTrusted(
|
|
||||||
instance_->pp_instance());
|
|
||||||
ASSERT_TRUE(broker);
|
|
||||||
ASSERT_EQ(PP_FALSE, broker_interface_->IsAllowed(broker));
|
|
||||||
|
|
||||||
PASS();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string TestBroker::TestIsAllowedPermissionGranted() {
|
|
||||||
PP_Resource broker = broker_interface_->CreateTrusted(
|
|
||||||
instance_->pp_instance());
|
|
||||||
ASSERT_TRUE(broker);
|
|
||||||
ASSERT_EQ(PP_TRUE, broker_interface_->IsAllowed(broker));
|
|
||||||
|
|
||||||
PASS();
|
|
||||||
}
|
|
@@ -1,35 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#ifndef PPAPI_TESTS_TEST_BROKER_H_
|
|
||||||
#define PPAPI_TESTS_TEST_BROKER_H_
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "ppapi/c/trusted/ppb_broker_trusted.h"
|
|
||||||
#include "ppapi/tests/test_case.h"
|
|
||||||
|
|
||||||
class TestBroker : public TestCase {
|
|
||||||
public:
|
|
||||||
TestBroker(TestingInstance* instance);
|
|
||||||
|
|
||||||
// TestCase implementation.
|
|
||||||
virtual bool Init();
|
|
||||||
virtual void RunTests(const std::string& filter);
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string TestCreate();
|
|
||||||
std::string TestConnectFailure();
|
|
||||||
std::string TestGetHandleFailure();
|
|
||||||
std::string TestConnectAndPipe();
|
|
||||||
std::string TestConnectPermissionDenied();
|
|
||||||
std::string TestConnectPermissionGranted();
|
|
||||||
std::string TestIsAllowedPermissionDenied();
|
|
||||||
std::string TestIsAllowedPermissionGranted();
|
|
||||||
|
|
||||||
const PPB_BrokerTrusted* broker_interface_;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // PPAPI_TESTS_TEST_BROKER_H_
|
|
@@ -31,7 +31,6 @@ source_set("thunk") {
|
|||||||
"ppb_audio_input_api.h",
|
"ppb_audio_input_api.h",
|
||||||
"ppb_audio_output_api.h",
|
"ppb_audio_output_api.h",
|
||||||
"ppb_audio_thunk.cc",
|
"ppb_audio_thunk.cc",
|
||||||
"ppb_broker_api.h",
|
|
||||||
"ppb_browser_font_singleton_api.h",
|
"ppb_browser_font_singleton_api.h",
|
||||||
"ppb_browser_font_trusted_api.h",
|
"ppb_browser_font_trusted_api.h",
|
||||||
"ppb_buffer_api.h",
|
"ppb_buffer_api.h",
|
||||||
@@ -143,7 +142,6 @@ source_set("thunk") {
|
|||||||
sources += [
|
sources += [
|
||||||
"ppb_audio_input_dev_thunk.cc",
|
"ppb_audio_input_dev_thunk.cc",
|
||||||
"ppb_audio_output_dev_thunk.cc",
|
"ppb_audio_output_dev_thunk.cc",
|
||||||
"ppb_broker_thunk.cc",
|
|
||||||
"ppb_browser_font_trusted_thunk.cc",
|
"ppb_browser_font_trusted_thunk.cc",
|
||||||
"ppb_buffer_thunk.cc",
|
"ppb_buffer_thunk.cc",
|
||||||
"ppb_char_set_thunk.cc",
|
"ppb_char_set_thunk.cc",
|
||||||
|
@@ -17,12 +17,6 @@ PROXIED_IFACE(PPB_X509CERTIFICATE_PRIVATE_INTERFACE_0_1,
|
|||||||
PPB_X509Certificate_Private_0_1)
|
PPB_X509Certificate_Private_0_1)
|
||||||
|
|
||||||
#if !defined(OS_NACL)
|
#if !defined(OS_NACL)
|
||||||
PROXIED_API(PPB_Broker)
|
|
||||||
|
|
||||||
PROXIED_IFACE(PPB_BROKER_TRUSTED_INTERFACE_0_2,
|
|
||||||
PPB_BrokerTrusted_0_2)
|
|
||||||
PROXIED_IFACE(PPB_BROKER_TRUSTED_INTERFACE_0_3,
|
|
||||||
PPB_BrokerTrusted_0_3)
|
|
||||||
PROXIED_IFACE(PPB_BROWSERFONT_TRUSTED_INTERFACE_1_0,
|
PROXIED_IFACE(PPB_BROWSERFONT_TRUSTED_INTERFACE_1_0,
|
||||||
PPB_BrowserFont_Trusted_1_0)
|
PPB_BrowserFont_Trusted_1_0)
|
||||||
PROXIED_IFACE(PPB_CHARSET_TRUSTED_INTERFACE_1_0,
|
PROXIED_IFACE(PPB_CHARSET_TRUSTED_INTERFACE_1_0,
|
||||||
|
@@ -1,44 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#ifndef PPAPI_THUNK_PPB_BROKER_API_H_
|
|
||||||
#define PPAPI_THUNK_PPB_BROKER_API_H_
|
|
||||||
|
|
||||||
#include "base/memory/ref_counted.h"
|
|
||||||
#include "ppapi/c/pp_bool.h"
|
|
||||||
#include "ppapi/c/pp_completion_callback.h"
|
|
||||||
#include "ppapi/c/pp_stdint.h"
|
|
||||||
#include "ppapi/shared_impl/singleton_resource_id.h"
|
|
||||||
|
|
||||||
namespace ppapi {
|
|
||||||
|
|
||||||
class TrackedCallback;
|
|
||||||
|
|
||||||
namespace thunk {
|
|
||||||
|
|
||||||
class PPB_Broker_API {
|
|
||||||
public:
|
|
||||||
virtual ~PPB_Broker_API() {}
|
|
||||||
|
|
||||||
virtual int32_t Connect(scoped_refptr<TrackedCallback> connect_callback) = 0;
|
|
||||||
virtual int32_t GetHandle(int32_t* handle) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
// TODO(raymes): Merge this into PPB_Broker_API when the PPB_Broker proxy is
|
|
||||||
// refactored to the new resource model. The IsAllowed function should be
|
|
||||||
// attached to the resource implementing the PPB_Broker_API. However in order to
|
|
||||||
// implement this quickly, the function is added in a new instance API.
|
|
||||||
class PPB_Broker_Instance_API {
|
|
||||||
public:
|
|
||||||
virtual ~PPB_Broker_Instance_API() {}
|
|
||||||
|
|
||||||
virtual PP_Bool IsAllowed() = 0;
|
|
||||||
|
|
||||||
static const SingletonResourceID kSingletonResourceID = BROKER_SINGLETON_ID;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace thunk
|
|
||||||
} // namespace ppapi
|
|
||||||
|
|
||||||
#endif // PPAPI_THUNK_PPB_BROKER_API_H_
|
|
@@ -1,88 +0,0 @@
|
|||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "ppapi/c/pp_errors.h"
|
|
||||||
#include "ppapi/c/trusted/ppb_broker_trusted.h"
|
|
||||||
#include "ppapi/shared_impl/tracked_callback.h"
|
|
||||||
#include "ppapi/thunk/enter.h"
|
|
||||||
#include "ppapi/thunk/ppb_broker_api.h"
|
|
||||||
#include "ppapi/thunk/resource_creation_api.h"
|
|
||||||
#include "ppapi/thunk/thunk.h"
|
|
||||||
|
|
||||||
namespace ppapi {
|
|
||||||
namespace thunk {
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
PP_Resource CreateTrusted(PP_Instance instance) {
|
|
||||||
EnterResourceCreation enter(instance);
|
|
||||||
if (enter.failed())
|
|
||||||
return 0;
|
|
||||||
return enter.functions()->CreateBroker(instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
PP_Bool IsBrokerTrusted(PP_Resource resource) {
|
|
||||||
EnterResource<PPB_Broker_API> enter(resource, false);
|
|
||||||
return PP_FromBool(enter.succeeded());
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t Connect(PP_Resource resource,
|
|
||||||
PP_CompletionCallback callback) {
|
|
||||||
EnterResource<PPB_Broker_API> enter(resource, callback, true);
|
|
||||||
if (enter.failed())
|
|
||||||
return enter.retval();
|
|
||||||
return enter.SetResult(enter.object()->Connect(enter.callback()));
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t GetHandle(PP_Resource resource, int32_t* handle) {
|
|
||||||
EnterResource<PPB_Broker_API> enter(resource, true);
|
|
||||||
if (enter.failed())
|
|
||||||
return enter.retval();
|
|
||||||
return enter.object()->GetHandle(handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
PP_Bool IsAllowed(PP_Resource resource) {
|
|
||||||
// TODO(raymes): This is a hack. See the note in ppb_broker_api.h.
|
|
||||||
PP_Instance instance = 0;
|
|
||||||
{
|
|
||||||
EnterResource<PPB_Broker_API> enter_resource(resource, true);
|
|
||||||
if (enter_resource.failed())
|
|
||||||
return PP_FALSE;
|
|
||||||
instance = enter_resource.resource()->pp_instance();
|
|
||||||
}
|
|
||||||
EnterInstanceAPI<PPB_Broker_Instance_API> enter_instance(instance);
|
|
||||||
if (enter_instance.failed())
|
|
||||||
return PP_FALSE;
|
|
||||||
return enter_instance.functions()->IsAllowed();
|
|
||||||
}
|
|
||||||
|
|
||||||
const PPB_BrokerTrusted_0_2 g_ppb_broker_0_2_thunk = {
|
|
||||||
&CreateTrusted,
|
|
||||||
&IsBrokerTrusted,
|
|
||||||
&Connect,
|
|
||||||
&GetHandle,
|
|
||||||
};
|
|
||||||
|
|
||||||
const PPB_BrokerTrusted_0_3 g_ppb_broker_0_3_thunk = {
|
|
||||||
&CreateTrusted,
|
|
||||||
&IsBrokerTrusted,
|
|
||||||
&Connect,
|
|
||||||
&GetHandle,
|
|
||||||
&IsAllowed,
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
const PPB_BrokerTrusted_0_2* GetPPB_BrokerTrusted_0_2_Thunk() {
|
|
||||||
return &g_ppb_broker_0_2_thunk;
|
|
||||||
}
|
|
||||||
|
|
||||||
const PPB_BrokerTrusted_0_3* GetPPB_BrokerTrusted_0_3_Thunk() {
|
|
||||||
return &g_ppb_broker_0_3_thunk;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace thunk
|
|
||||||
} // namespace ppapi
|
|
@@ -179,7 +179,6 @@ class ResourceCreationAPI {
|
|||||||
#if !defined(OS_NACL)
|
#if !defined(OS_NACL)
|
||||||
virtual PP_Resource CreateAudioInput(PP_Instance instance) = 0;
|
virtual PP_Resource CreateAudioInput(PP_Instance instance) = 0;
|
||||||
virtual PP_Resource CreateAudioOutput(PP_Instance instance) = 0;
|
virtual PP_Resource CreateAudioOutput(PP_Instance instance) = 0;
|
||||||
virtual PP_Resource CreateBroker(PP_Instance instance) = 0;
|
|
||||||
virtual PP_Resource CreateBrowserFont(
|
virtual PP_Resource CreateBrowserFont(
|
||||||
PP_Instance instance,
|
PP_Instance instance,
|
||||||
const PP_BrowserFont_Trusted_Description* description) = 0;
|
const PP_BrowserFont_Trusted_Description* description) = 0;
|
||||||
|
@@ -178,8 +178,6 @@ SandboxType SandboxTypeFromCommandLine(const base::CommandLine& command_line) {
|
|||||||
return SandboxType::kNoSandbox;
|
return SandboxType::kNoSandbox;
|
||||||
return SandboxType::kGpu;
|
return SandboxType::kGpu;
|
||||||
}
|
}
|
||||||
if (process_type == switches::kPpapiBrokerProcess)
|
|
||||||
return SandboxType::kNoSandbox;
|
|
||||||
|
|
||||||
if (process_type == switches::kPpapiPluginProcess)
|
if (process_type == switches::kPpapiPluginProcess)
|
||||||
return SandboxType::kPpapi;
|
return SandboxType::kPpapi;
|
||||||
|
@@ -134,19 +134,6 @@ TEST(SandboxTypeTest, GPU) {
|
|||||||
EXPECT_EQ(SandboxType::kNoSandbox, SandboxTypeFromCommandLine(command_line));
|
EXPECT_EQ(SandboxType::kNoSandbox, SandboxTypeFromCommandLine(command_line));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(SandboxTypeTest, PPAPIBroker) {
|
|
||||||
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
|
|
||||||
command_line.AppendSwitchASCII(switches::kProcessType,
|
|
||||||
switches::kPpapiBrokerProcess);
|
|
||||||
EXPECT_EQ(SandboxType::kNoSandbox, SandboxTypeFromCommandLine(command_line));
|
|
||||||
|
|
||||||
command_line.AppendSwitchASCII(switches::kServiceSandboxType, "network");
|
|
||||||
EXPECT_EQ(SandboxType::kNoSandbox, SandboxTypeFromCommandLine(command_line));
|
|
||||||
|
|
||||||
command_line.AppendSwitch(switches::kNoSandbox);
|
|
||||||
EXPECT_EQ(SandboxType::kNoSandbox, SandboxTypeFromCommandLine(command_line));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(SandboxTypeTest, PPAPIPlugin) {
|
TEST(SandboxTypeTest, PPAPIPlugin) {
|
||||||
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
|
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
|
||||||
command_line.AppendSwitchASCII(switches::kProcessType,
|
command_line.AppendSwitchASCII(switches::kProcessType,
|
||||||
|
@@ -114,7 +114,6 @@ const char kProcessType[] = "type";
|
|||||||
const char kGpuProcess[] = "gpu-process";
|
const char kGpuProcess[] = "gpu-process";
|
||||||
const char kNaClBrokerProcess[] = "nacl-broker";
|
const char kNaClBrokerProcess[] = "nacl-broker";
|
||||||
const char kNaClLoaderProcess[] = "nacl-loader";
|
const char kNaClLoaderProcess[] = "nacl-loader";
|
||||||
const char kPpapiBrokerProcess[] = "ppapi-broker";
|
|
||||||
const char kPpapiPluginProcess[] = "ppapi";
|
const char kPpapiPluginProcess[] = "ppapi";
|
||||||
const char kRendererProcess[] = "renderer";
|
const char kRendererProcess[] = "renderer";
|
||||||
const char kUtilityProcess[] = "utility";
|
const char kUtilityProcess[] = "utility";
|
||||||
|
@@ -71,7 +71,6 @@ SANDBOX_POLICY_EXPORT extern const char kProcessType[];
|
|||||||
SANDBOX_POLICY_EXPORT extern const char kGpuProcess[];
|
SANDBOX_POLICY_EXPORT extern const char kGpuProcess[];
|
||||||
SANDBOX_POLICY_EXPORT extern const char kNaClBrokerProcess[];
|
SANDBOX_POLICY_EXPORT extern const char kNaClBrokerProcess[];
|
||||||
SANDBOX_POLICY_EXPORT extern const char kNaClLoaderProcess[];
|
SANDBOX_POLICY_EXPORT extern const char kNaClLoaderProcess[];
|
||||||
SANDBOX_POLICY_EXPORT extern const char kPpapiBrokerProcess[];
|
|
||||||
SANDBOX_POLICY_EXPORT extern const char kPpapiPluginProcess[];
|
SANDBOX_POLICY_EXPORT extern const char kPpapiPluginProcess[];
|
||||||
SANDBOX_POLICY_EXPORT extern const char kRendererProcess[];
|
SANDBOX_POLICY_EXPORT extern const char kRendererProcess[];
|
||||||
SANDBOX_POLICY_EXPORT extern const char kUtilityProcess[];
|
SANDBOX_POLICY_EXPORT extern const char kUtilityProcess[];
|
||||||
|
Reference in New Issue
Block a user