Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Unified Diff: ppapi/native_client/src/trusted/plugin/plugin.cc

Issue 9390028: Remove browser support for non-PPAPI nexes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ppapi/native_client/src/trusted/plugin/plugin.cc
===================================================================
--- ppapi/native_client/src/trusted/plugin/plugin.cc (revision 121986)
+++ ppapi/native_client/src/trusted/plugin/plugin.cc (working copy)
@@ -40,19 +40,18 @@
#include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
#include "native_client/src/trusted/handle_pass/browser_handle.h"
#include "native_client/src/trusted/nonnacl_util/sel_ldr_launcher.h"
-#include "native_client/src/trusted/plugin/browser_interface.h"
-#include "native_client/src/trusted/plugin/desc_based_handle.h"
#include "native_client/src/trusted/plugin/json_manifest.h"
#include "native_client/src/trusted/plugin/nacl_subprocess.h"
#include "native_client/src/trusted/plugin/nexe_arch.h"
#include "native_client/src/trusted/plugin/plugin_error.h"
-#include "native_client/src/trusted/plugin/scriptable_handle.h"
+#include "native_client/src/trusted/plugin/scriptable_plugin.h"
#include "native_client/src/trusted/plugin/service_runtime.h"
#include "native_client/src/trusted/plugin/string_encoding.h"
#include "native_client/src/trusted/plugin/utility.h"
#include "native_client/src/trusted/service_runtime/include/sys/fcntl.h"
#include "native_client/src/trusted/service_runtime/nacl_error_code.h"
+#include "ppapi/c/dev/ppb_console_dev.h"
#include "ppapi/c/dev/ppp_find_dev.h"
#include "ppapi/c/dev/ppp_printing_dev.h"
#include "ppapi/c/dev/ppp_scrollbar_dev.h"
@@ -60,6 +59,7 @@
#include "ppapi/c/dev/ppp_widget_dev.h"
#include "ppapi/c/dev/ppp_zoom_dev.h"
#include "ppapi/c/pp_errors.h"
+#include "ppapi/c/ppb_var.h"
#include "ppapi/c/ppp_input_event.h"
#include "ppapi/c/ppp_instance.h"
#include "ppapi/c/ppp_mouse_lock.h"
@@ -84,12 +84,6 @@
namespace {
-bool GetReadyStateProperty(void* obj, SrpcParams* params) {
- Plugin* plugin = static_cast<Plugin*>(obj);
- params->outs()[0]->u.ival = plugin->nacl_ready_state();
- return true;
-}
-
const char* const kTypeAttribute = "type";
// The "src" attribute of the <embed> tag. The value is expected to be either
// a URL or URI pointing to the manifest file (which is expected to contain
@@ -116,24 +110,6 @@
// The key used to find the dictionary nexe URLs in the manifest file.
const char* const kNexesKey = "nexes";
-bool GetLastError(void* obj, SrpcParams* params) {
- NaClSrpcArg** outs = params->outs();
- PLUGIN_PRINTF(("GetLastError (obj=%p)\n", obj));
-
- Plugin* plugin = static_cast<Plugin*>(obj);
- outs[0]->arrays.str = strdup(plugin->last_error_string().c_str());
- return true;
-}
-
-bool GetExitStatus(void* obj, SrpcParams* params) {
- NaClSrpcArg** outs = params->outs();
- PLUGIN_PRINTF(("GetExitStatus (obj=%p)\n", obj));
-
- Plugin* plugin = static_cast<Plugin*>(obj);
- outs[0]->u.ival = plugin->exit_status();
- return true;
-}
-
// Up to 20 seconds
const int64_t kTimeSmallMin = 1; // in ms
const int64_t kTimeSmallMax = 20000; // in ms
@@ -505,80 +481,52 @@
} // namespace
-bool Plugin::ExperimentalJavaScriptApisAreEnabled() {
- return getenv("NACL_ENABLE_EXPERIMENTAL_JAVASCRIPT_APIS") != NULL;
-}
-
static int const kAbiHeaderBuffer = 256; // must be at least EI_ABIVERSION + 1
-void Plugin::LoadMethods() {
- PLUGIN_PRINTF(("Plugin::LoadMethods ()\n"));
- // Properties implemented by Plugin.
- AddPropertyGet(GetReadyStateProperty, "readyState", "i");
+void Plugin::AddPropertyGet(const nacl::string& prop_name,
+ Plugin::PropertyGetter getter) {
+ PLUGIN_PRINTF(("Plugin::AddPropertyGet (prop_name='%s')\n",
+ prop_name.c_str()));
+ property_getters_[nacl::string(prop_name)] = getter;
}
-bool Plugin::HasMethod(uintptr_t method_id, CallType call_type) {
- PLUGIN_PRINTF(("Plugin::HasMethod (method_id=%x)\n",
- static_cast<int>(method_id)));
- if (GetMethodInfo(method_id, call_type)) {
- PLUGIN_PRINTF(("true\n"));
- return true;
- }
- if (!ExperimentalJavaScriptApisAreEnabled()) {
- PLUGIN_PRINTF(("false\n"));
- return false;
- }
- if (call_type != METHOD_CALL) {
- // SRPC nexes can only export methods.
- PLUGIN_PRINTF(("false\n"));
- return false;
- }
- bool has_method = main_subprocess_.HasMethod(method_id);
- PLUGIN_PRINTF(("%s\n", (has_method ? "true" : "false")));
- return has_method;
+bool Plugin::HasProperty(const nacl::string& prop_name) {
+ PLUGIN_PRINTF(("Plugin::HasProperty (prop_name=%s)\n",
+ prop_name.c_str()));
+ return property_getters_[prop_name] != NULL;
}
-bool Plugin::InitParams(uintptr_t method_id,
- CallType call_type,
- SrpcParams* params) {
- MethodInfo* method_info = GetMethodInfo(method_id, call_type);
- PLUGIN_PRINTF(("Plugin::InitParams (id=%"NACL_PRIxPTR", method_info=%p)\n",
- method_id, method_info));
- if (NULL != method_info) {
- return params->Init(method_info->ins(), method_info->outs());
- }
- if (!ExperimentalJavaScriptApisAreEnabled()) {
+bool Plugin::GetProperty(const nacl::string& prop_name,
+ NaClSrpcArg* prop_value) {
+ PLUGIN_PRINTF(("Plugin::GetProperty (prop_name=%s)\n", prop_name.c_str()));
+
+ PropertyGetter getter = property_getters_[prop_name];
+ if (NULL == getter) {
return false;
}
- if (call_type != METHOD_CALL) {
- // SRPC nexes can only export methods.
- return false;
- }
- return main_subprocess_.InitParams(method_id, params);
+ (this->*getter)(prop_value);
+ return true;
}
-bool Plugin::Invoke(uintptr_t method_id,
- CallType call_type,
- SrpcParams* params) {
- MethodInfo* method_info = GetMethodInfo(method_id, call_type);
+void Plugin::GetExitStatus(NaClSrpcArg* prop_value) {
+ PLUGIN_PRINTF(("GetExitStatus (this=%p)\n", reinterpret_cast<void*>(this)));
+ prop_value->tag = NACL_SRPC_ARG_TYPE_INT;
+ prop_value->u.ival = exit_status();
+}
- if (NULL != method_info && NULL != method_info->function_ptr()) {
- return method_info->function_ptr()(static_cast<void*>(this), params);
- }
- if (!ExperimentalJavaScriptApisAreEnabled()) {
- return false;
- }
- if (call_type != METHOD_CALL) {
- // SRPC nexes can only export methods.
- return false;
- }
- return main_subprocess_.Invoke(method_id, params);
+void Plugin::GetLastError(NaClSrpcArg* prop_value) {
+ PLUGIN_PRINTF(("GetLastError (this=%p)\n", reinterpret_cast<void*>(this)));
+ prop_value->tag = NACL_SRPC_ARG_TYPE_STRING;
+ prop_value->arrays.str = strdup(last_error_string().c_str());
}
-bool Plugin::Init(BrowserInterface* browser_interface,
- int argc,
- char* argn[],
- char* argv[]) {
+void Plugin::GetReadyStateProperty(NaClSrpcArg* prop_value) {
+ PLUGIN_PRINTF(("GetReadyState (this=%p)\n", reinterpret_cast<void*>(this)));
+ prop_value->tag = NACL_SRPC_ARG_TYPE_INT;
+ prop_value->u.ival = nacl_ready_state();
+}
+
+bool Plugin::Init(int argc, char* argn[], char* argv[]) {
PLUGIN_PRINTF(("Plugin::Init (instance=%p)\n", static_cast<void*>(this)));
#ifdef NACL_OSX
@@ -591,7 +539,6 @@
pp::TextInput_Dev(this).SetTextInputType(PP_TEXTINPUT_TYPE_NONE);
#endif
- browser_interface_ = browser_interface;
// Remember the embed/object argn/argv pairs.
argn_ = new(std::nothrow) char*[argc];
argv_ = new(std::nothrow) char*[argc];
@@ -619,8 +566,12 @@
PLUGIN_PRINTF(("Plugin::Init (wrapper_factory=%p)\n",
static_cast<void*>(wrapper_factory_)));
- // Set up the scriptable methods for the plugin.
- LoadMethods();
+ // Export a property to allow us to get the exit status of a nexe.
+ AddPropertyGet("exitStatus", &Plugin::GetExitStatus);
+ // Export a property to allow us to get the last error description.
+ AddPropertyGet("lastError", &Plugin::GetLastError);
+ // Export a property to allow us to get the ready state of a nexe during load.
+ AddPropertyGet("readyState", &Plugin::GetReadyStateProperty);
PLUGIN_PRINTF(("Plugin::Init (return 1)\n"));
// Return success.
@@ -670,53 +621,6 @@
return true;
}
-bool Plugin::StartSrpcServicesCommon(NaClSubprocess* subprocess,
- ErrorInfo* error_info) {
- if (!subprocess->StartSrpcServices()) {
- error_info->SetReport(ERROR_SRPC_CONNECTION_FAIL,
- "SRPC connection failure for " +
- subprocess->description());
- return false;
- }
- PLUGIN_PRINTF(("Plugin::StartSrpcServicesCommon (established srpc_client "
- "%p)\n",
- static_cast<void*>(subprocess->srpc_client())));
- return true;
-}
-
-bool Plugin::StartSrpcServices(NaClSubprocess* subprocess,
- ErrorInfo* error_info) {
- if (!StartSrpcServicesCommon(subprocess, error_info)) {
- return false;
- }
- // TODO(jvoung): This next bit is likely not needed...
- // If StartSrpcServices is only in the JS API that is just for SRPC nexes
- // (namely __startSrpcServices), then attempts to start the JS proxy
- // will fail anyway?
- // If that is the case, by removing the following line,
- // the StartSrpcServices == StartSrpcServicesCommon.
- // We still need this function though, to launch helper SRPC nexes within
- // the plugin.
- return StartJSObjectProxy(subprocess, error_info);
-}
-
-bool Plugin::StartJSObjectProxy(NaClSubprocess* subprocess,
- ErrorInfo* error_info) {
- if (!subprocess->StartJSObjectProxy(this, error_info)) {
- // TODO(sehr,polina): rename the function and env var
- // to ExperimentalJavaScriptApisAreEnabled.
- if (error_info->error_code() == ERROR_START_PROXY_CHECK_PPP &&
- ExperimentalJavaScriptApisAreEnabled()) {
- // It is not an error for the proxy to fail to find PPP methods if
- // experimental APIs are enabled. This means we have an SRPC nexe.
- error_info->Reset();
- } else {
- return false;
- }
- }
- return true;
-}
-
bool Plugin::LoadNaClModule(nacl::DescWrapper* wrapper,
ErrorInfo* error_info,
pp::CompletionCallback init_done_cb,
@@ -736,8 +640,8 @@
}
bool Plugin::LoadNaClModuleContinuationIntern(ErrorInfo* error_info) {
- if (!(StartSrpcServicesCommon(&main_subprocess_, error_info)
- && StartJSObjectProxy(&main_subprocess_, error_info))) {
+ if (!(main_subprocess_.StartSrpcServices()
jvoung - send to chromium... 2012/02/15 19:02:28 Should the error_info be passed along, to note any
sehr (please use chromium) 2012/02/16 01:16:59 I've replaced what was there.
+ && main_subprocess_.StartJSObjectProxy(this, error_info))) {
return false;
}
PLUGIN_PRINTF(("Plugin::LoadNaClModule (%s)\n",
@@ -749,7 +653,7 @@
const Manifest* manifest,
ErrorInfo* error_info) {
nacl::scoped_ptr<NaClSubprocess> nacl_subprocess(
- new NaClSubprocess("helper module", browser_interface_, NULL, NULL));
+ new NaClSubprocess("helper module", NULL, NULL));
if (NULL == nacl_subprocess.get()) {
error_info->SetReport(ERROR_SEL_LDR_INIT,
"unable to allocate helper subprocess.");
@@ -763,18 +667,18 @@
pp::BlockUntilComplete(),
pp::BlockUntilComplete())
// We need not wait for the init_done callback. We can block
- // here in StartSrpcServicesCommon, since helper NaCl modules
+ // here in StartSrpcServices, since helper NaCl modules
// are spawned from a private thread.
//
// TODO(bsy): if helper module crashes, we should abort.
// crash_cb is not used here, so we are relying on crashes
- // being detected in StartSrpcServicesCommon or later.
+ // being detected in StartSrpcServices or later.
//
// NB: More refactoring might be needed, however, if helper
// NaCl modules have their own manifest. Currently the
// manifest is a per-plugin-instance object, not a per
// NaClSubprocess object.
- && StartSrpcServicesCommon(nacl_subprocess.get(), error_info))) {
+ && nacl_subprocess->StartSrpcServices())) {
jvoung - send to chromium... 2012/02/15 19:02:28 same
sehr (please use chromium) 2012/02/16 01:16:59 Done.
return NULL;
}
@@ -794,31 +698,6 @@
return NULL;
}
-void Plugin::AddPropertyGet(RpcFunction function_ptr,
- const char* name,
- const char* outs) {
- uintptr_t method_id = browser_interface()->StringToIdentifier(name);
- PLUGIN_PRINTF(("Plugin::AddPropertyGet (name='%s', id=%"
- NACL_PRIxPTR")\n", name, method_id));
- MethodInfo* new_method = new MethodInfo(function_ptr, name, "", outs);
- property_get_methods_.AddMethod(method_id, new_method);
-}
-
-MethodInfo* Plugin::GetMethodInfo(uintptr_t method_id, CallType call_type) {
- MethodInfo* method_info = NULL;
- switch (call_type) {
- case PROPERTY_GET:
- method_info = property_get_methods_.GetMethod(method_id);
- break;
- case PROPERTY_SET:
- case METHOD_CALL:
- break;
- }
- PLUGIN_PRINTF(("Plugin::GetMethodInfo (id=%"NACL_PRIxPTR", "
- "return %p)\n", method_id, static_cast<void*>(method_info)));
- return method_info;
-}
-
// Suggested names for progress event types, per
// http://www.w3.org/TR/progress-events/
const char* const Plugin::kProgressEventLoadStart = "loadstart";
@@ -897,18 +776,13 @@
HistogramEnumerateOsArch(GetSandboxISA());
init_time_ = NaClGetTimeOfDayMicroseconds();
- scoped_ptr<BrowserInterface> browser_interface(
- new(std::nothrow) BrowserInterface);
- if (browser_interface == NULL) {
+ ScriptablePlugin* scriptable_plugin = ScriptablePlugin::NewPlugin(this);
+ if (scriptable_plugin == NULL)
return false;
- }
- ScriptableHandle* handle = ScriptableHandle::NewPlugin(this);
- if (handle == NULL)
- return false;
- set_scriptable_handle(handle);
+ set_scriptable_plugin(scriptable_plugin);
PLUGIN_PRINTF(("Plugin::Init (scriptable_handle=%p)\n",
- static_cast<void*>(scriptable_handle())));
+ static_cast<void*>(scriptable_plugin_)));
url_util_ = pp::URLUtil_Dev::Get();
if (url_util_ == NULL)
return false;
@@ -917,7 +791,6 @@
static_cast<const void*>(url_util_)));
bool status = Plugin::Init(
- browser_interface.release(),
static_cast<int>(argc),
// TODO(polina): Can we change the args on our end to be const to
// avoid these ugly casts?
@@ -972,11 +845,6 @@
}
}
- // Export a property to allow us to get the last error description.
- AddPropertyGet(GetLastError, "lastError", "s");
- // Export a property to allow us to get the nexe exit status.
- AddPropertyGet(GetExitStatus, "exitStatus", "i");
-
PLUGIN_PRINTF(("Plugin::Init (status=%d)\n", status));
return status;
}
@@ -984,12 +852,11 @@
Plugin::Plugin(PP_Instance pp_instance)
: pp::InstancePrivate(pp_instance),
- browser_interface_(NULL),
- scriptable_handle_(NULL),
+ scriptable_plugin_(NULL),
argc_(-1),
argn_(NULL),
argv_(NULL),
- main_subprocess_("main subprocess", NULL, NULL, NULL),
+ main_subprocess_("main subprocess", NULL, NULL),
nacl_ready_state_(UNSENT),
nexe_error_reported_(false),
wrapper_factory_(NULL),
@@ -1010,9 +877,9 @@
Plugin::~Plugin() {
int64_t shutdown_start = NaClGetTimeOfDayMicroseconds();
- PLUGIN_PRINTF(("Plugin::~Plugin (this=%p, scriptable_handle=%p)\n",
+ PLUGIN_PRINTF(("Plugin::~Plugin (this=%p, scriptable_plugin=%p)\n",
static_cast<void*>(this),
- static_cast<void*>(scriptable_handle())));
+ static_cast<void*>(scriptable_plugin())));
// If the proxy has been shutdown before now, it's likely the plugin suffered
// an error while loading.
@@ -1029,8 +896,8 @@
url_downloaders_.erase(url_downloaders_.begin(), url_downloaders_.end());
ShutdownProxy();
- ScriptableHandle* scriptable_handle_ = scriptable_handle();
- ScriptableHandle::Unref(&scriptable_handle_);
+ ScriptablePlugin* scriptable_plugin_ = scriptable_plugin();
+ ScriptablePlugin::Unref(&scriptable_plugin_);
// ShutDownSubprocesses shuts down the main subprocess, which shuts
// down the main ServiceRuntime object, which kills the subprocess.
@@ -1059,7 +926,6 @@
ShutDownSubprocesses();
delete wrapper_factory_;
- delete browser_interface_;
delete[] argv_;
delete[] argn_;
@@ -1145,8 +1011,8 @@
PLUGIN_PRINTF(("Plugin::GetInstanceObject (this=%p)\n",
static_cast<void*>(this)));
// The browser will unref when it discards the var for this object.
- ScriptableHandle* handle =
- static_cast<ScriptableHandle*>(scriptable_handle()->AddRef());
+ ScriptablePlugin* handle =
+ static_cast<ScriptablePlugin*>(scriptable_plugin()->AddRef());
pp::Var* handle_var = handle->var();
PLUGIN_PRINTF(("Plugin::GetInstanceObject (handle=%p, handle_var=%p)\n",
static_cast<void*>(handle), static_cast<void*>(handle_var)));
@@ -1441,7 +1307,7 @@
nacl::string message = nacl::string("NaCl module crashed");
set_last_error_string(message);
- browser_interface()->AddToConsole(this, message);
+ AddToConsole(message);
EnqueueProgressEvent(kProgressEventCrash);
set_nexe_error_reported(true);
@@ -1823,7 +1689,7 @@
nacl::string message = nacl::string("NaCl module load failed: ") +
error_info.message();
set_last_error_string(message);
- browser_interface()->AddToConsole(this, message);
+ AddToConsole(message);
ShutdownProxy();
// Inform JavaScript that loading encountered an error and is complete.
EnqueueProgressEvent(kProgressEventError);
@@ -1842,7 +1708,7 @@
// Report an error in lastError and on the JavaScript console.
nacl::string error_string("NaCl module load failed: user aborted");
set_last_error_string(error_string);
- browser_interface()->AddToConsole(this, error_string);
+ AddToConsole(error_string);
ShutdownProxy();
// Inform JavaScript that loading was aborted and is complete.
EnqueueProgressEvent(kProgressEventAbort);
@@ -2044,4 +1910,23 @@
return SCHEME_OTHER;
}
+void Plugin::AddToConsole(const nacl::string& text) {
+ pp::Module* module = pp::Module::Get();
+ const PPB_Var* var_interface =
+ static_cast<const PPB_Var*>(
+ module->GetBrowserInterface(PPB_VAR_INTERFACE));
+ nacl::string prefix_string("NativeClient");
+ PP_Var prefix =
+ var_interface->VarFromUtf8(prefix_string.c_str(),
+ static_cast<uint32_t>(prefix_string.size()));
+ PP_Var str = var_interface->VarFromUtf8(text.c_str(),
+ static_cast<uint32_t>(text.size()));
+ const PPB_Console_Dev* console_interface =
+ static_cast<const PPB_Console_Dev*>(
+ module->GetBrowserInterface(PPB_CONSOLE_DEV_INTERFACE));
+ console_interface->LogWithSource(pp_instance(), PP_LOGLEVEL_LOG, prefix, str);
+ var_interface->Release(prefix);
+ var_interface->Release(str);
+}
+
} // namespace plugin

Powered by Google App Engine
This is Rietveld 408576698