From 895ccf69a7fb3ab3601bbb394a0d3ffcf20ba66b Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 4 Jan 2015 22:45:51 -0800 Subject: [PATCH] Avoid using app API in renderer process for #907 --- atom/common/api/atom_api_screen.cc | 34 ++++++------------------------ atom/common/api/lib/screen.coffee | 13 +++++++++++- 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/atom/common/api/atom_api_screen.cc b/atom/common/api/atom_api_screen.cc index 1ea0e1d971..0a6e6bac4c 100644 --- a/atom/common/api/atom_api_screen.cc +++ b/atom/common/api/atom_api_screen.cc @@ -2,41 +2,21 @@ // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. -#include "atom/browser/browser.h" #include "atom/common/native_mate_converters/gfx_converter.h" #include "atom/common/node_includes.h" namespace { -const char* kRequireAppReadyMessage = - "APIs of \"screen\" module can only be used after the \"ready\" event of " - "\"app\" module gets emitted."; - -gfx::Point GetCursorScreenPoint(mate::Arguments* args) { - if (!atom::Browser::Get()->is_ready()) { - args->ThrowError(kRequireAppReadyMessage); - return gfx::Point(); - } - - gfx::Screen* screen = gfx::Screen::GetNativeScreen(); - return screen->GetCursorScreenPoint(); -} - -gfx::Display GetPrimaryDisplay(mate::Arguments* args) { - if (!atom::Browser::Get()->is_ready()) { - args->ThrowError(kRequireAppReadyMessage); - return gfx::Display(); - } - - gfx::Screen* screen = gfx::Screen::GetNativeScreen(); - return screen->GetPrimaryDisplay(); -} - void Initialize(v8::Handle exports, v8::Handle unused, v8::Handle context, void* priv) { + gfx::Screen* screen = gfx::Screen::GetNativeScreen(); mate::Dictionary dict(context->GetIsolate(), exports); - dict.SetMethod("getCursorScreenPoint", &GetCursorScreenPoint); - dict.SetMethod("getPrimaryDisplay", &GetPrimaryDisplay); + dict.SetMethod("getCursorScreenPoint", + base::Bind(&gfx::Screen::GetCursorScreenPoint, + base::Unretained(screen))); + dict.SetMethod("getPrimaryDisplay", + base::Bind(&gfx::Screen::GetPrimaryDisplay, + base::Unretained(screen))); } } // namespace diff --git a/atom/common/api/lib/screen.coffee b/atom/common/api/lib/screen.coffee index da7701e55a..e2913fcb8a 100644 --- a/atom/common/api/lib/screen.coffee +++ b/atom/common/api/lib/screen.coffee @@ -1,6 +1,17 @@ +binding = process.atomBinding 'screen' + +checkAppIsReady = -> + unless process.type is 'renderer' or require('app').isReady() + throw new Error('Can not use screen module before the "ready" event of app module gets emitted') + module.exports = if process.platform in ['linux', 'win32'] and process.type is 'renderer' # On Linux we could not access screen in renderer process. require('remote').require 'screen' else - process.atomBinding 'screen' + getCursorScreenPoint: -> + checkAppIsReady() + binding.getCursorScreenPoint() + getPrimaryDisplay: -> + checkAppIsReady() + binding.getPrimaryDisplay()