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