15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sstream>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_time.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ppapi/c/private/ppb_testing_private.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/completion_callback.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/testing_instance.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)REGISTER_TEST_CASE(View);
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When waiting for view changed events, wait no longer than this.
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(THREAD_SANITIZER)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int kViewChangeTimeoutSec = 5;
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// ThreadSanitizer may slow the interaction down significantly.
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static int kViewChangeTimeoutSec = 30;
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestView::TestView(TestingInstance* instance)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : TestCase(instance),
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      post_quit_on_view_changed_(false) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::DidChangeView(const pp::View& view) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_view_ = view;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  page_visibility_log_.push_back(view.IsPageVisible());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (post_quit_on_view_changed_) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    post_quit_on_view_changed_ = false;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testing_interface_->QuitMessageLoop(instance_->pp_instance());
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestView::Init() {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CheckTestingInterface();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::RunTests(const std::string& filter) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(CreatedVisible, filter);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(CreatedInvisible, filter);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(PageHideShow, filter);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(SizeChange, filter);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(ClipChange, filter);
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RUN_TEST(ScrollOffsetChange, filter);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestView::WaitUntilViewChanged() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedule a callback so this step times out if we don't get a ViewChanged
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in a reasonable amount of time.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::CompletionCallbackFactory<TestView> factory(this);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::CompletionCallback timeout =
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      factory.NewCallback(&TestView::QuitMessageLoop);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Module::Get()->core()->CallOnMainThread(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kViewChangeTimeoutSec * 1000, timeout);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t old_page_visibility_change_count = page_visibility_log_.size();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run a nested message loop. It will exit either on ViewChanged or if the
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // timeout happens.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  post_quit_on_view_changed_ = true;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testing_interface_->RunMessageLoop(instance_->pp_instance());
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  post_quit_on_view_changed_ = false;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We know we got a view changed event if something was appended to the log.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return page_visibility_log_.size() > old_page_visibility_change_count;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestView::QuitMessageLoop(int32_t result) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testing_interface_->QuitMessageLoop(instance_->pp_instance());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestView::TestCreatedVisible() {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(page_visibility_log_.empty());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(page_visibility_log_[0]);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestView::TestCreatedInvisible() {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(page_visibility_log_.empty());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page_visibility_log_[0]) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add more error message since this test has some extra requirements.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance_->AppendError("Initial page is set to visible. NOTE: "
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "This test must be run in a background tab. "
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Either run in the UI test which does this, or you can middle-click "
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "on the test link to run manually.");
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(page_visibility_log_[0]);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestView::TestPageHideShow() {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initial state should be visible.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(page_visibility_log_.empty());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(page_visibility_log_[0]);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now that we're alive, tell the test knows it can change our visibility.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->ReportProgress("TestPageHideShow:Created");
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait until we get a hide event, being careful to handle spurious
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notifications of ViewChanged.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Time begin_time = pp::Module::Get()->core()->GetTime();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (WaitUntilViewChanged() &&
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         page_visibility_log_[page_visibility_log_.size() - 1] &&
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         pp::Module::Get()->core()->GetTime() - begin_time <
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             kViewChangeTimeoutSec) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page_visibility_log_[page_visibility_log_.size() - 1]) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Didn't get a view changed event that changed visibility (though there
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // may have been some that didn't change visibility).
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add more error message since this test has some extra requirements.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "Didn't receive a hide event in timeout. NOTE: "
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "This test requires tab visibility to change and won't pass if you "
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "just run it in a browser. Normally the UI test should handle "
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "this. You can also run manually by waiting 2 secs, creating a new "
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "tab, waiting 2 more secs, and closing the new tab.";
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the test so it can show us again.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->ReportProgress("TestPageHideShow:Hidden");
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait until we get a show event.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  begin_time = pp::Module::Get()->core()->GetTime();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (WaitUntilViewChanged() &&
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         !page_visibility_log_[page_visibility_log_.size() - 1] &&
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         pp::Module::Get()->core()->GetTime() - begin_time <
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             kViewChangeTimeoutSec) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(page_visibility_log_[page_visibility_log_.size() - 1]);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestView::TestSizeChange() {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Rect original_rect = last_view_.GetRect();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Rect desired_rect = original_rect;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  desired_rect.set_width(original_rect.width() + 10);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  desired_rect.set_height(original_rect.height() + 12);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::ostringstream script_stream;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  script_stream << "var plugin = document.getElementById('plugin');";
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  script_stream << "plugin.setAttribute('width', "
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << desired_rect.width() << ");";
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  script_stream << "plugin.setAttribute('height', "
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << desired_rect.height() << ");";
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->EvalScript(script_stream.str());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Time begin_time = pp::Module::Get()->core()->GetTime();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (WaitUntilViewChanged() && last_view_.GetRect() != desired_rect &&
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         pp::Module::Get()->core()->GetTime() - begin_time <
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             kViewChangeTimeoutSec) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(last_view_.GetRect() == desired_rect);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestView::TestClipChange() {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Rect original_rect = last_view_.GetRect();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Original clip should be the full frame.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Rect original_clip = last_view_.GetClipRect();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(original_clip.x() == 0);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(original_clip.y() == 0);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(original_clip.width() == original_rect.width());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(original_clip.height() == original_rect.height());
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int clip_amount = original_rect.height() / 2;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It might be nice to set the position to be absolute and set the location,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but this will cause WebKit to actually tear down the plugin and recreate
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it. So instead we add a big div to cause the document to be scrollable,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and scroll it down.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::ostringstream script_stream;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  script_stream
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "var big = document.createElement('div');"
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "big.setAttribute('style', 'position:absolute; left:100px; "
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    "top:0px; width:1px; height:5000px;');"
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "document.body.appendChild(big);"
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "window.scrollBy(0, " << original_rect.y() + clip_amount << ");";
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->EvalScript(script_stream.str());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Rect desired_clip = original_clip;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  desired_clip.set_y(clip_amount);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  desired_clip.set_height(desired_clip.height() - desired_clip.y());
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Time begin_time = pp::Module::Get()->core()->GetTime();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (WaitUntilViewChanged() && last_view_.GetClipRect() != desired_clip &&
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         pp::Module::Get()->core()->GetTime() - begin_time <
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             kViewChangeTimeoutSec) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(last_view_.GetClipRect() == desired_clip);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestView::TestScrollOffsetChange() {
2056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  instance_->EvalScript("document.body.style.width = '5000px';"
2066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        "document.body.style.height = '5000px';");
2076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  instance_->EvalScript("window.scrollTo(5, 1);");
2086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  PP_Time begin_time = pp::Module::Get()->core()->GetTime();
2106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  while (WaitUntilViewChanged() &&
2116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)         last_view_.GetScrollOffset() != pp::Point(5, 1) &&
2126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)         pp::Module::Get()->core()->GetTime() - begin_time <
2136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)             kViewChangeTimeoutSec) {
2146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
2156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(pp::Point(5, 1), last_view_.GetScrollOffset());
2166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  instance_->EvalScript("window.scrollTo(0, 0);");
2186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  begin_time = pp::Module::Get()->core()->GetTime();
2206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  while (WaitUntilViewChanged() &&
2216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)         last_view_.GetScrollOffset() != pp::Point(0, 0) &&
2226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)         pp::Module::Get()->core()->GetTime() - begin_time <
2236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)             kViewChangeTimeoutSec) {
2246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
2256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(pp::Point(0, 0), last_view_.GetScrollOffset());
2266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  PASS();
2286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
229