| Index: ppapi/proxy/plugin_var_serialization_rules.cc
|
| diff --git a/ppapi/proxy/plugin_var_serialization_rules.cc b/ppapi/proxy/plugin_var_serialization_rules.cc
|
| index 2e92dd57ba8f1f3af534e0e7f38f47d9ba21b329..87a3cc2a8ff89cc4cbd77dc3f9d1ebda1c8997e5 100644
|
| --- a/ppapi/proxy/plugin_var_serialization_rules.cc
|
| +++ b/ppapi/proxy/plugin_var_serialization_rules.cc
|
| @@ -22,17 +22,19 @@ PluginVarSerializationRules::PluginVarSerializationRules()
|
| PluginVarSerializationRules::~PluginVarSerializationRules() {
|
| }
|
|
|
| -PP_Var PluginVarSerializationRules::SendCallerOwned(const PP_Var& var,
|
| - std::string* str_val) {
|
| +PP_Var PluginVarSerializationRules::SendCallerOwned(
|
| + const PP_Var& var,
|
| + const std::string** str_ptr_out) {
|
| // Objects need special translations to get the IDs valid in the host.
|
| if (var.type == PP_VARTYPE_OBJECT)
|
| return var_tracker_->GetHostObject(var);
|
|
|
| - // Retrieve the string to use for IPC.
|
| + // Retrieve the pointer to the string in the tracker in order to send the
|
| + // string over IPC without unnecessary copies.
|
| if (var.type == PP_VARTYPE_STRING) {
|
| StringVar* string_var = StringVar::FromPPVar(var);
|
| if (string_var)
|
| - *str_val = string_var->value();
|
| + *str_ptr_out = string_var->ptr();
|
| else
|
| NOTREACHED() << "Trying to send unknown string over IPC.";
|
| }
|
| @@ -41,10 +43,10 @@ PP_Var PluginVarSerializationRules::SendCallerOwned(const PP_Var& var,
|
|
|
| PP_Var PluginVarSerializationRules::BeginReceiveCallerOwned(
|
| const PP_Var& var,
|
| - const std::string* str_val,
|
| + scoped_ptr<std::string> str,
|
| Dispatcher* dispatcher) {
|
| if (var.type == PP_VARTYPE_STRING)
|
| - return StringVar::StringToPPVar(*str_val);
|
| + return StringVar::StringToPPVar(str.Pass());
|
|
|
| if (var.type == PP_VARTYPE_OBJECT) {
|
| DCHECK(dispatcher->IsPlugin());
|
| @@ -65,10 +67,10 @@ void PluginVarSerializationRules::EndReceiveCallerOwned(const PP_Var& var) {
|
| }
|
|
|
| PP_Var PluginVarSerializationRules::ReceivePassRef(const PP_Var& var,
|
| - const std::string& str_val,
|
| + scoped_ptr<std::string> str,
|
| Dispatcher* dispatcher) {
|
| if (var.type == PP_VARTYPE_STRING)
|
| - return StringVar::StringToPPVar(str_val);
|
| + return StringVar::StringToPPVar(str.Pass());
|
|
|
| // Overview of sending an object with "pass ref" from the browser to the
|
| // plugin:
|
| @@ -96,8 +98,9 @@ PP_Var PluginVarSerializationRules::ReceivePassRef(const PP_Var& var,
|
| return var;
|
| }
|
|
|
| -PP_Var PluginVarSerializationRules::BeginSendPassRef(const PP_Var& var,
|
| - std::string* str_val) {
|
| +PP_Var PluginVarSerializationRules::BeginSendPassRef(
|
| + const PP_Var& var,
|
| + const std::string** str_ptr_out) {
|
| // Overview of sending an object with "pass ref" from the plugin to the
|
| // browser:
|
| // Example 1 Example 2
|
| @@ -118,9 +121,11 @@ PP_Var PluginVarSerializationRules::BeginSendPassRef(const PP_Var& var,
|
| return var_tracker_->GetHostObject(var);
|
|
|
| if (var.type == PP_VARTYPE_STRING) {
|
| + // Get the pointer to the string that's in the tracker and return it, so we
|
| + // can avoid an extra copy of the string when serializing over IPC.
|
| StringVar* string_var = StringVar::FromPPVar(var);
|
| if (string_var)
|
| - *str_val = string_var->value();
|
| + *str_ptr_out = string_var->ptr();
|
| else
|
| NOTREACHED() << "Trying to send unknown string over IPC.";
|
| }
|
|
|