blob: da08d56c8d58b056f19675d66718e76e79ae94d4 [file] [log] [blame]
// Copyright 2017 The Chromium 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 HEADLESS_TEST_TAB_SOCKET_TEST_H_
#define HEADLESS_TEST_TAB_SOCKET_TEST_H_
#include "headless/public/devtools/domains/page.h"
#include "headless/public/devtools/domains/runtime.h"
#include "headless/public/headless_tab_socket.h"
#include "headless/test/headless_browser_test.h"
namespace headless {
class TabSocketTest : public HeadlessAsyncDevTooledBrowserTest,
public headless::HeadlessTabSocket::Listener,
public page::Observer,
public runtime::Observer {
public:
TabSocketTest();
~TabSocketTest() override;
// HeadlessAsyncDevTooledBrowserTest implementation:
void SetUp() override;
void RunDevTooledTest() override;
bool GetAllowTabSockets() override;
// runtime::Observer implementation:
void OnExecutionContextCreated(
const runtime::ExecutionContextCreatedParams& params) override;
void ExpectJsException(std::unique_ptr<runtime::EvaluateResult> result);
void FailOnJsEvaluateException(
std::unique_ptr<runtime::EvaluateResult> result);
// Note this will fail the test if an execution context corresponding to
// |name| doesn't exist.
int GetV8ExecutionContextIdByWorldName(const std::string& name);
// Returns a pointer to the set of v8 execution context ids corresponding to
// |devtools_frame_id| or null if none exist.
const std::set<int>* GetV8ExecutionContextIdsForFrame(
const std::string& devtools_frame_id) const;
// Attempts to install a main world TabSocket in |devtools_frame_id|.
// If successful |callback| will run with the execution context id of the
// main world tab socket.
void CreateMainWorldTabSocket(std::string devtools_frame_id,
base::Callback<void(int)> callback);
// Attempts to create an isolated world in |isolated_world_name| and then
// install a world TabSocket. If successful |callback| will run with the
// execution context id of the newly created isolated world as a parameter.
// Note |isolated_world_name| must be unique.
void CreateIsolatedWorldTabSocket(std::string isolated_world_name,
std::string devtools_frame_id,
base::Callback<void(int)> callback);
virtual void RunTabSocketTest() = 0;
const std::string& main_frame_id() const { return *main_frame_id_; }
private:
void OnPageEnabled(std::unique_ptr<page::EnableResult> result);
void OnResourceTree(std::unique_ptr<page::GetResourceTreeResult> result);
void CreateMainWorldTabSocketStep2(std::string devtools_frame_id,
base::Callback<void(int)> callback,
int v8_execution_context_id);
void OnCreatedIsolatedWorld(
base::Callback<void(int)> callback,
std::unique_ptr<page::CreateIsolatedWorldResult> result);
void InstallHeadlessTabSocketBindings(base::Callback<void(int)> callback,
int execution_context_id);
void OnInstalledHeadlessTabSocketBindings(int execution_context_id,
base::Callback<void(int)> callback,
bool success);
std::map<std::string, int> world_name_to_v8_execution_context_id_;
std::map<std::string, std::set<int>> frame_id_to_v8_execution_context_ids_;
base::Optional<std::string> main_frame_id_;
};
} // namespace headless
#endif // HEADLESS_TEST_TAB_SOCKET_TEST_H_