2017-08-04 00:55:19 +02:00
|
|
|
// 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.
|
|
|
|
|
2020-08-20 00:23:42 +02:00
|
|
|
#ifndef CEF_TESTS_CEFTESTS_EXTENSIONS_EXTENSION_TEST_HANDLER_H_
|
|
|
|
#define CEF_TESTS_CEFTESTS_EXTENSIONS_EXTENSION_TEST_HANDLER_H_
|
2017-08-04 00:55:19 +02:00
|
|
|
#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);
|
2024-01-20 18:00:09 +01:00
|
|
|
~ExtensionTestHandler() override;
|
2017-08-04 00:55:19 +02:00
|
|
|
|
|
|
|
// 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,
|
2023-06-01 16:06:15 +02:00
|
|
|
int64_t query_id,
|
2017-08-04 00:55:19 +02:00
|
|
|
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.
|
2024-01-20 18:00:09 +01:00
|
|
|
bool create_main_browser_ = true;
|
2017-08-04 00:55:19 +02:00
|
|
|
|
|
|
|
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) \
|
2019-03-13 22:27:37 +01:00
|
|
|
EXTENSION_TEST(name##RCGlobal, test_class, 0) \
|
2017-08-04 00:55:19 +02:00
|
|
|
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) \
|
2019-03-13 22:27:37 +01:00
|
|
|
EXTENSION_TEST(name##RCGlobal, test_class, 0) \
|
2017-08-04 00:55:19 +02:00
|
|
|
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)
|
|
|
|
|
2020-08-20 00:23:42 +02:00
|
|
|
#endif // CEF_TESTS_CEFTESTS_EXTENSIONS_EXTENSION_TEST_HANDLER_H_
|