OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "headless/lib/renderer/headless_content_renderer_client.h" | 5 #include "headless/lib/renderer/headless_content_renderer_client.h" |
6 | 6 |
7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "content/public/common/bindings_policy.h" |
| 10 #include "content/public/renderer/render_frame.h" |
8 #include "printing/features/features.h" | 11 #include "printing/features/features.h" |
9 | 12 |
10 #if BUILDFLAG(ENABLE_BASIC_PRINTING) | 13 #if BUILDFLAG(ENABLE_BASIC_PRINTING) |
11 #include "components/printing/renderer/print_web_view_helper.h" | 14 #include "components/printing/renderer/print_web_view_helper.h" |
12 #include "headless/lib/renderer/headless_print_web_view_helper_delegate.h" | 15 #include "headless/lib/renderer/headless_print_web_view_helper_delegate.h" |
13 #endif | 16 #endif |
14 | 17 |
15 namespace headless { | 18 namespace headless { |
16 | 19 |
17 HeadlessContentRendererClient::HeadlessContentRendererClient() {} | 20 HeadlessContentRendererClient::HeadlessContentRendererClient() {} |
18 | 21 |
19 HeadlessContentRendererClient::~HeadlessContentRendererClient() {} | 22 HeadlessContentRendererClient::~HeadlessContentRendererClient() {} |
20 | 23 |
21 void HeadlessContentRendererClient::RenderFrameCreated( | 24 void HeadlessContentRendererClient::RenderFrameCreated( |
22 content::RenderFrame* render_frame) { | 25 content::RenderFrame* render_frame) { |
23 #if BUILDFLAG(ENABLE_BASIC_PRINTING) | 26 #if BUILDFLAG(ENABLE_BASIC_PRINTING) |
24 new printing::PrintWebViewHelper( | 27 new printing::PrintWebViewHelper( |
25 render_frame, base::MakeUnique<HeadlessPrintWebViewHelperDelegate>()); | 28 render_frame, base::MakeUnique<HeadlessPrintWebViewHelperDelegate>()); |
26 #endif | 29 #endif |
27 } | 30 } |
28 | 31 |
| 32 void HeadlessContentRendererClient::RunScriptsAtDocumentStart( |
| 33 content::RenderFrame* render_frame) { |
| 34 if (!(render_frame->GetEnabledBindings() & |
| 35 content::BindingsPolicy::BINDINGS_POLICY_HEADLESS)) { |
| 36 return; |
| 37 } |
| 38 |
| 39 render_frame->ExecuteJavaScript(base::UTF8ToUTF16(R"( |
| 40 (function() { |
| 41 let tabSocket = null; |
| 42 let messagesToSend = []; |
| 43 |
| 44 function getNextEmbedderMessage() { |
| 45 tabSocket.awaitNextMessageFromEmbedder().then( |
| 46 function(result) { |
| 47 window.TabSocket.onmessage(new CustomEvent( |
| 48 "onmessage", {detail : {message : result.message}})); |
| 49 getNextEmbedderMessage(); |
| 50 }); |
| 51 }; |
| 52 |
| 53 window.TabSocket = new Proxy( |
| 54 { |
| 55 send: function(message) { |
| 56 if (tabSocket) { |
| 57 tabSocket.sendMessageToEmbedder(message); |
| 58 } else { |
| 59 messagesToSend.push(message); |
| 60 } |
| 61 }, |
| 62 onmessage: null |
| 63 }, |
| 64 { |
| 65 set: function(target, prop, value, receiver) { |
| 66 if (prop !== "onmessage") |
| 67 return false; |
| 68 target[prop] = value; |
| 69 if (tabSocket) |
| 70 getNextEmbedderMessage(); |
| 71 return true; |
| 72 } |
| 73 }); |
| 74 |
| 75 // Note define() defines a module in the mojo module dependency |
| 76 // system. While we don't expose our module, the callback below only |
| 77 // fires after the requested modules have been loaded. |
| 78 define([ |
| 79 'headless/lib/tab_socket.mojom', |
| 80 'content/public/renderer/frame_interfaces', |
| 81 ], function(tabSocketMojom, frameInterfaces) { |
| 82 tabSocket = new tabSocketMojom.TabSocketPtr( |
| 83 frameInterfaces.getInterface(tabSocketMojom.TabSocket.name)); |
| 84 // Send any messages that may have been created before the dependency |
| 85 // was resolved. |
| 86 for (var i = 0; i < messagesToSend.length; i++) { |
| 87 tabSocket.sendMessageToEmbedder(messagesToSend[i]); |
| 88 } |
| 89 messagesToSend = []; |
| 90 if (window.TabSocket.onmessage) |
| 91 getNextEmbedderMessage(); |
| 92 }); |
| 93 |
| 94 })(); )")); |
| 95 } |
| 96 |
29 } // namespace headless | 97 } // namespace headless |
OLD | NEW |