From 2db0f7f8d44be93190323a94c4a1fc255251bfa5 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Mon, 5 Sep 2022 10:10:50 +0200 Subject: [PATCH] fix: `screen.getCursorScreenPoint()` crash on Wayland (#35503) fix: screen.getCursorScreenPoint() crash on Wayland --- shell/browser/api/electron_api_screen.cc | 17 ++++++++++++++++- shell/browser/api/electron_api_screen.h | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/shell/browser/api/electron_api_screen.cc b/shell/browser/api/electron_api_screen.cc index 53ae9f6b37..592d0017ae 100644 --- a/shell/browser/api/electron_api_screen.cc +++ b/shell/browser/api/electron_api_screen.cc @@ -24,6 +24,10 @@ #include "ui/display/win/screen_win.h" #endif +#if defined(USE_OZONE) +#include "ui/ozone/public/ozone_platform.h" +#endif + namespace electron::api { gin::WrapperInfo Screen::kWrapperInfo = {gin::kEmbedderNativeGin}; @@ -68,7 +72,18 @@ Screen::~Screen() { screen_->RemoveObserver(this); } -gfx::Point Screen::GetCursorScreenPoint() { +gfx::Point Screen::GetCursorScreenPoint(v8::Isolate* isolate) { +#if defined(USE_OZONE) + // Wayland will crash unless a window is created prior to calling + // GetCursorScreenPoint. + if (!ui::OzonePlatform::IsInitialized()) { + gin_helper::ErrorThrower thrower(isolate); + thrower.ThrowError( + "screen.getCursorScreenPoint() cannot be called before a window has " + "been created."); + return gfx::Point(); + } +#endif return screen_->GetCursorScreenPoint(); } diff --git a/shell/browser/api/electron_api_screen.h b/shell/browser/api/electron_api_screen.h index 67c8fa7226..ef203cd7b1 100644 --- a/shell/browser/api/electron_api_screen.h +++ b/shell/browser/api/electron_api_screen.h @@ -40,7 +40,7 @@ class Screen : public gin::Wrappable, Screen(v8::Isolate* isolate, display::Screen* screen); ~Screen() override; - gfx::Point GetCursorScreenPoint(); + gfx::Point GetCursorScreenPoint(v8::Isolate* isolate); display::Display GetPrimaryDisplay(); std::vector GetAllDisplays(); display::Display GetDisplayNearestPoint(const gfx::Point& point);