Chromium Code Reviews| Index: ppapi/tests/test_fullscreen.cc |
| =================================================================== |
| --- ppapi/tests/test_fullscreen.cc (revision 102782) |
| +++ 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_(""), |
|
brettw
2011/09/27 00:04:20
Just use error_() (the "" version requires more wo
polina
2011/09/27 00:49:08
Done.
|
| 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_ = ""; |
|
brettw
2011/09/27 00:04:20
error_.clear()?
polina
2011/09/27 00:49:08
Done.
|
| + 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,70 @@ |
| 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 after 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, You actually get two DidChangeView calls: |
| +// one for moving the plugin to the middle of window and one for 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("1st DidChangeView is not in fullscreen"); |
| + } else if (fullscreen_pending_) { |
| fullscreen_pending_ = false; |
| - pp::Module::Get()->core()->CallOnMainThread(0, fullscreen_callback_); |
| - } else if (normal_pending_ && |
| - !IsFullscreenView(position, clip, screen_size_)) { |
| + if (!screen_mode_.IsFullscreen()) |
| + FailFullscreenTest("2nd DidChangeView is not in fullscreen"); |
| + else if (!HasMidScreen(position, screen_size_)) |
| + FailFullscreenTest("DidChangeView is not in the middle of the screen"); |
| + else if (position.size() != normal_position_.size()) |
| + FailFullscreenTest("DidChangeView 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_); |
| } |
| } |