Index: content/renderer/web_intents_host.cc |
diff --git a/content/renderer/web_intents_host.cc b/content/renderer/web_intents_host.cc |
index 1c38eb8348799d03b3041dd31fd0ca9bd54a44b2..83fd7302b9bbe6518a214dbed932b7ddacf16adb 100644 |
--- a/content/renderer/web_intents_host.cc |
+++ b/content/renderer/web_intents_host.cc |
@@ -6,10 +6,12 @@ |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
+#include "base/utf_string_conversions.h" |
#include "content/common/intents_messages.h" |
#include "content/renderer/render_view_impl.h" |
#include "ipc/ipc_message.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebBlob.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebIntentRequest.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
@@ -19,6 +21,7 @@ |
#include "webkit/glue/cpp_bound_class.h" |
using WebKit::WebBindings; |
+using WebKit::WebBlob; |
using WebKit::WebCString; |
using WebKit::WebFrame; |
using WebKit::WebIntentRequest; |
@@ -36,6 +39,7 @@ class WebIntentsHost::BoundDeliveredIntent : public CppBoundClass { |
WebFrame* frame) { |
action_ = WebString(intent.action).utf8(); |
type_ = WebString(intent.type).utf8(); |
+ extra_data_ = intent.extra_data; |
parent_ = parent; |
v8::HandleScope scope; |
@@ -48,25 +52,32 @@ class WebIntentsHost::BoundDeliveredIntent : public CppBoundClass { |
WebSerializedScriptValue::fromString(WebString(intent.data)); |
DCHECK(!ssv.isNull()); |
data_obj = v8::Local<v8::Value>::New(ssv.deserialize()); |
- } else { |
- DCHECK(intent.data_type == webkit_glue::WebIntentData::UNSERIALIZED); |
+ } else if (intent.data_type == webkit_glue::WebIntentData::UNSERIALIZED) { |
data_obj = v8::String::New( |
reinterpret_cast<const uint16_t*>(intent.unserialized_data.data()), |
static_cast<int>(intent.unserialized_data.length())); |
+ } else { |
+ DCHECK(intent.data_type == webkit_glue::WebIntentData::BLOB); |
+ WebBlob web_blob = WebBlob::createFromFile( |
+ WebString::fromUTF8(intent.blob_file.AsUTF8Unsafe()), |
+ intent.blob_length); |
+ data_obj = v8::Local<v8::Value>::New(web_blob.toV8Value()); |
} |
data_val_.reset(new CppVariant); |
WebBindings::toNPVariant(data_obj, frame->windowObject(), data_val_.get()); |
- BindGetterCallback("action", base::Bind(&BoundDeliveredIntent::getAction, |
+ BindGetterCallback("action", base::Bind(&BoundDeliveredIntent::GetAction, |
base::Unretained(this))); |
- BindGetterCallback("type", base::Bind(&BoundDeliveredIntent::getType, |
+ BindGetterCallback("type", base::Bind(&BoundDeliveredIntent::GetType, |
base::Unretained(this))); |
- BindGetterCallback("data", base::Bind(&BoundDeliveredIntent::getData, |
+ BindGetterCallback("data", base::Bind(&BoundDeliveredIntent::GetData, |
base::Unretained(this))); |
- BindCallback("postResult", base::Bind(&BoundDeliveredIntent::postResult, |
+ BindCallback("getExtra", base::Bind(&BoundDeliveredIntent::GetExtra, |
+ base::Unretained(this))); |
+ BindCallback("postResult", base::Bind(&BoundDeliveredIntent::PostResult, |
base::Unretained(this))); |
- BindCallback("postFailure", base::Bind(&BoundDeliveredIntent::postFailure, |
+ BindCallback("postFailure", base::Bind(&BoundDeliveredIntent::PostFailure, |
base::Unretained(this))); |
} |
@@ -85,7 +96,7 @@ class WebIntentsHost::BoundDeliveredIntent : public CppBoundClass { |
return ssv.toString(); |
} |
- void postResult(const CppArgumentList& args, CppVariant* retval) { |
+ void PostResult(const CppArgumentList& args, CppVariant* retval) { |
if (args.size() != 1) { |
WebBindings::setException(NULL, "Must pass one argument to postResult"); |
return; |
@@ -95,7 +106,7 @@ class WebIntentsHost::BoundDeliveredIntent : public CppBoundClass { |
parent_->OnResult(str); |
} |
- void postFailure(const CppArgumentList& args, CppVariant* retval) { |
+ void PostFailure(const CppArgumentList& args, CppVariant* retval) { |
if (args.size() != 1) { |
WebBindings::setException(NULL, "Must pass one argument to postFailure"); |
return; |
@@ -105,26 +116,49 @@ class WebIntentsHost::BoundDeliveredIntent : public CppBoundClass { |
parent_->OnFailure(str); |
} |
- void getAction(CppVariant* result) { |
+ void GetAction(CppVariant* result) { |
std::string action; |
action.assign(action_.data(), action_.length()); |
result->Set(action); |
} |
- void getType(CppVariant* result) { |
+ void GetType(CppVariant* result) { |
std::string type; |
type.assign(type_.data(), type_.length()); |
result->Set(type); |
} |
- void getData(CppVariant* result) { |
+ void GetData(CppVariant* result) { |
result->Set(*data_val_.get()); |
} |
+ void GetExtra(const CppArgumentList& args, CppVariant* result) { |
+ if (args.size() != 1) { |
+ WebBindings::setException(NULL, "Must pass one argument to getExtra"); |
+ return; |
+ } |
+ |
+ if (!args[0].isString()) { |
+ WebBindings::setException(NULL, "Argument to getExtra must be a string"); |
+ return; |
+ } |
+ |
+ std::string str = args[0].ToString(); |
+ std::map<string16, string16>::const_iterator iter = |
+ extra_data_.find(UTF8ToUTF16(str)); |
+ if (iter == extra_data_.end()) { |
+ result->SetNull(); |
+ return; |
+ } |
+ std::string val = UTF16ToUTF8(iter->second); |
+ result->Set(val); |
+ } |
+ |
private: |
// Intent data suitable for surfacing to Javascript callers. |
WebCString action_; |
WebCString type_; |
+ std::map<string16, string16> extra_data_; |
scoped_ptr<CppVariant> data_val_; |
// The dispatcher object, for forwarding postResult/postFailure calls. |