| // Copyright 2016 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef COBALT_DOM_TESTING_STUB_WINDOW_H_ |
| #define COBALT_DOM_TESTING_STUB_WINDOW_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <utility> |
| |
| #include "base/bind.h" |
| #include "base/callback.h" |
| #include "base/optional.h" |
| #include "cobalt/base/debugger_hooks.h" |
| #include "cobalt/css_parser/parser.h" |
| #include "cobalt/cssom/viewport_size.h" |
| #include "cobalt/dom/captions/system_caption_settings.h" |
| #include "cobalt/dom/dom_settings.h" |
| #include "cobalt/dom/local_storage_database.h" |
| #include "cobalt/dom/testing/stub_environment_settings.h" |
| #include "cobalt/dom/window.h" |
| #include "cobalt/dom_parser/parser.h" |
| #include "cobalt/loader/loader_factory.h" |
| #include "cobalt/network/network_module.h" |
| #include "cobalt/script/global_environment.h" |
| #include "cobalt/script/javascript_engine.h" |
| #include "cobalt/web/context.h" |
| #include "cobalt/web/environment_settings.h" |
| #include "cobalt/web/testing/stub_web_context.h" |
| #include "starboard/window.h" |
| #include "url/gurl.h" |
| |
| namespace cobalt { |
| namespace dom { |
| class OnScreenKeyboardBridge; |
| namespace testing { |
| // A helper class for tests that brings up a dom::Window with a number of parts |
| // stubbed out. |
| class StubWindow { |
| public: |
| StubWindow() {} |
| virtual ~StubWindow() { |
| if (window_) { |
| global_environment()->SetReportEvalCallback(base::Closure()); |
| global_environment()->SetReportErrorCallback( |
| script::GlobalEnvironment::ReportErrorCallback()); |
| window_->DispatchEvent(new web::Event(base::Tokens::unload())); |
| window_->DestroyTimers(); |
| window_.reset(); |
| } |
| } |
| |
| void set_options(const DOMSettings::Options& options) { options_ = options; } |
| |
| web::testing::StubWebContext* web_context() { |
| if (!web_context_) InitializeWebContext(); |
| return web_context_.get(); |
| } |
| |
| scoped_refptr<dom::Window> window() { |
| if (!window_) InitializeWindow(); |
| return window_; |
| } |
| scoped_refptr<script::GlobalEnvironment> global_environment() { |
| // The Window has to be set as the global object for the global environment |
| // to be valid. |
| if (!window_) InitializeWindow(); |
| return web_context()->global_environment(); |
| } |
| css_parser::Parser* css_parser() { return css_parser_.get(); } |
| web::EnvironmentSettings* environment_settings() { |
| // The Window has to be set as the global object for the environment |
| // settings object to be valid. |
| if (!window_) InitializeWindow(); |
| return web_context()->environment_settings(); |
| } |
| |
| void set_on_screen_keyboard_bridge( |
| OnScreenKeyboardBridge* on_screen_keyboard_bridge) { |
| on_screen_keyboard_bridge_ = on_screen_keyboard_bridge; |
| } |
| |
| private: |
| static void StubLoadCompleteCallback( |
| const base::Optional<std::string>& error) {} |
| |
| void InitializeWebContext() { |
| web_context_.reset(new web::testing::StubWebContext()); |
| web_context()->setup_environment_settings( |
| new dom::testing::StubEnvironmentSettings(options_)); |
| web_context()->environment_settings()->set_creation_url( |
| GURL("about:blank")); |
| } |
| |
| void InitializeWindow() { |
| loader_factory_.reset(new loader::LoaderFactory( |
| "Test", web_context()->fetcher_factory(), NULL, |
| web_context()->environment_settings()->debugger_hooks(), 0, |
| base::ThreadPriority::DEFAULT)); |
| system_caption_settings_ = new cobalt::dom::captions::SystemCaptionSettings( |
| web_context()->environment_settings()); |
| css_parser_.reset(css_parser::Parser::Create().release()); |
| dom_parser_.reset( |
| new dom_parser::Parser(base::Bind(&StubLoadCompleteCallback))); |
| dom_stat_tracker_.reset(new dom::DomStatTracker("StubWindow")); |
| window_ = new dom::Window( |
| web_context()->environment_settings(), cssom::ViewportSize(1920, 1080), |
| base::kApplicationStateStarted, css_parser_.get(), dom_parser_.get(), |
| web_context()->fetcher_factory(), loader_factory_.get(), nullptr, |
| nullptr, nullptr, nullptr, nullptr, nullptr, &local_storage_database_, |
| nullptr, nullptr, nullptr, nullptr, |
| web_context()->global_environment()->script_value_factory(), nullptr, |
| dom_stat_tracker_.get(), "en", base::Callback<void(const GURL&)>(), |
| base::Bind(&StubLoadCompleteCallback), nullptr, |
| network_bridge::PostSender(), csp::kCSPOptional, |
| web::kCspEnforcementEnable, base::Closure() /* csp_policy_changed */, |
| base::Closure() /* ran_animation_frame_callbacks */, |
| dom::Window::CloseCallback() /* window_close */, |
| base::Closure() /* window_minimize */, on_screen_keyboard_bridge_, |
| nullptr /* camera_3d */, dom::Window::OnStartDispatchEventCallback(), |
| dom::Window::OnStopDispatchEventCallback(), |
| dom::ScreenshotManager::ProvideScreenshotFunctionCallback(), |
| nullptr /* synchronous_loader_interrupt */, |
| false /* enable_inline_script_warnings */, nullptr /* ui_nav_root */, |
| true /* enable_map_to_mesh */, 0 /* csp_insecure_allowed_token */, |
| 0 /* dom_max_element_depth */, 1.f /* video_playback_rate_multiplier */, |
| dom::Window::kClockTypeSystemTime /* clock_type */, |
| dom::Window::CacheCallback() /* splash_screen_cache_callback */, |
| system_caption_settings_ /* captions */ |
| ); |
| global_environment()->CreateGlobalObject( |
| window_, web_context()->environment_settings()); |
| } |
| |
| OnScreenKeyboardBridge* on_screen_keyboard_bridge_ = nullptr; |
| DOMSettings::Options options_; |
| std::unique_ptr<css_parser::Parser> css_parser_; |
| std::unique_ptr<dom_parser::Parser> dom_parser_; |
| std::unique_ptr<loader::LoaderFactory> loader_factory_; |
| dom::LocalStorageDatabase local_storage_database_; |
| std::unique_ptr<dom::DomStatTracker> dom_stat_tracker_; |
| std::unique_ptr<web::testing::StubWebContext> web_context_; |
| scoped_refptr<dom::Window> window_; |
| |
| scoped_refptr<cobalt::dom::captions::SystemCaptionSettings> |
| system_caption_settings_; |
| }; |
| |
| } // namespace testing |
| } // namespace dom |
| } // namespace cobalt |
| |
| #endif // COBALT_DOM_TESTING_STUB_WINDOW_H_ |