| Index: ppapi/tests/test_fullscreen.cc
|
| ===================================================================
|
| --- ppapi/tests/test_fullscreen.cc (revision 102885)
|
| +++ ppapi/tests/test_fullscreen.cc (working copy)
|
| @@ -10,13 +10,10 @@
|
|
|
| #include "ppapi/c/dev/ppb_testing_dev.h"
|
| #include "ppapi/c/dev/ppb_fullscreen_dev.h"
|
| -#include "ppapi/cpp/dev/fullscreen_dev.h"
|
| -#include "ppapi/cpp/graphics_2d.h"
|
| +#include "ppapi/cpp/input_event.h"
|
| #include "ppapi/cpp/instance.h"
|
| #include "ppapi/cpp/module.h"
|
| #include "ppapi/cpp/point.h"
|
| -#include "ppapi/cpp/rect.h"
|
| -#include "ppapi/cpp/size.h"
|
| #include "ppapi/tests/test_utils.h"
|
| #include "ppapi/tests/testing_instance.h"
|
|
|
| @@ -24,28 +21,32 @@
|
|
|
| namespace {
|
|
|
| -bool IsFullscreenView(const pp::Rect& position,
|
| - const pp::Rect& clip,
|
| - const pp::Size& screen_size) {
|
| - return (position.point() == pp::Point(0, 0) &&
|
| - position.size() == screen_size &&
|
| - clip.point() == pp::Point(0, 0) &&
|
| - clip.size() == screen_size);
|
| +bool HasMidScreen(const pp::Rect& position, const pp::Size& screen_size) {
|
| + static int32_t mid_x = screen_size.width() / 2;
|
| + static int32_t mid_y = screen_size.height() / 2;
|
| + return (position.Contains(mid_x, mid_y));
|
| }
|
|
|
| } // namespace
|
|
|
| TestFullscreen::TestFullscreen(TestingInstance* instance)
|
| : TestCase(instance),
|
| + error_(),
|
| screen_mode_(instance),
|
| fullscreen_pending_(false),
|
| normal_pending_(false),
|
| + saw_first_fullscreen_didchangeview(false),
|
| + graphics2d_fullscreen_(instance, pp::Size(10, 10), false),
|
| + graphics2d_normal_(instance, pp::Size(15, 15), false),
|
| + set_fullscreen_true_callback_(instance->pp_instance()),
|
| fullscreen_callback_(instance->pp_instance()),
|
| normal_callback_(instance->pp_instance()) {
|
| screen_mode_.GetScreenSize(&screen_size_);
|
| }
|
|
|
| bool TestFullscreen::Init() {
|
| + if (graphics2d_fullscreen_.is_null() && graphics2d_normal_.is_null())
|
| + return false;
|
| return InitTestingInterface();
|
| }
|
|
|
| @@ -54,6 +55,16 @@
|
| RUN_TEST(NormalToFullscreenToNormal);
|
| }
|
|
|
| +bool TestFullscreen::GotError() {
|
| + return !error_.empty();
|
| +}
|
| +
|
| +std::string TestFullscreen::Error() {
|
| + std::string last_error = error_;
|
| + error_.clear();
|
| + return last_error;
|
| +}
|
| +
|
| std::string TestFullscreen::TestGetScreenSize() {
|
| if (screen_size_.width() < 320 || screen_size_.width() > 2560)
|
| return ReportError("screen_size.width()", screen_size_.width());
|
| @@ -68,26 +79,20 @@
|
| return ReportError("IsFullscreen() at start", true);
|
|
|
| // 1. Switch to fullscreen.
|
| + // This is only allowed within a context of a user gesture (e.g. mouse click).
|
| // The transition is asynchronous and ends at the next DidChangeView().
|
| // No graphics devices can be bound while in transition.
|
| - fullscreen_pending_ = true;
|
| - if (!screen_mode_.SetFullscreen(true))
|
| - return ReportError("SetFullscreen(true) in normal", false);
|
| - pp::Graphics2D graphics2d_fullscreen(instance_, pp::Size(10, 10), false);
|
| - if (graphics2d_fullscreen.is_null())
|
| - return "Failed to create graphics2d_fullscreen";
|
| - if (instance_->BindGraphics(graphics2d_fullscreen))
|
| - return ReportError("BindGraphics() in fullscreen transition", true);
|
| - if (screen_mode_.IsFullscreen())
|
| - return ReportError("IsFullscreen() in fullscreen transtion", true);
|
| -
|
| + instance_->RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE);
|
| + // HandleInputEvent() will call SetFullscreen(true).
|
| // DidChangeView() will call the callback once in fullscreen mode.
|
| fullscreen_callback_.WaitForResult();
|
| + if (GotError())
|
| + return Error();
|
| if (fullscreen_pending_)
|
| return "fullscreen_pending_ has not been reset";
|
| if (!screen_mode_.IsFullscreen())
|
| return ReportError("IsFullscreen() in fullscreen", false);
|
| - if (!instance_->BindGraphics(graphics2d_fullscreen))
|
| + if (!instance_->BindGraphics(graphics2d_fullscreen_))
|
| return ReportError("BindGraphics() in fullscreen", false);
|
|
|
| // 2. Stay in fullscreen. No change.
|
| @@ -97,27 +102,23 @@
|
| return ReportError("IsFullscreen() in fullscreen^2", false);
|
|
|
| // 3. Switch to normal.
|
| - // The transition is synchronous in-process and asynchornous out-of-process
|
| - // because proxied IsFullscreen saves a roundtrip by relying on information
|
| - // communicated via a previous call to DidChangeView.
|
| - // Graphics devices can be bound right away.
|
| + // The transition is asynchronous and ends at DidChangeView().
|
| + // No graphics devices can be bound while in transition.
|
| normal_pending_ = true;
|
| if (!screen_mode_.SetFullscreen(false))
|
| return ReportError("SetFullscreen(false) in fullscreen", false);
|
| - pp::Graphics2D graphics2d_normal(instance_, pp::Size(15, 15), false);
|
| - if (graphics2d_normal.is_null())
|
| - return "Failed to create graphics2d_normal";
|
| - if (!instance_->BindGraphics(graphics2d_normal))
|
| - return ReportError("BindGraphics() in normal transition", false);
|
| - if (testing_interface_->IsOutOfProcess()) {
|
| - if (!screen_mode_.IsFullscreen())
|
| - return ReportError("IsFullscreen() in normal transition", false);
|
| - normal_callback_.WaitForResult();
|
| - if (normal_pending_)
|
| - return "normal_pending_ has not been reset";
|
| - }
|
| + if (instance_->BindGraphics(graphics2d_normal_))
|
| + return ReportError("BindGraphics() in normal transition", true);
|
| + if (!screen_mode_.IsFullscreen())
|
| + return ReportError("IsFullscreen() in normal transition", false);
|
| + // DidChangeView() will call the callback once out of fullscreen mode.
|
| + normal_callback_.WaitForResult();
|
| + if (normal_pending_)
|
| + return "normal_pending_ has not been reset";
|
| if (screen_mode_.IsFullscreen())
|
| return ReportError("IsFullscreen() in normal", true);
|
| + if (!instance_->BindGraphics(graphics2d_fullscreen_))
|
| + return ReportError("BindGraphics() in normal", false);
|
|
|
| // 4. Stay in normal. No change.
|
| if (!screen_mode_.SetFullscreen(false))
|
| @@ -128,18 +129,75 @@
|
| PASS();
|
| }
|
|
|
| -// Transition to fullscreen is asynchornous ending at DidChangeView.
|
| -// Transition to normal is synchronous in-process and asynchronous
|
| -// out-of-process ending at DidChangeView.
|
| +void TestFullscreen::FailFullscreenTest(const std::string& error) {
|
| + screen_mode_.SetFullscreen(false);
|
| + fullscreen_pending_ = false;
|
| + error_ = error;
|
| + pp::Module::Get()->core()->CallOnMainThread(0, fullscreen_callback_);
|
| +}
|
| +
|
| +// Transition to fullscreen can only happen when processing a user gesture.
|
| +bool TestFullscreen::HandleInputEvent(const pp::InputEvent& event) {
|
| + // We only let mouse events through and only mouse clicks count.
|
| + if (event.GetType() != PP_INPUTEVENT_TYPE_MOUSEDOWN &&
|
| + event.GetType() != PP_INPUTEVENT_TYPE_MOUSEUP)
|
| + return false;
|
| + // We got the gesture. No need to handle any more events.
|
| + instance_->ClearInputEventRequest(PP_INPUTEVENT_CLASS_MOUSE);
|
| + fullscreen_pending_ = true;
|
| + if (!screen_mode_.SetFullscreen(true)) {
|
| + FailFullscreenTest(ReportError("SetFullscreen(true) in normal", false));
|
| + return false;
|
| + }
|
| + // No graphics devices can be bound while in transition.
|
| + if (instance_->BindGraphics(graphics2d_fullscreen_)) {
|
| + FailFullscreenTest(
|
| + ReportError("BindGraphics() in fullscreen transition", true));
|
| + return false;
|
| + }
|
| + if (screen_mode_.IsFullscreen()) {
|
| + FailFullscreenTest(
|
| + ReportError("IsFullscreen() in fullscreen transtion", true));
|
| + return false;
|
| + }
|
| + // DidChangeView() will complete the transition to fullscreen.
|
| + return false;
|
| +}
|
| +
|
| +// Transitions to/from fullscreen is asynchornous ending at DidChangeView.
|
| +// When going to fullscreen, two DidChangeView calls are generated:
|
| +// one for moving the plugin to the middle of window and one for stretching
|
| +// the window and placing the plugin in the middle of the screen.
|
| +// Plugin size does not change.
|
| void TestFullscreen::DidChangeView(const pp::Rect& position,
|
| const pp::Rect& clip) {
|
| - if (fullscreen_pending_ && IsFullscreenView(position, clip, screen_size_)) {
|
| + if (normal_position_.IsEmpty())
|
| + normal_position_ = position;
|
| +
|
| + if (fullscreen_pending_ && !saw_first_fullscreen_didchangeview) {
|
| + saw_first_fullscreen_didchangeview = true;
|
| + if (!screen_mode_.IsFullscreen())
|
| + FailFullscreenTest("DidChangeView1 is not in fullscreen");
|
| + if (position.size() != normal_position_.size())
|
| + FailFullscreenTest("DidChangeView1 has different plugin size");
|
| + // Wait for the 2nd DidChangeView.
|
| + } else if (fullscreen_pending_) {
|
| fullscreen_pending_ = false;
|
| - pp::Module::Get()->core()->CallOnMainThread(0, fullscreen_callback_);
|
| - } else if (normal_pending_ &&
|
| - !IsFullscreenView(position, clip, screen_size_)) {
|
| + saw_first_fullscreen_didchangeview = false;
|
| + if (!screen_mode_.IsFullscreen())
|
| + FailFullscreenTest("DidChangeView2 is not in fullscreen");
|
| + else if (!HasMidScreen(position, screen_size_))
|
| + FailFullscreenTest("DidChangeView2 is not in the middle of the screen");
|
| + else if (position.size() != normal_position_.size())
|
| + FailFullscreenTest("DidChangeView2 has different plugin size");
|
| + else
|
| + pp::Module::Get()->core()->CallOnMainThread(0, fullscreen_callback_);
|
| + } else if (normal_pending_) {
|
| normal_pending_ = false;
|
| - if (testing_interface_->IsOutOfProcess())
|
| - pp::Module::Get()->core()->CallOnMainThread(0, normal_callback_);
|
| + if (screen_mode_.IsFullscreen())
|
| + error_ = "DidChangeview is in fullscreen";
|
| + else if (position != normal_position_)
|
| + error_ = "DidChangeView position is not normal";
|
| + pp::Module::Get()->core()->CallOnMainThread(0, normal_callback_);
|
| }
|
| }
|
|
|