Index: headless/lib/browser/headless_browser_impl.cc |
diff --git a/headless/lib/browser/headless_browser_impl.cc b/headless/lib/browser/headless_browser_impl.cc |
index a3eb1ba37406e9ec9a87b979cff65bb23781b0ed..f7f54d3de0c75e7a593b91c968c0b433682959cb 100644 |
--- a/headless/lib/browser/headless_browser_impl.cc |
+++ b/headless/lib/browser/headless_browser_impl.cc |
@@ -65,6 +65,14 @@ HeadlessBrowserImpl::CreateBrowserContextBuilder() { |
return HeadlessBrowserContext::Builder(this); |
} |
+void HeadlessBrowserImpl::AddObserver(Observer* observer) { |
+ observers_.insert(observer); |
+} |
+ |
+void HeadlessBrowserImpl::RemoveObserver(Observer* observer) { |
+ observers_.erase(observer); |
+} |
+ |
HeadlessWebContents* HeadlessBrowserImpl::CreateWebContents( |
HeadlessWebContents::Builder* builder) { |
DCHECK(BrowserMainThread()->BelongsToCurrentThread()); |
@@ -108,7 +116,7 @@ std::vector<HeadlessWebContents*> HeadlessBrowserImpl::GetAllWebContents() { |
result.reserve(web_contents_.size()); |
for (const auto& web_contents_pair : web_contents_) { |
- result.push_back(web_contents_pair.first); |
+ result.push_back(web_contents_pair.second.get()); |
} |
return result; |
@@ -142,17 +150,30 @@ void HeadlessBrowserImpl::RunOnStartCallback() { |
HeadlessWebContentsImpl* HeadlessBrowserImpl::RegisterWebContents( |
std::unique_ptr<HeadlessWebContentsImpl> web_contents) { |
+ DCHECK(BrowserMainThread()->BelongsToCurrentThread()); |
DCHECK(web_contents); |
HeadlessWebContentsImpl* unowned_web_contents = web_contents.get(); |
web_contents_[unowned_web_contents] = std::move(web_contents); |
+ for (auto it = observers_.begin(); it != observers_.end();) { |
+ // Pre-increment it because the observer may unregister itself. |
+ Observer* observer = *it++; |
+ observer->HeadlessWebContentsCreated(unowned_web_contents); |
+ } |
return unowned_web_contents; |
} |
void HeadlessBrowserImpl::DestroyWebContents( |
HeadlessWebContentsImpl* web_contents) { |
- auto it = web_contents_.find(web_contents); |
- DCHECK(it != web_contents_.end()); |
- web_contents_.erase(it); |
+ DCHECK(BrowserMainThread()->BelongsToCurrentThread()); |
+ auto find_it = web_contents_.find(web_contents); |
+ DCHECK(find_it != web_contents_.end()); |
+ HeadlessWebContents* headless_web_contents = find_it->second.get(); |
+ web_contents_.erase(find_it); |
+ for (auto it = observers_.begin(); it != observers_.end();) { |
+ // Pre-increment it because the observer may unregister itself. |
+ Observer* observer = *it++; |
+ observer->HeadlessWebContentsDestroyed(headless_web_contents); |
+ } |
} |
void HeadlessBrowserImpl::SetOptionsForTesting( |