|
@@ -753,61 +753,52 @@ void BaseWindow::SetParentWindow(v8::Local<v8::Value> value,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void BaseWindow::SetBrowserView(v8::Local<v8::Value> value) {
|
|
|
+void BaseWindow::SetBrowserView(
|
|
|
+ absl::optional<gin::Handle<BrowserView>> browser_view) {
|
|
|
ResetBrowserViews();
|
|
|
- AddBrowserView(value);
|
|
|
-}
|
|
|
-
|
|
|
-void BaseWindow::AddBrowserView(v8::Local<v8::Value> value) {
|
|
|
- gin::Handle<BrowserView> browser_view;
|
|
|
- if (value->IsObject() &&
|
|
|
- gin::ConvertFromV8(isolate(), value, &browser_view)) {
|
|
|
- auto get_that_view = browser_views_.find(browser_view->ID());
|
|
|
- if (get_that_view == browser_views_.end()) {
|
|
|
- // If we're reparenting a BrowserView, ensure that it's detached from
|
|
|
- // its previous owner window.
|
|
|
- auto* owner_window = browser_view->owner_window();
|
|
|
- if (owner_window && owner_window != window_.get()) {
|
|
|
- owner_window->RemoveBrowserView(browser_view->view());
|
|
|
- browser_view->SetOwnerWindow(nullptr);
|
|
|
- }
|
|
|
-
|
|
|
- window_->AddBrowserView(browser_view->view());
|
|
|
- browser_view->SetOwnerWindow(window_.get());
|
|
|
- browser_views_[browser_view->ID()].Reset(isolate(), value);
|
|
|
+ if (browser_view)
|
|
|
+ AddBrowserView(*browser_view);
|
|
|
+}
|
|
|
+
|
|
|
+void BaseWindow::AddBrowserView(gin::Handle<BrowserView> browser_view) {
|
|
|
+ auto iter = browser_views_.find(browser_view->ID());
|
|
|
+ if (iter == browser_views_.end()) {
|
|
|
+ // If we're reparenting a BrowserView, ensure that it's detached from
|
|
|
+ // its previous owner window.
|
|
|
+ BaseWindow* owner_window = browser_view->owner_window();
|
|
|
+ if (owner_window) {
|
|
|
+ // iter == browser_views_.end() should imply owner_window != this.
|
|
|
+ DCHECK_NE(owner_window, this);
|
|
|
+ owner_window->RemoveBrowserView(browser_view);
|
|
|
+ browser_view->SetOwnerWindow(nullptr);
|
|
|
}
|
|
|
+
|
|
|
+ window_->AddBrowserView(browser_view->view());
|
|
|
+ browser_view->SetOwnerWindow(this);
|
|
|
+ browser_views_[browser_view->ID()].Reset(isolate(), browser_view.ToV8());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void BaseWindow::RemoveBrowserView(v8::Local<v8::Value> value) {
|
|
|
- gin::Handle<BrowserView> browser_view;
|
|
|
- if (value->IsObject() &&
|
|
|
- gin::ConvertFromV8(isolate(), value, &browser_view)) {
|
|
|
- auto get_that_view = browser_views_.find(browser_view->ID());
|
|
|
- if (get_that_view != browser_views_.end()) {
|
|
|
- window_->RemoveBrowserView(browser_view->view());
|
|
|
- browser_view->SetOwnerWindow(nullptr);
|
|
|
- (*get_that_view).second.Reset(isolate(), value);
|
|
|
- browser_views_.erase(get_that_view);
|
|
|
- }
|
|
|
+void BaseWindow::RemoveBrowserView(gin::Handle<BrowserView> browser_view) {
|
|
|
+ auto iter = browser_views_.find(browser_view->ID());
|
|
|
+ if (iter != browser_views_.end()) {
|
|
|
+ window_->RemoveBrowserView(browser_view->view());
|
|
|
+ browser_view->SetOwnerWindow(nullptr);
|
|
|
+ iter->second.Reset();
|
|
|
+ browser_views_.erase(iter);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void BaseWindow::SetTopBrowserView(v8::Local<v8::Value> value,
|
|
|
+void BaseWindow::SetTopBrowserView(gin::Handle<BrowserView> browser_view,
|
|
|
gin_helper::Arguments* args) {
|
|
|
- gin::Handle<BrowserView> browser_view;
|
|
|
- if (value->IsObject() &&
|
|
|
- gin::ConvertFromV8(isolate(), value, &browser_view)) {
|
|
|
- auto* owner_window = browser_view->owner_window();
|
|
|
- auto get_that_view = browser_views_.find(browser_view->ID());
|
|
|
- if (get_that_view == browser_views_.end() ||
|
|
|
- (owner_window && owner_window != window_.get())) {
|
|
|
- args->ThrowError("Given BrowserView is not attached to the window");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- window_->SetTopBrowserView(browser_view->view());
|
|
|
+ BaseWindow* owner_window = browser_view->owner_window();
|
|
|
+ auto iter = browser_views_.find(browser_view->ID());
|
|
|
+ if (iter == browser_views_.end() || (owner_window && owner_window != this)) {
|
|
|
+ args->ThrowError("Given BrowserView is not attached to the window");
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ window_->SetTopBrowserView(browser_view->view());
|
|
|
}
|
|
|
|
|
|
std::string BaseWindow::GetMediaSourceId() const {
|
|
@@ -1127,11 +1118,11 @@ void BaseWindow::ResetBrowserViews() {
|
|
|
!browser_view.IsEmpty()) {
|
|
|
// There's a chance that the BrowserView may have been reparented - only
|
|
|
// reset if the owner window is *this* window.
|
|
|
- auto* owner_window = browser_view->owner_window();
|
|
|
- if (owner_window && owner_window == window_.get()) {
|
|
|
- browser_view->SetOwnerWindow(nullptr);
|
|
|
- owner_window->RemoveBrowserView(browser_view->view());
|
|
|
- }
|
|
|
+ BaseWindow* owner_window = browser_view->owner_window();
|
|
|
+ DCHECK_EQ(owner_window, this);
|
|
|
+ browser_view->SetOwnerWindow(nullptr);
|
|
|
+ window_->RemoveBrowserView(browser_view->view());
|
|
|
+ browser_view->SetOwnerWindow(nullptr);
|
|
|
}
|
|
|
|
|
|
item.second.Reset();
|