Report deprecated BrowserWindow options
authorKevin Sawicki <kevinsawicki@gmail.com>
Wed, 16 Mar 2016 16:38:03 +0000 (09:38 -0700)
committerKevin Sawicki <kevinsawicki@gmail.com>
Thu, 17 Mar 2016 20:37:07 +0000 (13:37 -0700)
atom/browser/api/atom_api_window.cc
lib/browser/api/browser-window.js

index 6c0f0f6f762aaeb28280cd5754210eb88380f5c4..87f6411e66588e53c344c0417c46a64c1ac30c8d 100644 (file)
@@ -52,6 +52,11 @@ namespace api {
 
 namespace {
 
+// The DeprecatedOptionsCheckCallback funtion which is implemented in JavaScript
+using DeprecatedOptionsCheckCallback =
+    base::Callback<std::string(v8::Local<v8::Value>)>;
+DeprecatedOptionsCheckCallback g_deprecated_options_check;
+
 void OnCapturePageDone(
     v8::Isolate* isolate,
     const base::Callback<void(const gfx::Image&)>& callback,
@@ -291,6 +296,13 @@ mate::Wrappable* Window::New(v8::Isolate* isolate, mate::Arguments* args) {
     options = mate::Dictionary::CreateEmpty(isolate);
   }
 
+  std::string deprecation_message = g_deprecated_options_check.Run(
+      options.GetHandle());
+  if (deprecation_message.length() > 0) {
+    args->ThrowError(deprecation_message);
+    return nullptr;
+  }
+
   return new Window(isolate, options);
 }
 
@@ -797,6 +809,10 @@ v8::Local<v8::Value> Window::From(v8::Isolate* isolate,
     return v8::Null(isolate);
 }
 
+void SetDeprecatedOptionsCheck(const DeprecatedOptionsCheckCallback& callback) {
+  g_deprecated_options_check = callback;
+}
+
 }  // namespace api
 
 }  // namespace atom
@@ -816,6 +832,9 @@ void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
                            &mate::TrackableObject<Window>::FromWeakMapID);
   browser_window.SetMethod("getAllWindows",
                            &mate::TrackableObject<Window>::GetAll);
+  browser_window.SetMethod("_setDeprecatedOptionsCheck",
+                           &atom::api::SetDeprecatedOptionsCheck);
+
 
   mate::Dictionary dict(isolate, exports);
   dict.Set("BrowserWindow", browser_window);
index 7e2a8d38c31f4738f72ee4fd3681c038ffd86e64..9645f855eed1ea76f96e8730acd485b025527fa3 100644 (file)
@@ -8,7 +8,6 @@ const BrowserWindow = process.atomBinding('window').BrowserWindow;
 BrowserWindow.prototype.__proto__ = EventEmitter.prototype;
 
 BrowserWindow.prototype._init = function() {
-
   // avoid recursive require.
   var app, menu;
   app = require('electron').app;
@@ -240,4 +239,56 @@ BrowserWindow.prototype.getPageTitle = deprecate('getPageTitle', 'webContents.ge
   return (ref1 = this.webContents) != null ? ref1.getTitle() : void 0;
 });
 
+const isDeprecatedKey = function(key) {
+  return key.indexOf('-') >= 0;
+};
+
+// Map deprecated key with hyphens to camel case key
+const getNonDeprecatedKey = function(deprecatedKey) {
+  return deprecatedKey.replace(/-./g, function(match) {
+    return match[1].toUpperCase();
+  });
+};
+
+// TODO Remove for 1.0
+const checkForDeprecatedOptions = function(options) {
+  if (!options) return '';
+
+  let keysToCheck = Object.keys(options);
+  if (options.webPreferences) {
+    keysToCheck = keysToCheck.concat(Object.keys(options.webPreferences));
+  }
+
+  // Check options for keys with hypens in them
+  let deprecatedKey = keysToCheck.filter(isDeprecatedKey)[0];
+  if (deprecatedKey) {
+    try {
+      deprecate.warn(deprecatedKey, getNonDeprecatedKey(deprecatedKey));
+    } catch (error) {
+      // Return error message so it can be rethrown via C++
+      return error.message;
+    }
+  }
+
+  let webPreferenceOption;
+  if (options.hasOwnProperty('nodeIntegration')) {
+    webPreferenceOption = 'nodeIntegration';
+  } else if (options.hasOwnProperty('preload')) {
+    webPreferenceOption = 'preload';
+  } else if (options.hasOwnProperty('zoomFactor')) {
+    webPreferenceOption = 'zoomFactor';
+  }
+  if (webPreferenceOption) {
+    try {
+      deprecate.log(`Setting ${webPreferenceOption} on options is deprecated. Set it on options.webPreferences instead.`);
+    } catch (error) {
+      // Return error message so it can be rethrown via C++
+      return error.message;
+    }
+  }
+
+  return '';
+};
+BrowserWindow._setDeprecatedOptionsCheck(checkForDeprecatedOptions);
+
 module.exports = BrowserWindow;