Index: ppapi/tests/test_message_handler.cc |
diff --git a/ppapi/tests/test_message_handler.cc b/ppapi/tests/test_message_handler.cc |
index bfb3be3f57f29a647922b770bcdd80fe1d5b0623..acee8b70c427b09ec4c5c3a718fac1de37998c88 100644 |
--- a/ppapi/tests/test_message_handler.cc |
+++ b/ppapi/tests/test_message_handler.cc |
@@ -8,6 +8,7 @@ |
#include <algorithm> |
#include <map> |
#include <sstream> |
+#include <vector> |
#include "ppapi/c/pp_var.h" |
#include "ppapi/c/ppb_file_io.h" |
@@ -44,14 +45,13 @@ namespace { |
// (Though it handles messages on the background thread). |
class MyMessageHandler : public pp::MessageHandler { |
public: |
- explicit MyMessageHandler(TestingInstance* instance, |
- const pp::MessageLoop& loop) |
+ MyMessageHandler(TestingInstance* instance, const pp::MessageLoop& loop) |
: testing_instance_(instance), |
message_handler_loop_(loop), |
is_registered_(false), |
test_finished_event_(instance->pp_instance()), |
destroy_event_(instance->pp_instance()), |
- async_message_received_(instance->pp_instance()) { |
+ finished_message_received_(instance->pp_instance()) { |
AssertOnMainThread(); |
} |
void Register() { |
@@ -96,12 +96,10 @@ class MyMessageHandler : public pp::MessageHandler { |
errors_.swap(temp_errors); |
return temp_errors; |
} |
- pp::Var WaitForAsyncMessage() { |
- async_message_received_.Wait(); |
- pp::Var var_to_return = last_async_message_received_; |
- last_async_message_received_ = pp::Var(); |
- async_message_received_.Reset(); |
- return var_to_return; |
+ void WaitForAsyncMessages(std::vector<pp::Var>* out_vec) { |
+ finished_message_received_.Wait(); |
+ out_vec->swap(async_messages_received_); |
+ finished_message_received_.Reset(); |
} |
private: |
static void AssertOnMainThread() { |
@@ -122,12 +120,10 @@ class MyMessageHandler : public pp::MessageHandler { |
AddError("HandleMessage was passed the wrong instance!"); |
if (var.is_string() && var.AsString() == "FINISHED_TEST") { |
test_finished_event_.Signal(); |
+ } else if (var.is_string() && var.AsString() == "FINISHED_WAITING") { |
+ finished_message_received_.Signal(); |
} else { |
- // Any client causing a message to arrive must wait for the message |
- // before continuing. See WaitForAsyncMessage(). |
- assert(last_async_message_received_.is_undefined()); |
- last_async_message_received_ = var; |
- async_message_received_.Signal(); |
+ async_messages_received_.push_back(var); |
} |
} |
@@ -178,8 +174,8 @@ class MyMessageHandler : public pp::MessageHandler { |
NestedEvent test_finished_event_; |
NestedEvent destroy_event_; |
- pp::Var last_async_message_received_; |
- NestedEvent async_message_received_; |
+ std::vector<pp::Var> async_messages_received_; |
+ NestedEvent finished_message_received_; |
// Undefined & private to disallow copy and assign. |
MyMessageHandler(const MyMessageHandler&); |
@@ -220,6 +216,7 @@ void TestMessageHandler::RunTests(const std::string& filter) { |
RUN_TEST(RegisterErrorConditions, filter); |
RUN_TEST(PostMessageAndAwaitResponse, filter); |
RUN_TEST(Exceptions, filter); |
+ RUN_TEST(BrowserHostedResources, filter); |
} |
void TestMessageHandler::HandleMessage(const pp::Var& message_data) { |
@@ -306,7 +303,7 @@ std::string TestMessageHandler::TestExceptions() { |
MyMessageHandler handler(instance(), |
handler_thread_.message_loop()); |
{ |
- // First, try sending a blocking message when there is no handler |
+ // First try sending a blocking message when there is no handler |
// registered. It should throw an exception. |
std::string js_code( |
"var plugin = document.getElementById('plugin');\n" |
@@ -327,22 +324,63 @@ std::string TestMessageHandler::TestExceptions() { |
} |
handler.Register(); |
{ |
- // Now that a handler is registered, try requesting and sending a |
- // FileSystem. It should throw an exception. The file system is opened |
- // asynchronously. What *should* happen is that it opens successfully, then |
- // we try to send it via postMessageAndAwaitResponse, which fails with an |
- // exception. The test could fail either because the filesystem doesn't |
- // open or because postMessageAndAwaitResponse doesn't throw an exception. |
+ // Try passing different numbers of arguments; only 1 argument is allowed. |
+ // Other numbers should throw an exception. |
+ std::string js_code( |
+ "var plugin = document.getElementById('plugin');\n" |
+ "var caught_exception = false;\n" |
+ "try {\n" |
+ " plugin.postMessageAndAwaitResponse();\n" |
+ "} catch (err) {\n" |
+ " caught_exception = true;\n" |
+ "}\n" |
+ "plugin.postMessage(caught_exception ? 'SUCCESS' : 'FAIL');\n" |
+ "try {\n" |
+ " plugin.postMessageAndAwaitResponse('hello', 5);\n" |
+ "} catch (err) {\n" |
+ " caught_exception = true;\n" |
+ "}\n" |
+ "plugin.postMessage(caught_exception ? 'SUCCESS' : 'FAIL');\n" |
+ "plugin.postMessage('FINISHED_WAITING');\n"); |
+ instance_->EvalScript(js_code); |
+ std::vector<pp::Var> messages; |
+ handler.WaitForAsyncMessages(&messages); |
+ ASSERT_EQ(2u, messages.size()); |
+ ASSERT_EQ("SUCCESS", messages[0].AsString()); |
+ ASSERT_EQ("SUCCESS", messages[1].AsString()); |
+ } |
+ handler.Unregister(); |
+ ASSERT_SUBTEST_SUCCESS(handler.WaitForDestroy()); |
+ |
+ PASS(); |
+} |
+ |
+std::string TestMessageHandler::TestBrowserHostedResources() { |
+ MyMessageHandler handler(instance(), |
+ handler_thread_.message_loop()); |
+ handler.Register(); |
+ { |
+ // Try requesting and sending a FileSystem. It should throw an exception. |
+ // The file system is opened asynchronously. Once it opens successfully, |
+ // then we send it via postMessage and postMessageAndAwaitResponse. We try |
+ // both to make sure that the ordering is correct. |
std::string js_code( |
"var plugin = document.getElementById('plugin');\n" |
"function gotFileSystem(fs) {\n" |
" var caught_exception = false;\n" |
" try {\n" |
- " plugin.postMessageAndAwaitResponse(fs);\n" |
+ " plugin.postMessage(fs);" |
+ " plugin.postMessage(fs);" |
+ " plugin.postMessage(fs);" |
+ " plugin.postMessage(fs);" |
+ " var result = plugin.postMessageAndAwaitResponse(fs);\n" |
" } catch (err) {\n" |
" caught_exception = true;\n" |
- " }\n" |
- " plugin.postMessage(caught_exception ? 'SUCCESS' : 'FAIL');\n" |
+ " }\n" //TODO(dmichael): Really test that the filesystem is right |
+ // ...and FileRef? |
+ " plugin.postMessage(result.toString() == fs.toString() ?" |
+ " 'SUCCESS' : result.toString());\n" |
+ " plugin.postMessage('FINISHED_WAITING');\n" |
"}\n" |
"function fileSystemError() {\n" |
" plugin.postMessage('Failed to open filesystem');\n" |
@@ -350,9 +388,10 @@ std::string TestMessageHandler::TestExceptions() { |
"window.webkitRequestFileSystem(\n" |
" window.Temporary, 1024, gotFileSystem, fileSystemError)\n"); |
instance_->EvalScript(js_code); |
- pp::Var msg = handler.WaitForAsyncMessage(); |
- ASSERT_EQ(PP_VARTYPE_STRING, msg.pp_var().type); |
- ASSERT_EQ("SUCCESS", msg.AsString()); |
+ std::vector<pp::Var> messages; |
+ handler.WaitForAsyncMessages(&messages); |
+ ASSERT_EQ(5u, messages.size()); |
+ ASSERT_EQ("SUCCESS", messages.back().AsString()); |
} |
handler.Unregister(); |
ASSERT_SUBTEST_SUCCESS(handler.WaitForDestroy()); |
@@ -360,6 +399,7 @@ std::string TestMessageHandler::TestExceptions() { |
PASS(); |
} |
+ |
pp::Var TestMessageHandler::WaitForMessage() { |
message_received_.Wait(); |
pp::Var var_to_return = last_message_; |