Index: headless/lib/browser/headless_web_contents_impl.cc |
diff --git a/headless/lib/browser/headless_web_contents_impl.cc b/headless/lib/browser/headless_web_contents_impl.cc |
index f58dfe0671c2b627794fc9b2540eb9624d134809..7902dd943941ef67a3f3d940b348ee9f06a48f63 100644 |
--- a/headless/lib/browser/headless_web_contents_impl.cc |
+++ b/headless/lib/browser/headless_web_contents_impl.cc |
@@ -19,6 +19,7 @@ |
#include "content/public/common/bindings_policy.h" |
#include "content/public/common/service_registry.h" |
#include "content/public/renderer/render_frame.h" |
+#include "headless/lib/browser/headless_browser_impl.h" |
#include "ui/aura/window.h" |
namespace headless { |
@@ -51,23 +52,55 @@ class WebContentsObserverAdapter : public content::WebContentsObserver { |
class HeadlessWebContentsImpl::Delegate : public content::WebContentsDelegate { |
public: |
- Delegate() {} |
+ explicit Delegate(HeadlessBrowserImpl* browser) : browser_(browser) {} |
+ |
+ void WebContentsCreated(content::WebContents* source_contents, |
+ int opener_render_frame_id, |
+ const std::string& frame_name, |
+ const GURL& target_url, |
+ content::WebContents* new_contents) override { |
+ browser_->RegisterWebContents( |
+ HeadlessWebContentsImpl::FromWebContents(new_contents, browser_)); |
+ } |
private: |
+ HeadlessBrowserImpl* browser_; // Not owned. |
DISALLOW_COPY_AND_ASSIGN(Delegate); |
}; |
-HeadlessWebContentsImpl::HeadlessWebContentsImpl( |
- content::BrowserContext* browser_context, |
+// static |
+std::unique_ptr<HeadlessWebContentsImpl> HeadlessWebContentsImpl::Create( |
+ content::BrowserContext* context, |
aura::Window* parent_window, |
- const gfx::Size& initial_size) |
- : web_contents_delegate_(new HeadlessWebContentsImpl::Delegate()) { |
- content::WebContents::CreateParams create_params(browser_context, nullptr); |
+ const gfx::Size& initial_size, |
+ HeadlessBrowserImpl* browser) { |
+ content::WebContents::CreateParams create_params(context, nullptr); |
create_params.initial_size = initial_size; |
- web_contents_.reset(content::WebContents::Create(create_params)); |
- web_contents_->SetDelegate(web_contents_delegate_.get()); |
+ std::unique_ptr<HeadlessWebContentsImpl> headless_web_contents = |
+ base::WrapUnique(new HeadlessWebContentsImpl( |
+ content::WebContents::Create(create_params), browser)); |
+ headless_web_contents->is_directly_created_ = true; |
+ |
+ headless_web_contents->InitializeScreen(parent_window, initial_size); |
+ |
+ return headless_web_contents; |
+} |
+ |
+// static |
+std::unique_ptr<HeadlessWebContentsImpl> |
+HeadlessWebContentsImpl::FromWebContents(content::WebContents* web_contents, |
+ HeadlessBrowserImpl* browser) { |
+ std::unique_ptr<HeadlessWebContentsImpl> headless_web_contents = |
+ base::WrapUnique(new HeadlessWebContentsImpl(web_contents, browser)); |
+ |
+ headless_web_contents->is_directly_created_ = false; |
+ |
+ return headless_web_contents; |
+} |
+void HeadlessWebContentsImpl::InitializeScreen(aura::Window* parent_window, |
+ const gfx::Size& initial_size) { |
aura::Window* contents = web_contents_->GetNativeView(); |
DCHECK(!parent_window->Contains(contents)); |
parent_window->AddChild(contents); |
@@ -80,6 +113,16 @@ HeadlessWebContentsImpl::HeadlessWebContentsImpl( |
host_view->SetSize(initial_size); |
} |
+HeadlessWebContentsImpl::HeadlessWebContentsImpl( |
+ content::WebContents* web_contents, |
+ HeadlessBrowserImpl* browser) |
+ : web_contents_delegate_(new HeadlessWebContentsImpl::Delegate(browser)), |
+ web_contents_(web_contents), |
+ is_directly_created_(false), |
+ browser_(browser) { |
+ web_contents_->SetDelegate(web_contents_delegate_.get()); |
+} |
+ |
HeadlessWebContentsImpl::~HeadlessWebContentsImpl() { |
web_contents_->Close(); |
} |
@@ -95,6 +138,14 @@ bool HeadlessWebContentsImpl::OpenURL(const GURL& url) { |
return true; |
} |
+bool HeadlessWebContentsImpl::IsDirectlyCreated() const { |
+ return is_directly_created_; |
+} |
+ |
+void HeadlessWebContentsImpl::Close() { |
+ browser_->DestroyWebContents(this); |
+} |
+ |
void HeadlessWebContentsImpl::AddObserver(Observer* observer) { |
DCHECK(observer_map_.find(observer) == observer_map_.end()); |
observer_map_[observer] = base::WrapUnique( |