// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PPAPI_TEST_TEST_VIEW_H_
#define PPAPI_TEST_TEST_VIEW_H_

#include <stdint.h>

#include "ppapi/cpp/view.h"
#include "ppapi/tests/test_case.h"

class TestView : public TestCase {
 public:
  TestView(TestingInstance* instance);

  virtual void DidChangeView(const pp::View& view);

  // TestCase implementation.
  virtual bool Init();
  virtual void RunTests(const std::string& test_filter);

 private:
  // Waits until we get a view changed event. Note that the browser may give
  // us any number of view changed events, so tests that use this should
  // expect that there may be spurious events and handle them accordingly.
  // Note also that view changed sequencing can change between different
  // versions of WebKit.
  //
  // Returns true if we got a view changed, false if it timed out.
  bool WaitUntilViewChanged();

  void QuitMessageLoop(int32_t result);

  std::string TestCreatedVisible();
  std::string TestCreatedInvisible();
  std::string TestPageHideShow();
  std::string TestSizeChange();
  std::string TestClipChange();
  std::string TestScrollOffsetChange();

  pp::View last_view_;

  // DidChangeView stores the page visibility in this vector on each
  // invocation so tests can check it.
  std::vector<bool> page_visibility_log_;

  // Set to true to request that the next invocation of DidChangeView should
  // post a quit to the message loop. DidChangeView will also reset the flag so
  // this will only happen once.
  bool post_quit_on_view_changed_;
};

#endif  // PPAPI_TEST_TEST_VIEW_H_
