blob: b627f692601aabfc5bfe377a2261f2de20a02c89 [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.
#include "headless/lib/renderer/headless_content_renderer_client.h"
#include "base/memory/ptr_util.h"
#include "base/strings/utf_string_conversions.h"
#include "content/public/common/bindings_policy.h"
#include "content/public/renderer/render_frame.h"
#include "printing/features/features.h"
#if BUILDFLAG(ENABLE_BASIC_PRINTING)
#include "components/printing/renderer/print_web_view_helper.h"
#include "headless/lib/renderer/headless_print_web_view_helper_delegate.h"
#endif
namespace headless {
HeadlessContentRendererClient::HeadlessContentRendererClient() {}
HeadlessContentRendererClient::~HeadlessContentRendererClient() {}
void HeadlessContentRendererClient::RenderFrameCreated(
content::RenderFrame* render_frame) {
#if BUILDFLAG(ENABLE_BASIC_PRINTING)
new printing::PrintWebViewHelper(
render_frame, base::MakeUnique<HeadlessPrintWebViewHelperDelegate>());
#endif
}
void HeadlessContentRendererClient::RunScriptsAtDocumentStart(
content::RenderFrame* render_frame) {
if (!(render_frame->GetEnabledBindings() &
content::BindingsPolicy::BINDINGS_POLICY_HEADLESS)) {
return;
}
render_frame->ExecuteJavaScript(base::UTF8ToUTF16(R"(
(function() {
let tabSocket = null;
let messagesToSend = [];
function getNextEmbedderMessage() {
tabSocket.awaitNextMessageFromEmbedder().then(
function(result) {
window.TabSocket.onmessage(new CustomEvent(
"onmessage", {detail : {message : result.message}}));
getNextEmbedderMessage();
});
};
window.TabSocket = new Proxy(
{
send: function(message) {
if (tabSocket) {
tabSocket.sendMessageToEmbedder(message);
} else {
messagesToSend.push(message);
}
},
onmessage: null
},
{
set: function(target, prop, value, receiver) {
if (prop !== "onmessage")
return false;
target[prop] = value;
if (tabSocket)
getNextEmbedderMessage();
return true;
}
});
// Note define() defines a module in the mojo module dependency
// system. While we don't expose our module, the callback below only
// fires after the requested modules have been loaded.
define([
'headless/lib/tab_socket.mojom',
'content/public/renderer/frame_interfaces',
], function(tabSocketMojom, frameInterfaces) {
tabSocket = new tabSocketMojom.TabSocketPtr(
frameInterfaces.getInterface(tabSocketMojom.TabSocket.name));
// Send any messages that may have been created before the dependency
// was resolved.
for (var i = 0; i < messagesToSend.length; i++) {
tabSocket.sendMessageToEmbedder(messagesToSend[i]);
}
messagesToSend = [];
if (window.TabSocket.onmessage)
getNextEmbedderMessage();
});
})(); )"));
}
} // namespace headless