throw an error for out of bounds window levels
authorleethomas <leet944@gmail.com>
Wed, 25 Jan 2017 04:08:08 +0000 (20:08 -0800)
committerleethomas <leet944@gmail.com>
Wed, 25 Jan 2017 04:14:09 +0000 (20:14 -0800)
atom/browser/api/atom_api_window.cc
atom/browser/native_window.h
atom/browser/native_window_mac.h
atom/browser/native_window_mac.mm
atom/browser/native_window_views.cc
atom/browser/native_window_views.h

index 44126cf..2f97a88 100644 (file)
@@ -513,9 +513,16 @@ bool Window::IsClosable() {
 void Window::SetAlwaysOnTop(bool top, mate::Arguments* args) {
   std::string level = "floating";
   int relativeLevel = 0;
+  std::string error;
+
   args->GetNext(&level);
   args->GetNext(&relativeLevel);
-  window_->SetAlwaysOnTop(top, level, relativeLevel);
+
+  window_->SetAlwaysOnTop(top, level, relativeLevel, &error);
+
+  if (!error.empty()) {
+    args->ThrowError(error);
+  }
 }
 
 bool Window::IsAlwaysOnTop() {
index 05c06df..6f2d525 100644 (file)
@@ -120,7 +120,8 @@ class NativeWindow : public base::SupportsUserData,
   virtual bool IsClosable() = 0;
   virtual void SetAlwaysOnTop(bool top,
                               const std::string& level = "floating",
-                              int relativeLevel = 0) = 0;
+                              int relativeLevel = 0,
+                              std::string* error = nullptr) = 0;
   virtual bool IsAlwaysOnTop() = 0;
   virtual void Center() = 0;
   virtual void SetTitle(const std::string& title) = 0;
index 37786be..1860512 100644 (file)
@@ -68,7 +68,7 @@ class NativeWindowMac : public NativeWindow,
   void SetClosable(bool closable) override;
   bool IsClosable() override;
   void SetAlwaysOnTop(bool top, const std::string& level,
-                      int relativeLevel) override;
+                      int relativeLevel, std::string* error) override;
   bool IsAlwaysOnTop() override;
   void Center() override;
   void SetTitle(const std::string& title) override;
index 6962611..589accf 100644 (file)
@@ -1056,8 +1056,10 @@ bool NativeWindowMac::IsClosable() {
   return [window_ styleMask] & NSClosableWindowMask;
 }
 
-void NativeWindowMac::SetAlwaysOnTop(bool top, const std::string& level, int relativeLevel) {
+void NativeWindowMac::SetAlwaysOnTop(bool top, const std::string& level, int relativeLevel,
+                                     std::string* error) {
   int windowLevel = NSNormalWindowLevel;
+  CGWindowLevel maxWindowLevel = CGWindowLevelForKey(kCGMaximumWindowLevelKey);
   
   if (top) {
     if (level == "floating") {
@@ -1081,10 +1083,12 @@ void NativeWindowMac::SetAlwaysOnTop(bool top, const std::string& level, int rel
   }
 
   NSInteger newLevel = windowLevel + relativeLevel;
-  if (newLevel >= 0 && newLevel < CGWindowLevelForKey(kCGMaximumWindowLevelKey)) {
+  
+  if (newLevel >= 0 && newLevel <= maxWindowLevel) {
     [window_ setLevel:newLevel];
   } else {
-    [window_ setLevel:windowLevel];
+    *error = std::string([[NSString stringWithFormat:
+      @"relativeLevel must be between 0 and %d", maxWindowLevel] UTF8String]);
   }
 }
 
index e13608f..16a10b3 100644 (file)
@@ -683,7 +683,7 @@ bool NativeWindowViews::IsClosable() {
 }
 
 void NativeWindowViews::SetAlwaysOnTop(bool top, const std::string& level,
-                                       int relativeLevel) {
+                                       int relativeLevel, std::string* error) {
   window_->SetAlwaysOnTop(top);
 }
 
index f70904b..a6a43b3 100644 (file)
@@ -87,7 +87,7 @@ class NativeWindowViews : public NativeWindow,
   void SetClosable(bool closable) override;
   bool IsClosable() override;
   void SetAlwaysOnTop(bool top, const std::string& level,
-                      int relativeLevel) override;
+                      int relativeLevel, std::string& error) override;
   bool IsAlwaysOnTop() override;
   void Center() override;
   void SetTitle(const std::string& title) override;