Handle empty handles (#11598)
* Handle empty handles * Close and dispose window at end of void test * Dispose of existing window before running void 0 spec
This commit is contained in:
parent
181169b743
commit
9bd7d53cf8
3 changed files with 23 additions and 10 deletions
|
@ -340,7 +340,7 @@ WebContents::WebContents(v8::Isolate* isolate, const mate::Dictionary& options)
|
||||||
// Obtain the session.
|
// Obtain the session.
|
||||||
std::string partition;
|
std::string partition;
|
||||||
mate::Handle<api::Session> session;
|
mate::Handle<api::Session> session;
|
||||||
if (options.Get("session", &session)) {
|
if (options.Get("session", &session) && !session.IsEmpty()) {
|
||||||
} else if (options.Get("partition", &partition)) {
|
} else if (options.Get("partition", &partition)) {
|
||||||
session = Session::FromPartition(isolate, partition);
|
session = Session::FromPartition(isolate, partition);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -101,7 +101,7 @@ Window::Window(v8::Isolate* isolate, v8::Local<v8::Object> wrapper,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (options.Get("webContents", &web_contents)) {
|
if (options.Get("webContents", &web_contents) && !web_contents.IsEmpty()) {
|
||||||
// Set webPreferences from options if using an existing webContents.
|
// Set webPreferences from options if using an existing webContents.
|
||||||
// These preferences will be used when the webContent launches new
|
// These preferences will be used when the webContent launches new
|
||||||
// render processes.
|
// render processes.
|
||||||
|
@ -135,7 +135,7 @@ void Window::Init(v8::Isolate* isolate,
|
||||||
|
|
||||||
// The parent window.
|
// The parent window.
|
||||||
mate::Handle<Window> parent;
|
mate::Handle<Window> parent;
|
||||||
if (options.Get("parent", &parent))
|
if (options.Get("parent", &parent) && !parent.IsEmpty())
|
||||||
parent_window_.Reset(isolate, parent.ToV8());
|
parent_window_.Reset(isolate, parent.ToV8());
|
||||||
|
|
||||||
// Creates BrowserWindow.
|
// Creates BrowserWindow.
|
||||||
|
@ -149,7 +149,7 @@ void Window::Init(v8::Isolate* isolate,
|
||||||
#if defined(TOOLKIT_VIEWS)
|
#if defined(TOOLKIT_VIEWS)
|
||||||
// Sets the window icon.
|
// Sets the window icon.
|
||||||
mate::Handle<NativeImage> icon;
|
mate::Handle<NativeImage> icon;
|
||||||
if (options.Get(options::kIcon, &icon))
|
if (options.Get(options::kIcon, &icon) && !icon.IsEmpty())
|
||||||
SetIcon(icon);
|
SetIcon(icon);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -184,7 +184,7 @@ void Window::WillDestroyNativeObject() {
|
||||||
v8::HandleScope handle_scope(isolate());
|
v8::HandleScope handle_scope(isolate());
|
||||||
for (v8::Local<v8::Value> value : child_windows_.Values(isolate())) {
|
for (v8::Local<v8::Value> value : child_windows_.Values(isolate())) {
|
||||||
mate::Handle<Window> child;
|
mate::Handle<Window> child;
|
||||||
if (mate::ConvertFromV8(isolate(), value, &child))
|
if (mate::ConvertFromV8(isolate(), value, &child) && !child.IsEmpty())
|
||||||
child->window_->CloseImmediately();
|
child->window_->CloseImmediately();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -731,7 +731,7 @@ void Window::SetMenu(v8::Isolate* isolate, v8::Local<v8::Value> value) {
|
||||||
mate::Handle<Menu> menu;
|
mate::Handle<Menu> menu;
|
||||||
if (value->IsObject() &&
|
if (value->IsObject() &&
|
||||||
mate::V8ToString(value->ToObject()->GetConstructorName()) == "Menu" &&
|
mate::V8ToString(value->ToObject()->GetConstructorName()) == "Menu" &&
|
||||||
mate::ConvertFromV8(isolate, value, &menu)) {
|
mate::ConvertFromV8(isolate, value, &menu) && !menu.IsEmpty()) {
|
||||||
menu_.Reset(isolate, menu.ToV8());
|
menu_.Reset(isolate, menu.ToV8());
|
||||||
window_->SetMenu(menu->model());
|
window_->SetMenu(menu->model());
|
||||||
} else if (value->IsNull()) {
|
} else if (value->IsNull()) {
|
||||||
|
@ -851,7 +851,7 @@ void Window::SetParentWindow(v8::Local<v8::Value> value,
|
||||||
}
|
}
|
||||||
|
|
||||||
mate::Handle<Window> parent;
|
mate::Handle<Window> parent;
|
||||||
if (value->IsNull()) {
|
if (value->IsNull() || value->IsUndefined()) {
|
||||||
RemoveFromParentChildWindows();
|
RemoveFromParentChildWindows();
|
||||||
parent_window_.Reset();
|
parent_window_.Reset();
|
||||||
window_->SetParentWindow(nullptr);
|
window_->SetParentWindow(nullptr);
|
||||||
|
@ -887,7 +887,7 @@ void Window::SetBrowserView(v8::Local<v8::Value> value) {
|
||||||
ResetBrowserView();
|
ResetBrowserView();
|
||||||
|
|
||||||
mate::Handle<BrowserView> browser_view;
|
mate::Handle<BrowserView> browser_view;
|
||||||
if (value->IsNull()) {
|
if (value->IsNull() || value->IsUndefined()) {
|
||||||
window_->SetBrowserView(nullptr);
|
window_->SetBrowserView(nullptr);
|
||||||
} else if (mate::ConvertFromV8(isolate(), value, &browser_view)) {
|
} else if (mate::ConvertFromV8(isolate(), value, &browser_view)) {
|
||||||
window_->SetBrowserView(browser_view->view());
|
window_->SetBrowserView(browser_view->view());
|
||||||
|
@ -902,7 +902,8 @@ void Window::ResetBrowserView() {
|
||||||
}
|
}
|
||||||
|
|
||||||
mate::Handle<BrowserView> browser_view;
|
mate::Handle<BrowserView> browser_view;
|
||||||
if (mate::ConvertFromV8(isolate(), GetBrowserView(), &browser_view)) {
|
if (mate::ConvertFromV8(isolate(), GetBrowserView(), &browser_view)
|
||||||
|
&& !browser_view.IsEmpty()) {
|
||||||
browser_view->web_contents()->SetOwnerWindow(nullptr);
|
browser_view->web_contents()->SetOwnerWindow(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -991,8 +992,10 @@ void Window::RemoveFromParentChildWindows() {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mate::Handle<Window> parent;
|
mate::Handle<Window> parent;
|
||||||
if (!mate::ConvertFromV8(isolate(), GetParentWindow(), &parent))
|
if (!mate::ConvertFromV8(isolate(), GetParentWindow(), &parent)
|
||||||
|
|| parent.IsEmpty()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
parent->child_windows_.Remove(ID());
|
parent->child_windows_.Remove(ID());
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,6 +86,16 @@ describe('BrowserWindow module', () => {
|
||||||
return closeWindow(w).then(() => { w = null })
|
return closeWindow(w).then(() => { w = null })
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('BrowserWindow constructor', () => {
|
||||||
|
it('allows passing void 0 as the webContents', () => {
|
||||||
|
w.close()
|
||||||
|
w = null
|
||||||
|
w = new BrowserWindow({
|
||||||
|
webContents: void 0
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('BrowserWindow.close()', () => {
|
describe('BrowserWindow.close()', () => {
|
||||||
let server
|
let server
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue