summaryrefslogtreecommitdiffstats
path: root/ppapi/tests/test_post_message.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ppapi/tests/test_post_message.cc')
-rw-r--r--ppapi/tests/test_post_message.cc83
1 files changed, 72 insertions, 11 deletions
diff --git a/ppapi/tests/test_post_message.cc b/ppapi/tests/test_post_message.cc
index 0f97b74..a86f310 100644
--- a/ppapi/tests/test_post_message.cc
+++ b/ppapi/tests/test_post_message.cc
@@ -8,7 +8,7 @@
#include "ppapi/c/dev/ppb_testing_dev.h"
#include "ppapi/c/pp_var.h"
-#include "ppapi/cpp/dev/scriptable_object_deprecated.h"
+#include "ppapi/cpp/dev/var_array_buffer_dev.h"
#include "ppapi/cpp/instance.h"
#include "ppapi/cpp/var.h"
#include "ppapi/tests/pp_thread.h"
@@ -111,6 +111,7 @@ void TestPostMessage::RunTests(const std::string& filter) {
// that was sent in Init above.
RUN_TEST(SendInInit, filter);
RUN_TEST(SendingData, filter);
+ RUN_TEST(SendingArrayBuffer, filter);
RUN_TEST(MessageEvent, filter);
RUN_TEST(NoHandler, filter);
RUN_TEST(ExtraParam, filter);
@@ -244,30 +245,90 @@ std::string TestPostMessage::TestSendingData() {
PASS();
}
+std::string TestPostMessage::TestSendingArrayBuffer() {
+ // 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();
+ ASSERT_TRUE(ClearListeners());
+
+ // Create a 100-byte array buffer with test_data[i] == i.
+ pp::VarArrayBuffer_Dev test_data(100u);
+ ASSERT_NE(NULL, test_data.Map());
+ ASSERT_EQ(100u, test_data.ByteLength());
+ unsigned char* buff = static_cast<unsigned char*>(test_data.Map());
+ for (size_t i = 0; i < test_data.ByteLength(); ++i)
+ buff[i] = i;
+
+ // Have the listener test some properties of the ArrayBuffer.
+ const char* const properties_to_check[] = {
+ "message_event.data.constructor.name === 'ArrayBuffer'",
+ "message_event.data.byteLength === 100",
+ "(new DataView(message_event.data)).getInt8(0) == 0",
+ "(new DataView(message_event.data)).getInt8(99) == 99",
+ NULL};
+ for (size_t i = 0; properties_to_check[i]; ++i) {
+ ASSERT_TRUE(AddEchoingListener(properties_to_check[i]));
+ message_data_.clear();
+ instance_->PostMessage(test_data);
+ ASSERT_EQ(message_data_.size(), 0);
+ ASSERT_EQ(WaitForMessages(), 1);
+ ASSERT_TRUE(message_data_.back().is_bool());
+ if (!message_data_.back().AsBool())
+ return std::string("Failed: ") + properties_to_check[i];
+ ASSERT_TRUE(message_data_.back().AsBool());
+ ASSERT_TRUE(ClearListeners());
+ }
+
+ // Set up the JavaScript message event listener to echo the data part of the
+ // message event back to us.
+ ASSERT_TRUE(AddEchoingListener("message_event.data"));
+ message_data_.clear();
+ instance_->PostMessage(test_data);
+ // PostMessage is asynchronous, so we should not receive a response yet.
+ ASSERT_EQ(message_data_.size(), 0);
+ ASSERT_EQ(WaitForMessages(), 1);
+ ASSERT_TRUE(message_data_.back().is_array_buffer());
+ pp::VarArrayBuffer_Dev received(message_data_.back());
+ message_data_.clear();
+ ASSERT_EQ(test_data.ByteLength(), received.ByteLength());
+ unsigned char* received_buff = static_cast<unsigned char*>(received.Map());
+ // The buffer should be copied, so this should be a distinct buffer. When
+ // 'transferrables' are implemented for PPAPI, we'll also want to test that
+ // we get the _same_ buffer back when it's transferred.
+ ASSERT_NE(buff, received_buff);
+ for (size_t i = 0; i < test_data.ByteLength(); ++i)
+ ASSERT_EQ(buff[i], received_buff[i]);
+
+ ASSERT_TRUE(ClearListeners());
+
+ PASS();
+}
+
std::string TestPostMessage::TestMessageEvent() {
// Set up the JavaScript message event listener to pass us some values from
// the MessageEvent and make sure they match our expectations.
WaitForMessages();
ASSERT_TRUE(ClearListeners());
- // Have the listener pass back the type of message_event and make sure it's
- // "object".
- ASSERT_TRUE(AddEchoingListener("typeof(message_event)"));
+ // Have the listener pass back the class name of message_event and make sure
+ // it's "MessageEvent".
+ ASSERT_TRUE(AddEchoingListener("message_event.constructor.name"));
message_data_.clear();
instance_->PostMessage(pp::Var(kTestInt));
ASSERT_EQ(message_data_.size(), 0);
ASSERT_EQ(WaitForMessages(), 1);
ASSERT_TRUE(message_data_.back().is_string());
- ASSERT_EQ(message_data_.back().AsString(), "object");
+ ASSERT_EQ(message_data_.back().AsString(), "MessageEvent");
ASSERT_TRUE(ClearListeners());
// Make sure all the non-data properties have the expected values.
- bool success = AddEchoingListener("((message_event.origin == '')"
- " && (message_event.lastEventId == '')"
- " && (message_event.source == null)"
- " && (message_event.ports.length == 0)"
- " && (message_event.bubbles == false)"
- " && (message_event.cancelable == false)"
+ bool success = AddEchoingListener("((message_event.origin === '')"
+ " && (message_event.lastEventId === '')"
+ " && (message_event.source === null)"
+ " && (message_event.ports.length === 0)"
+ " && (message_event.bubbles === false)"
+ " && (message_event.cancelable === false)"
")");
ASSERT_TRUE(success);
message_data_.clear();