// Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights // reserved. Use of this source code is governed by a BSD-style license that // can be found in the LICENSE file. #include "tests/cefsimple/simple_app.h" #include #include "include/cef_browser.h" #include "include/cef_command_line.h" #include "include/views/cef_browser_view.h" #include "include/views/cef_window.h" #include "include/wrapper/cef_helpers.h" #include "tests/cefsimple/simple_handler.h" namespace { // When using the Views framework this object provides the delegate // implementation for the CefWindow that hosts the Views-based browser. class SimpleWindowDelegate : public CefWindowDelegate { public: explicit SimpleWindowDelegate(CefRefPtr browser_view) : browser_view_(browser_view) {} void OnWindowCreated(CefRefPtr window) OVERRIDE { // Add the browser view and show the window. window->AddChildView(browser_view_); window->Show(); // Give keyboard focus to the browser view. browser_view_->RequestFocus(); } void OnWindowDestroyed(CefRefPtr window) OVERRIDE { browser_view_ = nullptr; } bool CanClose(CefRefPtr window) OVERRIDE { // Allow the window to close if the browser says it's OK. CefRefPtr browser = browser_view_->GetBrowser(); if (browser) return browser->GetHost()->TryCloseBrowser(); return true; } CefSize GetPreferredSize(CefRefPtr view) OVERRIDE { return CefSize(800, 600); } private: CefRefPtr browser_view_; IMPLEMENT_REFCOUNTING(SimpleWindowDelegate); DISALLOW_COPY_AND_ASSIGN(SimpleWindowDelegate); }; class SimpleBrowserViewDelegate : public CefBrowserViewDelegate { public: SimpleBrowserViewDelegate() {} bool OnPopupBrowserViewCreated(CefRefPtr browser_view, CefRefPtr popup_browser_view, bool is_devtools) OVERRIDE { // Create a new top-level Window for the popup. It will show itself after // creation. CefWindow::CreateTopLevelWindow( new SimpleWindowDelegate(popup_browser_view)); // We created the Window. return true; } private: IMPLEMENT_REFCOUNTING(SimpleBrowserViewDelegate); DISALLOW_COPY_AND_ASSIGN(SimpleBrowserViewDelegate); }; } // namespace SimpleApp::SimpleApp() {} void SimpleApp::OnContextInitialized() { CEF_REQUIRE_UI_THREAD(); CefRefPtr command_line = CefCommandLine::GetGlobalCommandLine(); const bool enable_chrome_runtime = SimpleHandler::IsChromeRuntimeEnabled(); #if defined(OS_WIN) || defined(OS_LINUX) // Create the browser using the Views framework if "--use-views" is specified // via the command-line. Otherwise, create the browser using the native // platform framework. The Views framework is currently only supported on // Windows and Linux. const bool use_views = command_line->HasSwitch("use-views"); #else const bool use_views = false; #endif // SimpleHandler implements browser-level callbacks. CefRefPtr handler(new SimpleHandler(use_views)); // Specify CEF browser settings here. CefBrowserSettings browser_settings; std::string url; // Check if a "--url=" value was provided via the command-line. If so, use // that instead of the default URL. url = command_line->GetSwitchValue("url"); if (url.empty()) url = "http://www.google.com"; if (use_views && !enable_chrome_runtime) { // Create the BrowserView. CefRefPtr browser_view = CefBrowserView::CreateBrowserView( handler, url, browser_settings, nullptr, nullptr, new SimpleBrowserViewDelegate()); // Create the Window. It will show itself after creation. CefWindow::CreateTopLevelWindow(new SimpleWindowDelegate(browser_view)); } else { // Information used when creating the native window. CefWindowInfo window_info; #if defined(OS_WIN) // On Windows we need to specify certain flags that will be passed to // CreateWindowEx(). window_info.SetAsPopup(NULL, "cefsimple"); #endif // Create the first browser window. CefBrowserHost::CreateBrowser(window_info, handler, url, browser_settings, nullptr, nullptr); } } CefRefPtr SimpleApp::GetDefaultClient() { // Called when a new browser window is created via the Chrome runtime UI. return SimpleHandler::GetInstance(); }