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

Unified Diff: ppapi/tests/test_post_message.cc

Issue 26564009: [PPAPI] It is now possible to pass filesystems from JavaScript to NaCl modules. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: ResourceRawVarData: Remove ResourceDispatcher and inline everything; much simpler. Created 7 years, 2 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
« ppapi/tests/test_post_message.h ('K') | « ppapi/tests/test_post_message.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ppapi/tests/test_post_message.cc
diff --git a/ppapi/tests/test_post_message.cc b/ppapi/tests/test_post_message.cc
index b1e30b23a2c106c8e0a0852f525b9a29ee7728b4..766e185a326bb03eb08ecc0e604b16e1a9150c4f 100644
--- a/ppapi/tests/test_post_message.cc
+++ b/ppapi/tests/test_post_message.cc
@@ -161,6 +161,18 @@ TestPostMessage::~TestPostMessage() {
bool TestPostMessage::Init() {
bool success = CheckTestingInterface();
+ core_interface_ = static_cast<const PPB_Core*>(
+ pp::Module::Get()->GetBrowserInterface(PPB_CORE_INTERFACE));
+ file_system_interface_ = static_cast<const PPB_FileSystem*>(
+ pp::Module::Get()->GetBrowserInterface(PPB_FILESYSTEM_INTERFACE));
+ var_interface_ = static_cast<const PPB_Var*>(
+ pp::Module::Get()->GetBrowserInterface(PPB_VAR_INTERFACE));
+ var_resource_interface_ = static_cast<const PPB_VarResource_Dev*>(
+ pp::Module::Get()->GetBrowserInterface(PPB_VAR_RESOURCE_DEV_INTERFACE));
+ if (!core_interface_ || !file_system_interface_ || !var_interface_ ||
+ !var_resource_interface_)
+ return false;
+
// Set up a special listener that only responds to a FINISHED_WAITING string.
// This is for use by WaitForMessages.
std::string js_code;
@@ -201,6 +213,7 @@ void TestPostMessage::RunTests(const std::string& filter) {
RUN_TEST(SendingArrayBuffer, filter);
RUN_TEST(SendingArray, filter);
RUN_TEST(SendingDictionary, filter);
+ RUN_TEST(SendingResource, filter);
RUN_TEST(SendingComplexVar, filter);
RUN_TEST(MessageEvent, filter);
RUN_TEST(NoHandler, filter);
@@ -253,6 +266,21 @@ bool TestPostMessage::PostMessageFromJavaScript(const std::string& func) {
return true;
}
+bool TestPostMessage::PostMessageFromJavaScriptAsync(const std::string& func) {
+ // After the |func| calls callback, post both the given |message|, as well as
+ // the special message FINISHED_WAITING_MESSAGE. This ensures that
+ // WaitForMessagesAsync correctly waits until the callback is called.
+ std::string js_code;
+ js_code += "var plugin = document.getElementById('plugin');"
+ "var callback = function(message) {"
+ " plugin.postMessage(message);"
+ " plugin.postMessage('" FINISHED_WAITING_MESSAGE "');"
+ "};";
+ js_code += "(" + func + ")(callback);";
+ instance_->EvalScript(js_code);
+ return true;
+}
+
bool TestPostMessage::ClearListeners() {
std::string js_code;
js_code += "var plugin = document.getElementById('plugin');"
@@ -276,6 +304,18 @@ int TestPostMessage::WaitForMessages() {
return message_data_.size() - message_size_before;
}
+int TestPostMessage::WaitForMessagesAsync() {
+ size_t message_size_before = message_data_.size();
+ // Unlike WaitForMessages, we do not post FINISHED_WAITING_MESSAGE. This is
+ // because PostMessageFromJavaScriptAsync will post it for us, when the
+ // asynchronous operation completes.
+ testing_interface_->RunMessageLoop(instance_->pp_instance());
+ // Now that the FINISHED_WAITING_MESSAGE has been echoed back to us, we know
+ // that all pending messages have been slurped up. Return the number we
+ // received (which may be zero).
+ return message_data_.size() - message_size_before;
+}
+
std::string TestPostMessage::CheckMessageProperties(
const pp::Var& test_data,
const std::vector<std::string>& properties_to_check) {
@@ -533,6 +573,39 @@ std::string TestPostMessage::TestSendingDictionary() {
PASS();
}
+std::string TestPostMessage::TestSendingResource() {
+ // Clean up after previous tests. This also swallows the message sent by Init
+ // if we didn't run the 'SendInInit' test. All tests other than 'SendInInit'
+ // should start with these.
+ WaitForMessages();
+ message_data_.clear();
+ ASSERT_TRUE(ClearListeners());
+
+ // Test sending a DOMFileSystem from JavaScript to the plugin.
+ ASSERT_TRUE(AddEchoingListener("message_event.data"));
+ PostMessageFromJavaScriptAsync(
+ "function(callback) { "
+ " window.webkitRequestFileSystem(window.TEMPORARY, 1024, callback);"
+ "}");
+ ASSERT_EQ(message_data_.size(), 0);
+ ASSERT_EQ(WaitForMessagesAsync(), 1);
+ // TODO(mgiuca): Use the C++ API instead of the C API, when it is available.
+ PP_Var var = message_data_.back().Detach();
+ PP_Resource result = var_resource_interface_->VarToResource(var);
+ ASSERT_TRUE(file_system_interface_->IsFileSystem(result));
raymes 2013/10/22 05:59:21 Can we test some properties of the file system mat
Matt Giuca 2013/10/23 08:05:54 Done. (I just want you to know how hard this was!)
+ core_interface_->ReleaseResource(result);
+ var_interface_->Release(var);
+
+ WaitForMessages();
+ message_data_.clear();
+ ASSERT_TRUE(ClearListeners());
+
+ // TODO(mgiuca): Test roundtrip from plugin to JS and back, when the plugin to
+ // JS support is available.
+
+ PASS();
+}
+
std::string TestPostMessage::TestSendingComplexVar() {
// Clean up after previous tests. This also swallows the message sent by Init
// if we didn't run the 'SendInInit' test. All tests other than 'SendInInit'
« ppapi/tests/test_post_message.h ('K') | « ppapi/tests/test_post_message.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698