Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Side by Side Diff: headless/lib/browser/headless_web_contents_impl.cc

Issue 2049363003: Adds support for headless chrome embedder mojo services (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Abandon (for now) the concice bindings. Add BINDINGS_POLICY_HEADLESS and headless-mojo:// Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/browser/headless_web_contents_impl.h" 5 #include "headless/lib/browser/headless_web_contents_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/json/json_writer.h"
8 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
9 #include "base/memory/weak_ptr.h" 10 #include "base/memory/weak_ptr.h"
11 #include "base/strings/utf_string_conversions.h"
10 #include "base/trace_event/trace_event.h" 12 #include "base/trace_event/trace_event.h"
11 #include "content/public/browser/devtools_agent_host.h" 13 #include "content/public/browser/devtools_agent_host.h"
12 #include "content/public/browser/navigation_handle.h" 14 #include "content/public/browser/navigation_handle.h"
13 #include "content/public/browser/render_frame_host.h" 15 #include "content/public/browser/render_frame_host.h"
14 #include "content/public/browser/render_process_host.h" 16 #include "content/public/browser/render_process_host.h"
15 #include "content/public/browser/render_view_host.h" 17 #include "content/public/browser/render_view_host.h"
16 #include "content/public/browser/render_widget_host_view.h" 18 #include "content/public/browser/render_widget_host_view.h"
17 #include "content/public/browser/web_contents.h" 19 #include "content/public/browser/web_contents.h"
18 #include "content/public/browser/web_contents_delegate.h" 20 #include "content/public/browser/web_contents_delegate.h"
19 #include "content/public/browser/web_contents_observer.h"
20 #include "content/public/common/bindings_policy.h" 21 #include "content/public/common/bindings_policy.h"
21 #include "content/public/common/service_registry.h"
22 #include "content/public/renderer/render_frame.h" 22 #include "content/public/renderer/render_frame.h"
23 #include "headless/lib/browser/headless_browser_context_impl.h" 23 #include "headless/lib/browser/headless_browser_context_impl.h"
24 #include "headless/lib/browser/headless_browser_impl.h" 24 #include "headless/lib/browser/headless_browser_impl.h"
25 #include "headless/lib/browser/headless_browser_main_parts.h" 25 #include "headless/lib/browser/headless_browser_main_parts.h"
26 #include "headless/lib/browser/headless_devtools_client_impl.h" 26 #include "headless/lib/browser/headless_devtools_client_impl.h"
27 #include "services/shell/public/cpp/interface_registry.h"
27 #include "ui/aura/window.h" 28 #include "ui/aura/window.h"
28 29
29 namespace headless { 30 namespace headless {
30 31
31 class WebContentsObserverAdapter : public content::WebContentsObserver { 32 class WebContentsObserverAdapter : public content::WebContentsObserver {
32 public: 33 public:
33 WebContentsObserverAdapter(content::WebContents* web_contents, 34 WebContentsObserverAdapter(content::WebContents* web_contents,
34 HeadlessWebContents::Observer* observer) 35 HeadlessWebContents::Observer* observer)
35 : content::WebContentsObserver(web_contents), observer_(observer) {} 36 : content::WebContentsObserver(web_contents), observer_(observer) {}
36 37
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 HeadlessBrowserImpl* browser) { 73 HeadlessBrowserImpl* browser) {
73 content::BrowserContext* context = 74 content::BrowserContext* context =
74 HeadlessBrowserContextImpl::From(builder->browser_context_); 75 HeadlessBrowserContextImpl::From(builder->browser_context_);
75 content::WebContents::CreateParams create_params(context, nullptr); 76 content::WebContents::CreateParams create_params(context, nullptr);
76 create_params.initial_size = builder->window_size_; 77 create_params.initial_size = builder->window_size_;
77 78
78 std::unique_ptr<HeadlessWebContentsImpl> headless_web_contents = 79 std::unique_ptr<HeadlessWebContentsImpl> headless_web_contents =
79 base::WrapUnique(new HeadlessWebContentsImpl( 80 base::WrapUnique(new HeadlessWebContentsImpl(
80 content::WebContents::Create(create_params), browser)); 81 content::WebContents::Create(create_params), browser));
81 82
83 headless_web_contents->mojo_services_ = std::move(builder->mojo_services_);
82 headless_web_contents->InitializeScreen(parent_window, builder->window_size_); 84 headless_web_contents->InitializeScreen(parent_window, builder->window_size_);
83 if (!headless_web_contents->OpenURL(builder->initial_url_)) 85 if (!headless_web_contents->OpenURL(builder->initial_url_))
84 return nullptr; 86 return nullptr;
85 return headless_web_contents; 87 return headless_web_contents;
86 } 88 }
87 89
88 // static 90 // static
89 std::unique_ptr<HeadlessWebContentsImpl> 91 std::unique_ptr<HeadlessWebContentsImpl>
90 HeadlessWebContentsImpl::CreateFromWebContents( 92 HeadlessWebContentsImpl::CreateFromWebContents(
91 content::WebContents* web_contents, 93 content::WebContents* web_contents,
(...skipping 14 matching lines...) Expand all
106 contents->SetBounds(gfx::Rect(initial_size)); 108 contents->SetBounds(gfx::Rect(initial_size));
107 content::RenderWidgetHostView* host_view = 109 content::RenderWidgetHostView* host_view =
108 web_contents_->GetRenderWidgetHostView(); 110 web_contents_->GetRenderWidgetHostView();
109 if (host_view) 111 if (host_view)
110 host_view->SetSize(initial_size); 112 host_view->SetSize(initial_size);
111 } 113 }
112 114
113 HeadlessWebContentsImpl::HeadlessWebContentsImpl( 115 HeadlessWebContentsImpl::HeadlessWebContentsImpl(
114 content::WebContents* web_contents, 116 content::WebContents* web_contents,
115 HeadlessBrowserImpl* browser) 117 HeadlessBrowserImpl* browser)
116 : web_contents_delegate_(new HeadlessWebContentsImpl::Delegate(browser)), 118 : content::WebContentsObserver(web_contents),
119 web_contents_delegate_(new HeadlessWebContentsImpl::Delegate(browser)),
117 web_contents_(web_contents), 120 web_contents_(web_contents),
118 browser_(browser) { 121 browser_(browser) {
119 web_contents_->SetDelegate(web_contents_delegate_.get()); 122 web_contents_->SetDelegate(web_contents_delegate_.get());
120 } 123 }
121 124
122 HeadlessWebContentsImpl::~HeadlessWebContentsImpl() { 125 HeadlessWebContentsImpl::~HeadlessWebContentsImpl() {
123 web_contents_->Close(); 126 web_contents_->Close();
124 } 127 }
125 128
129 void HeadlessWebContentsImpl::RenderFrameCreated(
130 content::RenderFrameHost* render_frame_host) {
131 if (!mojo_services_.empty()) {
132 render_frame_host->GetRenderViewHost()->AllowBindings(
133 content::BINDINGS_POLICY_HEADLESS);
134 }
135
136 shell::InterfaceRegistry* interface_registry =
137 render_frame_host->GetInterfaceRegistry();
138
139 for (const MojoService& service : mojo_services_) {
140 interface_registry->AddInterface(service.service_name,
141 service.service_factory,
142 browser_->BrowserMainThread());
143 }
144 }
145
126 bool HeadlessWebContentsImpl::OpenURL(const GURL& url) { 146 bool HeadlessWebContentsImpl::OpenURL(const GURL& url) {
127 if (!url.is_valid()) 147 if (!url.is_valid())
128 return false; 148 return false;
129 content::NavigationController::LoadURLParams params(url); 149 content::NavigationController::LoadURLParams params(url);
130 params.transition_type = ui::PageTransitionFromInt( 150 params.transition_type = ui::PageTransitionFromInt(
131 ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR); 151 ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
132 web_contents_->GetController().LoadURLWithParams(params); 152 web_contents_->GetController().LoadURLWithParams(params);
133 web_contents_->Focus(); 153 web_contents_->Focus();
134 return true; 154 return true;
135 } 155 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 window_size_ = size; 209 window_size_ = size;
190 return *this; 210 return *this;
191 } 211 }
192 212
193 HeadlessWebContents::Builder& HeadlessWebContents::Builder::SetBrowserContext( 213 HeadlessWebContents::Builder& HeadlessWebContents::Builder::SetBrowserContext(
194 HeadlessBrowserContext* browser_context) { 214 HeadlessBrowserContext* browser_context) {
195 browser_context_ = browser_context; 215 browser_context_ = browser_context;
196 return *this; 216 return *this;
197 } 217 }
198 218
219 HeadlessWebContents::Builder& HeadlessWebContents::Builder::AddMojoService(
220 const std::string& service_name,
221 const base::Callback<void(mojo::ScopedMessagePipeHandle)>&
222 service_factory) {
223 mojo_services_.emplace_back(service_name, service_factory);
224 return *this;
225 }
226
199 HeadlessWebContents* HeadlessWebContents::Builder::Build() { 227 HeadlessWebContents* HeadlessWebContents::Builder::Build() {
200 return browser_->CreateWebContents(this); 228 return browser_->CreateWebContents(this);
201 } 229 }
202 230
231 HeadlessWebContents::Builder::MojoService::MojoService() {}
232
233 HeadlessWebContents::Builder::MojoService::MojoService(
234 const std::string& service_name,
235 const base::Callback<void(mojo::ScopedMessagePipeHandle)>& service_factory)
236 : service_name(service_name), service_factory(service_factory) {}
237
238 HeadlessWebContents::Builder::MojoService::~MojoService() {}
239
203 } // namespace headless 240 } // namespace headless
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698