diff options
author | Inna Palant <ipalant@google.com> | 2023-12-12 19:56:22 -0800 |
---|---|---|
committer | Inna Palant <ipalant@google.com> | 2023-12-12 19:56:22 -0800 |
commit | 1ee1f36e3b492d7a6a0bf2367fe509365853aeaa (patch) | |
tree | a5790e155ff0d998639beb6172dfa0feb294aac9 /tests/ceftests/extensions/extension_test_handler.h | |
parent | 1e76199e6f0ded437fca14eb9e512e0c6bd0fc1e (diff) | |
parent | c33b736614ef77e4048cee551999a656a5ef465f (diff) | |
download | cef-1ee1f36e3b492d7a6a0bf2367fe509365853aeaa.tar.gz |
Merge remote-tracking branch 'origin/upstream'main
Import b/312293934
Diffstat (limited to 'tests/ceftests/extensions/extension_test_handler.h')
-rw-r--r-- | tests/ceftests/extensions/extension_test_handler.h | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/tests/ceftests/extensions/extension_test_handler.h b/tests/ceftests/extensions/extension_test_handler.h new file mode 100644 index 00000000..6e916e35 --- /dev/null +++ b/tests/ceftests/extensions/extension_test_handler.h @@ -0,0 +1,238 @@ +// Copyright (c) 2017 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. + +#ifndef CEF_TESTS_CEFTESTS_EXTENSIONS_EXTENSION_TEST_HANDLER_H_ +#define CEF_TESTS_CEFTESTS_EXTENSIONS_EXTENSION_TEST_HANDLER_H_ +#pragma once + +#include <vector> + +#include "include/cef_extension_handler.h" +#include "include/cef_values.h" +#include "include/wrapper/cef_scoped_temp_dir.h" +#include "tests/ceftests/routing_test_handler.h" +#include "tests/gtest/include/gtest/gtest.h" + +class ExtensionTestHandler : public RoutingTestHandler, + public CefExtensionHandler { + public: + // All tests must be able to run with all RequestContext combinations. See the + // EXTENSION_TEST_GROUP_* macros below. + enum RequestContextType { + // If set create a custom context. Otherwise, use the global context. + RC_TYPE_FLAG_CUSTOM = 1 << 0, + + // If set store data on disk. Otherwise, store data in memory. + // Requires RC_TYPE_FLAG_CUSTOM. + RC_TYPE_FLAG_ON_DISK = 1 << 1, + + // If set use a handler. Otherwise, don't. + RC_TYPE_FLAG_WITH_HANDLER = 1 << 2, + + // If set load extensions with a different context that shares the same + // storage but specifies a different handler. + // Excludes RC_TYPE_FLAG_LOAD_WITHOUT_HANDLER. + RC_TYPE_FLAG_LOAD_WITH_HANDLER = 1 << 3, + + // If set load extensions with a different context that shares the same + // storage but doesn't specify a handler. + // Requires RC_TYPE_FLAG_WITH_HANDLER. + // Excludes RC_TYPE_FLAG_LOAD_WITH_HANDLER. + RC_TYPE_FLAG_LOAD_WITHOUT_HANDLER = 1 << 4, + }; + + explicit ExtensionTestHandler(RequestContextType request_context_type); + virtual ~ExtensionTestHandler(); + + // TestHandler methods: + void RunTest() override; + void DestroyTest() override; + void OnAfterCreated(CefRefPtr<CefBrowser> browser) override; + + // CefExtensionHandler methods: + void OnExtensionLoadFailed(cef_errorcode_t result) override; + + // CefMessageRouterBrowserSide::Handler methods: + bool OnQuery(CefRefPtr<CefBrowser> browser, + CefRefPtr<CefFrame> frame, + int64 query_id, + const CefString& request, + bool persistent, + CefRefPtr<Callback> callback) override; + + CefRefPtr<CefRequestContext> request_context() const { + return request_context_; + } + CefRefPtr<CefRequestContext> loader_request_context() const { + return loader_request_context_; + } + + bool request_context_is_custom() const { + return !!(request_context_type_ & RC_TYPE_FLAG_CUSTOM); + } + bool request_context_on_disk() const { + return !!(request_context_type_ & RC_TYPE_FLAG_ON_DISK); + } + bool request_context_with_handler() const { + return !!(request_context_type_ & RC_TYPE_FLAG_WITH_HANDLER); + } + bool request_context_load_with_handler() const { + return !!(request_context_type_ & RC_TYPE_FLAG_LOAD_WITH_HANDLER); + } + bool request_context_load_without_handler() const { + return !!(request_context_type_ & RC_TYPE_FLAG_LOAD_WITHOUT_HANDLER); + } + bool request_context_same_loader() const { + return !(request_context_load_with_handler() || + request_context_load_without_handler()); + } + + protected: + // Returns the default extension manifest. + typedef std::vector<std::string> ApiPermissionsList; + static CefRefPtr<CefDictionaryValue> CreateDefaultManifest( + const ApiPermissionsList& api_permissions); + + // Returns the JS code that, when executed, will deliver |message| to the + // OnMessage callback. + static std::string GetMessageJS(const std::string& message); + + // Run checks on the state of |extension| in |context|. If |has_access| is + // true then |context| is expected to have access to |extension|. If + // |is_loader| is true then |context| is expected to have loaded |extension|. + static void VerifyExtensionInContext(CefRefPtr<CefExtension> extension, + CefRefPtr<CefRequestContext> context, + bool has_access, + bool is_loader); + + // Helper for loading/unloading an extension. + void LoadExtension(const std::string& extension_path, + CefRefPtr<CefDictionaryValue> manifest); + void UnloadExtension(CefRefPtr<CefExtension> extension); + + // Release request contexts. This is normally called from DestroyTest(). + void ReleaseRequestContexts(); + + void set_create_main_browser(bool val) { create_main_browser_ = val; } + bool create_main_browser() const { return create_main_browser_; } + + // Called when its time to add resources for the main browser if + // |create_main_browser_| is true. + virtual void OnAddMainBrowserResources() {} + // Called when its time to create the main browser if + // |create_main_browser_| is true. + virtual void OnCreateMainBrowser() {} + + // Called when its time to load extensions. + virtual void OnLoadExtensions() = 0; + + // Called when |browser| receives |message|. Return true if the message is + // handled. The JS code that sends messages is created by GetMessageJS(). + virtual bool OnMessage(CefRefPtr<CefBrowser> browser, + const std::string& message) = 0; + + // Called to perform verification on test destruction. + virtual void OnDestroyTest() = 0; + + private: + const RequestContextType request_context_type_; + CefScopedTempDir request_context_temp_dir_; + + // Context used when creating browsers. + CefRefPtr<CefRequestContext> request_context_; + + // Context used when loading extensions. + CefRefPtr<CefRequestContext> loader_request_context_; + + // If true expect creation of a main browser. Default is true. + bool create_main_browser_; + + DISALLOW_COPY_AND_ASSIGN(ExtensionTestHandler); +}; + +// Helper for implementing an extension test. +#define EXTENSION_TEST(name, test_class, rc_type) \ + TEST(ExtensionTest, name) { \ + CefRefPtr<test_class> handler = new test_class( \ + static_cast<ExtensionTestHandler::RequestContextType>(rc_type)); \ + handler->ExecuteTest(); \ + ReleaseAndWaitForDestructor(handler); \ + } + +// Helper for implementing extension tests that include all RequestContext +// combinations. When two or more extension tests significantly overlap in +// tested functionality the first test should use the ALL macro and the others +// should use the MINIMAL macro. +#define EXTENSION_TEST_GROUP_ALL(name, test_class) \ + EXTENSION_TEST(name##RCGlobal, test_class, 0) \ + EXTENSION_TEST(name##RCGlobalLoadWithHandler, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_LOAD_WITH_HANDLER) \ + EXTENSION_TEST(name##RCGlobalWithHandler, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_WITH_HANDLER) \ + EXTENSION_TEST(name##RCGlobalWithHandlerLoadWithHandler, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_WITH_HANDLER | \ + ExtensionTestHandler::RC_TYPE_FLAG_LOAD_WITH_HANDLER) \ + EXTENSION_TEST(name##RCGlobalWithHandlerLoadWithoutHandler, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_WITH_HANDLER | \ + ExtensionTestHandler::RC_TYPE_FLAG_LOAD_WITHOUT_HANDLER) \ + EXTENSION_TEST(name##RCCustomInMemory, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_CUSTOM) \ + EXTENSION_TEST(name##RCCustomInMemoryLoadWithHandler, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_CUSTOM | \ + ExtensionTestHandler::RC_TYPE_FLAG_LOAD_WITH_HANDLER) \ + EXTENSION_TEST(name##RCCustomInMemoryWithHandler, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_CUSTOM | \ + ExtensionTestHandler::RC_TYPE_FLAG_WITH_HANDLER) \ + EXTENSION_TEST(name##RCCustomInMemoryWithHandlerLoadWithHandler, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_CUSTOM | \ + ExtensionTestHandler::RC_TYPE_FLAG_WITH_HANDLER | \ + ExtensionTestHandler::RC_TYPE_FLAG_LOAD_WITH_HANDLER) \ + EXTENSION_TEST(name##RCCustomInMemoryWithHandlerLoadWithoutHandler, \ + test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_CUSTOM | \ + ExtensionTestHandler::RC_TYPE_FLAG_WITH_HANDLER | \ + ExtensionTestHandler::RC_TYPE_FLAG_LOAD_WITHOUT_HANDLER) \ + EXTENSION_TEST(name##RCCustomOnDisk, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_CUSTOM | \ + ExtensionTestHandler::RC_TYPE_FLAG_ON_DISK) \ + EXTENSION_TEST(name##RCCustomOnDiskLoadWithHandler, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_CUSTOM | \ + ExtensionTestHandler::RC_TYPE_FLAG_ON_DISK | \ + ExtensionTestHandler::RC_TYPE_FLAG_LOAD_WITH_HANDLER) \ + EXTENSION_TEST(name##RCCustomOnDiskWithHandler, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_CUSTOM | \ + ExtensionTestHandler::RC_TYPE_FLAG_ON_DISK | \ + ExtensionTestHandler::RC_TYPE_FLAG_WITH_HANDLER) \ + EXTENSION_TEST(name##RCCustomOnDiskWithHandlerLoadWithHandler, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_CUSTOM | \ + ExtensionTestHandler::RC_TYPE_FLAG_ON_DISK | \ + ExtensionTestHandler::RC_TYPE_FLAG_WITH_HANDLER | \ + ExtensionTestHandler::RC_TYPE_FLAG_LOAD_WITH_HANDLER) \ + EXTENSION_TEST(name##RCCustomOnDiskWithHandlerLoadWithoutHandler, \ + test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_CUSTOM | \ + ExtensionTestHandler::RC_TYPE_FLAG_ON_DISK | \ + ExtensionTestHandler::RC_TYPE_FLAG_WITH_HANDLER | \ + ExtensionTestHandler::RC_TYPE_FLAG_LOAD_WITHOUT_HANDLER) + +#define EXTENSION_TEST_GROUP_MINIMAL_GLOBAL(name, test_class) \ + EXTENSION_TEST(name##RCGlobal, test_class, 0) \ + EXTENSION_TEST(name##RCGlobalWithHandler, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_WITH_HANDLER) + +#define EXTENSION_TEST_GROUP_MINIMAL_CUSTOM(name, test_class) \ + EXTENSION_TEST(name##RCCustomInMemory, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_CUSTOM) \ + EXTENSION_TEST(name##RCCustomInMemoryWithHandler, test_class, \ + ExtensionTestHandler::RC_TYPE_FLAG_CUSTOM | \ + ExtensionTestHandler::RC_TYPE_FLAG_WITH_HANDLER) + +// Helper for implementing extension tests that include a minimal set of +// RequestContext combinations. This mostly just verifies that the test runs +// and doesn't leak state information in the context. +#define EXTENSION_TEST_GROUP_MINIMAL(name, test_class) \ + EXTENSION_TEST_GROUP_MINIMAL_GLOBAL(name, test_class) \ + EXTENSION_TEST_GROUP_MINIMAL_CUSTOM(name, test_class) + +#endif // CEF_TESTS_CEFTESTS_EXTENSIONS_EXTENSION_TEST_HANDLER_H_ |