| Index: ppapi/tests/test_flash_message_loop.cc
|
| diff --git a/ppapi/tests/test_flash_message_loop.cc b/ppapi/tests/test_flash_message_loop.cc
|
| index e7cb3186915b1e296ab29e3f19bc6e6a843581b5..2043cbeb11c6b01f8662ccf28702a9006268f3f9 100644
|
| --- a/ppapi/tests/test_flash_message_loop.cc
|
| +++ b/ppapi/tests/test_flash_message_loop.cc
|
| @@ -5,27 +5,97 @@
|
| #include "ppapi/tests/test_flash_message_loop.h"
|
|
|
| #include "ppapi/c/pp_macros.h"
|
| +#include "ppapi/c/ppb_var.h"
|
| #include "ppapi/cpp/core.h"
|
| +#include "ppapi/cpp/dev/scriptable_object_deprecated.h"
|
| #include "ppapi/cpp/logging.h"
|
| #include "ppapi/cpp/module.h"
|
| #include "ppapi/cpp/private/flash_message_loop.h"
|
| #include "ppapi/tests/testing_instance.h"
|
|
|
| +namespace {
|
| +
|
| +const char kDidRunScriptCallback[] = "DidRunScriptCallback";
|
| +
|
| +} // namespace
|
| +
|
| +class TestFlashMessageLoop::InstanceSO
|
| + : public pp::deprecated::ScriptableObject {
|
| + public:
|
| + explicit InstanceSO(TestFlashMessageLoop* owner) : owner_(owner) {}
|
| +
|
| + ~InstanceSO() override {
|
| + if (owner_)
|
| + owner_->clear_instance_so();
|
| + }
|
| +
|
| + // pp::deprecated::ScriptableObject overrides.
|
| + bool HasMethod(const pp::Var& name, pp::Var* exception) override {
|
| + if (!name.is_string())
|
| + return false;
|
| + return name.AsString() == kDidRunScriptCallback;
|
| + }
|
| +
|
| + pp::Var Call(const pp::Var& method_name,
|
| + const std::vector<pp::Var>& args,
|
| + pp::Var* exception) override {
|
| + if (!method_name.is_string())
|
| + return false;
|
| + std::string name = method_name.AsString();
|
| +
|
| + if (name == kDidRunScriptCallback) {
|
| + if (args.size() != 0) {
|
| + *exception = pp::Var("Bad argument to DidRunScriptCallback()");
|
| + } else if (owner_) {
|
| + owner_->DidRunScriptCallback();
|
| + }
|
| + } else {
|
| + *exception = pp::Var("Bad function call");
|
| + }
|
| +
|
| + return pp::Var();
|
| + }
|
| +
|
| + void clear_owner() { owner_ = nullptr; }
|
| +
|
| + private:
|
| + TestFlashMessageLoop* owner_;
|
| +};
|
| +
|
| REGISTER_TEST_CASE(FlashMessageLoop);
|
|
|
| TestFlashMessageLoop::TestFlashMessageLoop(TestingInstance* instance)
|
| : TestCase(instance),
|
| - message_loop_(NULL),
|
| - callback_factory_(this) {
|
| -}
|
| + message_loop_(nullptr),
|
| + instance_so_(nullptr),
|
| + suspend_script_callback_result_(false),
|
| + callback_factory_(this) {}
|
|
|
| TestFlashMessageLoop::~TestFlashMessageLoop() {
|
| PP_DCHECK(!message_loop_);
|
| +
|
| + ResetTestObject();
|
| + if (instance_so_)
|
| + instance_so_->clear_owner();
|
| }
|
|
|
| void TestFlashMessageLoop::RunTests(const std::string& filter) {
|
| RUN_TEST(Basics, filter);
|
| RUN_TEST(RunWithoutQuit, filter);
|
| + RUN_TEST(SuspendScriptCallbackWhileRunning, filter);
|
| +}
|
| +
|
| +void TestFlashMessageLoop::DidRunScriptCallback() {
|
| + // Script callbacks are not supposed to run while the Flash message loop is
|
| + // running.
|
| + if (message_loop_)
|
| + suspend_script_callback_result_ = false;
|
| +}
|
| +
|
| +pp::deprecated::ScriptableObject* TestFlashMessageLoop::CreateTestObject() {
|
| + if (!instance_so_)
|
| + instance_so_ = new InstanceSO(this);
|
| + return instance_so_;
|
| }
|
|
|
| std::string TestFlashMessageLoop::TestBasics() {
|
| @@ -38,7 +108,7 @@ std::string TestFlashMessageLoop::TestBasics() {
|
|
|
| ASSERT_TRUE(message_loop_);
|
| delete message_loop_;
|
| - message_loop_ = NULL;
|
| + message_loop_ = nullptr;
|
|
|
| ASSERT_EQ(PP_OK, result);
|
| PASS();
|
| @@ -54,7 +124,7 @@ std::string TestFlashMessageLoop::TestRunWithoutQuit() {
|
|
|
| if (message_loop_) {
|
| delete message_loop_;
|
| - message_loop_ = NULL;
|
| + message_loop_ = nullptr;
|
| ASSERT_TRUE(false);
|
| }
|
|
|
| @@ -62,6 +132,41 @@ std::string TestFlashMessageLoop::TestRunWithoutQuit() {
|
| PASS();
|
| }
|
|
|
| +std::string TestFlashMessageLoop::TestSuspendScriptCallbackWhileRunning() {
|
| + suspend_script_callback_result_ = true;
|
| + message_loop_ = new pp::flash::MessageLoop(instance_);
|
| +
|
| + pp::CompletionCallback callback = callback_factory_.NewCallback(
|
| + &TestFlashMessageLoop::TestSuspendScriptCallbackTask);
|
| + pp::Module::Get()->core()->CallOnMainThread(0, callback);
|
| + message_loop_->Run();
|
| +
|
| + ASSERT_TRUE(message_loop_);
|
| + delete message_loop_;
|
| + message_loop_ = nullptr;
|
| +
|
| + ASSERT_TRUE(suspend_script_callback_result_);
|
| + PASS();
|
| +}
|
| +
|
| +void TestFlashMessageLoop::TestSuspendScriptCallbackTask(int32_t unused) {
|
| + pp::Var exception;
|
| + pp::Var rev = instance_->ExecuteScript(
|
| + "(function() {"
|
| + " function delayedHandler() {"
|
| + " document.getElementById('plugin').DidRunScriptCallback();"
|
| + " }"
|
| + " setTimeout(delayedHandler, 1);"
|
| + "})()",
|
| + &exception);
|
| + if (!exception.is_undefined())
|
| + suspend_script_callback_result_ = false;
|
| +
|
| + pp::CompletionCallback callback =
|
| + callback_factory_.NewCallback(&TestFlashMessageLoop::QuitMessageLoopTask);
|
| + pp::Module::Get()->core()->CallOnMainThread(500, callback);
|
| +}
|
| +
|
| void TestFlashMessageLoop::QuitMessageLoopTask(int32_t unused) {
|
| if (message_loop_)
|
| message_loop_->Quit();
|
| @@ -72,7 +177,7 @@ void TestFlashMessageLoop::QuitMessageLoopTask(int32_t unused) {
|
| void TestFlashMessageLoop::DestroyMessageLoopResourceTask(int32_t unused) {
|
| if (message_loop_) {
|
| delete message_loop_;
|
| - message_loop_ = NULL;
|
| + message_loop_ = nullptr;
|
| } else {
|
| PP_NOTREACHED();
|
| }
|
|
|