// 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_handler.h" #include #include #include "include/base/cef_callback.h" #include "include/cef_app.h" #include "include/cef_parser.h" #include "include/views/cef_browser_view.h" #include "include/views/cef_window.h" #include "include/wrapper/cef_closure_task.h" #include "include/wrapper/cef_helpers.h" namespace { SimpleHandler* g_instance = nullptr; // Returns a data: URI with the specified contents. std::string GetDataURI(const std::string& data, const std::string& mime_type) { return "data:" + mime_type + ";base64," + CefURIEncode(CefBase64Encode(data.data(), data.size()), false) .ToString(); } } // namespace SimpleHandler::SimpleHandler(bool use_views) : use_views_(use_views) { DCHECK(!g_instance); g_instance = this; } SimpleHandler::~SimpleHandler() { g_instance = nullptr; } // static SimpleHandler* SimpleHandler::GetInstance() { return g_instance; } void SimpleHandler::OnTitleChange(CefRefPtr browser, const CefString& title) { CEF_REQUIRE_UI_THREAD(); if (use_views_) { // Set the title of the window using the Views framework. CefRefPtr browser_view = CefBrowserView::GetForBrowser(browser); if (browser_view) { CefRefPtr window = browser_view->GetWindow(); if (window) { window->SetTitle(title); } } } else if (!IsChromeRuntimeEnabled()) { // Set the title of the window using platform APIs. PlatformTitleChange(browser, title); } } void SimpleHandler::OnAfterCreated(CefRefPtr browser) { CEF_REQUIRE_UI_THREAD(); // Add to the list of existing browsers. browser_list_.push_back(browser); } bool SimpleHandler::DoClose(CefRefPtr browser) { CEF_REQUIRE_UI_THREAD(); // Closing the main window requires special handling. See the DoClose() // documentation in the CEF header for a detailed destription of this // process. if (browser_list_.size() == 1) { // Set a flag to indicate that the window close should be allowed. is_closing_ = true; } // Allow the close. For windowed browsers this will result in the OS close // event being sent. return false; } void SimpleHandler::OnBeforeClose(CefRefPtr browser) { CEF_REQUIRE_UI_THREAD(); // Remove from the list of existing browsers. BrowserList::iterator bit = browser_list_.begin(); for (; bit != browser_list_.end(); ++bit) { if ((*bit)->IsSame(browser)) { browser_list_.erase(bit); break; } } if (browser_list_.empty()) { // All browser windows have closed. Quit the application message loop. CefQuitMessageLoop(); } } void SimpleHandler::OnLoadError(CefRefPtr browser, CefRefPtr frame, ErrorCode errorCode, const CefString& errorText, const CefString& failedUrl) { CEF_REQUIRE_UI_THREAD(); // Allow Chrome to show the error page. if (IsChromeRuntimeEnabled()) { return; } // Don't display an error for downloaded files. if (errorCode == ERR_ABORTED) { return; } // Display a load error message using a data: URI. std::stringstream ss; ss << "" "

Failed to load URL " << std::string(failedUrl) << " with error " << std::string(errorText) << " (" << errorCode << ").

"; frame->LoadURL(GetDataURI(ss.str(), "text/html")); } void SimpleHandler::CloseAllBrowsers(bool force_close) { if (!CefCurrentlyOn(TID_UI)) { // Execute on the UI thread. CefPostTask(TID_UI, base::BindOnce(&SimpleHandler::CloseAllBrowsers, this, force_close)); return; } if (browser_list_.empty()) { return; } BrowserList::const_iterator it = browser_list_.begin(); for (; it != browser_list_.end(); ++it) { (*it)->GetHost()->CloseBrowser(force_close); } } // static bool SimpleHandler::IsChromeRuntimeEnabled() { static bool enabled = []() { return CefCommandLine::GetGlobalCommandLine()->HasSwitch( "enable-chrome-runtime"); }(); return enabled; }