From 74321dce74259d18163cbbb318aec431bf05c5a1 Mon Sep 17 00:00:00 2001 From: Charlie Hess Date: Mon, 20 Jun 2016 17:48:42 -0700 Subject: [PATCH 001/516] Add systemPreferences.subscribeLocalNotification. (#6150) --- .../api/atom_api_system_preferences.cc | 4 ++ .../browser/api/atom_api_system_preferences.h | 18 ++++-- .../api/atom_api_system_preferences_mac.mm | 61 +++++++++++++------ docs/api/system-preferences.md | 11 ++++ 4 files changed, 71 insertions(+), 23 deletions(-) diff --git a/atom/browser/api/atom_api_system_preferences.cc b/atom/browser/api/atom_api_system_preferences.cc index 2b11aad252..c3421365f0 100644 --- a/atom/browser/api/atom_api_system_preferences.cc +++ b/atom/browser/api/atom_api_system_preferences.cc @@ -53,6 +53,10 @@ void SystemPreferences::BuildPrototype( &SystemPreferences::SubscribeNotification) .SetMethod("unsubscribeNotification", &SystemPreferences::UnsubscribeNotification) + .SetMethod("subscribeLocalNotification", + &SystemPreferences::SubscribeLocalNotification) + .SetMethod("unsubscribeLocalNotification", + &SystemPreferences::UnsubscribeLocalNotification) .SetMethod("getUserDefault", &SystemPreferences::GetUserDefault) #endif .SetMethod("isDarkMode", &SystemPreferences::IsDarkMode); diff --git a/atom/browser/api/atom_api_system_preferences.h b/atom/browser/api/atom_api_system_preferences.h index 7779ce0078..9a5cf99035 100644 --- a/atom/browser/api/atom_api_system_preferences.h +++ b/atom/browser/api/atom_api_system_preferences.h @@ -26,17 +26,18 @@ class SystemPreferences : public mate::EventEmitter { static void BuildPrototype(v8::Isolate* isolate, v8::Local prototype); -#if defined(OS_MACOSX) - using NotificationCallback = base::Callback< - void(const std::string&, const base::DictionaryValue&)>; -#endif - #if defined(OS_WIN) bool IsAeroGlassEnabled(); #elif defined(OS_MACOSX) + using NotificationCallback = base::Callback< + void(const std::string&, const base::DictionaryValue&)>; + int SubscribeNotification(const std::string& name, const NotificationCallback& callback); void UnsubscribeNotification(int id); + int SubscribeLocalNotification(const std::string& name, + const NotificationCallback& callback); + void UnsubscribeLocalNotification(int request_id); v8::Local GetUserDefault(const std::string& name, const std::string& type); #endif @@ -46,6 +47,13 @@ class SystemPreferences : public mate::EventEmitter { explicit SystemPreferences(v8::Isolate* isolate); ~SystemPreferences() override; +#if defined(OS_MACOSX) + int DoSubscribeNotification(const std::string& name, + const NotificationCallback& callback, + bool is_local); + void DoUnsubscribeNotification(int request_id, bool is_local); +#endif + private: DISALLOW_COPY_AND_ASSIGN(SystemPreferences); }; diff --git a/atom/browser/api/atom_api_system_preferences_mac.mm b/atom/browser/api/atom_api_system_preferences_mac.mm index 72011500bd..6f7055ab91 100644 --- a/atom/browser/api/atom_api_system_preferences_mac.mm +++ b/atom/browser/api/atom_api_system_preferences_mac.mm @@ -30,34 +30,59 @@ std::map g_id_map; int SystemPreferences::SubscribeNotification( const std::string& name, const NotificationCallback& callback) { + return DoSubscribeNotification(name, callback, false); +} + +void SystemPreferences::UnsubscribeNotification(int request_id) { + DoUnsubscribeNotification(request_id, false); +} + +int SystemPreferences::SubscribeLocalNotification( + const std::string& name, const NotificationCallback& callback) { + return DoSubscribeNotification(name, callback, true); +} + +void SystemPreferences::UnsubscribeLocalNotification(int request_id) { + DoUnsubscribeNotification(request_id, true); +} + +int SystemPreferences::DoSubscribeNotification(const std::string& name, + const NotificationCallback& callback, bool is_local) { int request_id = g_next_id++; __block NotificationCallback copied_callback = callback; - g_id_map[request_id] = [[NSDistributedNotificationCenter defaultCenter] - addObserverForName:base::SysUTF8ToNSString(name) - object:nil - queue:nil - usingBlock:^(NSNotification* notification) { - std::unique_ptr user_info = - NSDictionaryToDictionaryValue(notification.userInfo); - if (user_info) { - copied_callback.Run( - base::SysNSStringToUTF8(notification.name), - *user_info); - } else { - copied_callback.Run( - base::SysNSStringToUTF8(notification.name), - base::DictionaryValue()); - } + NSNotificationCenter* center = is_local ? + [NSNotificationCenter defaultCenter] : + [NSDistributedNotificationCenter defaultCenter]; + + g_id_map[request_id] = [center + addObserverForName:base::SysUTF8ToNSString(name) + object:nil + queue:nil + usingBlock:^(NSNotification* notification) { + std::unique_ptr user_info = + NSDictionaryToDictionaryValue(notification.userInfo); + if (user_info) { + copied_callback.Run( + base::SysNSStringToUTF8(notification.name), + *user_info); + } else { + copied_callback.Run( + base::SysNSStringToUTF8(notification.name), + base::DictionaryValue()); } + } ]; return request_id; } -void SystemPreferences::UnsubscribeNotification(int request_id) { +void SystemPreferences::DoUnsubscribeNotification(int request_id, bool is_local) { auto iter = g_id_map.find(request_id); if (iter != g_id_map.end()) { id observer = iter->second; - [[NSDistributedNotificationCenter defaultCenter] removeObserver:observer]; + NSNotificationCenter* center = is_local ? + [NSNotificationCenter defaultCenter] : + [NSDistributedNotificationCenter defaultCenter]; + [center removeObserver:observer]; g_id_map.erase(iter); } } diff --git a/docs/api/system-preferences.md b/docs/api/system-preferences.md index a47975d097..586422e566 100644 --- a/docs/api/system-preferences.md +++ b/docs/api/system-preferences.md @@ -40,6 +40,17 @@ example values of `event` are: Removes the subscriber with `id`. +### `systemPreferences.subscribeLocalNotification(event, callback)` _macOS_ + +Same as `subscribeNotification`, but uses `NSNotificationCenter` for local defaults. +This is necessary for events such as: + +* `NSUserDefaultsDidChangeNotification` + +### `systemPreferences.unsubscribeLocalNotification(id)` _macOS_ + +Same as `unsubscribeNotification`, but removes the subscriber from `NSNotificationCenter`. + ### `systemPreferences.getUserDefault(key, type)` _macOS_ * `key` String From 8a9f2261d0d8a5b73353a23c876897bdea180567 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Jun 2016 17:54:15 -0700 Subject: [PATCH 002/516] Add default error handler to remote promises (#6151) * Add failing spec for unhandled main process exception * Remove unused return * Use let/const instead of var * Add spec for unhandled rejection in renderer process * Prevent unhandled rejection defaul * Use once instead of on * Add default fulfilled/rejection handler to promise --- lib/browser/rpc-server.js | 23 ++++++++++-------- spec/api-ipc-spec.js | 27 +++++++++++++++++++++ spec/fixtures/module/unhandled-rejection.js | 3 +++ 3 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 spec/fixtures/module/unhandled-rejection.js diff --git a/lib/browser/rpc-server.js b/lib/browser/rpc-server.js index 0b954e518b..083c5e4d03 100644 --- a/lib/browser/rpc-server.js +++ b/lib/browser/rpc-server.js @@ -54,7 +54,7 @@ let getObjectPrototype = function (object) { // Convert a real value into meta data. let valueToMeta = function (sender, value, optimizeSimpleObject = false) { // Determine the type of value. - let meta = { type: typeof value } + const meta = { type: typeof value } if (meta.type === 'object') { // Recognize certain types of objects. if (value === null) { @@ -93,6 +93,10 @@ let valueToMeta = function (sender, value, optimizeSimpleObject = false) { } else if (meta.type === 'buffer') { meta.value = Array.prototype.slice.call(value, 0) } else if (meta.type === 'promise') { + // Add default handler to prevent unhandled rejections in main process + // Instead they should appear in the renderer process + value.then(function () {}, function () {}) + meta.then = valueToMeta(sender, function (onFulfilled, onRejected) { value.then(onFulfilled, onRejected) }) @@ -114,7 +118,7 @@ let valueToMeta = function (sender, value, optimizeSimpleObject = false) { } // Convert object to meta by value. -var plainObjectToMeta = function (obj) { +const plainObjectToMeta = function (obj) { return Object.getOwnPropertyNames(obj).map(function (name) { return { name: name, @@ -124,7 +128,7 @@ var plainObjectToMeta = function (obj) { } // Convert Error into meta data. -var exceptionToMeta = function (error) { +const exceptionToMeta = function (error) { return { type: 'exception', message: error.message, @@ -133,10 +137,9 @@ var exceptionToMeta = function (error) { } // Convert array of meta data from renderer into array of real values. -var unwrapArgs = function (sender, args) { - var metaToValue - metaToValue = function (meta) { - var i, len, member, ref, returnValue +const unwrapArgs = function (sender, args) { + const metaToValue = function (meta) { + let i, len, member, ref, returnValue switch (meta.type) { case 'value': return meta.value @@ -200,8 +203,8 @@ var unwrapArgs = function (sender, args) { // Call a function and send reply asynchronously if it's a an asynchronous // style function and the caller didn't pass a callback. -var callFunction = function (event, func, caller, args) { - var funcMarkedAsync, funcName, funcPassedCallback, ref, ret +const callFunction = function (event, func, caller, args) { + let funcMarkedAsync, funcName, funcPassedCallback, ref, ret funcMarkedAsync = v8Util.getHiddenValue(func, 'asynchronous') funcPassedCallback = typeof args[args.length - 1] === 'function' try { @@ -209,7 +212,7 @@ var callFunction = function (event, func, caller, args) { args.push(function (ret) { event.returnValue = valueToMeta(event.sender, ret, true) }) - return func.apply(caller, args) + func.apply(caller, args) } else { ret = func.apply(caller, args) event.returnValue = valueToMeta(event.sender, ret, true) diff --git a/spec/api-ipc-spec.js b/spec/api-ipc-spec.js index e88815873a..cbf58fe8ea 100644 --- a/spec/api-ipc-spec.js +++ b/spec/api-ipc-spec.js @@ -126,6 +126,33 @@ describe('ipc module', function () { done() }) }) + + it('does not emit unhandled rejection events in the main process', function (done) { + remote.process.once('unhandledRejection', function (reason) { + done(reason) + }) + + var promise = remote.require(path.join(fixtures, 'module', 'unhandled-rejection.js')) + promise.reject().then(function () { + done(new Error('Promise was not rejected')) + }).catch(function (error) { + assert.equal(error.message, 'rejected') + done() + }) + }) + + it('emits unhandled rejection events in the renderer process', function (done) { + window.addEventListener('unhandledrejection', function (event) { + event.preventDefault() + assert.equal(event.reason.message, 'rejected') + done() + }) + + var promise = remote.require(path.join(fixtures, 'module', 'unhandled-rejection.js')) + promise.reject().then(function () { + done(new Error('Promise was not rejected')) + }) + }) }) describe('remote webContents', function () { diff --git a/spec/fixtures/module/unhandled-rejection.js b/spec/fixtures/module/unhandled-rejection.js new file mode 100644 index 0000000000..6cb870ec88 --- /dev/null +++ b/spec/fixtures/module/unhandled-rejection.js @@ -0,0 +1,3 @@ +exports.reject = function () { + return Promise.reject(new Error('rejected')) +} From 9993aab5b13922a6e71ad9b16bf1c1c576e8bd15 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 21 Jun 2016 12:24:25 +0900 Subject: [PATCH 003/516] Update brightray for electron/brightray#228 --- vendor/brightray | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/brightray b/vendor/brightray index 4e4113ee43..3a98173c68 160000 --- a/vendor/brightray +++ b/vendor/brightray @@ -1 +1 @@ -Subproject commit 4e4113ee43484c6058ced9defa9b905e0e7339a6 +Subproject commit 3a98173c6848bac241074979b24f5a54cc92b5b0 From db98e256f283c3b79e1184bfa924f2ee99ce338c Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 21 Jun 2016 15:40:30 +0900 Subject: [PATCH 004/516] mac: Add tray.getBounds() API --- atom/browser/api/atom_api_tray.cc | 7 ++++++- atom/browser/api/atom_api_tray.h | 1 + atom/browser/ui/tray_icon.cc | 4 ++++ atom/browser/ui/tray_icon.h | 4 ++++ atom/browser/ui/tray_icon_cocoa.h | 1 + atom/browser/ui/tray_icon_cocoa.mm | 23 +++++++++++++---------- 6 files changed, 29 insertions(+), 11 deletions(-) diff --git a/atom/browser/api/atom_api_tray.cc b/atom/browser/api/atom_api_tray.cc index c84e8a1d66..85c0578a8e 100644 --- a/atom/browser/api/atom_api_tray.cc +++ b/atom/browser/api/atom_api_tray.cc @@ -159,6 +159,10 @@ void Tray::SetContextMenu(v8::Isolate* isolate, mate::Handle menu) { tray_icon_->SetContextMenu(menu->model()); } +gfx::Rect Tray::GetBounds() { + return tray_icon_->GetBounds(); +} + v8::Local Tray::ModifiersToObject(v8::Isolate* isolate, int modifiers) { mate::Dictionary obj(isolate, v8::Object::New(isolate)); @@ -181,7 +185,8 @@ void Tray::BuildPrototype(v8::Isolate* isolate, .SetMethod("setHighlightMode", &Tray::SetHighlightMode) .SetMethod("displayBalloon", &Tray::DisplayBalloon) .SetMethod("popUpContextMenu", &Tray::PopUpContextMenu) - .SetMethod("setContextMenu", &Tray::SetContextMenu); + .SetMethod("setContextMenu", &Tray::SetContextMenu) + .SetMethod("getBounds", &Tray::GetBounds); } } // namespace api diff --git a/atom/browser/api/atom_api_tray.h b/atom/browser/api/atom_api_tray.h index a6c329567c..0bc28af818 100644 --- a/atom/browser/api/atom_api_tray.h +++ b/atom/browser/api/atom_api_tray.h @@ -65,6 +65,7 @@ class Tray : public mate::TrackableObject, void DisplayBalloon(mate::Arguments* args, const mate::Dictionary& options); void PopUpContextMenu(mate::Arguments* args); void SetContextMenu(v8::Isolate* isolate, mate::Handle menu); + gfx::Rect GetBounds(); private: v8::Local ModifiersToObject(v8::Isolate* isolate, int modifiers); diff --git a/atom/browser/ui/tray_icon.cc b/atom/browser/ui/tray_icon.cc index dcdb90ac15..fda68b09cd 100644 --- a/atom/browser/ui/tray_icon.cc +++ b/atom/browser/ui/tray_icon.cc @@ -30,6 +30,10 @@ void TrayIcon::PopUpContextMenu(const gfx::Point& pos, ui::SimpleMenuModel* menu_model) { } +gfx::Rect TrayIcon::GetBounds() { + return gfx::Rect(); +} + void TrayIcon::NotifyClicked(const gfx::Rect& bounds, int modifiers) { FOR_EACH_OBSERVER(TrayIconObserver, observers_, OnClicked(bounds, modifiers)); } diff --git a/atom/browser/ui/tray_icon.h b/atom/browser/ui/tray_icon.h index 1916c11b23..2763e50941 100644 --- a/atom/browser/ui/tray_icon.h +++ b/atom/browser/ui/tray_icon.h @@ -60,8 +60,12 @@ class TrayIcon { // Set the context menu for this icon. virtual void SetContextMenu(ui::SimpleMenuModel* menu_model) = 0; + // Returns the bounds of tray icon. + virtual gfx::Rect GetBounds(); + void AddObserver(TrayIconObserver* obs) { observers_.AddObserver(obs); } void RemoveObserver(TrayIconObserver* obs) { observers_.RemoveObserver(obs); } + void NotifyClicked(const gfx::Rect& = gfx::Rect(), int modifiers = 0); void NotifyDoubleClicked(const gfx::Rect& = gfx::Rect(), int modifiers = 0); void NotifyBalloonShow(); diff --git a/atom/browser/ui/tray_icon_cocoa.h b/atom/browser/ui/tray_icon_cocoa.h index 59e2241aa4..cb972d54a9 100644 --- a/atom/browser/ui/tray_icon_cocoa.h +++ b/atom/browser/ui/tray_icon_cocoa.h @@ -32,6 +32,7 @@ class TrayIconCocoa : public TrayIcon, void PopUpContextMenu(const gfx::Point& pos, ui::SimpleMenuModel* menu_model) override; void SetContextMenu(ui::SimpleMenuModel* menu_model) override; + gfx::Rect GetBounds() override; protected: // AtomMenuModel::Observer: diff --git a/atom/browser/ui/tray_icon_cocoa.mm b/atom/browser/ui/tray_icon_cocoa.mm index 0dfd59132a..8b25aa3540 100644 --- a/atom/browser/ui/tray_icon_cocoa.mm +++ b/atom/browser/ui/tray_icon_cocoa.mm @@ -8,6 +8,7 @@ #include "base/strings/sys_string_conversions.h" #include "ui/events/cocoa/cocoa_event_utils.h" #include "ui/gfx/image/image.h" +#include "ui/gfx/mac/coordinate_conversion.h" #include "ui/gfx/screen.h" namespace { @@ -236,13 +237,13 @@ const CGFloat kVerticalTitleMargin = 2; // Single click event. if (event.clickCount == 1) trayIcon_->NotifyClicked( - [self getBoundsFromEvent:event], + gfx::ScreenRectFromNSRect(event.window.frame), ui::EventFlagsFromModifiers([event modifierFlags])); // Double click event. if (event.clickCount == 2) trayIcon_->NotifyDoubleClicked( - [self getBoundsFromEvent:event], + gfx::ScreenRectFromNSRect(event.window.frame), ui::EventFlagsFromModifiers([event modifierFlags])); [self setNeedsDisplay:YES]; @@ -273,7 +274,7 @@ const CGFloat kVerticalTitleMargin = 2; - (void)rightMouseUp:(NSEvent*)event { trayIcon_->NotifyRightClicked( - [self getBoundsFromEvent:event], + gfx::ScreenRectFromNSRect(event.window.frame), ui::EventFlagsFromModifiers([event modifierFlags])); } @@ -324,13 +325,6 @@ const CGFloat kVerticalTitleMargin = 2; return isHighlightEnable_ && (inMouseEventSequence_ || isMenuOpen); } -- (gfx::Rect)getBoundsFromEvent:(NSEvent*)event { - NSRect frame = event.window.frame; - gfx::Rect bounds(frame.origin.x, 0, NSWidth(frame), NSHeight(frame)); - NSScreen* screen = [[NSScreen screens] objectAtIndex:0]; - bounds.set_y(NSHeight([screen frame]) - NSMaxY(frame)); - return bounds; -} @end namespace atom { @@ -386,6 +380,15 @@ void TrayIconCocoa::SetContextMenu(ui::SimpleMenuModel* menu_model) { [status_item_view_ setMenuController:menu_.get()]; } +gfx::Rect TrayIconCocoa::GetBounds() { + auto bounds = gfx::ScreenRectFromNSRect([status_item_view_ window].frame); + // Calling [window frame] immediately after the view gets created will have + // negative |y| sometimes. + if (bounds.y() < 0) + bounds.set_y(0); + return bounds; +} + void TrayIconCocoa::MenuClosed() { [status_item_view_ setNeedsDisplay:YES]; } From 886ef1717c992eacfb827ff755ab3122b75fb12d Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 21 Jun 2016 15:49:22 +0900 Subject: [PATCH 005/516] win: Implement tray.getBounds() API --- atom/browser/ui/win/notify_icon.cc | 27 ++++++++++++++++----------- atom/browser/ui/win/notify_icon.h | 1 + 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/atom/browser/ui/win/notify_icon.cc b/atom/browser/ui/win/notify_icon.cc index 1cc616216c..d12b328b0d 100644 --- a/atom/browser/ui/win/notify_icon.cc +++ b/atom/browser/ui/win/notify_icon.cc @@ -48,26 +48,19 @@ NotifyIcon::~NotifyIcon() { void NotifyIcon::HandleClickEvent(int modifiers, bool left_mouse_click, bool double_button_click) { - NOTIFYICONIDENTIFIER icon_id; - memset(&icon_id, 0, sizeof(NOTIFYICONIDENTIFIER)); - icon_id.uID = icon_id_; - icon_id.hWnd = window_; - icon_id.cbSize = sizeof(NOTIFYICONIDENTIFIER); - - RECT rect = { 0 }; - Shell_NotifyIconGetRect(&icon_id, &rect); + gfx::Rect bounds = GetBounds(); if (left_mouse_click) { if (double_button_click) // double left click - NotifyDoubleClicked(gfx::Rect(rect), modifiers); + NotifyDoubleClicked(bounds, modifiers); else // single left click - NotifyClicked(gfx::Rect(rect), modifiers); + NotifyClicked(bounds, modifiers); return; } else if (!double_button_click) { // single right click if (menu_model_) PopUpContextMenu(gfx::Point(), menu_model_); else - NotifyRightClicked(gfx::Rect(rect), modifiers); + NotifyRightClicked(bounds, modifiers); } } @@ -163,6 +156,18 @@ void NotifyIcon::SetContextMenu(ui::SimpleMenuModel* menu_model) { menu_model_ = menu_model; } +gfx::Rect NotifyIcon::GetBounds() { + NOTIFYICONIDENTIFIER icon_id; + memset(&icon_id, 0, sizeof(NOTIFYICONIDENTIFIER)); + icon_id.uID = icon_id_; + icon_id.hWnd = window_; + icon_id.cbSize = sizeof(NOTIFYICONIDENTIFIER); + + RECT rect = { 0 }; + Shell_NotifyIconGetRect(&icon_id, &rect); + return gfx::Rect(rect); +} + void NotifyIcon::InitIconData(NOTIFYICONDATA* icon_data) { memset(icon_data, 0, sizeof(NOTIFYICONDATA)); icon_data->cbSize = sizeof(NOTIFYICONDATA); diff --git a/atom/browser/ui/win/notify_icon.h b/atom/browser/ui/win/notify_icon.h index 95e9945a17..1284ebadcf 100644 --- a/atom/browser/ui/win/notify_icon.h +++ b/atom/browser/ui/win/notify_icon.h @@ -54,6 +54,7 @@ class NotifyIcon : public TrayIcon { void PopUpContextMenu(const gfx::Point& pos, ui::SimpleMenuModel* menu_model) override; void SetContextMenu(ui::SimpleMenuModel* menu_model) override; + gfx::Rect GetBounds() override; private: void InitIconData(NOTIFYICONDATA* icon_data); From 324153d3949f7a366962a6f518430164df782db0 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 21 Jun 2016 16:05:28 +0900 Subject: [PATCH 006/516] win: Use DIP rect for tray icon's bounds --- atom/browser/ui/win/notify_icon.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/atom/browser/ui/win/notify_icon.cc b/atom/browser/ui/win/notify_icon.cc index d12b328b0d..0ccf46b832 100644 --- a/atom/browser/ui/win/notify_icon.cc +++ b/atom/browser/ui/win/notify_icon.cc @@ -13,6 +13,7 @@ #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/screen.h" +#include "ui/gfx/win/dpi.h" #include "ui/views/controls/menu/menu_runner.h" namespace atom { @@ -165,7 +166,7 @@ gfx::Rect NotifyIcon::GetBounds() { RECT rect = { 0 }; Shell_NotifyIconGetRect(&icon_id, &rect); - return gfx::Rect(rect); + return gfx::win::ScreenToDIPRect(gfx::Rect(rect)); } void NotifyIcon::InitIconData(NOTIFYICONDATA* icon_data) { From 11f242a2411da03466fc0d5f8183ad1bed4d72ab Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 21 Jun 2016 16:13:50 +0900 Subject: [PATCH 007/516] docs: Tray.getBounds() --- docs/api/tray.md | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/docs/api/tray.md b/docs/api/tray.md index 902444e533..7e0cc65a8f 100644 --- a/docs/api/tray.md +++ b/docs/api/tray.md @@ -3,20 +3,20 @@ > Add icons and context menus to the system's notification area. ```javascript -const {app, Menu, Tray} = require('electron'); +const {app, Menu, Tray} = require('electron') -let appIcon = null; +let appIcon = null app.on('ready', () => { - appIcon = new Tray('/path/to/my/icon'); + appIcon = new Tray('/path/to/my/icon') const contextMenu = Menu.buildFromTemplate([ {label: 'Item1', type: 'radio'}, {label: 'Item2', type: 'radio'}, {label: 'Item3', type: 'radio', checked: true}, {label: 'Item4', type: 'radio'} ]); - appIcon.setToolTip('This is my application.'); - appIcon.setContextMenu(contextMenu); -}); + appIcon.setToolTip('This is my application.') + appIcon.setContextMenu(contextMenu) +}) ``` __Platform limitations:__ @@ -208,4 +208,14 @@ The `position` is only available on Windows, and it is (0, 0) by default. Sets the context menu for this icon. +### `Tray.getBounds()` _macOS_ _Windows_ + +Returns the `bounds` of this tray icon as `Object`. + +* `bounds` Object + * `x` Integer + * `y` Integer + * `width` Integer + * `height` Integer + [event-emitter]: http://nodejs.org/api/events.html#events_class_events_eventemitter From 9d63199c373ba5c0c864535b7f613f95431e6faa Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 21 Jun 2016 16:20:33 +0900 Subject: [PATCH 008/516] docs: Make tray.md follow docs style guide --- docs/api/tray.md | 66 +++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/docs/api/tray.md b/docs/api/tray.md index 7e0cc65a8f..aed699b8ee 100644 --- a/docs/api/tray.md +++ b/docs/api/tray.md @@ -5,17 +5,17 @@ ```javascript const {app, Menu, Tray} = require('electron') -let appIcon = null +let tray = null app.on('ready', () => { - appIcon = new Tray('/path/to/my/icon') + tray = new Tray('/path/to/my/icon') const contextMenu = Menu.buildFromTemplate([ {label: 'Item1', type: 'radio'}, {label: 'Item2', type: 'radio'}, {label: 'Item3', type: 'radio', checked: true}, {label: 'Item4', type: 'radio'} ]); - appIcon.setToolTip('This is my application.') - appIcon.setContextMenu(contextMenu) + tray.setToolTip('This is my application.') + tray.setContextMenu(contextMenu) }) ``` @@ -49,21 +49,18 @@ rely on the `click` event and always attach a context menu to the tray icon. Creates a new tray icon associated with the `image`. -## Events +### Instance Events The `Tray` module emits the following events: -**Note:** Some events are only available on specific operating systems and are -labeled as such. - -### Event: 'click' +#### Event: 'click' * `event` Event * `altKey` Boolean * `shiftKey` Boolean * `ctrlKey` Boolean * `metaKey` Boolean -* `bounds` Object - the bounds of tray icon. +* `bounds` Object _macOS_ _Windows_ - the bounds of tray icon. * `x` Integer * `y` Integer * `width` Integer @@ -71,9 +68,7 @@ labeled as such. Emitted when the tray icon is clicked. -**Note:** The `bounds` payload is only implemented on macOS and Windows. - -### Event: 'right-click' _macOS_ _Windows_ +#### Event: 'right-click' _macOS_ _Windows_ * `event` Event * `altKey` Boolean @@ -88,7 +83,7 @@ Emitted when the tray icon is clicked. Emitted when the tray icon is right clicked. -### Event: 'double-click' _macOS_ _Windows_ +#### Event: 'double-click' _macOS_ _Windows_ * `event` Event * `altKey` Boolean @@ -103,85 +98,82 @@ Emitted when the tray icon is right clicked. Emitted when the tray icon is double clicked. -### Event: 'balloon-show' _Windows_ +#### Event: 'balloon-show' _Windows_ Emitted when the tray balloon shows. -### Event: 'balloon-click' _Windows_ +#### Event: 'balloon-click' _Windows_ Emitted when the tray balloon is clicked. -### Event: 'balloon-closed' _Windows_ +#### Event: 'balloon-closed' _Windows_ Emitted when the tray balloon is closed because of timeout or user manually closes it. -### Event: 'drop' _macOS_ +#### Event: 'drop' _macOS_ Emitted when any dragged items are dropped on the tray icon. -### Event: 'drop-files' _macOS_ +#### Event: 'drop-files' _macOS_ * `event` * `files` Array - the file path of dropped files. Emitted when dragged files are dropped in the tray icon. -### Event: 'drag-enter' _macOS_ +#### Event: 'drag-enter' _macOS_ Emitted when a drag operation enters the tray icon. -### Event: 'drag-leave' _macOS_ +#### Event: 'drag-leave' _macOS_ Emitted when a drag operation exits the tray icon. -### Event: 'drag-end' _macOS_ +#### Event: 'drag-end' _macOS_ Emitted when a drag operation ends on the tray or ends at another location. -## Methods +### Instance Methods -The `Tray` module has the following methods: +The `Tray` class has the following methods: -**Note:** Some methods are only available on specific operating systems and are -labeled as such. - -### `Tray.destroy()` +#### `tray.destroy()` Destroys the tray icon immediately. -### `Tray.setImage(image)` +#### `tray.setImage(image)` * `image` [NativeImage](native-image.md) Sets the `image` associated with this tray icon. -### `Tray.setPressedImage(image)` _macOS_ +#### `tray.setPressedImage(image)` _macOS_ * `image` [NativeImage](native-image.md) Sets the `image` associated with this tray icon when pressed on macOS. -### `Tray.setToolTip(toolTip)` +#### `tray.setToolTip(toolTip)` * `toolTip` String Sets the hover text for this tray icon. -### `Tray.setTitle(title)` _macOS_ +#### `tray.setTitle(title)` _macOS_ * `title` String Sets the title displayed aside of the tray icon in the status bar. -### `Tray.setHighlightMode(highlight)` _macOS_ +#### `tray.setHighlightMode(highlight)` _macOS_ * `highlight` Boolean Sets whether the tray icon's background becomes highlighted (in blue) when the tray icon is clicked. Defaults to true. -### `Tray.displayBalloon(options)` _Windows_ +#### `tray.displayBalloon(options)` _Windows_ * `options` Object * `icon` [NativeImage](native-image.md) @@ -190,7 +182,7 @@ when the tray icon is clicked. Defaults to true. Displays a tray balloon. -### `Tray.popUpContextMenu([menu, position])` _macOS_ _Windows_ +#### `tray.popUpContextMenu([menu, position])` _macOS_ _Windows_ * `menu` Menu (optional) * `position` Object (optional) - The pop up position. @@ -202,13 +194,13 @@ be shown instead of the tray icon's context menu. The `position` is only available on Windows, and it is (0, 0) by default. -### `Tray.setContextMenu(menu)` +#### `tray.setContextMenu(menu)` * `menu` Menu Sets the context menu for this icon. -### `Tray.getBounds()` _macOS_ _Windows_ +#### `tray.getBounds()` _macOS_ _Windows_ Returns the `bounds` of this tray icon as `Object`. From 816b2ea8f259e098f737c27d969abb23060c9139 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 21 Jun 2016 08:54:55 +0000 Subject: [PATCH 009/516] linux: Disable parent window when showing modal dialogs (#6160) --- atom/browser/ui/file_dialog_gtk.cc | 17 ++++++++++------- atom/browser/ui/message_box_gtk.cc | 16 ++++++++++------ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/atom/browser/ui/file_dialog_gtk.cc b/atom/browser/ui/file_dialog_gtk.cc index 1ad7ff5f2d..dcb7bea86b 100644 --- a/atom/browser/ui/file_dialog_gtk.cc +++ b/atom/browser/ui/file_dialog_gtk.cc @@ -4,7 +4,7 @@ #include "atom/browser/ui/file_dialog.h" -#include "atom/browser/native_window.h" +#include "atom/browser/native_window_views.h" #include "base/callback.h" #include "base/files/file_util.h" #include "base/strings/string_util.h" @@ -40,7 +40,8 @@ class FileChooserDialog { const std::string& button_label, const base::FilePath& default_path, const Filters& filters) - : dialog_scope_(parent_window), + : parent_(static_cast(parent_window)), + dialog_scope_(parent_window), filters_(filters) { const char* confirm_text = GTK_STOCK_OK; @@ -58,9 +59,10 @@ class FileChooserDialog { GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, confirm_text, GTK_RESPONSE_ACCEPT, NULL); - if (parent_window) { - gfx::NativeWindow window = parent_window->GetNativeWindow(); - libgtk2ui::SetGtkTransientForAura(dialog_, window); + if (parent_) { + parent_->SetEnabled(false); + libgtk2ui::SetGtkTransientForAura(dialog_, parent_->GetNativeWindow()); + gtk_window_set_modal(GTK_WINDOW(dialog_), TRUE); } if (action == GTK_FILE_CHOOSER_ACTION_SAVE) @@ -69,8 +71,6 @@ class FileChooserDialog { if (action != GTK_FILE_CHOOSER_ACTION_OPEN) gtk_file_chooser_set_create_folders(GTK_FILE_CHOOSER(dialog_), TRUE); - gtk_window_set_modal(GTK_WINDOW(dialog_), TRUE); - if (!default_path.empty()) { if (base::DirectoryExists(default_path)) { gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog_), @@ -89,6 +89,8 @@ class FileChooserDialog { virtual ~FileChooserDialog() { gtk_widget_destroy(dialog_); + if (parent_) + parent_->SetEnabled(true); } void RunAsynchronous() { @@ -143,6 +145,7 @@ class FileChooserDialog { void AddFilters(const Filters& filters); base::FilePath AddExtensionForFilename(const gchar* filename) const; + atom::NativeWindowViews* parent_; atom::NativeWindow::DialogScope dialog_scope_; GtkWidget* dialog_; diff --git a/atom/browser/ui/message_box_gtk.cc b/atom/browser/ui/message_box_gtk.cc index b09ccdd482..d08171c6e4 100644 --- a/atom/browser/ui/message_box_gtk.cc +++ b/atom/browser/ui/message_box_gtk.cc @@ -5,7 +5,7 @@ #include "atom/browser/ui/message_box.h" #include "atom/browser/browser.h" -#include "atom/browser/native_window.h" +#include "atom/browser/native_window_views.h" #include "base/callback.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -36,7 +36,8 @@ class GtkMessageBox { const std::string& detail, const gfx::ImageSkia& icon) : dialog_scope_(parent_window), - cancel_id_(cancel_id) { + cancel_id_(cancel_id), + parent_(static_cast(parent_window)) { // Create dialog. dialog_ = gtk_message_dialog_new( nullptr, // parent @@ -75,14 +76,17 @@ class GtkMessageBox { } // Parent window. - if (parent_window) { - gfx::NativeWindow window = parent_window->GetNativeWindow(); - libgtk2ui::SetGtkTransientForAura(dialog_, window); + if (parent_) { + parent_->SetEnabled(false); + libgtk2ui::SetGtkTransientForAura(dialog_, parent_->GetNativeWindow()); + gtk_window_set_modal(GTK_WINDOW(dialog_), TRUE); } } ~GtkMessageBox() { gtk_widget_destroy(dialog_); + if (parent_) + parent_->SetEnabled(true); } GtkMessageType GetMessageType(MessageBoxType type) { @@ -123,7 +127,6 @@ class GtkMessageBox { } int RunSynchronous() { - gtk_window_set_modal(GTK_WINDOW(dialog_), TRUE); Show(); int response = gtk_dialog_run(GTK_DIALOG(dialog_)); if (response < 0) @@ -149,6 +152,7 @@ class GtkMessageBox { // The id to return when the dialog is closed without pressing buttons. int cancel_id_; + NativeWindowViews* parent_; GtkWidget* dialog_; MessageBoxCallback callback_; From aca37c897439171344924f79d8d20978b893cf42 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 21 Jun 2016 18:05:01 +0900 Subject: [PATCH 010/516] Update menubar color when theme changes --- atom/browser/ui/views/menu_bar.cc | 23 +++++++++++++++-------- atom/browser/ui/views/menu_bar.h | 4 +++- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/atom/browser/ui/views/menu_bar.cc b/atom/browser/ui/views/menu_bar.cc index 872375ccbb..796e6ef804 100644 --- a/atom/browser/ui/views/menu_bar.cc +++ b/atom/browser/ui/views/menu_bar.cc @@ -50,14 +50,7 @@ void GetMenuBarColor(SkColor* enabled, SkColor* disabled, SkColor* highlight, MenuBar::MenuBar() : background_color_(kDefaultColor), menu_model_(NULL) { -#if defined(OS_WIN) - background_color_ = color_utils::GetSysSkColor(COLOR_MENUBAR); -#elif defined(USE_X11) - GetMenuBarColor(&enabled_color_, &disabled_color_, &highlight_color_, - &hover_color_, &background_color_); -#endif - - set_background(views::Background::CreateSolidBackground(background_color_)); + UpdateMenuBarColor(); SetLayoutManager(new views::BoxLayout( views::BoxLayout::kHorizontal, 0, 0, 0)); } @@ -159,4 +152,18 @@ void MenuBar::OnMenuButtonClicked(views::MenuButton* source, menu_delegate.RunMenu(menu_model_->GetSubmenuModelAt(id), source); } +void MenuBar::OnNativeThemeChanged(const ui::NativeTheme* theme) { + UpdateMenuBarColor(); +} + +void MenuBar::UpdateMenuBarColor() { +#if defined(OS_WIN) + background_color_ = color_utils::GetSysSkColor(COLOR_MENUBAR); +#elif defined(USE_X11) + GetMenuBarColor(&enabled_color_, &disabled_color_, &highlight_color_, + &hover_color_, &background_color_); +#endif + set_background(views::Background::CreateSolidBackground(background_color_)); +} + } // namespace atom diff --git a/atom/browser/ui/views/menu_bar.h b/atom/browser/ui/views/menu_bar.h index 9f38a5981c..eb62784e71 100644 --- a/atom/browser/ui/views/menu_bar.h +++ b/atom/browser/ui/views/menu_bar.h @@ -60,9 +60,11 @@ class MenuBar : public views::View, void OnMenuButtonClicked(views::MenuButton* source, const gfx::Point& point, const ui::Event* event) override; - + void OnNativeThemeChanged(const ui::NativeTheme* theme) override; private: + void UpdateMenuBarColor(); + SkColor background_color_; #if defined(USE_X11) From a16d907684fca735ca1b5a402adabb6cefdd0bdd Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Jun 2016 17:03:48 -0700 Subject: [PATCH 011/516] Add quit role --- lib/browser/api/menu-item.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index 4d2737d0fa..5ff96766c9 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -15,7 +15,8 @@ rolesMap = { selectall: 'selectAll', minimize: 'minimize', close: 'close', - delete: 'delete' + delete: 'delete', + quit: 'quit' } // Maps methods that should be called directly on the BrowserWindow instance @@ -24,12 +25,16 @@ methodInBrowserWindow = { close: true } +const methodInApp = { + quit: true +} + MenuItem = (function () { MenuItem.types = ['normal', 'separator', 'submenu', 'checkbox', 'radio'] function MenuItem (options) { var click, ref - const Menu = require('electron').Menu + const {app, Menu} = require('electron') click = options.click this.selector = options.selector this.type = options.type @@ -73,7 +78,9 @@ MenuItem = (function () { } if (this.role && rolesMap[this.role] && process.platform !== 'darwin' && (focusedWindow != null)) { methodName = rolesMap[this.role] - if (methodInBrowserWindow[methodName]) { + if(methodInApp[methodName]) { + return app[methodName]() + } else if (methodInBrowserWindow[methodName]) { return focusedWindow[methodName]() } else { return (ref2 = focusedWindow.webContents) != null ? ref2[methodName]() : void 0 From 67f7b4d4c583798ab0037d735732e1befad49030 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Jun 2016 17:03:59 -0700 Subject: [PATCH 012/516] Map quit role to terminate selector --- atom/browser/ui/cocoa/atom_menu_controller.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/atom/browser/ui/cocoa/atom_menu_controller.mm b/atom/browser/ui/cocoa/atom_menu_controller.mm index 642721e6bd..26cf2a94ed 100644 --- a/atom/browser/ui/cocoa/atom_menu_controller.mm +++ b/atom/browser/ui/cocoa/atom_menu_controller.mm @@ -38,6 +38,7 @@ Role kRolesMap[] = { { @selector(performMiniaturize:), "minimize" }, { @selector(performClose:), "close" }, { @selector(performZoom:), "zoom" }, + { @selector(terminate:), "quit" }, }; } // namespace From 7a6436014e9a3d67faf84d979c4fec7938b7a532 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Jun 2016 17:04:03 -0700 Subject: [PATCH 013/516] Use quit role --- default_app/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default_app/main.js b/default_app/main.js index 4e5ea96b03..0fdf30bf82 100644 --- a/default_app/main.js +++ b/default_app/main.js @@ -214,7 +214,7 @@ app.once('ready', () => { { label: 'Quit ' + app.getName(), accelerator: 'Command+Q', - click () { app.quit() } + role: 'quit' } ] }) From 11ba7eaa91d8e9d1d55746a485ccb2d1940a6aa0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Jun 2016 17:08:45 -0700 Subject: [PATCH 014/516] Add File > Exit menu on Windows --- default_app/main.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/default_app/main.js b/default_app/main.js index 0fdf30bf82..4c3c658420 100644 --- a/default_app/main.js +++ b/default_app/main.js @@ -243,6 +243,18 @@ app.once('ready', () => { ] } + if (process.platform === 'win32') { + template.unshift({ + label: 'File', + submenu: [ + { + label: 'Exit', + role: 'quit' + } + ] + }) + } + const menu = Menu.buildFromTemplate(template) Menu.setApplicationMenu(menu) }) From 2d8ec60eedecc0aa53d14a41f763719bc6288002 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Jun 2016 17:14:16 -0700 Subject: [PATCH 015/516] Use const/let instead of var --- lib/browser/api/menu-item.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index 5ff96766c9..15ede39609 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -1,11 +1,9 @@ 'use strict' -var MenuItem, methodInBrowserWindow, nextCommandId, rolesMap - -nextCommandId = 0 +let nextCommandId = 0 // Maps role to methods of webContents -rolesMap = { +const rolesMap = { undo: 'undo', redo: 'redo', cut: 'cut', @@ -20,7 +18,7 @@ rolesMap = { } // Maps methods that should be called directly on the BrowserWindow instance -methodInBrowserWindow = { +const methodInBrowserWindow = { minimize: true, close: true } @@ -29,11 +27,11 @@ const methodInApp = { quit: true } -MenuItem = (function () { +const MenuItem = (function () { MenuItem.types = ['normal', 'separator', 'submenu', 'checkbox', 'radio'] function MenuItem (options) { - var click, ref + let click, ref const {app, Menu} = require('electron') click = options.click this.selector = options.selector @@ -72,7 +70,7 @@ MenuItem = (function () { this.commandId = ++nextCommandId this.click = (focusedWindow) => { // Manually flip the checked flags when clicked. - var methodName, ref1, ref2 + let methodName, ref1, ref2 if ((ref1 = this.type) === 'checkbox' || ref1 === 'radio') { this.checked = !this.checked } From 32ea5a5e27e1d99e6bef46a3b44d9761ff261873 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Jun 2016 17:16:34 -0700 Subject: [PATCH 016/516] Remove CoffeeScript ref variables --- lib/browser/api/menu-item.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index 15ede39609..7b5a688cb1 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -31,9 +31,9 @@ const MenuItem = (function () { MenuItem.types = ['normal', 'separator', 'submenu', 'checkbox', 'radio'] function MenuItem (options) { - let click, ref const {app, Menu} = require('electron') - click = options.click + + const click = options.click this.selector = options.selector this.type = options.type this.role = options.role @@ -51,7 +51,7 @@ const MenuItem = (function () { if ((this.type == null) && (this.submenu != null)) { this.type = 'submenu' } - if (this.type === 'submenu' && ((ref = this.submenu) != null ? ref.constructor : void 0) !== Menu) { + if (this.type === 'submenu' && (this.submenu != null ? this.submenu.constructor : void 0) !== Menu) { throw new Error('Invalid submenu') } this.overrideReadOnlyProperty('type', 'normal') @@ -70,18 +70,19 @@ const MenuItem = (function () { this.commandId = ++nextCommandId this.click = (focusedWindow) => { // Manually flip the checked flags when clicked. - let methodName, ref1, ref2 - if ((ref1 = this.type) === 'checkbox' || ref1 === 'radio') { + if (this.type === 'checkbox' || this.type === 'radio') { this.checked = !this.checked } + if (this.role && rolesMap[this.role] && process.platform !== 'darwin' && (focusedWindow != null)) { - methodName = rolesMap[this.role] + const methodName = rolesMap[this.role] if(methodInApp[methodName]) { return app[methodName]() } else if (methodInBrowserWindow[methodName]) { return focusedWindow[methodName]() } else { - return (ref2 = focusedWindow.webContents) != null ? ref2[methodName]() : void 0 + const {webContents} = focusedWindow + return webContents != null ? webContents[methodName]() : void 0 } } else if (typeof click === 'function') { return click(this, focusedWindow) From 395c3727020792a9a8975d4d8b5aa5f788f7fc93 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 Jun 2016 17:20:57 -0700 Subject: [PATCH 017/516] Document quit role --- docs/api/menu-item.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/api/menu-item.md b/docs/api/menu-item.md index ec3fef55e5..391b639e11 100644 --- a/docs/api/menu-item.md +++ b/docs/api/menu-item.md @@ -51,6 +51,7 @@ The `role` property can have following values: * `delete` * `minimize` - Minimize current window * `close` - Close current window +* `quit`- Quit the application On macOS `role` can also have following additional values: From fbfac6d49bd49c90106e68ae78e71d9789459ac3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 09:07:56 -0700 Subject: [PATCH 018/516] Fix lint errors --- lib/browser/api/menu-item.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index 7b5a688cb1..f38ab970d6 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -76,7 +76,7 @@ const MenuItem = (function () { if (this.role && rolesMap[this.role] && process.platform !== 'darwin' && (focusedWindow != null)) { const methodName = rolesMap[this.role] - if(methodInApp[methodName]) { + if (methodInApp[methodName]) { return app[methodName]() } else if (methodInBrowserWindow[methodName]) { return focusedWindow[methodName]() From e3e1ed41ca8c9910064c6c829c541b8d308e622a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 09:31:17 -0700 Subject: [PATCH 019/516] Add togglefullscreen role --- lib/browser/api/menu-item.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index f38ab970d6..de5aab28ef 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -14,13 +14,17 @@ const rolesMap = { minimize: 'minimize', close: 'close', delete: 'delete', - quit: 'quit' + quit: 'quit', + togglefullscreen: 'toggleFullScreen' } // Maps methods that should be called directly on the BrowserWindow instance const methodInBrowserWindow = { minimize: true, - close: true + close: true, + toggleFullScreen: function (window) { + window.setFullScreen(!window.isFullScreen()) + } } const methodInApp = { @@ -79,7 +83,11 @@ const MenuItem = (function () { if (methodInApp[methodName]) { return app[methodName]() } else if (methodInBrowserWindow[methodName]) { - return focusedWindow[methodName]() + if (typeof methodName === 'function') { + return methodName(focusedWindow) + } else { + return focusedWindow[methodName]() + } } else { const {webContents} = focusedWindow return webContents != null ? webContents[methodName]() : void 0 From 2536e62fb05dcb3580d170f7efbfd7a0d5d5112f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 09:34:12 -0700 Subject: [PATCH 020/516] Add togglefullscreen role selector --- atom/browser/ui/cocoa/atom_menu_controller.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/atom/browser/ui/cocoa/atom_menu_controller.mm b/atom/browser/ui/cocoa/atom_menu_controller.mm index 26cf2a94ed..536f487605 100644 --- a/atom/browser/ui/cocoa/atom_menu_controller.mm +++ b/atom/browser/ui/cocoa/atom_menu_controller.mm @@ -39,6 +39,7 @@ Role kRolesMap[] = { { @selector(performClose:), "close" }, { @selector(performZoom:), "zoom" }, { @selector(terminate:), "quit" }, + { @selector(toggleFullScreen:), "togglefullscreen" }, }; } // namespace From 3cdf36c53630e766eb9a4b0f92f92995d7a43476 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 09:34:41 -0700 Subject: [PATCH 021/516] Use togglefullscreen role --- default_app/main.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/default_app/main.js b/default_app/main.js index 4c3c658420..9df5f394ae 100644 --- a/default_app/main.js +++ b/default_app/main.js @@ -107,12 +107,8 @@ app.once('ready', () => { }, { label: 'Toggle Full Screen', - accelerator: (() => { - return (process.platform === 'darwin') ? 'Ctrl+Command+F' : 'F11' - })(), - click (item, focusedWindow) { - if (focusedWindow) focusedWindow.setFullScreen(!focusedWindow.isFullScreen()) - } + role: 'togglefullscreen', + accelerator: process.platform === 'darwin' ? 'Ctrl+Command+F' : 'F11' }, { label: 'Toggle Developer Tools', From dcd832e88cb8c032c91ea181bd2024217d4f9316 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 09:38:35 -0700 Subject: [PATCH 022/516] :art: --- default_app/main.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/default_app/main.js b/default_app/main.js index 9df5f394ae..91fbbdfbef 100644 --- a/default_app/main.js +++ b/default_app/main.js @@ -112,9 +112,7 @@ app.once('ready', () => { }, { label: 'Toggle Developer Tools', - accelerator: (() => { - return (process.platform === 'darwin') ? 'Alt+Command+I' : 'Ctrl+Shift+I' - })(), + accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', click (item, focusedWindow) { if (focusedWindow) focusedWindow.toggleDevTools() } From 35097b244e372a87ba36c3256cd1e48937b93a68 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 09:43:29 -0700 Subject: [PATCH 023/516] Doc togglefullscreen menu item role --- docs/api/menu-item.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/api/menu-item.md b/docs/api/menu-item.md index 391b639e11..13e8317b97 100644 --- a/docs/api/menu-item.md +++ b/docs/api/menu-item.md @@ -52,6 +52,7 @@ The `role` property can have following values: * `minimize` - Minimize current window * `close` - Close current window * `quit`- Quit the application +* `togglefullscreen`- Toggle full screen mode on the current window On macOS `role` can also have following additional values: From 3505e98a46c9edf06c7b110b743a6dbe2da0a054 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 10:06:56 -0700 Subject: [PATCH 024/516] Access function in methodInBrowserWindow --- lib/browser/api/menu-item.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index de5aab28ef..651de147af 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -82,12 +82,10 @@ const MenuItem = (function () { const methodName = rolesMap[this.role] if (methodInApp[methodName]) { return app[methodName]() + } else if (typeof methodInBrowserWindow[methodName] === 'function') { + return methodInBrowserWindow[methodName](focusedWindow) } else if (methodInBrowserWindow[methodName]) { - if (typeof methodName === 'function') { - return methodName(focusedWindow) - } else { - return focusedWindow[methodName]() - } + return focusedWindow[methodName]() } else { const {webContents} = focusedWindow return webContents != null ? webContents[methodName]() : void 0 From 738edb650d8a6b2023284b05e8731f5cbc81039a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 12:33:02 -0700 Subject: [PATCH 025/516] Make NSDeleteFunctionKey to NSDeleteCharacter --- atom/browser/ui/accelerator_util_mac.mm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/atom/browser/ui/accelerator_util_mac.mm b/atom/browser/ui/accelerator_util_mac.mm index e2448833ab..cf1d3de4d2 100644 --- a/atom/browser/ui/accelerator_util_mac.mm +++ b/atom/browser/ui/accelerator_util_mac.mm @@ -29,6 +29,10 @@ void SetPlatformAccelerator(ui::Accelerator* accelerator) { modifiers ^= NSShiftKeyMask; } + if (character == NSDeleteFunctionKey) { + character = NSDeleteCharacter; + } + NSString* characters = [[[NSString alloc] initWithCharacters:&character length:1] autorelease]; From 9486df1303e889a3ac2f8e3284cf271624383cc3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 12:38:44 -0700 Subject: [PATCH 026/516] Add delete accelerator to delete menu --- default_app/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/default_app/main.js b/default_app/main.js index 4c3c658420..7b9ba67d59 100644 --- a/default_app/main.js +++ b/default_app/main.js @@ -86,6 +86,7 @@ app.once('ready', () => { }, { label: 'Delete', + accelerator: 'Delete', role: 'delete' }, { From 583cc925ac93ed3bcc8a958bffec281f80f8c361 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 15:25:14 -0700 Subject: [PATCH 027/516] Map roles by command id --- atom/browser/ui/atom_menu_model.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/atom/browser/ui/atom_menu_model.cc b/atom/browser/ui/atom_menu_model.cc index 9add7a2271..369684dd3f 100644 --- a/atom/browser/ui/atom_menu_model.cc +++ b/atom/browser/ui/atom_menu_model.cc @@ -17,12 +17,14 @@ AtomMenuModel::~AtomMenuModel() { } void AtomMenuModel::SetRole(int index, const base::string16& role) { - roles_[index] = role; + int command_id = GetCommandIdAt(index); + roles_[command_id] = role; } base::string16 AtomMenuModel::GetRoleAt(int index) { - if (ContainsKey(roles_, index)) - return roles_[index]; + int command_id = GetCommandIdAt(index); + if (ContainsKey(roles_, command_id)) + return roles_[command_id]; else return base::string16(); } From 812dea9a8b80a05d8fda6e176dd2314f4e6aad9b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 15:28:02 -0700 Subject: [PATCH 028/516] Add comment about map key/values --- atom/browser/ui/atom_menu_model.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atom/browser/ui/atom_menu_model.h b/atom/browser/ui/atom_menu_model.h index d091df9fb5..1112949e7e 100644 --- a/atom/browser/ui/atom_menu_model.h +++ b/atom/browser/ui/atom_menu_model.h @@ -42,7 +42,7 @@ class AtomMenuModel : public ui::SimpleMenuModel { private: Delegate* delegate_; // weak ref. - std::map roles_; + std::map roles_; // command id -> role base::ObserverList observers_; DISALLOW_COPY_AND_ASSIGN(AtomMenuModel); From 08a1e926500a8eb16dd600ae60277fa042821748 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 22 Jun 2016 10:26:54 +0900 Subject: [PATCH 029/516] Bump v1.2.4 --- atom/browser/resources/mac/Info.plist | 4 ++-- atom/browser/resources/win/atom.rc | 8 ++++---- atom/common/atom_version.h | 2 +- electron.gyp | 2 +- package.json | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/atom/browser/resources/mac/Info.plist b/atom/browser/resources/mac/Info.plist index 46898637c5..41d8a27ea8 100644 --- a/atom/browser/resources/mac/Info.plist +++ b/atom/browser/resources/mac/Info.plist @@ -17,9 +17,9 @@ CFBundleIconFile electron.icns CFBundleVersion - 1.2.3 + 1.2.4 CFBundleShortVersionString - 1.2.3 + 1.2.4 LSApplicationCategoryType public.app-category.developer-tools LSMinimumSystemVersion diff --git a/atom/browser/resources/win/atom.rc b/atom/browser/resources/win/atom.rc index b6df17ca1d..370a1e8f3d 100644 --- a/atom/browser/resources/win/atom.rc +++ b/atom/browser/resources/win/atom.rc @@ -56,8 +56,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,2,3,0 - PRODUCTVERSION 1,2,3,0 + FILEVERSION 1,2,4,0 + PRODUCTVERSION 1,2,4,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -74,12 +74,12 @@ BEGIN BEGIN VALUE "CompanyName", "GitHub, Inc." VALUE "FileDescription", "Electron" - VALUE "FileVersion", "1.2.3" + VALUE "FileVersion", "1.2.4" VALUE "InternalName", "electron.exe" VALUE "LegalCopyright", "Copyright (C) 2015 GitHub, Inc. All rights reserved." VALUE "OriginalFilename", "electron.exe" VALUE "ProductName", "Electron" - VALUE "ProductVersion", "1.2.3" + VALUE "ProductVersion", "1.2.4" VALUE "SquirrelAwareVersion", "1" END END diff --git a/atom/common/atom_version.h b/atom/common/atom_version.h index d649af2a6e..7bf5a09702 100644 --- a/atom/common/atom_version.h +++ b/atom/common/atom_version.h @@ -7,7 +7,7 @@ #define ATOM_MAJOR_VERSION 1 #define ATOM_MINOR_VERSION 2 -#define ATOM_PATCH_VERSION 3 +#define ATOM_PATCH_VERSION 4 #define ATOM_VERSION_IS_RELEASE 1 diff --git a/electron.gyp b/electron.gyp index 09c1e27979..d0657df31d 100644 --- a/electron.gyp +++ b/electron.gyp @@ -4,7 +4,7 @@ 'product_name%': 'Electron', 'company_name%': 'GitHub, Inc', 'company_abbr%': 'github', - 'version%': '1.2.3', + 'version%': '1.2.4', }, 'includes': [ 'filenames.gypi', diff --git a/package.json b/package.json index f4eb3eb287..bce8c02dfc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "electron", - "version": "1.2.3", + "version": "1.2.4", "devDependencies": { "asar": "^0.11.0", "request": "*", From e6327fb01570698d5578ca505fa6b696c50fe8f5 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 22 Jun 2016 11:00:45 +0900 Subject: [PATCH 030/516] Add EventEmitter::CreateEventFromFlags --- atom/browser/api/atom_api_tray.cc | 26 +++----------------------- atom/browser/api/atom_api_tray.h | 2 -- atom/browser/api/event_emitter.cc | 10 ++++++++++ atom/browser/api/event_emitter.h | 11 +++++++++++ 4 files changed, 24 insertions(+), 25 deletions(-) diff --git a/atom/browser/api/atom_api_tray.cc b/atom/browser/api/atom_api_tray.cc index 85c0578a8e..6bbad738b3 100644 --- a/atom/browser/api/atom_api_tray.cc +++ b/atom/browser/api/atom_api_tray.cc @@ -16,7 +16,6 @@ #include "atom/common/node_includes.h" #include "native_mate/constructor.h" #include "native_mate/dictionary.h" -#include "ui/events/event_constants.h" #include "ui/gfx/image/image.h" namespace atom { @@ -44,24 +43,15 @@ mate::WrappableBase* Tray::New(v8::Isolate* isolate, } void Tray::OnClicked(const gfx::Rect& bounds, int modifiers) { - v8::Locker locker(isolate()); - v8::HandleScope handle_scope(isolate()); - EmitCustomEvent("click", - ModifiersToObject(isolate(), modifiers), bounds); + EmitWithFlags("click", modifiers, bounds); } void Tray::OnDoubleClicked(const gfx::Rect& bounds, int modifiers) { - v8::Locker locker(isolate()); - v8::HandleScope handle_scope(isolate()); - EmitCustomEvent("double-click", - ModifiersToObject(isolate(), modifiers), bounds); + EmitWithFlags("double-click", modifiers, bounds); } void Tray::OnRightClicked(const gfx::Rect& bounds, int modifiers) { - v8::Locker locker(isolate()); - v8::HandleScope handle_scope(isolate()); - EmitCustomEvent("right-click", - ModifiersToObject(isolate(), modifiers), bounds); + EmitWithFlags("right-click", modifiers, bounds); } void Tray::OnBalloonShow() { @@ -163,16 +153,6 @@ gfx::Rect Tray::GetBounds() { return tray_icon_->GetBounds(); } -v8::Local Tray::ModifiersToObject(v8::Isolate* isolate, - int modifiers) { - mate::Dictionary obj(isolate, v8::Object::New(isolate)); - obj.Set("shiftKey", static_cast(modifiers & ui::EF_SHIFT_DOWN)); - obj.Set("ctrlKey", static_cast(modifiers & ui::EF_CONTROL_DOWN)); - obj.Set("altKey", static_cast(modifiers & ui::EF_ALT_DOWN)); - obj.Set("metaKey", static_cast(modifiers & ui::EF_COMMAND_DOWN)); - return obj.GetHandle(); -} - // static void Tray::BuildPrototype(v8::Isolate* isolate, v8::Local prototype) { diff --git a/atom/browser/api/atom_api_tray.h b/atom/browser/api/atom_api_tray.h index 0bc28af818..4dd79c467f 100644 --- a/atom/browser/api/atom_api_tray.h +++ b/atom/browser/api/atom_api_tray.h @@ -68,8 +68,6 @@ class Tray : public mate::TrackableObject, gfx::Rect GetBounds(); private: - v8::Local ModifiersToObject(v8::Isolate* isolate, int modifiers); - v8::Global menu_; std::unique_ptr tray_icon_; diff --git a/atom/browser/api/event_emitter.cc b/atom/browser/api/event_emitter.cc index 7e392fddee..e98008b85d 100644 --- a/atom/browser/api/event_emitter.cc +++ b/atom/browser/api/event_emitter.cc @@ -8,6 +8,7 @@ #include "native_mate/arguments.h" #include "native_mate/dictionary.h" #include "native_mate/object_template_builder.h" +#include "ui/events/event_constants.h" namespace mate { @@ -65,6 +66,15 @@ v8::Local CreateCustomEvent( return event; } +v8::Local CreateEventFromFlags(v8::Isolate* isolate, int flags) { + mate::Dictionary obj = mate::Dictionary::CreateEmpty(isolate); + obj.Set("shiftKey", static_cast(flags & ui::EF_SHIFT_DOWN)); + obj.Set("ctrlKey", static_cast(flags & ui::EF_CONTROL_DOWN)); + obj.Set("altKey", static_cast(flags & ui::EF_ALT_DOWN)); + obj.Set("metaKey", static_cast(flags & ui::EF_COMMAND_DOWN)); + return obj.GetHandle(); +} + } // namespace internal } // namespace mate diff --git a/atom/browser/api/event_emitter.h b/atom/browser/api/event_emitter.h index 99f6ed46e4..ead3beddaa 100644 --- a/atom/browser/api/event_emitter.h +++ b/atom/browser/api/event_emitter.h @@ -30,6 +30,7 @@ v8::Local CreateCustomEvent( v8::Isolate* isolate, v8::Local object, v8::Local event); +v8::Local CreateEventFromFlags(v8::Isolate* isolate, int flags); } // namespace internal @@ -54,6 +55,16 @@ class EventEmitter : public Wrappable { internal::CreateCustomEvent(isolate(), GetWrapper(), event), args...); } + // this.emit(name, new Event(flags), args...); + template + bool EmitWithFlags(const base::StringPiece& name, + int flags, + const Args&... args) { + return EmitCustomEvent( + name, + internal::CreateEventFromFlags(isolate(), flags), args...); + } + // this.emit(name, new Event(), args...); template bool Emit(const base::StringPiece& name, const Args&... args) { From 8d08e215b2284a66267b2209954b3f37157dac34 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 22 Jun 2016 11:22:14 +0900 Subject: [PATCH 031/516] Add "event" parameter for "click" handler of MenuItem --- atom/browser/api/atom_api_menu.cc | 6 ++++-- atom/browser/api/atom_api_menu.h | 2 +- docs/api/menu-item.md | 4 ++-- lib/browser/api/menu-item.js | 4 ++-- lib/browser/api/menu.js | 4 ++-- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/atom/browser/api/atom_api_menu.cc b/atom/browser/api/atom_api_menu.cc index 996c71739b..c9cd37522b 100644 --- a/atom/browser/api/atom_api_menu.cc +++ b/atom/browser/api/atom_api_menu.cc @@ -61,8 +61,10 @@ bool Menu::GetAcceleratorForCommandId(int command_id, return mate::ConvertFromV8(isolate(), val, accelerator); } -void Menu::ExecuteCommand(int command_id, int event_flags) { - execute_command_.Run(command_id); +void Menu::ExecuteCommand(int command_id, int flags) { + execute_command_.Run( + mate::internal::CreateEventFromFlags(isolate(), flags), + command_id); } void Menu::MenuWillShow(ui::SimpleMenuModel* source) { diff --git a/atom/browser/api/atom_api_menu.h b/atom/browser/api/atom_api_menu.h index 9ba4d7a754..53c6bdaf4e 100644 --- a/atom/browser/api/atom_api_menu.h +++ b/atom/browser/api/atom_api_menu.h @@ -90,7 +90,7 @@ class Menu : public mate::TrackableObject, base::Callback is_enabled_; base::Callback is_visible_; base::Callback(int)> get_accelerator_; - base::Callback execute_command_; + base::Callback, int)> execute_command_; base::Callback menu_will_show_; DISALLOW_COPY_AND_ASSIGN(Menu); diff --git a/docs/api/menu-item.md b/docs/api/menu-item.md index 13e8317b97..7cb434288b 100644 --- a/docs/api/menu-item.md +++ b/docs/api/menu-item.md @@ -11,8 +11,8 @@ Create a new `MenuItem` with the following method: ### new MenuItem(options) * `options` Object - * `click` Function - Will be called with `click(menuItem, browserWindow)` when - the menu item is clicked + * `click` Function - Will be called with + `click(menuItem, browserWindow, event)` when the menu item is clicked * `role` String - Define the action of the menu item; when specified the `click` property will be ignored * `type` String - Can be `normal`, `separator`, `submenu`, `checkbox` or diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index 651de147af..b0100b7f2f 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -72,7 +72,7 @@ const MenuItem = (function () { throw new Error('Unknown menu type ' + this.type) } this.commandId = ++nextCommandId - this.click = (focusedWindow) => { + this.click = (event, focusedWindow) => { // Manually flip the checked flags when clicked. if (this.type === 'checkbox' || this.type === 'radio') { this.checked = !this.checked @@ -91,7 +91,7 @@ const MenuItem = (function () { return webContents != null ? webContents[methodName]() : void 0 } } else if (typeof click === 'function') { - return click(this, focusedWindow) + return click(this, focusedWindow, event) } else if (typeof this.selector === 'string' && process.platform === 'darwin') { return Menu.sendActionToFirstResponder(this.selector) } diff --git a/lib/browser/api/menu.js b/lib/browser/api/menu.js index b122fc36cf..3b10821936 100644 --- a/lib/browser/api/menu.js +++ b/lib/browser/api/menu.js @@ -114,9 +114,9 @@ Menu.prototype._init = function () { var command = this.commandsMap[commandId] return command != null ? command.icon : undefined }, - executeCommand: (commandId) => { + executeCommand: (event, commandId) => { var command = this.commandsMap[commandId] - return command != null ? command.click(BrowserWindow.getFocusedWindow()) : undefined + return command != null ? command.click(event, BrowserWindow.getFocusedWindow()) : undefined }, menuWillShow: () => { // Make sure radio groups have at least one menu item seleted. From 62d0dbea5a2382dacc2231a6150d0a4699498e4b Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 22 Jun 2016 13:23:07 +0900 Subject: [PATCH 032/516] docs: Reformat the menu-item.md --- docs/api/menu-item.md | 52 ++++++++++++++++++++++++++----------------- docs/api/session.md | 1 + 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/docs/api/menu-item.md b/docs/api/menu-item.md index 7cb434288b..0d05d81bcd 100644 --- a/docs/api/menu-item.md +++ b/docs/api/menu-item.md @@ -2,7 +2,7 @@ > Add items to native application menus and context menus. -See [`menu`](menu.md) for examples. +See [`Menu`](menu.md) for examples. ## Class: MenuItem @@ -12,11 +12,11 @@ Create a new `MenuItem` with the following method: * `options` Object * `click` Function - Will be called with - `click(menuItem, browserWindow, event)` when the menu item is clicked - * `role` String - Define the action of the menu item; when specified the - `click` property will be ignored + `click(menuItem, browserWindow, event)` when the menu item is clicked. + * `role` String - Define the action of the menu item, when specified the + `click` property will be ignored. * `type` String - Can be `normal`, `separator`, `submenu`, `checkbox` or - `radio` + `radio`. * `label` String * `sublabel` String * `accelerator` [Accelerator](accelerator.md) @@ -25,15 +25,15 @@ Create a new `MenuItem` with the following method: unclickable. * `visible` Boolean - If false, the menu item will be entirely hidden. * `checked` Boolean - Should only be specified for `checkbox` or `radio` type - menu items. + menu items. * `submenu` Menu - Should be specified for `submenu` type menu items. If - `submenu` is specified, the `type: 'submenu'` can be omitted. If the value - is not a `Menu` then it will be automatically converted to one using - `Menu.buildFromTemplate`. + `submenu` is specified, the `type: 'submenu'` can be omitted. If the value + is not a `Menu` then it will be automatically converted to one using + `Menu.buildFromTemplate`. * `id` String - Unique within a single menu. If defined then it can be used - as a reference to this item by the position attribute. + as a reference to this item by the position attribute. * `position` String - This field allows fine-grained definition of the - specific location within a given menu. + specific location within a given menu. It is best to specify `role` for any menu item that matches a standard role, rather than trying to manually implement the behavior in a `click` function. @@ -69,19 +69,29 @@ On macOS `role` can also have following additional values: When specifying `role` on macOS, `label` and `accelerator` are the only options that will affect the MenuItem. All other options will be ignored. -## Instance Properties +### Instance Properties -The following properties (and no others) can be updated on an existing `MenuItem`: +The following properties are available on instances of `MenuItem`: - * `enabled` Boolean - * `visible` Boolean - * `checked` Boolean +#### `menuItem.enabled` -Their meanings are as described above. +A Boolean indicating whether the item is enabled, this property can be +dynamically changed. -A `checkbox` menu item will toggle its `checked` property on and off when -selected. You can add a `click` function to do additional work. +#### `menuItem.visible` + +A Boolean indicating whether the item is visible, this property can be +dynamically changed. + +#### `menuItem.checked` + +A Boolean indicating whether the item is checked, this property can be +dynamically changed. + +A `checkbox` menu item will toggle the `checked` property on and off when +selected. A `radio` menu item will turn on its `checked` property when clicked, and -will turn off that property for all adjacent items in the same menu. Again, -you can add a `click` function for additional behavior. +will turn off that property for all adjacent items in the same menu. + +You can add a `click` function for additional behavior. diff --git a/docs/api/session.md b/docs/api/session.md index 030b2c7542..0486b1ddbd 100644 --- a/docs/api/session.md +++ b/docs/api/session.md @@ -566,3 +566,4 @@ app.on('ready', function () { console.error('Failed to register protocol') }) }) +``` From 90b64504fcc4d72272ee12a89133a45904739999 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 22 Jun 2016 13:36:10 +0900 Subject: [PATCH 033/516] spec: Fix failing tests of Menu --- spec/api-menu-spec.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/api-menu-spec.js b/spec/api-menu-spec.js index 6866448e0f..a8cc5b518c 100644 --- a/spec/api-menu-spec.js +++ b/spec/api-menu-spec.js @@ -231,7 +231,7 @@ describe('menu module', function () { } } ]) - menu.delegate.executeCommand(menu.items[0].commandId) + menu.delegate.executeCommand({}, menu.items[0].commandId) }) }) @@ -244,7 +244,7 @@ describe('menu module', function () { } ]) assert.equal(menu.items[0].checked, false) - menu.delegate.executeCommand(menu.items[0].commandId) + menu.delegate.executeCommand({}, menu.items[0].commandId) assert.equal(menu.items[0].checked, true) }) @@ -255,9 +255,9 @@ describe('menu module', function () { type: 'radio' } ]) - menu.delegate.executeCommand(menu.items[0].commandId) + menu.delegate.executeCommand({}, menu.items[0].commandId) assert.equal(menu.items[0].checked, true) - menu.delegate.executeCommand(menu.items[0].commandId) + menu.delegate.executeCommand({}, menu.items[0].commandId) assert.equal(menu.items[0].checked, true) }) From 8ffd069689d9ad81a8492b5e01ecb85bada604d4 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 22 Jun 2016 14:06:54 +0900 Subject: [PATCH 034/516] mac: Fix maximize/unmaximize event emitted before window is maximized --- atom/browser/native_window_mac.mm | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 5f997ee9b6..3330eb8e9f 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -70,6 +70,7 @@ bool ScopedDisableResize::disable_resize_ = false; @interface AtomNSWindowDelegate : NSObject { @private atom::NativeWindowMac* shell_; + bool is_zooming_; } - (id)initWithShell:(atom::NativeWindowMac*)shell; @end @@ -79,6 +80,7 @@ bool ScopedDisableResize::disable_resize_ = false; - (id)initWithShell:(atom::NativeWindowMac*)shell { if ((self = [super init])) { shell_ = shell; + is_zooming_ = false; } return self; } @@ -172,16 +174,20 @@ bool ScopedDisableResize::disable_resize_ = false; } - (BOOL)windowShouldZoom:(NSWindow*)window toFrame:(NSRect)newFrame { - // Cocoa doen't have concept of maximize/unmaximize, so wee need to emulate - // them by calculating size change when zooming. - if (newFrame.size.width < [window frame].size.width || - newFrame.size.height < [window frame].size.height) - shell_->NotifyWindowUnmaximize(); - else - shell_->NotifyWindowMaximize(); + is_zooming_ = true; return YES; } +- (void)windowDidEndLiveResize:(NSNotification*)notification { + if (is_zooming_) { + if (shell_->IsMaximized()) + shell_->NotifyWindowMaximize(); + else + shell_->NotifyWindowUnmaximize(); + is_zooming_ = false; + } +} + - (void)windowWillEnterFullScreen:(NSNotification*)notification { // Hide the native toolbar before entering fullscreen, so there is no visual // artifacts. From 0d481aaeb8a4f77b1aebf205657132d79d64aa15 Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Fri, 17 Jun 2016 12:16:15 -0700 Subject: [PATCH 035/516] :memo: use h3 headings for events and methods, per the styleguide --- docs-translations/jp/api/session.md | 44 ++++++++-------- docs-translations/ko-KR/api/menu.md | 2 +- docs-translations/ko-KR/api/session.md | 54 +++++++++---------- docs-translations/ko-KR/api/web-contents.md | 4 +- docs-translations/zh-CN/api/session.md | 50 +++++++++--------- docs-translations/zh-CN/api/web-contents.md | 4 +- docs/api/session.md | 58 ++++++++++----------- docs/api/web-contents.md | 4 +- 8 files changed, 110 insertions(+), 110 deletions(-) diff --git a/docs-translations/jp/api/session.md b/docs-translations/jp/api/session.md index a5d47d404a..84e0d08deb 100644 --- a/docs-translations/jp/api/session.md +++ b/docs-translations/jp/api/session.md @@ -70,7 +70,7 @@ session.defaultSession.on('will-download', function(event, item, webContents) { `Session`のインスタンス上で次のメソッドが提供されています: -#### `ses.cookies` +### `ses.cookies` `cookies`は、cookiesに問い合わせしたり、修正をできるようにします。例: @@ -94,7 +94,7 @@ session.defaultSession.cookies.set(cookie, function(error) { }); ``` -#### `ses.cookies.get(filter, callback)` +### `ses.cookies.get(filter, callback)` * `filter` Object * `url` String (オプション) - `url`に関連付けられているcookiesを取得します。空の場合すべてのurlのcookiesを取得します @@ -122,7 +122,7 @@ session.defaultSession.cookies.set(cookie, function(error) { cookieの有効期限をUNIX時間で何秒かを示します。セッションcookiesは提供されません。 -#### `ses.cookies.set(details, callback)` +### `ses.cookies.set(details, callback)` * `details` Object * `url` String - `url`に関連付けられているcookiesを取得します。 @@ -137,7 +137,7 @@ cookieの有効期限をUNIX時間で何秒かを示します。セッションc `details`でcookieを設定し、完了すると`callback(error)`で`callback`がコールされます。 -#### `ses.cookies.remove(url, name, callback)` +### `ses.cookies.remove(url, name, callback)` * `url` String - cookieに関連付けられているURL * `name` String - 削除するcookieの名前 @@ -145,20 +145,20 @@ cookieの有効期限をUNIX時間で何秒かを示します。セッションc `url` と `name`と一致するcookiesを削除し、完了すると`callback`が、`callback()`でコールされます。 -#### `ses.getCacheSize(callback)` +### `ses.getCacheSize(callback)` * `callback` Function * `size` Integer - 使用しているキャッシュサイズバイト数 現在のセッションのキャッシュサイズを返します。 -#### `ses.clearCache(callback)` +### `ses.clearCache(callback)` * `callback` Function - 操作が完了したら、コールされます。 セッションのHTTPキャッシュをクリアします。 -#### `ses.clearStorageData([options, ]callback)` +### `ses.clearStorageData([options, ]callback)` * `options` Object (オプション) * `origin` String - `window.location.origin`の説明で、`scheme://host:port`に従う @@ -171,11 +171,11 @@ cookieの有効期限をUNIX時間で何秒かを示します。セッションc ウェブストレージのデータをクリアします。 -#### `ses.flushStorageData()` +### `ses.flushStorageData()` 書き込まれていないDOMStorageデータをディスクに書き込みます。 -#### `ses.setProxy(config, callback)` +### `ses.setProxy(config, callback)` * `config` Object * `pacScript` String - PACファイルに関連付けらえたURL @@ -213,13 +213,13 @@ proxyURL = ["://"][":"] `url`をプロキシ情報で解決します。リクエストが実行された時、`callback(proxy)`で `callback`がコールされます。 -#### `ses.setDownloadPath(path)` +### `ses.setDownloadPath(path)` * `path` String - ダウンロード場所 ダウンロードの保存ディレクトリを設定します。既定では、ダウンロードディレクトリは、個別のアプリフォルダー下の`Downloads`です。 -#### `ses.enableNetworkEmulation(options)` +### `ses.enableNetworkEmulation(options)` * `options` Object * `offline` Boolean - ネットワーク停止を再現するかどうか @@ -241,11 +241,11 @@ window.webContents.session.enableNetworkEmulation({ window.webContents.session.enableNetworkEmulation({offline: true}); ``` -#### `ses.disableNetworkEmulation()` +### `ses.disableNetworkEmulation()` `session`ですでに有効になっているネットワークエミュレーションを無効化します。オリジナルのネットワーク設定にリセットします。 -#### `ses.setCertificateVerifyProc(proc)` +### `ses.setCertificateVerifyProc(proc)` * `proc` Function @@ -262,7 +262,7 @@ myWindow.webContents.session.setCertificateVerifyProc(function(hostname, cert, c }); ``` -#### `ses.webRequest` +### `ses.webRequest` `webRequest`APIセットをインターセプトし、そのライフタイムの様々な段階でリクエストの内容を変更できます。 @@ -284,7 +284,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, }); ``` -#### `ses.webRequest.onBeforeRequest([filter, ]listener)` +### `ses.webRequest.onBeforeRequest([filter, ]listener)` * `filter` Object * `listener` Function @@ -312,7 +312,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `cancel` Boolean (オプション) * `redirectURL` String (オプション) - オリジナルリクエストが送信もしくは完了するのを中断し、代わりに付与したURLにリダイレクトします。 -#### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` +### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -334,7 +334,7 @@ The `callback` has to be called with an `response` object: * `cancel` Boolean (オプション) * `requestHeaders` Object (オプション) - 付与されると、リクエストはそれらのヘッダーで作成されます。 -#### `ses.webRequest.onSendHeaders([filter, ]listener)` +### `ses.webRequest.onSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -349,7 +349,7 @@ The `callback` has to be called with an `response` object: * `timestamp` Double * `requestHeaders` Object -#### `ses.webRequest.onHeadersReceived([filter,] listener)` +### `ses.webRequest.onHeadersReceived([filter,] listener)` * `filter` Object * `listener` Function @@ -373,7 +373,7 @@ The `callback` has to be called with an `response` object: * `cancel` Boolean * `responseHeaders` Object (オプション) - 付与されていると、これらのヘッダーでサーバーはレスポンスしたと仮定します。 -#### `ses.webRequest.onResponseStarted([filter, ]listener)` +### `ses.webRequest.onResponseStarted([filter, ]listener)` * `filter` Object * `listener` Function @@ -391,7 +391,7 @@ The `callback` has to be called with an `response` object: * `statusCode` Integer * `statusLine` String -#### `ses.webRequest.onBeforeRedirect([filter, ]listener)` +### `ses.webRequest.onBeforeRedirect([filter, ]listener)` * `filter` Object * `listener` Function @@ -410,7 +410,7 @@ The `callback` has to be called with an `response` object: * `fromCache` Boolean * `responseHeaders` Object -#### `ses.webRequest.onCompleted([filter, ]listener)` +### `ses.webRequest.onCompleted([filter, ]listener)` * `filter` Object * `listener` Function @@ -428,7 +428,7 @@ The `callback` has to be called with an `response` object: * `statusCode` Integer * `statusLine` String -#### `ses.webRequest.onErrorOccurred([filter, ]listener)` +### `ses.webRequest.onErrorOccurred([filter, ]listener)` * `filter` Object * `listener` Function diff --git a/docs-translations/ko-KR/api/menu.md b/docs-translations/ko-KR/api/menu.md index eaee7e8d4f..36e6c091c1 100644 --- a/docs-translations/ko-KR/api/menu.md +++ b/docs-translations/ko-KR/api/menu.md @@ -217,7 +217,7 @@ Menu.setApplicationMenu(menu); 새로운 메뉴를 생성합니다. -### Methods +## Methods `menu` 클래스는 다음과 같은 메서드를 가지고 있습니다: diff --git a/docs-translations/ko-KR/api/session.md b/docs-translations/ko-KR/api/session.md index a2dc9b682a..5ee37a2705 100644 --- a/docs-translations/ko-KR/api/session.md +++ b/docs-translations/ko-KR/api/session.md @@ -53,7 +53,7 @@ const ses = session.fromPartition('persist:name'); `Session` 객체는 다음과 같은 이벤트를 가지고 있습니다: -#### Event: 'will-download' +### Event: 'will-download' * `event` Event * `item` [DownloadItem](download-item.md) @@ -77,7 +77,7 @@ session.defaultSession.on('will-download', (event, item, webContents) => { `Session` 객체는 다음과 같은 메서드와 속성을 가지고 있습니다: -#### `ses.cookies` +### `ses.cookies` `cookies` 속성은 쿠키를 조작하는 방법을 제공합니다. 예를 들어 다음과 같이 할 수 있습니다: @@ -102,7 +102,7 @@ session.defaultSession.cookies.set(cookie, (error) => { }); ``` -#### `ses.cookies.get(filter, callback)` +### `ses.cookies.get(filter, callback)` * `filter` Object * `url` String (optional) - `url`에 해당하는 쿠키를 취득합니다. 이 속성을 @@ -133,7 +133,7 @@ session.defaultSession.cookies.set(cookie, (error) => { * `expirationDate` Double - (Option) UNIX 시간으로 표시되는 쿠키의 만료일에 대한 초 단위 시간. 세션 쿠키는 지원되지 않음. -#### `ses.cookies.set(details, callback)` +### `ses.cookies.set(details, callback)` * `details` Object * `url` String - 쿠키에 대한 `url` 링크. @@ -153,7 +153,7 @@ session.defaultSession.cookies.set(cookie, (error) => { `details` 객체에 따라 쿠키를 설정합니다. 작업이 완료되면 `callback`이 `callback(error)` 형태로 호출됩니다. -#### `ses.cookies.remove(url, name, callback)` +### `ses.cookies.remove(url, name, callback)` * `url` String - 쿠키와 관련된 URL입니다. * `name` String - 지울 쿠키의 이름입니다. @@ -162,20 +162,20 @@ session.defaultSession.cookies.set(cookie, (error) => { `url`과 `name`에 일치하는 쿠키를 삭제합니다. 작업이 완료되면 `callback`이 `callback()` 형식으로 호출됩니다. -#### `ses.getCacheSize(callback)` +### `ses.getCacheSize(callback)` * `callback` Function * `size` Integer - 바이트로 표현된 캐시 크기 세션의 현재 캐시 크기를 반환합니다. -#### `ses.clearCache(callback)` +### `ses.clearCache(callback)` * `callback` Function - 작업이 완료되면 호출됩니다. 세션의 HTTP 캐시를 비웁니다. -#### `ses.clearStorageData([options, ]callback)` +### `ses.clearStorageData([options, ]callback)` * `options` Object (optional), proprties: * `origin` String - `scheme://host:port`와 같은 `window.location.origin` 규칙을 @@ -189,11 +189,11 @@ session.defaultSession.cookies.set(cookie, (error) => { 웹 스토리지의 데이터를 비웁니다. -#### `ses.flushStorageData()` +### `ses.flushStorageData()` 디스크에 사용되지 않은 DOMStorage 데이터를 모두 덮어씌웁니다. -#### `ses.setProxy(config, callback)` +### `ses.setProxy(config, callback)` * `config` Object * `pacScript` String - PAC 파일과 관련된 URL입니다. @@ -240,14 +240,14 @@ proxyURL = ["://"][":"] `url`의 프록시 정보를 해석합니다. `callback`은 요청이 수행되었을 때 `callback(proxy)` 형태로 호출됩니다. -#### `ses.setDownloadPath(path)` +### `ses.setDownloadPath(path)` * `path` String - 다운로드 위치 다운로드 저장 위치를 지정합니다. 기본 다운로드 위치는 각 애플리케이션 데이터 디렉터리의 `Downloads` 폴더입니다. -#### `ses.enableNetworkEmulation(options)` +### `ses.enableNetworkEmulation(options)` * `options` Object * `offline` Boolean - 네트워크의 오프라인 상태 여부 @@ -269,11 +269,11 @@ window.webContents.session.enableNetworkEmulation({ window.webContents.session.enableNetworkEmulation({offline: true}); ``` -#### `ses.disableNetworkEmulation()` +### `ses.disableNetworkEmulation()` 활성화된 `session`의 에뮬레이션을 비활성화합니다. 기본 네트워크 설정으로 돌아갑니다. -#### `ses.setCertificateVerifyProc(proc)` +### `ses.setCertificateVerifyProc(proc)` * `proc` Function @@ -292,7 +292,7 @@ myWindow.webContents.session.setCertificateVerifyProc((hostname, cert, callback) callback(false); }); ``` -#### `ses.setPermissionRequestHandler(handler)` +### `ses.setPermissionRequestHandler(handler)` * `handler` Function * `webContents` Object - [WebContents](web-contents.md) 권한을 요청. @@ -317,13 +317,13 @@ session.fromPartition(partition).setPermissionRequestHandler((webContents, permi }); ``` -#### `ses.clearHostResolverCache([callback])` +### `ses.clearHostResolverCache([callback])` * `callback` Function (optional) - 작업이 완료되면 호출됩니다. 호스트 리소버(resolver) 캐시를 지웁니다. -#### `ses.allowNTLMCredentialsForDomains(domains)` +### `ses.allowNTLMCredentialsForDomains(domains)` * `domains` String - 통합 인증을 사용하도록 설정할 쉼표로 구분된 서버의 리스트. @@ -339,7 +339,7 @@ session.defaultSession.allowNTLMCredentialsForDomains('*example.com, *foobar.com session.defaultSession.allowNTLMCredentialsForDomains('*') ``` -#### `ses.webRequest` +### `ses.webRequest` `webRequest` API는 생명주기의 다양한 단계에 맞춰 요청 콘텐츠를 가로채거나 변경할 수 있도록 합니다. @@ -367,7 +367,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, (details, callback }); ``` -#### `ses.webRequest.onBeforeRequest([filter, ]listener)` +### `ses.webRequest.onBeforeRequest([filter, ]listener)` * `filter` Object * `listener` Function @@ -396,7 +396,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, (details, callback * `redirectURL` String (optional) - 원래 요청은 전송과 완료가 방지되지만 이 속성을 지정하면 해당 URL로 리다이렉트됩니다. -#### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` +### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -421,7 +421,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `requestHeaders` Object (optional) - 이 속성이 제공되면, 요청은 이 헤더로 만들어 집니다. -#### `ses.webRequest.onSendHeaders([filter, ]listener)` +### `ses.webRequest.onSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -438,7 +438,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `timestamp` Double * `requestHeaders` Object -#### `ses.webRequest.onHeadersReceived([filter, ]listener)` +### `ses.webRequest.onHeadersReceived([filter, ]listener)` * `filter` Object * `listener` Function @@ -467,7 +467,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener 변경하기 위해 반드시 지정되어야 합니다. 그렇지 않은 경우, 기존의 응답 헤더의 상태가 사용됩니다. -#### `ses.webRequest.onResponseStarted([filter, ]listener)` +### `ses.webRequest.onResponseStarted([filter, ]listener)` * `filter` Object * `listener` Function @@ -486,7 +486,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `statusCode` Integer * `statusLine` String -#### `ses.webRequest.onBeforeRedirect([filter, ]listener)` +### `ses.webRequest.onBeforeRedirect([filter, ]listener)` * `filter` Object * `listener` Function @@ -506,7 +506,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `fromCache` Boolean * `responseHeaders` Object -#### `ses.webRequest.onCompleted([filter, ]listener)` +### `ses.webRequest.onCompleted([filter, ]listener)` * `filter` Object * `listener` Function @@ -524,7 +524,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `statusCode` Integer * `statusLine` String -#### `ses.webRequest.onErrorOccurred([filter, ]listener)` +### `ses.webRequest.onErrorOccurred([filter, ]listener)` * `filter` Object * `listener` Function @@ -540,7 +540,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `fromCache` Boolean * `error` String - 에러 설명. -#### `ses.protocol` +### `ses.protocol` 현재 세션의 [protocol](protocol.md) 모듈 인스턴스를 반환합니다. diff --git a/docs-translations/ko-KR/api/web-contents.md b/docs-translations/ko-KR/api/web-contents.md index 437b5dabbe..e0e5fd7771 100644 --- a/docs-translations/ko-KR/api/web-contents.md +++ b/docs-translations/ko-KR/api/web-contents.md @@ -1022,7 +1022,7 @@ win.webContents.debugger.sendCommand('Network.enable'); 지정한 커맨드를 디버깅 대상에게 전송합니다. -#### Event: 'detach' +### Event: 'detach' * `event` Event * `reason` String - 디버거 분리 사유. @@ -1030,7 +1030,7 @@ win.webContents.debugger.sendCommand('Network.enable'); 디버깅 세션이 종료될 때 발생하는 이벤트입니다. `webContents`가 닫히거나 개발자 도구가 부착된 `webContents`에 대해 호출될 때 발생합니다. -#### Event: 'message' +### Event: 'message' * `event` Event * `method` String - 메서드 이름. diff --git a/docs-translations/zh-CN/api/session.md b/docs-translations/zh-CN/api/session.md index b9664c08e6..b96290dbe3 100644 --- a/docs-translations/zh-CN/api/session.md +++ b/docs-translations/zh-CN/api/session.md @@ -47,7 +47,7 @@ var ses = session.fromPartition('persist:name'); 实例 `Session` 有以下事件: -#### Event: 'will-download' +### Event: 'will-download' * `event` Event * `item` [DownloadItem](download-item.md) @@ -70,7 +70,7 @@ session.defaultSession.on('will-download', function(event, item, webContents) { 实例 `Session` 有以下方法: -#### `ses.cookies` +### `ses.cookies` `cookies` 赋予你全力来查询和修改 cookies. 例如: @@ -94,7 +94,7 @@ session.defaultSession.cookies.set(cookie, function(error) { }); ``` -#### `ses.cookies.get(filter, callback)` +### `ses.cookies.get(filter, callback)` * `filter` Object * `url` String (可选) - 与获取 cookies 相关的 @@ -123,7 +123,7 @@ session.defaultSession.cookies.set(cookie, function(error) { cookie . * `expirationDate` Double (可选) - cookie的截至日期,数值为UNIX纪元以来的秒数. 对session cookies 不提供. -#### `ses.cookies.set(details, callback)` +### `ses.cookies.set(details, callback)` * `details` Object * `url` String - 与获取 cookies 相关的 @@ -140,7 +140,7 @@ session.defaultSession.cookies.set(cookie, function(error) { 使用 `details` 设置 cookie, 完成时使用 `callback(error)` 掉哟个 `callback` . -#### `ses.cookies.remove(url, name, callback)` +### `ses.cookies.remove(url, name, callback)` * `url` String - 与 cookies 相关的 `url`. @@ -149,20 +149,20 @@ session.defaultSession.cookies.set(cookie, function(error) { 删除匹配 `url` 和 `name` 的 cookie, 完成时使用 `callback()`调用`callback`. -#### `ses.getCacheSize(callback)` +### `ses.getCacheSize(callback)` * `callback` Function * `size` Integer - 单位 bytes 的缓存 size. 返回 session 的当前缓存 size . -#### `ses.clearCache(callback)` +### `ses.clearCache(callback)` * `callback` Function - 操作完成时调用 清空 session 的 HTTP 缓存. -#### `ses.clearStorageData([options, ]callback)` +### `ses.clearStorageData([options, ]callback)` * `options` Object (可选) * `origin` String - 应当遵循 `window.location.origin` 的格式 @@ -176,11 +176,11 @@ session.defaultSession.cookies.set(cookie, function(error) { 清除 web storages 的数据. -#### `ses.flushStorageData()` +### `ses.flushStorageData()` 将没有写入的 DOMStorage 写入磁盘. -#### `ses.setProxy(config, callback)` +### `ses.setProxy(config, callback)` * `config` Object * `pacScript` String - 与 PAC 文件相关的 URL. @@ -219,13 +219,13 @@ proxyURL = ["://"][":"] 解析 `url` 的代理信息.当请求完成的时候使用 `callback(proxy)` 调用 `callback`. -#### `ses.setDownloadPath(path)` +### `ses.setDownloadPath(path)` * `path` String - 下载地址 设置下载保存地址,默认保存地址为各自 app 应用的 `Downloads`目录. -#### `ses.enableNetworkEmulation(options)` +### `ses.enableNetworkEmulation(options)` * `options` Object * `offline` Boolean - 是否模拟网络故障. @@ -247,12 +247,12 @@ window.webContents.session.enableNetworkEmulation({ window.webContents.session.enableNetworkEmulation({offline: true}); ``` -#### `ses.disableNetworkEmulation()` +### `ses.disableNetworkEmulation()` 停止所有已经使用 `session` 的活跃模拟网络. 重置为原始网络类型. -#### `ses.setCertificateVerifyProc(proc)` +### `ses.setCertificateVerifyProc(proc)` * `proc` Function @@ -269,7 +269,7 @@ myWindow.webContents.session.setCertificateVerifyProc(function(hostname, cert, c }); ``` -#### `ses.setPermissionRequestHandler(handler)` +### `ses.setPermissionRequestHandler(handler)` * `handler` Function * `webContents` Object - [WebContents](web-contents.md) 请求许可. @@ -291,13 +291,13 @@ session.fromPartition(partition).setPermissionRequestHandler(function(webContent }); ``` -#### `ses.clearHostResolverCache([callback])` +### `ses.clearHostResolverCache([callback])` * `callback` Function (可选) - 操作结束调用. 清除主机解析缓存. -#### `ses.webRequest` +### `ses.webRequest` 在其生命周期的不同阶段,`webRequest` API 设置允许拦截并修改请求内容. @@ -319,7 +319,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, }); ``` -#### `ses.webRequest.onBeforeRequest([filter, ]listener)` +### `ses.webRequest.onBeforeRequest([filter, ]listener)` * `filter` Object * `listener` Function @@ -347,7 +347,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `cancel` Boolean (可选) * `redirectURL` String (可选) - 原始请求阻止发送或完成,而不是重定向. -#### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` +### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -369,7 +369,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `cancel` Boolean (可选) * `requestHeaders` Object (可选) - 如果提供了,将使用这些 headers 来创建请求. -#### `ses.webRequest.onSendHeaders([filter, ]listener)` +### `ses.webRequest.onSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -384,7 +384,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `timestamp` Double * `requestHeaders` Object -#### `ses.webRequest.onHeadersReceived([filter,] listener)` +### `ses.webRequest.onHeadersReceived([filter,] listener)` * `filter` Object * `listener` Function @@ -408,7 +408,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `cancel` Boolean * `responseHeaders` Object (可选) - 如果提供, 服务器将假定使用这些头来响应. -#### `ses.webRequest.onResponseStarted([filter, ]listener)` +### `ses.webRequest.onResponseStarted([filter, ]listener)` * `filter` Object * `listener` Function @@ -427,7 +427,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `statusCode` Integer * `statusLine` String -#### `ses.webRequest.onBeforeRedirect([filter, ]listener)` +### `ses.webRequest.onBeforeRedirect([filter, ]listener)` * `filter` Object * `listener` Function @@ -446,7 +446,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `fromCache` Boolean * `responseHeaders` Object -#### `ses.webRequest.onCompleted([filter, ]listener)` +### `ses.webRequest.onCompleted([filter, ]listener)` * `filter` Object * `listener` Function @@ -464,7 +464,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `statusCode` Integer * `statusLine` String -#### `ses.webRequest.onErrorOccurred([filter, ]listener)` +### `ses.webRequest.onErrorOccurred([filter, ]listener)` * `filter` Object * `listener` Function diff --git a/docs-translations/zh-CN/api/web-contents.md b/docs-translations/zh-CN/api/web-contents.md index 54b9c56dcc..c05b6d2593 100644 --- a/docs-translations/zh-CN/api/web-contents.md +++ b/docs-translations/zh-CN/api/web-contents.md @@ -846,14 +846,14 @@ win.webContents.debugger.sendCommand("Network.enable"); 发送给定命令给调试目标. -#### Event: 'detach' +### Event: 'detach' * `event` Event * `reason` String - 拆分调试器原因. 在调试 session 结束时发出事件.这在 `webContents` 关闭时或 `webContents` 请求开发者工具栏时发生. -#### Event: 'message' +### Event: 'message' * `event` Event * `method` String - 方法名. diff --git a/docs/api/session.md b/docs/api/session.md index 0486b1ddbd..e4ef07d6c7 100644 --- a/docs/api/session.md +++ b/docs/api/session.md @@ -50,11 +50,11 @@ const session = require('electron').session; const ses = session.fromPartition('persist:name'); ``` -### Instance Events +## Events The following events are available on instances of `Session`: -#### Event: 'will-download' +### Event: 'will-download' * `event` Event * `item` [DownloadItem](download-item.md) @@ -74,11 +74,11 @@ session.defaultSession.on('will-download', (event, item, webContents) => { }); ``` -### Instance Methods +## Instance Methods The following methods are available on instances of `Session`: -#### `ses.cookies` +### `ses.cookies` The `cookies` gives you ability to query and modify cookies. For example: @@ -102,7 +102,7 @@ session.defaultSession.cookies.set(cookie, (error) => { }); ``` -#### `ses.cookies.get(filter, callback)` +### `ses.cookies.get(filter, callback)` * `filter` Object * `url` String (optional) - Retrieves cookies which are associated with @@ -134,7 +134,7 @@ with `callback(error, cookies)` on complete. the number of seconds since the UNIX epoch. Not provided for session cookies. -#### `ses.cookies.set(details, callback)` +### `ses.cookies.set(details, callback)` * `details` Object * `url` String - The url to associate the cookie with. @@ -154,7 +154,7 @@ with `callback(error, cookies)` on complete. Sets a cookie with `details`, `callback` will be called with `callback(error)` on complete. -#### `ses.cookies.remove(url, name, callback)` +### `ses.cookies.remove(url, name, callback)` * `url` String - The URL associated with the cookie. * `name` String - The name of cookie to remove. @@ -163,20 +163,20 @@ on complete. Removes the cookies matching `url` and `name`, `callback` will called with `callback()` on complete. -#### `ses.getCacheSize(callback)` +### `ses.getCacheSize(callback)` * `callback` Function * `size` Integer - Cache size used in bytes. Returns the session's current cache size. -#### `ses.clearCache(callback)` +### `ses.clearCache(callback)` * `callback` Function - Called when operation is done Clears the session’s HTTP cache. -#### `ses.clearStorageData([options, ]callback)` +### `ses.clearStorageData([options, ]callback)` * `options` Object (optional) * `origin` String - Should follow `window.location.origin`’s representation @@ -190,11 +190,11 @@ Clears the session’s HTTP cache. Clears the data of web storages. -#### `ses.flushStorageData()` +### `ses.flushStorageData()` Writes any unwritten DOMStorage data to disk. -#### `ses.setProxy(config, callback)` +### `ses.setProxy(config, callback)` * `config` Object * `pacScript` String - The URL associated with the PAC file. @@ -239,14 +239,14 @@ For example: Resolves the proxy information for `url`. The `callback` will be called with `callback(proxy)` when the request is performed. -#### `ses.setDownloadPath(path)` +### `ses.setDownloadPath(path)` * `path` String - The download location Sets download saving directory. By default, the download directory will be the `Downloads` under the respective app folder. -#### `ses.enableNetworkEmulation(options)` +### `ses.enableNetworkEmulation(options)` * `options` Object * `offline` Boolean - Whether to emulate network outage. @@ -268,12 +268,12 @@ window.webContents.session.enableNetworkEmulation({ window.webContents.session.enableNetworkEmulation({offline: true}); ``` -#### `ses.disableNetworkEmulation()` +### `ses.disableNetworkEmulation()` Disables any network emulation already active for the `session`. Resets to the original network configuration. -#### `ses.setCertificateVerifyProc(proc)` +### `ses.setCertificateVerifyProc(proc)` * `proc` Function @@ -294,7 +294,7 @@ myWindow.webContents.session.setCertificateVerifyProc((hostname, cert, callback) }); ``` -#### `ses.setPermissionRequestHandler(handler)` +### `ses.setPermissionRequestHandler(handler)` * `handler` Function * `webContents` Object - [WebContents](web-contents.md) requesting the permission. @@ -318,13 +318,13 @@ session.fromPartition(partition).setPermissionRequestHandler((webContents, permi }); ``` -#### `ses.clearHostResolverCache([callback])` +### `ses.clearHostResolverCache([callback])` * `callback` Function (optional) - Called when operation is done. Clears the host resolver cache. -#### `ses.allowNTLMCredentialsForDomains(domains)` +### `ses.allowNTLMCredentialsForDomains(domains)` * `domains` String - A comma-seperated list of servers for which integrated authentication is enabled. @@ -341,7 +341,7 @@ session.defaultSession.allowNTLMCredentialsForDomains('*example.com, *foobar.com session.defaultSession.allowNTLMCredentialsForDomains('*') ``` -#### `ses.webRequest` +### `ses.webRequest` The `webRequest` API set allows to intercept and modify contents of a request at various stages of its lifetime. @@ -370,7 +370,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, (details, callback }); ``` -#### `ses.webRequest.onBeforeRequest([filter, ]listener)` +### `ses.webRequest.onBeforeRequest([filter, ]listener)` * `filter` Object * `listener` Function @@ -400,7 +400,7 @@ The `callback` has to be called with an `response` object: * `redirectURL` String (optional) - The original request is prevented from being sent or completed, and is instead redirected to the given URL. -#### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` +### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -425,7 +425,7 @@ The `callback` has to be called with an `response` object: * `requestHeaders` Object (optional) - When provided, request will be made with these headers. -#### `ses.webRequest.onSendHeaders([filter, ]listener)` +### `ses.webRequest.onSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -442,7 +442,7 @@ response are visible by the time this listener is fired. * `timestamp` Double * `requestHeaders` Object -#### `ses.webRequest.onHeadersReceived([filter,]listener)` +### `ses.webRequest.onHeadersReceived([filter,]listener)` * `filter` Object * `listener` Function @@ -471,7 +471,7 @@ The `callback` has to be called with an `response` object: `responseHeaders` to change header status otherwise original response header's status will be used. -#### `ses.webRequest.onResponseStarted([filter, ]listener)` +### `ses.webRequest.onResponseStarted([filter, ]listener)` * `filter` Object * `listener` Function @@ -492,7 +492,7 @@ and response headers are available. * `statusCode` Integer * `statusLine` String -#### `ses.webRequest.onBeforeRedirect([filter, ]listener)` +### `ses.webRequest.onBeforeRedirect([filter, ]listener)` * `filter` Object * `listener` Function @@ -513,7 +513,7 @@ redirect is about to occur. * `fromCache` Boolean * `responseHeaders` Object -#### `ses.webRequest.onCompleted([filter, ]listener)` +### `ses.webRequest.onCompleted([filter, ]listener)` * `filter` Object * `listener` Function @@ -532,7 +532,7 @@ completed. * `statusCode` Integer * `statusLine` String -#### `ses.webRequest.onErrorOccurred([filter, ]listener)` +### `ses.webRequest.onErrorOccurred([filter, ]listener)` * `filter` Object * `listener` Function @@ -548,7 +548,7 @@ The `listener` will be called with `listener(details)` when an error occurs. * `fromCache` Boolean * `error` String - The error description. -#### `ses.protocol` +### `ses.protocol` Returns an instance of [protocol](protocol.md) module for this session. diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index fec4708d1c..220776b058 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -1035,7 +1035,7 @@ Detaches the debugger from the `webContents`. Send given command to the debugging target. -#### Event: 'detach' +### Event: 'detach' * `event` Event * `reason` String - Reason for detaching debugger. @@ -1043,7 +1043,7 @@ Send given command to the debugging target. Emitted when debugging session is terminated. This happens either when `webContents` is closed or devtools is invoked for the attached `webContents`. -#### Event: 'message' +### Event: 'message' * `event` Event * `method` String - Method name. From 74e0535659d1f37060680e4730904c4a47e39eba Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Fri, 17 Jun 2016 12:26:08 -0700 Subject: [PATCH 036/516] use unformatted raw code examples in styleguide --- docs/styleguide.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/docs/styleguide.md b/docs/styleguide.md index 44afe2aadb..c388b3184b 100644 --- a/docs/styleguide.md +++ b/docs/styleguide.md @@ -51,14 +51,12 @@ Here are some tips for understanding Electron documentation syntax. An example of [method](https://developer.mozilla.org/en-US/docs/Glossary/Method) documentation: ---- - +``` `methodName(required[, optional]))` -* `require` String (**required**) +* `required` String (**required**) * `optional` Integer - ---- +``` The method name is followed by the arguments it takes. Optional arguments are notated by brackets surrounding the optional argument as well as the comma @@ -77,15 +75,13 @@ or a custom type like Electron's [`webContent`](api/web-content.md). An example of [event](https://developer.mozilla.org/en-US/docs/Web/API/Event) documentation: ---- - +``` Event: 'wake-up' Returns: * `time` String - ---- +``` The event is a string that is used after a `.on` listener method. If it returns a value it and its type is noted below. If you were to listen and respond to @@ -93,6 +89,6 @@ this event it might look something like this: ```javascript Alarm.on('wake-up', (time) => { - console.log(time); -}); + console.log(time) +}) ``` From 49fd3ff41b64e388b8bd81db97b0af54f484a5dd Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Fri, 17 Jun 2016 12:33:50 -0700 Subject: [PATCH 037/516] document platform-specific arguments --- docs/styleguide.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/styleguide.md b/docs/styleguide.md index c388b3184b..b4d9150ae0 100644 --- a/docs/styleguide.md +++ b/docs/styleguide.md @@ -70,6 +70,14 @@ of argument is notated by either the common types: [`Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) or a custom type like Electron's [`webContent`](api/web-content.md). +If an argument is unique to certain platforms, those platforms are denoted +using a space-delimited italicized list following the datatype. Values can be +`OS X`, `Windows`, or `Linux`. + +``` +* `animate` Boolean (optional) _OS X_ _Windows_ +``` + ### Events An example of [event](https://developer.mozilla.org/en-US/docs/Web/API/Event) From a82a2485d7191acc88ba11f83bc1f5b2d05f6a5e Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Fri, 17 Jun 2016 14:01:33 -0700 Subject: [PATCH 038/516] fix debugger event headings --- docs/api/web-contents.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index 220776b058..fec4708d1c 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -1035,7 +1035,7 @@ Detaches the debugger from the `webContents`. Send given command to the debugging target. -### Event: 'detach' +#### Event: 'detach' * `event` Event * `reason` String - Reason for detaching debugger. @@ -1043,7 +1043,7 @@ Send given command to the debugging target. Emitted when debugging session is terminated. This happens either when `webContents` is closed or devtools is invoked for the attached `webContents`. -### Event: 'message' +#### Event: 'message' * `event` Event * `method` String - Method name. From 574e8974b666dc202523cd49687895895ca224bd Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Mon, 20 Jun 2016 08:30:09 -0700 Subject: [PATCH 039/516] undo heading changes to special-case session --- docs/api/session.md | 58 ++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/docs/api/session.md b/docs/api/session.md index e4ef07d6c7..0486b1ddbd 100644 --- a/docs/api/session.md +++ b/docs/api/session.md @@ -50,11 +50,11 @@ const session = require('electron').session; const ses = session.fromPartition('persist:name'); ``` -## Events +### Instance Events The following events are available on instances of `Session`: -### Event: 'will-download' +#### Event: 'will-download' * `event` Event * `item` [DownloadItem](download-item.md) @@ -74,11 +74,11 @@ session.defaultSession.on('will-download', (event, item, webContents) => { }); ``` -## Instance Methods +### Instance Methods The following methods are available on instances of `Session`: -### `ses.cookies` +#### `ses.cookies` The `cookies` gives you ability to query and modify cookies. For example: @@ -102,7 +102,7 @@ session.defaultSession.cookies.set(cookie, (error) => { }); ``` -### `ses.cookies.get(filter, callback)` +#### `ses.cookies.get(filter, callback)` * `filter` Object * `url` String (optional) - Retrieves cookies which are associated with @@ -134,7 +134,7 @@ with `callback(error, cookies)` on complete. the number of seconds since the UNIX epoch. Not provided for session cookies. -### `ses.cookies.set(details, callback)` +#### `ses.cookies.set(details, callback)` * `details` Object * `url` String - The url to associate the cookie with. @@ -154,7 +154,7 @@ with `callback(error, cookies)` on complete. Sets a cookie with `details`, `callback` will be called with `callback(error)` on complete. -### `ses.cookies.remove(url, name, callback)` +#### `ses.cookies.remove(url, name, callback)` * `url` String - The URL associated with the cookie. * `name` String - The name of cookie to remove. @@ -163,20 +163,20 @@ on complete. Removes the cookies matching `url` and `name`, `callback` will called with `callback()` on complete. -### `ses.getCacheSize(callback)` +#### `ses.getCacheSize(callback)` * `callback` Function * `size` Integer - Cache size used in bytes. Returns the session's current cache size. -### `ses.clearCache(callback)` +#### `ses.clearCache(callback)` * `callback` Function - Called when operation is done Clears the session’s HTTP cache. -### `ses.clearStorageData([options, ]callback)` +#### `ses.clearStorageData([options, ]callback)` * `options` Object (optional) * `origin` String - Should follow `window.location.origin`’s representation @@ -190,11 +190,11 @@ Clears the session’s HTTP cache. Clears the data of web storages. -### `ses.flushStorageData()` +#### `ses.flushStorageData()` Writes any unwritten DOMStorage data to disk. -### `ses.setProxy(config, callback)` +#### `ses.setProxy(config, callback)` * `config` Object * `pacScript` String - The URL associated with the PAC file. @@ -239,14 +239,14 @@ For example: Resolves the proxy information for `url`. The `callback` will be called with `callback(proxy)` when the request is performed. -### `ses.setDownloadPath(path)` +#### `ses.setDownloadPath(path)` * `path` String - The download location Sets download saving directory. By default, the download directory will be the `Downloads` under the respective app folder. -### `ses.enableNetworkEmulation(options)` +#### `ses.enableNetworkEmulation(options)` * `options` Object * `offline` Boolean - Whether to emulate network outage. @@ -268,12 +268,12 @@ window.webContents.session.enableNetworkEmulation({ window.webContents.session.enableNetworkEmulation({offline: true}); ``` -### `ses.disableNetworkEmulation()` +#### `ses.disableNetworkEmulation()` Disables any network emulation already active for the `session`. Resets to the original network configuration. -### `ses.setCertificateVerifyProc(proc)` +#### `ses.setCertificateVerifyProc(proc)` * `proc` Function @@ -294,7 +294,7 @@ myWindow.webContents.session.setCertificateVerifyProc((hostname, cert, callback) }); ``` -### `ses.setPermissionRequestHandler(handler)` +#### `ses.setPermissionRequestHandler(handler)` * `handler` Function * `webContents` Object - [WebContents](web-contents.md) requesting the permission. @@ -318,13 +318,13 @@ session.fromPartition(partition).setPermissionRequestHandler((webContents, permi }); ``` -### `ses.clearHostResolverCache([callback])` +#### `ses.clearHostResolverCache([callback])` * `callback` Function (optional) - Called when operation is done. Clears the host resolver cache. -### `ses.allowNTLMCredentialsForDomains(domains)` +#### `ses.allowNTLMCredentialsForDomains(domains)` * `domains` String - A comma-seperated list of servers for which integrated authentication is enabled. @@ -341,7 +341,7 @@ session.defaultSession.allowNTLMCredentialsForDomains('*example.com, *foobar.com session.defaultSession.allowNTLMCredentialsForDomains('*') ``` -### `ses.webRequest` +#### `ses.webRequest` The `webRequest` API set allows to intercept and modify contents of a request at various stages of its lifetime. @@ -370,7 +370,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, (details, callback }); ``` -### `ses.webRequest.onBeforeRequest([filter, ]listener)` +#### `ses.webRequest.onBeforeRequest([filter, ]listener)` * `filter` Object * `listener` Function @@ -400,7 +400,7 @@ The `callback` has to be called with an `response` object: * `redirectURL` String (optional) - The original request is prevented from being sent or completed, and is instead redirected to the given URL. -### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` +#### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -425,7 +425,7 @@ The `callback` has to be called with an `response` object: * `requestHeaders` Object (optional) - When provided, request will be made with these headers. -### `ses.webRequest.onSendHeaders([filter, ]listener)` +#### `ses.webRequest.onSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -442,7 +442,7 @@ response are visible by the time this listener is fired. * `timestamp` Double * `requestHeaders` Object -### `ses.webRequest.onHeadersReceived([filter,]listener)` +#### `ses.webRequest.onHeadersReceived([filter,]listener)` * `filter` Object * `listener` Function @@ -471,7 +471,7 @@ The `callback` has to be called with an `response` object: `responseHeaders` to change header status otherwise original response header's status will be used. -### `ses.webRequest.onResponseStarted([filter, ]listener)` +#### `ses.webRequest.onResponseStarted([filter, ]listener)` * `filter` Object * `listener` Function @@ -492,7 +492,7 @@ and response headers are available. * `statusCode` Integer * `statusLine` String -### `ses.webRequest.onBeforeRedirect([filter, ]listener)` +#### `ses.webRequest.onBeforeRedirect([filter, ]listener)` * `filter` Object * `listener` Function @@ -513,7 +513,7 @@ redirect is about to occur. * `fromCache` Boolean * `responseHeaders` Object -### `ses.webRequest.onCompleted([filter, ]listener)` +#### `ses.webRequest.onCompleted([filter, ]listener)` * `filter` Object * `listener` Function @@ -532,7 +532,7 @@ completed. * `statusCode` Integer * `statusLine` String -### `ses.webRequest.onErrorOccurred([filter, ]listener)` +#### `ses.webRequest.onErrorOccurred([filter, ]listener)` * `filter` Object * `listener` Function @@ -548,7 +548,7 @@ The `listener` will be called with `listener(details)` when an error occurs. * `fromCache` Boolean * `error` String - The error description. -### `ses.protocol` +#### `ses.protocol` Returns an instance of [protocol](protocol.md) module for this session. From 0ff50650d283fd6d9e52dde363323d60621182a2 Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Mon, 20 Jun 2016 16:51:31 -0700 Subject: [PATCH 040/516] document drop-files event type --- docs/api/tray.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/tray.md b/docs/api/tray.md index aed699b8ee..a93e0dbf38 100644 --- a/docs/api/tray.md +++ b/docs/api/tray.md @@ -117,7 +117,7 @@ Emitted when any dragged items are dropped on the tray icon. #### Event: 'drop-files' _macOS_ -* `event` +* `event` Event * `files` Array - the file path of dropped files. Emitted when dragged files are dropped in the tray icon. From 46c1ef60aaa73209083d878817105957119bd5a4 Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Tue, 21 Jun 2016 10:00:55 -0700 Subject: [PATCH 041/516] restore headings in translated session docs --- docs-translations/jp/api/session.md | 44 ++++++++++----------- docs-translations/ko-KR/api/session.md | 54 +++++++++++++------------- docs-translations/zh-CN/api/session.md | 50 ++++++++++++------------ 3 files changed, 74 insertions(+), 74 deletions(-) diff --git a/docs-translations/jp/api/session.md b/docs-translations/jp/api/session.md index 84e0d08deb..a5d47d404a 100644 --- a/docs-translations/jp/api/session.md +++ b/docs-translations/jp/api/session.md @@ -70,7 +70,7 @@ session.defaultSession.on('will-download', function(event, item, webContents) { `Session`のインスタンス上で次のメソッドが提供されています: -### `ses.cookies` +#### `ses.cookies` `cookies`は、cookiesに問い合わせしたり、修正をできるようにします。例: @@ -94,7 +94,7 @@ session.defaultSession.cookies.set(cookie, function(error) { }); ``` -### `ses.cookies.get(filter, callback)` +#### `ses.cookies.get(filter, callback)` * `filter` Object * `url` String (オプション) - `url`に関連付けられているcookiesを取得します。空の場合すべてのurlのcookiesを取得します @@ -122,7 +122,7 @@ session.defaultSession.cookies.set(cookie, function(error) { cookieの有効期限をUNIX時間で何秒かを示します。セッションcookiesは提供されません。 -### `ses.cookies.set(details, callback)` +#### `ses.cookies.set(details, callback)` * `details` Object * `url` String - `url`に関連付けられているcookiesを取得します。 @@ -137,7 +137,7 @@ cookieの有効期限をUNIX時間で何秒かを示します。セッションc `details`でcookieを設定し、完了すると`callback(error)`で`callback`がコールされます。 -### `ses.cookies.remove(url, name, callback)` +#### `ses.cookies.remove(url, name, callback)` * `url` String - cookieに関連付けられているURL * `name` String - 削除するcookieの名前 @@ -145,20 +145,20 @@ cookieの有効期限をUNIX時間で何秒かを示します。セッションc `url` と `name`と一致するcookiesを削除し、完了すると`callback`が、`callback()`でコールされます。 -### `ses.getCacheSize(callback)` +#### `ses.getCacheSize(callback)` * `callback` Function * `size` Integer - 使用しているキャッシュサイズバイト数 現在のセッションのキャッシュサイズを返します。 -### `ses.clearCache(callback)` +#### `ses.clearCache(callback)` * `callback` Function - 操作が完了したら、コールされます。 セッションのHTTPキャッシュをクリアします。 -### `ses.clearStorageData([options, ]callback)` +#### `ses.clearStorageData([options, ]callback)` * `options` Object (オプション) * `origin` String - `window.location.origin`の説明で、`scheme://host:port`に従う @@ -171,11 +171,11 @@ cookieの有効期限をUNIX時間で何秒かを示します。セッションc ウェブストレージのデータをクリアします。 -### `ses.flushStorageData()` +#### `ses.flushStorageData()` 書き込まれていないDOMStorageデータをディスクに書き込みます。 -### `ses.setProxy(config, callback)` +#### `ses.setProxy(config, callback)` * `config` Object * `pacScript` String - PACファイルに関連付けらえたURL @@ -213,13 +213,13 @@ proxyURL = ["://"][":"] `url`をプロキシ情報で解決します。リクエストが実行された時、`callback(proxy)`で `callback`がコールされます。 -### `ses.setDownloadPath(path)` +#### `ses.setDownloadPath(path)` * `path` String - ダウンロード場所 ダウンロードの保存ディレクトリを設定します。既定では、ダウンロードディレクトリは、個別のアプリフォルダー下の`Downloads`です。 -### `ses.enableNetworkEmulation(options)` +#### `ses.enableNetworkEmulation(options)` * `options` Object * `offline` Boolean - ネットワーク停止を再現するかどうか @@ -241,11 +241,11 @@ window.webContents.session.enableNetworkEmulation({ window.webContents.session.enableNetworkEmulation({offline: true}); ``` -### `ses.disableNetworkEmulation()` +#### `ses.disableNetworkEmulation()` `session`ですでに有効になっているネットワークエミュレーションを無効化します。オリジナルのネットワーク設定にリセットします。 -### `ses.setCertificateVerifyProc(proc)` +#### `ses.setCertificateVerifyProc(proc)` * `proc` Function @@ -262,7 +262,7 @@ myWindow.webContents.session.setCertificateVerifyProc(function(hostname, cert, c }); ``` -### `ses.webRequest` +#### `ses.webRequest` `webRequest`APIセットをインターセプトし、そのライフタイムの様々な段階でリクエストの内容を変更できます。 @@ -284,7 +284,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, }); ``` -### `ses.webRequest.onBeforeRequest([filter, ]listener)` +#### `ses.webRequest.onBeforeRequest([filter, ]listener)` * `filter` Object * `listener` Function @@ -312,7 +312,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `cancel` Boolean (オプション) * `redirectURL` String (オプション) - オリジナルリクエストが送信もしくは完了するのを中断し、代わりに付与したURLにリダイレクトします。 -### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` +#### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -334,7 +334,7 @@ The `callback` has to be called with an `response` object: * `cancel` Boolean (オプション) * `requestHeaders` Object (オプション) - 付与されると、リクエストはそれらのヘッダーで作成されます。 -### `ses.webRequest.onSendHeaders([filter, ]listener)` +#### `ses.webRequest.onSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -349,7 +349,7 @@ The `callback` has to be called with an `response` object: * `timestamp` Double * `requestHeaders` Object -### `ses.webRequest.onHeadersReceived([filter,] listener)` +#### `ses.webRequest.onHeadersReceived([filter,] listener)` * `filter` Object * `listener` Function @@ -373,7 +373,7 @@ The `callback` has to be called with an `response` object: * `cancel` Boolean * `responseHeaders` Object (オプション) - 付与されていると、これらのヘッダーでサーバーはレスポンスしたと仮定します。 -### `ses.webRequest.onResponseStarted([filter, ]listener)` +#### `ses.webRequest.onResponseStarted([filter, ]listener)` * `filter` Object * `listener` Function @@ -391,7 +391,7 @@ The `callback` has to be called with an `response` object: * `statusCode` Integer * `statusLine` String -### `ses.webRequest.onBeforeRedirect([filter, ]listener)` +#### `ses.webRequest.onBeforeRedirect([filter, ]listener)` * `filter` Object * `listener` Function @@ -410,7 +410,7 @@ The `callback` has to be called with an `response` object: * `fromCache` Boolean * `responseHeaders` Object -### `ses.webRequest.onCompleted([filter, ]listener)` +#### `ses.webRequest.onCompleted([filter, ]listener)` * `filter` Object * `listener` Function @@ -428,7 +428,7 @@ The `callback` has to be called with an `response` object: * `statusCode` Integer * `statusLine` String -### `ses.webRequest.onErrorOccurred([filter, ]listener)` +#### `ses.webRequest.onErrorOccurred([filter, ]listener)` * `filter` Object * `listener` Function diff --git a/docs-translations/ko-KR/api/session.md b/docs-translations/ko-KR/api/session.md index 5ee37a2705..a2dc9b682a 100644 --- a/docs-translations/ko-KR/api/session.md +++ b/docs-translations/ko-KR/api/session.md @@ -53,7 +53,7 @@ const ses = session.fromPartition('persist:name'); `Session` 객체는 다음과 같은 이벤트를 가지고 있습니다: -### Event: 'will-download' +#### Event: 'will-download' * `event` Event * `item` [DownloadItem](download-item.md) @@ -77,7 +77,7 @@ session.defaultSession.on('will-download', (event, item, webContents) => { `Session` 객체는 다음과 같은 메서드와 속성을 가지고 있습니다: -### `ses.cookies` +#### `ses.cookies` `cookies` 속성은 쿠키를 조작하는 방법을 제공합니다. 예를 들어 다음과 같이 할 수 있습니다: @@ -102,7 +102,7 @@ session.defaultSession.cookies.set(cookie, (error) => { }); ``` -### `ses.cookies.get(filter, callback)` +#### `ses.cookies.get(filter, callback)` * `filter` Object * `url` String (optional) - `url`에 해당하는 쿠키를 취득합니다. 이 속성을 @@ -133,7 +133,7 @@ session.defaultSession.cookies.set(cookie, (error) => { * `expirationDate` Double - (Option) UNIX 시간으로 표시되는 쿠키의 만료일에 대한 초 단위 시간. 세션 쿠키는 지원되지 않음. -### `ses.cookies.set(details, callback)` +#### `ses.cookies.set(details, callback)` * `details` Object * `url` String - 쿠키에 대한 `url` 링크. @@ -153,7 +153,7 @@ session.defaultSession.cookies.set(cookie, (error) => { `details` 객체에 따라 쿠키를 설정합니다. 작업이 완료되면 `callback`이 `callback(error)` 형태로 호출됩니다. -### `ses.cookies.remove(url, name, callback)` +#### `ses.cookies.remove(url, name, callback)` * `url` String - 쿠키와 관련된 URL입니다. * `name` String - 지울 쿠키의 이름입니다. @@ -162,20 +162,20 @@ session.defaultSession.cookies.set(cookie, (error) => { `url`과 `name`에 일치하는 쿠키를 삭제합니다. 작업이 완료되면 `callback`이 `callback()` 형식으로 호출됩니다. -### `ses.getCacheSize(callback)` +#### `ses.getCacheSize(callback)` * `callback` Function * `size` Integer - 바이트로 표현된 캐시 크기 세션의 현재 캐시 크기를 반환합니다. -### `ses.clearCache(callback)` +#### `ses.clearCache(callback)` * `callback` Function - 작업이 완료되면 호출됩니다. 세션의 HTTP 캐시를 비웁니다. -### `ses.clearStorageData([options, ]callback)` +#### `ses.clearStorageData([options, ]callback)` * `options` Object (optional), proprties: * `origin` String - `scheme://host:port`와 같은 `window.location.origin` 규칙을 @@ -189,11 +189,11 @@ session.defaultSession.cookies.set(cookie, (error) => { 웹 스토리지의 데이터를 비웁니다. -### `ses.flushStorageData()` +#### `ses.flushStorageData()` 디스크에 사용되지 않은 DOMStorage 데이터를 모두 덮어씌웁니다. -### `ses.setProxy(config, callback)` +#### `ses.setProxy(config, callback)` * `config` Object * `pacScript` String - PAC 파일과 관련된 URL입니다. @@ -240,14 +240,14 @@ proxyURL = ["://"][":"] `url`의 프록시 정보를 해석합니다. `callback`은 요청이 수행되었을 때 `callback(proxy)` 형태로 호출됩니다. -### `ses.setDownloadPath(path)` +#### `ses.setDownloadPath(path)` * `path` String - 다운로드 위치 다운로드 저장 위치를 지정합니다. 기본 다운로드 위치는 각 애플리케이션 데이터 디렉터리의 `Downloads` 폴더입니다. -### `ses.enableNetworkEmulation(options)` +#### `ses.enableNetworkEmulation(options)` * `options` Object * `offline` Boolean - 네트워크의 오프라인 상태 여부 @@ -269,11 +269,11 @@ window.webContents.session.enableNetworkEmulation({ window.webContents.session.enableNetworkEmulation({offline: true}); ``` -### `ses.disableNetworkEmulation()` +#### `ses.disableNetworkEmulation()` 활성화된 `session`의 에뮬레이션을 비활성화합니다. 기본 네트워크 설정으로 돌아갑니다. -### `ses.setCertificateVerifyProc(proc)` +#### `ses.setCertificateVerifyProc(proc)` * `proc` Function @@ -292,7 +292,7 @@ myWindow.webContents.session.setCertificateVerifyProc((hostname, cert, callback) callback(false); }); ``` -### `ses.setPermissionRequestHandler(handler)` +#### `ses.setPermissionRequestHandler(handler)` * `handler` Function * `webContents` Object - [WebContents](web-contents.md) 권한을 요청. @@ -317,13 +317,13 @@ session.fromPartition(partition).setPermissionRequestHandler((webContents, permi }); ``` -### `ses.clearHostResolverCache([callback])` +#### `ses.clearHostResolverCache([callback])` * `callback` Function (optional) - 작업이 완료되면 호출됩니다. 호스트 리소버(resolver) 캐시를 지웁니다. -### `ses.allowNTLMCredentialsForDomains(domains)` +#### `ses.allowNTLMCredentialsForDomains(domains)` * `domains` String - 통합 인증을 사용하도록 설정할 쉼표로 구분된 서버의 리스트. @@ -339,7 +339,7 @@ session.defaultSession.allowNTLMCredentialsForDomains('*example.com, *foobar.com session.defaultSession.allowNTLMCredentialsForDomains('*') ``` -### `ses.webRequest` +#### `ses.webRequest` `webRequest` API는 생명주기의 다양한 단계에 맞춰 요청 콘텐츠를 가로채거나 변경할 수 있도록 합니다. @@ -367,7 +367,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, (details, callback }); ``` -### `ses.webRequest.onBeforeRequest([filter, ]listener)` +#### `ses.webRequest.onBeforeRequest([filter, ]listener)` * `filter` Object * `listener` Function @@ -396,7 +396,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, (details, callback * `redirectURL` String (optional) - 원래 요청은 전송과 완료가 방지되지만 이 속성을 지정하면 해당 URL로 리다이렉트됩니다. -### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` +#### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -421,7 +421,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `requestHeaders` Object (optional) - 이 속성이 제공되면, 요청은 이 헤더로 만들어 집니다. -### `ses.webRequest.onSendHeaders([filter, ]listener)` +#### `ses.webRequest.onSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -438,7 +438,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `timestamp` Double * `requestHeaders` Object -### `ses.webRequest.onHeadersReceived([filter, ]listener)` +#### `ses.webRequest.onHeadersReceived([filter, ]listener)` * `filter` Object * `listener` Function @@ -467,7 +467,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener 변경하기 위해 반드시 지정되어야 합니다. 그렇지 않은 경우, 기존의 응답 헤더의 상태가 사용됩니다. -### `ses.webRequest.onResponseStarted([filter, ]listener)` +#### `ses.webRequest.onResponseStarted([filter, ]listener)` * `filter` Object * `listener` Function @@ -486,7 +486,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `statusCode` Integer * `statusLine` String -### `ses.webRequest.onBeforeRedirect([filter, ]listener)` +#### `ses.webRequest.onBeforeRedirect([filter, ]listener)` * `filter` Object * `listener` Function @@ -506,7 +506,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `fromCache` Boolean * `responseHeaders` Object -### `ses.webRequest.onCompleted([filter, ]listener)` +#### `ses.webRequest.onCompleted([filter, ]listener)` * `filter` Object * `listener` Function @@ -524,7 +524,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `statusCode` Integer * `statusLine` String -### `ses.webRequest.onErrorOccurred([filter, ]listener)` +#### `ses.webRequest.onErrorOccurred([filter, ]listener)` * `filter` Object * `listener` Function @@ -540,7 +540,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `fromCache` Boolean * `error` String - 에러 설명. -### `ses.protocol` +#### `ses.protocol` 현재 세션의 [protocol](protocol.md) 모듈 인스턴스를 반환합니다. diff --git a/docs-translations/zh-CN/api/session.md b/docs-translations/zh-CN/api/session.md index b96290dbe3..b9664c08e6 100644 --- a/docs-translations/zh-CN/api/session.md +++ b/docs-translations/zh-CN/api/session.md @@ -47,7 +47,7 @@ var ses = session.fromPartition('persist:name'); 实例 `Session` 有以下事件: -### Event: 'will-download' +#### Event: 'will-download' * `event` Event * `item` [DownloadItem](download-item.md) @@ -70,7 +70,7 @@ session.defaultSession.on('will-download', function(event, item, webContents) { 实例 `Session` 有以下方法: -### `ses.cookies` +#### `ses.cookies` `cookies` 赋予你全力来查询和修改 cookies. 例如: @@ -94,7 +94,7 @@ session.defaultSession.cookies.set(cookie, function(error) { }); ``` -### `ses.cookies.get(filter, callback)` +#### `ses.cookies.get(filter, callback)` * `filter` Object * `url` String (可选) - 与获取 cookies 相关的 @@ -123,7 +123,7 @@ session.defaultSession.cookies.set(cookie, function(error) { cookie . * `expirationDate` Double (可选) - cookie的截至日期,数值为UNIX纪元以来的秒数. 对session cookies 不提供. -### `ses.cookies.set(details, callback)` +#### `ses.cookies.set(details, callback)` * `details` Object * `url` String - 与获取 cookies 相关的 @@ -140,7 +140,7 @@ session.defaultSession.cookies.set(cookie, function(error) { 使用 `details` 设置 cookie, 完成时使用 `callback(error)` 掉哟个 `callback` . -### `ses.cookies.remove(url, name, callback)` +#### `ses.cookies.remove(url, name, callback)` * `url` String - 与 cookies 相关的 `url`. @@ -149,20 +149,20 @@ session.defaultSession.cookies.set(cookie, function(error) { 删除匹配 `url` 和 `name` 的 cookie, 完成时使用 `callback()`调用`callback`. -### `ses.getCacheSize(callback)` +#### `ses.getCacheSize(callback)` * `callback` Function * `size` Integer - 单位 bytes 的缓存 size. 返回 session 的当前缓存 size . -### `ses.clearCache(callback)` +#### `ses.clearCache(callback)` * `callback` Function - 操作完成时调用 清空 session 的 HTTP 缓存. -### `ses.clearStorageData([options, ]callback)` +#### `ses.clearStorageData([options, ]callback)` * `options` Object (可选) * `origin` String - 应当遵循 `window.location.origin` 的格式 @@ -176,11 +176,11 @@ session.defaultSession.cookies.set(cookie, function(error) { 清除 web storages 的数据. -### `ses.flushStorageData()` +#### `ses.flushStorageData()` 将没有写入的 DOMStorage 写入磁盘. -### `ses.setProxy(config, callback)` +#### `ses.setProxy(config, callback)` * `config` Object * `pacScript` String - 与 PAC 文件相关的 URL. @@ -219,13 +219,13 @@ proxyURL = ["://"][":"] 解析 `url` 的代理信息.当请求完成的时候使用 `callback(proxy)` 调用 `callback`. -### `ses.setDownloadPath(path)` +#### `ses.setDownloadPath(path)` * `path` String - 下载地址 设置下载保存地址,默认保存地址为各自 app 应用的 `Downloads`目录. -### `ses.enableNetworkEmulation(options)` +#### `ses.enableNetworkEmulation(options)` * `options` Object * `offline` Boolean - 是否模拟网络故障. @@ -247,12 +247,12 @@ window.webContents.session.enableNetworkEmulation({ window.webContents.session.enableNetworkEmulation({offline: true}); ``` -### `ses.disableNetworkEmulation()` +#### `ses.disableNetworkEmulation()` 停止所有已经使用 `session` 的活跃模拟网络. 重置为原始网络类型. -### `ses.setCertificateVerifyProc(proc)` +#### `ses.setCertificateVerifyProc(proc)` * `proc` Function @@ -269,7 +269,7 @@ myWindow.webContents.session.setCertificateVerifyProc(function(hostname, cert, c }); ``` -### `ses.setPermissionRequestHandler(handler)` +#### `ses.setPermissionRequestHandler(handler)` * `handler` Function * `webContents` Object - [WebContents](web-contents.md) 请求许可. @@ -291,13 +291,13 @@ session.fromPartition(partition).setPermissionRequestHandler(function(webContent }); ``` -### `ses.clearHostResolverCache([callback])` +#### `ses.clearHostResolverCache([callback])` * `callback` Function (可选) - 操作结束调用. 清除主机解析缓存. -### `ses.webRequest` +#### `ses.webRequest` 在其生命周期的不同阶段,`webRequest` API 设置允许拦截并修改请求内容. @@ -319,7 +319,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, }); ``` -### `ses.webRequest.onBeforeRequest([filter, ]listener)` +#### `ses.webRequest.onBeforeRequest([filter, ]listener)` * `filter` Object * `listener` Function @@ -347,7 +347,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `cancel` Boolean (可选) * `redirectURL` String (可选) - 原始请求阻止发送或完成,而不是重定向. -### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` +#### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -369,7 +369,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `cancel` Boolean (可选) * `requestHeaders` Object (可选) - 如果提供了,将使用这些 headers 来创建请求. -### `ses.webRequest.onSendHeaders([filter, ]listener)` +#### `ses.webRequest.onSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -384,7 +384,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `timestamp` Double * `requestHeaders` Object -### `ses.webRequest.onHeadersReceived([filter,] listener)` +#### `ses.webRequest.onHeadersReceived([filter,] listener)` * `filter` Object * `listener` Function @@ -408,7 +408,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `cancel` Boolean * `responseHeaders` Object (可选) - 如果提供, 服务器将假定使用这些头来响应. -### `ses.webRequest.onResponseStarted([filter, ]listener)` +#### `ses.webRequest.onResponseStarted([filter, ]listener)` * `filter` Object * `listener` Function @@ -427,7 +427,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `statusCode` Integer * `statusLine` String -### `ses.webRequest.onBeforeRedirect([filter, ]listener)` +#### `ses.webRequest.onBeforeRedirect([filter, ]listener)` * `filter` Object * `listener` Function @@ -446,7 +446,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `fromCache` Boolean * `responseHeaders` Object -### `ses.webRequest.onCompleted([filter, ]listener)` +#### `ses.webRequest.onCompleted([filter, ]listener)` * `filter` Object * `listener` Function @@ -464,7 +464,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, function(details, * `statusCode` Integer * `statusLine` String -### `ses.webRequest.onErrorOccurred([filter, ]listener)` +#### `ses.webRequest.onErrorOccurred([filter, ]listener)` * `filter` Object * `listener` Function From 2a079b2e0a78d6c2925cb3042228ff324e8c7445 Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Tue, 21 Jun 2016 11:05:34 -0700 Subject: [PATCH 042/516] =?UTF-8?q?wether=20=E2=86=92=20whether?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/api/web-contents.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index fec4708d1c..610fa2aa6d 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -339,9 +339,9 @@ Returns: was invoked on. Elements with source URLs are images, audio and video. * `mediaType` String - Type of the node the context menu was invoked on. Can be `none`, `image`, `audio`, `video`, `canvas`, `file` or `plugin`. - * `hasImageContent` Boolean - Wether the context menu was invoked on an image + * `hasImageContent` Boolean - Whether the context menu was invoked on an image which has non-empty contents. - * `isEditable` Boolean - Wether the context is editable. + * `isEditable` Boolean - Whether the context is editable. * `selectionText` String - Text of the selection that the context menu was invoked on. * `titleText` String - Title or alt text of the selection that the context @@ -356,29 +356,29 @@ Returns: Can be `none`, `mouse`, `keyboard`, `touch`, `touchMenu`. * `mediaFlags` Object - The flags for the media element the context menu was invoked on. See more about this below. - * `editFlags` Object - These flags indicate wether the renderer believes it is + * `editFlags` Object - These flags indicate whether the renderer believes it is able to perform the corresponding action. See more about this below. The `mediaFlags` is an object with the following properties: - * `inError` Boolean - Wether the media element has crashed. - * `isPaused` Boolean - Wether the media element is paused. - * `isMuted` Boolean - Wether the media element is muted. - * `hasAudio` Boolean - Wether the media element has audio. - * `isLooping` Boolean - Wether the media element is looping. - * `isControlsVisible` Boolean - Wether the media element's controls are + * `inError` Boolean - Whether the media element has crashed. + * `isPaused` Boolean - Whether the media element is paused. + * `isMuted` Boolean - Whether the media element is muted. + * `hasAudio` Boolean - Whether the media element has audio. + * `isLooping` Boolean - Whether the media element is looping. + * `isControlsVisible` Boolean - Whether the media element's controls are visible. - * `canToggleControls` Boolean - Wether the media element's controls are + * `canToggleControls` Boolean - Whether the media element's controls are toggleable. - * `canRotate` Boolean - Wether the media element can be rotated. + * `canRotate` Boolean - Whether the media element can be rotated. The `editFlags` is an object with the following properties: - * `canUndo` Boolean - Wether the renderer believes it can undo. - * `canRedo` Boolean - Wether the renderer believes it can redo. - * `canCut` Boolean - Wether the renderer believes it can cut. - * `canCopy` Boolean - Wether the renderer believes it can copy - * `canPaste` Boolean - Wether the renderer believes it can paste. - * `canDelete` Boolean - Wether the renderer believes it can delete. - * `canSelectAll` Boolean - Wether the renderer believes it can select all. + * `canUndo` Boolean - Whether the renderer believes it can undo. + * `canRedo` Boolean - Whether the renderer believes it can redo. + * `canCut` Boolean - Whether the renderer believes it can cut. + * `canCopy` Boolean - Whether the renderer believes it can copy + * `canPaste` Boolean - Whether the renderer believes it can paste. + * `canDelete` Boolean - Whether the renderer believes it can delete. + * `canSelectAll` Boolean - Whether the renderer believes it can select all. Emitted when there is a new context menu that needs to be handled. From 90d1b9169f22aa771425cd955d195dc3bf2ba4ae Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Tue, 21 Jun 2016 22:55:26 -0700 Subject: [PATCH 043/516] prepositions are hard --- docs/api/browser-window.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index e95570450b..a87be1e597 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -546,7 +546,7 @@ Focus on the window. ### `win.blur()` -Remove focus on the window. +Remove focus from the window. ### `win.isFocused()` From 72403c1a8db4167e559da928ae8e8f4343b93da6 Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Tue, 21 Jun 2016 22:56:51 -0700 Subject: [PATCH 044/516] use consistent verb style --- docs/api/browser-window.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index a87be1e597..22b0124442 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -542,11 +542,11 @@ the [close event](#event-close). ### `win.focus()` -Focus on the window. +Focuses on the window. ### `win.blur()` -Remove focus from the window. +Removes focus from the window. ### `win.isFocused()` From 271c39ceb3990931a809715d9d2d66d029a3e826 Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Tue, 21 Jun 2016 23:02:01 -0700 Subject: [PATCH 045/516] =?UTF-8?q?OS=20X=20=E2=86=92=20macOS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/styleguide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/styleguide.md b/docs/styleguide.md index b4d9150ae0..21d7c63b34 100644 --- a/docs/styleguide.md +++ b/docs/styleguide.md @@ -72,10 +72,10 @@ or a custom type like Electron's [`webContent`](api/web-content.md). If an argument is unique to certain platforms, those platforms are denoted using a space-delimited italicized list following the datatype. Values can be -`OS X`, `Windows`, or `Linux`. +`macOS`, `Windows`, or `Linux`. ``` -* `animate` Boolean (optional) _OS X_ _Windows_ +* `animate` Boolean (optional) _macOS_ _Windows_ ``` ### Events From b0f04de50c40d7a42f7e0eb33c3d82082033af46 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 22 Jun 2016 15:41:56 +0900 Subject: [PATCH 046/516] Do not force creating default session in C++ --- atom/browser/atom_access_token_store.cc | 39 +++++++++++++++++-------- atom/browser/atom_access_token_store.h | 9 ++++-- vendor/brightray | 2 +- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/atom/browser/atom_access_token_store.cc b/atom/browser/atom_access_token_store.cc index ed87ea9799..9f57148120 100644 --- a/atom/browser/atom_access_token_store.cc +++ b/atom/browser/atom_access_token_store.cc @@ -7,8 +7,8 @@ #include #include "atom/browser/atom_browser_context.h" -#include "atom/browser/atom_browser_main_parts.h" #include "atom/common/google_api_key.h" +#include "content/public/browser/browser_thread.h" #include "content/public/browser/geolocation_provider.h" namespace atom { @@ -25,6 +25,7 @@ const char* kGeolocationProviderURL = } // namespace AtomAccessTokenStore::AtomAccessTokenStore() { + LOG(ERROR) << "AtomAccessTokenStore"; content::GeolocationProvider::GetInstance()->UserDidOptIntoLocationServices(); } @@ -33,21 +34,35 @@ AtomAccessTokenStore::~AtomAccessTokenStore() { void AtomAccessTokenStore::LoadAccessTokens( const LoadAccessTokensCallback& callback) { - AccessTokenMap access_token_map; - - // Equivelent to access_token_map[kGeolocationProviderURL]. - // Somehow base::string16 is causing compilation errors when used in a pair - // of std::map on Linux, this can work around it. - std::pair token_pair; - token_pair.first = GURL(kGeolocationProviderURL); - access_token_map.insert(token_pair); - - auto browser_context = AtomBrowserMainParts::Get()->browser_context(); - callback.Run(access_token_map, browser_context->url_request_context_getter()); + content::BrowserThread::PostTaskAndReply( + content::BrowserThread::UI, + FROM_HERE, + base::Bind(&AtomAccessTokenStore::GetRequestContextOnUIThread, this), + base::Bind(&AtomAccessTokenStore::RespondOnOriginatingThread, + this, callback)); } void AtomAccessTokenStore::SaveAccessToken(const GURL& server_url, const base::string16& access_token) { } +void AtomAccessTokenStore::GetRequestContextOnUIThread() { + auto browser_context = brightray::BrowserContext::From("", false); + request_context_getter_ = browser_context->GetRequestContext(); +} + +void AtomAccessTokenStore::RespondOnOriginatingThread( + const LoadAccessTokensCallback& callback) { + // Equivelent to access_token_map[kGeolocationProviderURL]. + // Somehow base::string16 is causing compilation errors when used in a pair + // of std::map on Linux, this can work around it. + AccessTokenMap access_token_map; + std::pair token_pair; + token_pair.first = GURL(kGeolocationProviderURL); + access_token_map.insert(token_pair); + + callback.Run(access_token_map, request_context_getter_.get()); + request_context_getter_ = nullptr; +} + } // namespace atom diff --git a/atom/browser/atom_access_token_store.h b/atom/browser/atom_access_token_store.h index 54bc2cee3c..27c1911a65 100644 --- a/atom/browser/atom_access_token_store.h +++ b/atom/browser/atom_access_token_store.h @@ -9,12 +9,10 @@ namespace atom { -class AtomBrowserContext; - class AtomAccessTokenStore : public content::AccessTokenStore { public: AtomAccessTokenStore(); - virtual ~AtomAccessTokenStore(); + ~AtomAccessTokenStore(); // content::AccessTokenStore: void LoadAccessTokens( @@ -23,6 +21,11 @@ class AtomAccessTokenStore : public content::AccessTokenStore { const base::string16& access_token) override; private: + void GetRequestContextOnUIThread(); + void RespondOnOriginatingThread(const LoadAccessTokensCallback& callback); + + scoped_refptr request_context_getter_; + DISALLOW_COPY_AND_ASSIGN(AtomAccessTokenStore); }; diff --git a/vendor/brightray b/vendor/brightray index 3a98173c68..e26f8073df 160000 --- a/vendor/brightray +++ b/vendor/brightray @@ -1 +1 @@ -Subproject commit 3a98173c6848bac241074979b24f5a54cc92b5b0 +Subproject commit e26f8073df2b20ba2169ffb082c5f135d542313b From 9c8e64f26834e5652e6b94d3d256cfba65507499 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 22 Jun 2016 15:46:46 +0900 Subject: [PATCH 047/516] Cache the BrowserContext::GetUserAgent --- atom/browser/atom_browser_context.cc | 25 ++++++++++++++----------- atom/browser/atom_browser_context.h | 1 + 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/atom/browser/atom_browser_context.cc b/atom/browser/atom_browser_context.cc index 8268a77781..b9ae67b684 100644 --- a/atom/browser/atom_browser_context.cc +++ b/atom/browser/atom_browser_context.cc @@ -68,16 +68,7 @@ AtomBrowserContext::AtomBrowserContext(const std::string& partition, : brightray::BrowserContext(partition, in_memory), cert_verifier_(new AtomCertVerifier), network_delegate_(new AtomNetworkDelegate) { -} - -AtomBrowserContext::~AtomBrowserContext() { -} - -net::NetworkDelegate* AtomBrowserContext::CreateNetworkDelegate() { - return network_delegate_; -} - -std::string AtomBrowserContext::GetUserAgent() { + // Construct user agent string. Browser* browser = Browser::Get(); std::string name = RemoveWhitespace(browser->GetName()); std::string user_agent; @@ -91,7 +82,19 @@ std::string AtomBrowserContext::GetUserAgent() { browser->GetVersion().c_str(), CHROME_VERSION_STRING); } - return content::BuildUserAgentFromProduct(user_agent); + user_agent_ = content::BuildUserAgentFromProduct(user_agent); +} + +AtomBrowserContext::~AtomBrowserContext() { +} + +net::NetworkDelegate* AtomBrowserContext::CreateNetworkDelegate() { + return network_delegate_; +} + +std::string AtomBrowserContext::GetUserAgent() { + LOG(ERROR) << "GetUserAgent"; + return user_agent_; } std::unique_ptr diff --git a/atom/browser/atom_browser_context.h b/atom/browser/atom_browser_context.h index c9b1de947f..dbbae38272 100644 --- a/atom/browser/atom_browser_context.h +++ b/atom/browser/atom_browser_context.h @@ -47,6 +47,7 @@ class AtomBrowserContext : public brightray::BrowserContext { std::unique_ptr download_manager_delegate_; std::unique_ptr guest_manager_; std::unique_ptr permission_manager_; + std::string user_agent_; // Managed by brightray::BrowserContext. AtomCertVerifier* cert_verifier_; From 01bc8305f8d0477dfea2939f32ffc1ecadf6cf27 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 22 Jun 2016 15:57:51 +0900 Subject: [PATCH 048/516] Add ses.getUserAgent()/setUserAgent(...) APIs --- atom/browser/api/atom_api_session.cc | 30 +++++++++++++++++++++++ atom/browser/api/atom_api_session.h | 21 +++++++++------- atom/browser/api/atom_api_web_contents.cc | 22 +++-------------- atom/browser/api/atom_api_web_contents.h | 2 +- atom/browser/atom_browser_context.cc | 5 +++- atom/browser/atom_browser_context.h | 2 ++ vendor/brightray | 2 +- 7 files changed, 53 insertions(+), 31 deletions(-) diff --git a/atom/browser/api/atom_api_session.cc b/atom/browser/api/atom_api_session.cc index 602729b9e3..4a4ffba0c8 100644 --- a/atom/browser/api/atom_api_session.cc +++ b/atom/browser/api/atom_api_session.cc @@ -41,8 +41,10 @@ #include "net/http/http_auth_preferences.h" #include "net/proxy/proxy_service.h" #include "net/proxy/proxy_config_service_fixed.h" +#include "net/url_request/static_http_user_agent_settings.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_getter.h" +#include "ui/base/l10n/l10n_util.h" using content::BrowserThread; using content::StoragePartition; @@ -93,6 +95,15 @@ uint32_t GetQuotaMask(const std::vector& quota_types) { return quota_mask; } +void SetUserAgentInIO(scoped_refptr getter, + const std::string& accept_lang, + const std::string& user_agent) { + getter->GetURLRequestContext()->set_http_user_agent_settings( + new net::StaticHttpUserAgentSettings( + net::HttpUtil::GenerateAcceptLanguageHeader(accept_lang), + user_agent)); +} + } // namespace namespace mate { @@ -455,6 +466,23 @@ void Session::AllowNTLMCredentialsForDomains(const std::string& domains) { domains)); } +void Session::SetUserAgent(const std::string& user_agent, + mate::Arguments* args) { + browser_context_->SetUserAgent(user_agent); + + std::string accept_lang = l10n_util::GetApplicationLocale(""); + args->GetNext(&accept_lang); + + auto getter = browser_context_->GetRequestContext(); + getter->GetNetworkTaskRunner()->PostTask( + FROM_HERE, + base::Bind(&SetUserAgentInIO, getter, accept_lang, user_agent)); +} + +std::string Session::GetUserAgent() { + return browser_context_->GetUserAgent(); +} + v8::Local Session::Cookies(v8::Isolate* isolate) { if (cookies_.IsEmpty()) { auto handle = atom::api::Cookies::Create(isolate, browser_context()); @@ -520,6 +548,8 @@ void Session::BuildPrototype(v8::Isolate* isolate, .SetMethod("clearHostResolverCache", &Session::ClearHostResolverCache) .SetMethod("allowNTLMCredentialsForDomains", &Session::AllowNTLMCredentialsForDomains) + .SetMethod("setUserAgent", &Session::SetUserAgent) + .SetMethod("getUserAgent", &Session::GetUserAgent) .SetProperty("cookies", &Session::Cookies) .SetProperty("protocol", &Session::Protocol) .SetProperty("webRequest", &Session::WebRequest); diff --git a/atom/browser/api/atom_api_session.h b/atom/browser/api/atom_api_session.h index bb67fa106d..0868cbe18b 100644 --- a/atom/browser/api/atom_api_session.h +++ b/atom/browser/api/atom_api_session.h @@ -57,15 +57,7 @@ class Session: public mate::TrackableObject, static void BuildPrototype(v8::Isolate* isolate, v8::Local prototype); - protected: - Session(v8::Isolate* isolate, AtomBrowserContext* browser_context); - ~Session(); - - // content::DownloadManager::Observer: - void OnDownloadCreated(content::DownloadManager* manager, - content::DownloadItem* item) override; - - private: + // Methods. void ResolveProxy(const GURL& url, ResolveProxyCallback callback); template void DoCacheAction(const net::CompletionCallback& callback); @@ -80,10 +72,21 @@ class Session: public mate::TrackableObject, mate::Arguments* args); void ClearHostResolverCache(mate::Arguments* args); void AllowNTLMCredentialsForDomains(const std::string& domains); + void SetUserAgent(const std::string& user_agent, mate::Arguments* args); + std::string GetUserAgent(); v8::Local Cookies(v8::Isolate* isolate); v8::Local Protocol(v8::Isolate* isolate); v8::Local WebRequest(v8::Isolate* isolate); + protected: + Session(v8::Isolate* isolate, AtomBrowserContext* browser_context); + ~Session(); + + // content::DownloadManager::Observer: + void OnDownloadCreated(content::DownloadManager* manager, + content::DownloadItem* item) override; + + private: // Cached object. v8::Global cookies_; v8::Global protocol_; diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 52d24084d4..58b6a4729a 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -61,11 +61,9 @@ #include "native_mate/dictionary.h" #include "native_mate/object_template_builder.h" #include "net/http/http_response_headers.h" -#include "net/url_request/static_http_user_agent_settings.h" #include "net/url_request/url_request_context.h" #include "third_party/WebKit/public/web/WebInputEvent.h" #include "third_party/WebKit/public/web/WebFindOptions.h" -#include "ui/base/l10n/l10n_util.h" #include "atom/common/node_includes.h" @@ -76,15 +74,6 @@ struct PrintSettings { bool print_background; }; -void SetUserAgentInIO(scoped_refptr getter, - std::string accept_lang, - std::string user_agent) { - getter->GetURLRequestContext()->set_http_user_agent_settings( - new net::StaticHttpUserAgentSettings( - net::HttpUtil::GenerateAcceptLanguageHeader(accept_lang), - user_agent)); -} - } // namespace namespace mate { @@ -811,7 +800,7 @@ void WebContents::LoadURL(const GURL& url, const mate::Dictionary& options) { std::string user_agent; if (options.Get("userAgent", &user_agent)) - SetUserAgent(user_agent); + web_contents()->SetUserAgentOverride(user_agent); std::string extra_headers; if (options.Get("extraHeaders", &extra_headers)) @@ -898,14 +887,9 @@ bool WebContents::IsCrashed() const { return web_contents()->IsCrashed(); } -void WebContents::SetUserAgent(const std::string& user_agent) { +void WebContents::SetUserAgent(const std::string& user_agent, + mate::Arguments* args) { web_contents()->SetUserAgentOverride(user_agent); - scoped_refptr getter = - web_contents()->GetBrowserContext()->GetRequestContext(); - - auto accept_lang = l10n_util::GetApplicationLocale(""); - getter->GetNetworkTaskRunner()->PostTask(FROM_HERE, - base::Bind(&SetUserAgentInIO, getter, accept_lang, user_agent)); } std::string WebContents::GetUserAgent() { diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 6151110887..a99d4d4356 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -81,7 +81,7 @@ class WebContents : public mate::TrackableObject, void GoForward(); void GoToOffset(int offset); bool IsCrashed() const; - void SetUserAgent(const std::string& user_agent); + void SetUserAgent(const std::string& user_agent, mate::Arguments* args); std::string GetUserAgent(); void InsertCSS(const std::string& css); bool SavePage(const base::FilePath& full_file_path, diff --git a/atom/browser/atom_browser_context.cc b/atom/browser/atom_browser_context.cc index b9ae67b684..7b682543a0 100644 --- a/atom/browser/atom_browser_context.cc +++ b/atom/browser/atom_browser_context.cc @@ -88,12 +88,15 @@ AtomBrowserContext::AtomBrowserContext(const std::string& partition, AtomBrowserContext::~AtomBrowserContext() { } +void AtomBrowserContext::SetUserAgent(const std::string& user_agent) { + user_agent_ = user_agent; +} + net::NetworkDelegate* AtomBrowserContext::CreateNetworkDelegate() { return network_delegate_; } std::string AtomBrowserContext::GetUserAgent() { - LOG(ERROR) << "GetUserAgent"; return user_agent_; } diff --git a/atom/browser/atom_browser_context.h b/atom/browser/atom_browser_context.h index dbbae38272..f793bc9870 100644 --- a/atom/browser/atom_browser_context.h +++ b/atom/browser/atom_browser_context.h @@ -22,6 +22,8 @@ class AtomBrowserContext : public brightray::BrowserContext { AtomBrowserContext(const std::string& partition, bool in_memory); ~AtomBrowserContext() override; + void SetUserAgent(const std::string& user_agent); + // brightray::URLRequestContextGetter::Delegate: net::NetworkDelegate* CreateNetworkDelegate() override; std::string GetUserAgent() override; diff --git a/vendor/brightray b/vendor/brightray index e26f8073df..8244628f0c 160000 --- a/vendor/brightray +++ b/vendor/brightray @@ -1 +1 @@ -Subproject commit e26f8073df2b20ba2169ffb082c5f135d542313b +Subproject commit 8244628f0c1d0eb15c659d42e882fb5d447c77ba From 6b1df5838cc5a372fd7d5a817c29cffb069bc446 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 22 Jun 2016 16:05:38 +0900 Subject: [PATCH 049/516] docs: ses.setUserAgent(userAgent[, acceptLanguages]) --- docs/api/session.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/api/session.md b/docs/api/session.md index 0486b1ddbd..1b23ff5865 100644 --- a/docs/api/session.md +++ b/docs/api/session.md @@ -341,6 +341,23 @@ session.defaultSession.allowNTLMCredentialsForDomains('*example.com, *foobar.com session.defaultSession.allowNTLMCredentialsForDomains('*') ``` +#### `ses.setUserAgent(userAgent[, acceptLanguages])` + +* `userAgent` String +* `acceptLanguages` String (optional) + +Overrides the `userAgent` and `acceptLanguages` for this session. + +The `acceptLanguages` must a comma separated ordered list of language codes, for +example `"en-US,fr,de,ko,zh-CN,ja"`. + +This doesn't affect existing `WebContents`, and each `WebContents` can use +`webContents.setUserAgent` to override the session-wide user agent. + +#### `ses.getUserAgent()` + +Returns a `String` representing the user agent for this session. + #### `ses.webRequest` The `webRequest` API set allows to intercept and modify contents of a request at From 6f9c4766fcd12b0b834f476a5c323dbbf74ea079 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 22 Jun 2016 16:10:36 +0900 Subject: [PATCH 050/516] Fix usages of global BrowserContext in App::ImportCertificate --- atom/browser/api/atom_api_app.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index bc29b988ee..265ed8f36b 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -463,10 +463,11 @@ void App::DisableHardwareAcceleration(mate::Arguments* args) { void App::ImportCertificate( const base::DictionaryValue& options, const net::CompletionCallback& callback) { - auto browser_context = AtomBrowserMainParts::Get()->browser_context(); + auto browser_context = brightray::BrowserContext::From("", false); if (!certificate_manager_model_) { std::unique_ptr copy = options.CreateDeepCopy(); - CertificateManagerModel::Create(browser_context, + CertificateManagerModel::Create( + browser_context.get(), base::Bind(&App::OnCertificateManagerModelCreated, base::Unretained(this), base::Passed(©), From 5a702e01533190b9f7b8784c4ce3ccc6f5a86ac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arif=20=C3=87ak=C4=B1ro=C4=9Flu?= Date: Wed, 22 Jun 2016 10:11:13 +0300 Subject: [PATCH 051/516] Update README.md add `electron-tr` community --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 83ba1f5a61..61e17e0c88 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,6 @@ forums - [`electron-br`](https://electron-br.slack.com) *(Brazilian Portuguese)* - [`electron-kr`](http://www.meetup.com/electron-kr/) *(Korean)* - [`electron-jp`](https://electron-jp-slackin.herokuapp.com/) *(Japanese)* - +- [`electron-tr`](http://www.meetup.com/Electron-JS-Istanbul/) *(Turkish)* Check out [awesome-electron](https://github.com/sindresorhus/awesome-electron) for a community maintained list of useful example apps, tools and resources. From 1a74177e2d0bb1d86d2d2ac2b2399f88b638445c Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 22 Jun 2016 16:34:25 +0900 Subject: [PATCH 052/516] docs: Separate Cookies and WebRequest classes in session.md --- docs/api/session.md | 283 ++++++++++++++++++++++++-------------------- 1 file changed, 154 insertions(+), 129 deletions(-) diff --git a/docs/api/session.md b/docs/api/session.md index 1b23ff5865..b6026c32dd 100644 --- a/docs/api/session.md +++ b/docs/api/session.md @@ -5,16 +5,15 @@ The `session` module can be used to create new `Session` objects. You can also access the `session` of existing pages by using the `session` -property of [`webContents`](web-contents.md) which is a property of -[`BrowserWindow`](browser-window.md). +property of [`WebContents`](web-contents.md), or from the `session` module. ```javascript -const {BrowserWindow} = require('electron'); +const {session, BrowserWindow} = require('electron') -let win = new BrowserWindow({width: 800, height: 600}); -win.loadURL('http://github.com'); +let win = new BrowserWindow({width: 800, height: 600}) +win.loadURL('http://github.com') -const ses = win.webContents.session; +const ses = win.webContents.session ``` ## Methods @@ -78,91 +77,6 @@ session.defaultSession.on('will-download', (event, item, webContents) => { The following methods are available on instances of `Session`: -#### `ses.cookies` - -The `cookies` gives you ability to query and modify cookies. For example: - -```javascript -// Query all cookies. -session.defaultSession.cookies.get({}, (error, cookies) => { - console.log(cookies); -}); - -// Query all cookies associated with a specific url. -session.defaultSession.cookies.get({url: 'http://www.github.com'}, (error, cookies) => { - console.log(cookies); -}); - -// Set a cookie with the given cookie data; -// may overwrite equivalent cookies if they exist. -const cookie = {url: 'http://www.github.com', name: 'dummy_name', value: 'dummy'}; -session.defaultSession.cookies.set(cookie, (error) => { - if (error) - console.error(error); -}); -``` - -#### `ses.cookies.get(filter, callback)` - -* `filter` Object - * `url` String (optional) - Retrieves cookies which are associated with - `url`. Empty implies retrieving cookies of all urls. - * `name` String (optional) - Filters cookies by name. - * `domain` String (optional) - Retrieves cookies whose domains match or are - subdomains of `domains` - * `path` String (optional) - Retrieves cookies whose path matches `path`. - * `secure` Boolean (optional) - Filters cookies by their Secure property. - * `session` Boolean (optional) - Filters out session or persistent cookies. -* `callback` Function - -Sends a request to get all cookies matching `details`, `callback` will be called -with `callback(error, cookies)` on complete. - -`cookies` is an Array of `cookie` objects. - -* `cookie` Object - * `name` String - The name of the cookie. - * `value` String - The value of the cookie. - * `domain` String - The domain of the cookie. - * `hostOnly` String - Whether the cookie is a host-only cookie. - * `path` String - The path of the cookie. - * `secure` Boolean - Whether the cookie is marked as secure. - * `httpOnly` Boolean - Whether the cookie is marked as HTTP only. - * `session` Boolean - Whether the cookie is a session cookie or a persistent - cookie with an expiration date. - * `expirationDate` Double (optional) - The expiration date of the cookie as - the number of seconds since the UNIX epoch. Not provided for session - cookies. - -#### `ses.cookies.set(details, callback)` - -* `details` Object - * `url` String - The url to associate the cookie with. - * `name` String - The name of the cookie. Empty by default if omitted. - * `value` String - The value of the cookie. Empty by default if omitted. - * `domain` String - The domain of the cookie. Empty by default if omitted. - * `path` String - The path of the cookie. Empty by default if omitted. - * `secure` Boolean - Whether the cookie should be marked as Secure. Defaults to - false. - * `session` Boolean - Whether the cookie should be marked as HTTP only. Defaults - to false. - * `expirationDate` Double - The expiration date of the cookie as the number of - seconds since the UNIX epoch. If omitted then the cookie becomes a session - cookie and will not be retained between sessions. -* `callback` Function - -Sets a cookie with `details`, `callback` will be called with `callback(error)` -on complete. - -#### `ses.cookies.remove(url, name, callback)` - -* `url` String - The URL associated with the cookie. -* `name` String - The name of cookie to remove. -* `callback` Function - -Removes the cookies matching `url` and `name`, `callback` will called with -`callback()` on complete. - #### `ses.getCacheSize(callback)` * `callback` Function @@ -358,15 +272,140 @@ This doesn't affect existing `WebContents`, and each `WebContents` can use Returns a `String` representing the user agent for this session. +### Instance Properties + +The following properties are available on instances of `Session`: + +#### `ses.cookies` + +Returns an instance of `Cookies` class for this session. + #### `ses.webRequest` -The `webRequest` API set allows to intercept and modify contents of a request at -various stages of its lifetime. +Returns an instance of `WebRequest` class for this session. -Each API accepts an optional `filter` and a `listener`, the `listener` will be -called with `listener(details)` when the API's event has happened, the `details` -is an object that describes the request. Passing `null` as `listener` will -unsubscribe from the event. +#### `ses.protocol` + +Returns an instance of [protocol](protocol.md) module for this session. + +```javascript +const {app, session} = require('electron') +const path = require('path') + +app.on('ready', function () { + const protocol = session.fromPartition(partitionName).protocol + protocol.registerFileProtocol('atom', function (request, callback) { + var url = request.url.substr(7) + callback({path: path.normalize(__dirname + '/' + url)}) + }, function (error) { + if (error) + console.error('Failed to register protocol') + }) +}) +``` + +## Class: Cookies + +The `Cookies` class gives you ability to query and modify cookies. Instances of +`Cookies` class must be received by using `cookies` property of `Session` class. + +For example: + +```javascript +// Query all cookies. +session.defaultSession.cookies.get({}, (error, cookies) => { + console.log(cookies) +}) + +// Query all cookies associated with a specific url. +session.defaultSession.cookies.get({url: 'http://www.github.com'}, (error, cookies) => { + console.log(cookies) +}) + +// Set a cookie with the given cookie data; +// may overwrite equivalent cookies if they exist. +const cookie = {url: 'http://www.github.com', name: 'dummy_name', value: 'dummy'} +session.defaultSession.cookies.set(cookie, (error) => { + if (error) + console.error(error) +}) +``` + +### Instance Methods + +The following methods are available on instances of `Cookies`: + +#### `cookies.get(filter, callback)` + +* `filter` Object + * `url` String (optional) - Retrieves cookies which are associated with + `url`. Empty implies retrieving cookies of all urls. + * `name` String (optional) - Filters cookies by name. + * `domain` String (optional) - Retrieves cookies whose domains match or are + subdomains of `domains` + * `path` String (optional) - Retrieves cookies whose path matches `path`. + * `secure` Boolean (optional) - Filters cookies by their Secure property. + * `session` Boolean (optional) - Filters out session or persistent cookies. +* `callback` Function + +Sends a request to get all cookies matching `details`, `callback` will be called +with `callback(error, cookies)` on complete. + +`cookies` is an Array of `cookie` objects. + +* `cookie` Object + * `name` String - The name of the cookie. + * `value` String - The value of the cookie. + * `domain` String - The domain of the cookie. + * `hostOnly` String - Whether the cookie is a host-only cookie. + * `path` String - The path of the cookie. + * `secure` Boolean - Whether the cookie is marked as secure. + * `httpOnly` Boolean - Whether the cookie is marked as HTTP only. + * `session` Boolean - Whether the cookie is a session cookie or a persistent + cookie with an expiration date. + * `expirationDate` Double (optional) - The expiration date of the cookie as + the number of seconds since the UNIX epoch. Not provided for session + cookies. + +#### `cookies.set(details, callback)` + +* `details` Object + * `url` String - The url to associate the cookie with. + * `name` String - The name of the cookie. Empty by default if omitted. + * `value` String - The value of the cookie. Empty by default if omitted. + * `domain` String - The domain of the cookie. Empty by default if omitted. + * `path` String - The path of the cookie. Empty by default if omitted. + * `secure` Boolean - Whether the cookie should be marked as Secure. Defaults to + false. + * `session` Boolean - Whether the cookie should be marked as HTTP only. Defaults + to false. + * `expirationDate` Double - The expiration date of the cookie as the number of + seconds since the UNIX epoch. If omitted then the cookie becomes a session + cookie and will not be retained between sessions. +* `callback` Function + +Sets a cookie with `details`, `callback` will be called with `callback(error)` +on complete. + +#### `cookies.remove(url, name, callback)` + +* `url` String - The URL associated with the cookie. +* `name` String - The name of cookie to remove. +* `callback` Function + +Removes the cookies matching `url` and `name`, `callback` will called with +`callback()` on complete. + +## Class: WebRequest + +The `WebRequest` class allows to intercept and modify contents of a request at +various stages of its lifetime. Instances of `WebRequest` class must be received +by using `webRequest` property of `Session` class. + +The methods of `WebRequest` accept an optional `filter` and a `listener`, the +`listener` will be called with `listener(details)` when the API's event has +happened, the `details` is an object that describes the request. Passing `null` +as `listener` will unsubscribe from the event. The `filter` is an object that has an `urls` property, which is an Array of URL patterns that will be used to filter out the requests that do not match the URL @@ -375,19 +414,25 @@ patterns. If the `filter` is omitted then all requests will be matched. For certain events the `listener` is passed with a `callback`, which should be called with an `response` object when `listener` has done its work. +An example of adding `User-Agent` header for requests: + ```javascript // Modify the user agent for all requests to the following urls. const filter = { urls: ['https://*.github.com/*', '*://electron.github.io'] -}; +} session.defaultSession.webRequest.onBeforeSendHeaders(filter, (details, callback) => { - details.requestHeaders['User-Agent'] = "MyAgent"; - callback({cancel: false, requestHeaders: details.requestHeaders}); -}); + details.requestHeaders['User-Agent'] = "MyAgent" + callback({cancel: false, requestHeaders: details.requestHeaders}) +}) ``` -#### `ses.webRequest.onBeforeRequest([filter, ]listener)` +### Instance Methods + +The following methods are available on instances of `WebRequest`: + +#### `webRequest.onBeforeRequest([filter, ]listener)` * `filter` Object * `listener` Function @@ -417,7 +462,7 @@ The `callback` has to be called with an `response` object: * `redirectURL` String (optional) - The original request is prevented from being sent or completed, and is instead redirected to the given URL. -#### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` +#### `webRequest.onBeforeSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -442,7 +487,7 @@ The `callback` has to be called with an `response` object: * `requestHeaders` Object (optional) - When provided, request will be made with these headers. -#### `ses.webRequest.onSendHeaders([filter, ]listener)` +#### `webRequest.onSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -459,7 +504,7 @@ response are visible by the time this listener is fired. * `timestamp` Double * `requestHeaders` Object -#### `ses.webRequest.onHeadersReceived([filter,]listener)` +#### `webRequest.onHeadersReceived([filter,]listener)` * `filter` Object * `listener` Function @@ -488,7 +533,7 @@ The `callback` has to be called with an `response` object: `responseHeaders` to change header status otherwise original response header's status will be used. -#### `ses.webRequest.onResponseStarted([filter, ]listener)` +#### `webRequest.onResponseStarted([filter, ]listener)` * `filter` Object * `listener` Function @@ -509,7 +554,7 @@ and response headers are available. * `statusCode` Integer * `statusLine` String -#### `ses.webRequest.onBeforeRedirect([filter, ]listener)` +#### `webRequest.onBeforeRedirect([filter, ]listener)` * `filter` Object * `listener` Function @@ -530,7 +575,7 @@ redirect is about to occur. * `fromCache` Boolean * `responseHeaders` Object -#### `ses.webRequest.onCompleted([filter, ]listener)` +#### `webRequest.onCompleted([filter, ]listener)` * `filter` Object * `listener` Function @@ -549,7 +594,7 @@ completed. * `statusCode` Integer * `statusLine` String -#### `ses.webRequest.onErrorOccurred([filter, ]listener)` +#### `webRequest.onErrorOccurred([filter, ]listener)` * `filter` Object * `listener` Function @@ -564,23 +609,3 @@ The `listener` will be called with `listener(details)` when an error occurs. * `timestamp` Double * `fromCache` Boolean * `error` String - The error description. - -#### `ses.protocol` - -Returns an instance of [protocol](protocol.md) module for this session. - -```javascript -const {app, session} = require('electron') -const path = require('path') - -app.on('ready', function () { - const protocol = session.fromPartition(partitionName).protocol - protocol.registerFileProtocol('atom', function (request, callback) { - var url = request.url.substr(7) - callback({path: path.normalize(__dirname + '/' + url)}) - }, function (error) { - if (error) - console.error('Failed to register protocol') - }) -}) -``` From 7e7c085dc7449d8ed2527f4e2ddb50bc627c0748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arif=20=C3=87ak=C4=B1ro=C4=9Flu?= Date: Wed, 22 Jun 2016 11:02:14 +0300 Subject: [PATCH 053/516] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 61e17e0c88..cf8d97a560 100644 --- a/README.md +++ b/README.md @@ -73,5 +73,6 @@ forums - [`electron-kr`](http://www.meetup.com/electron-kr/) *(Korean)* - [`electron-jp`](https://electron-jp-slackin.herokuapp.com/) *(Japanese)* - [`electron-tr`](http://www.meetup.com/Electron-JS-Istanbul/) *(Turkish)* + Check out [awesome-electron](https://github.com/sindresorhus/awesome-electron) for a community maintained list of useful example apps, tools and resources. From c243cf0c0ff641f930b5dfb7918e5c3f20b24ec1 Mon Sep 17 00:00:00 2001 From: Milan Burda Date: Wed, 22 Jun 2016 10:40:01 +0200 Subject: [PATCH 054/516] Add BrowserWindow.prototype.setContentProtection(enable) --- atom/browser/api/atom_api_window.cc | 5 +++++ atom/browser/api/atom_api_window.h | 1 + atom/browser/native_window.h | 1 + atom/browser/native_window_mac.h | 1 + atom/browser/native_window_mac.mm | 5 +++++ atom/browser/native_window_views.cc | 7 +++++++ atom/browser/native_window_views.h | 1 + docs/api/browser-window.md | 7 +++++++ 8 files changed, 28 insertions(+) diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index cc3749bd01..ae6bb77cf9 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -572,6 +572,10 @@ void Window::SetIgnoreMouseEvents(bool ignore) { return window_->SetIgnoreMouseEvents(ignore); } +void Window::SetContentProtection(bool enable) { + return window_->SetContentProtection(enable); +} + void Window::SetFocusable(bool focusable) { return window_->SetFocusable(focusable); } @@ -833,6 +837,7 @@ void Window::BuildPrototype(v8::Isolate* isolate, .SetMethod("setDocumentEdited", &Window::SetDocumentEdited) .SetMethod("isDocumentEdited", &Window::IsDocumentEdited) .SetMethod("setIgnoreMouseEvents", &Window::SetIgnoreMouseEvents) + .SetMethod("setContentProtection", &Window::SetContentProtection) .SetMethod("setFocusable", &Window::SetFocusable) .SetMethod("focusOnWebView", &Window::FocusOnWebView) .SetMethod("blurWebView", &Window::BlurWebView) diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index 21ecca4c72..a204b70e29 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -153,6 +153,7 @@ class Window : public mate::TrackableObject, void SetDocumentEdited(bool edited); bool IsDocumentEdited(); void SetIgnoreMouseEvents(bool ignore); + void SetContentProtection(bool enable); void SetFocusable(bool focusable); void CapturePage(mate::Arguments* args); void SetProgressBar(double progress); diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index d3b6f8a2b0..8656c02ca9 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -157,6 +157,7 @@ class NativeWindow : public base::SupportsUserData, virtual void SetDocumentEdited(bool edited); virtual bool IsDocumentEdited(); virtual void SetIgnoreMouseEvents(bool ignore) = 0; + virtual void SetContentProtection(bool enable) = 0; virtual void SetFocusable(bool focusable); virtual void SetMenu(ui::MenuModel* menu); virtual bool HasModalDialog(); diff --git a/atom/browser/native_window_mac.h b/atom/browser/native_window_mac.h index af99b3912e..d07d586a84 100644 --- a/atom/browser/native_window_mac.h +++ b/atom/browser/native_window_mac.h @@ -79,6 +79,7 @@ class NativeWindowMac : public NativeWindow { void SetDocumentEdited(bool edited) override; bool IsDocumentEdited() override; void SetIgnoreMouseEvents(bool ignore) override; + void SetContentProtection(bool enable) override; bool HasModalDialog() override; void SetParentWindow(NativeWindow* parent) override; gfx::NativeWindow GetNativeWindow() override; diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 3330eb8e9f..004d2cad23 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -941,6 +941,11 @@ void NativeWindowMac::SetIgnoreMouseEvents(bool ignore) { [window_ setIgnoresMouseEvents:ignore]; } +void NativeWindowMac::SetContentProtection(bool enable) { + [window_ setSharingType:enable ? NSWindowSharingNone + : NSWindowSharingReadOnly]; +} + bool NativeWindowMac::HasModalDialog() { return [window_ attachedSheet] != nil; } diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index 1feb9618ac..e9ff695281 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -728,6 +728,13 @@ void NativeWindowViews::SetIgnoreMouseEvents(bool ignore) { #endif } +void NativeWindowViews::SetContentProtection(bool enable) { +#if defined(OS_WIN) + DWORD affinity = enable ? WDA_MONITOR : WDA_NONE; + ::SetWindowDisplayAffinity(GetAcceleratedWidget(), affinity); +#endif +} + void NativeWindowViews::SetFocusable(bool focusable) { #if defined(OS_WIN) LONG ex_style = ::GetWindowLong(GetAcceleratedWidget(), GWL_EXSTYLE); diff --git a/atom/browser/native_window_views.h b/atom/browser/native_window_views.h index 69d3d27a35..71f3741f2f 100644 --- a/atom/browser/native_window_views.h +++ b/atom/browser/native_window_views.h @@ -96,6 +96,7 @@ class NativeWindowViews : public NativeWindow, void SetHasShadow(bool has_shadow) override; bool HasShadow() override; void SetIgnoreMouseEvents(bool ignore) override; + void SetContentProtection(bool enable) override; void SetFocusable(bool focusable) override; void SetMenu(ui::MenuModel* menu_model) override; void SetParentWindow(NativeWindow* parent) override; diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index e95570450b..e5a9732e22 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -1050,6 +1050,13 @@ All mouse events happened in this window will be passed to the window below this window, but if this window has focus, it will still receive keyboard events. +### `win.setContentProtection(enable)` _macOS_ _Windows_ + +Prevents the window contents from being captured by other apps. + +On macOS it sets the NSWindow's sharingType to NSWindowSharingNone. +On Windows it calls SetWindowDisplayAffinity with WDA_MONITOR. + ### `win.setFocusable(focusable)` _Windows_ * `focusable` Boolean From ca57f8a3913eeb9f11af850ef6fb43e8999869d0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 15:41:37 -0700 Subject: [PATCH 055/516] Remove CoffeeScript class wrapper --- lib/browser/api/menu-item.js | 159 +++++++++++++++++------------------ 1 file changed, 78 insertions(+), 81 deletions(-) diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index b0100b7f2f..25d52f8fbd 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -31,97 +31,94 @@ const methodInApp = { quit: true } -const MenuItem = (function () { - MenuItem.types = ['normal', 'separator', 'submenu', 'checkbox', 'radio'] +const MenuItem = function (options) { + const {app, Menu} = require('electron') - function MenuItem (options) { - const {app, Menu} = require('electron') + const click = options.click + this.selector = options.selector + this.type = options.type + this.role = options.role + this.label = options.label + this.sublabel = options.sublabel + this.accelerator = options.accelerator + this.icon = options.icon + this.enabled = options.enabled + this.visible = options.visible + this.checked = options.checked - const click = options.click - this.selector = options.selector - this.type = options.type - this.role = options.role - this.label = options.label - this.sublabel = options.sublabel - this.accelerator = options.accelerator - this.icon = options.icon - this.enabled = options.enabled - this.visible = options.visible - this.checked = options.checked - this.submenu = options.submenu - if ((this.submenu != null) && this.submenu.constructor !== Menu) { - this.submenu = Menu.buildFromTemplate(this.submenu) + this.submenu = options.submenu + if (this.submenu != null && this.submenu.constructor !== Menu) { + this.submenu = Menu.buildFromTemplate(this.submenu) + } + if (this.type == null && this.submenu != null) { + this.type = 'submenu' + } + if (this.type === 'submenu' && (this.submenu == null || this.submenu.constructor !== Menu)) { + throw new Error('Invalid submenu') + } + + this.overrideReadOnlyProperty('type', 'normal') + this.overrideReadOnlyProperty('role') + this.overrideReadOnlyProperty('accelerator') + this.overrideReadOnlyProperty('icon') + this.overrideReadOnlyProperty('submenu') + + this.overrideProperty('label', '') + this.overrideProperty('sublabel', '') + this.overrideProperty('enabled', true) + this.overrideProperty('visible', true) + this.overrideProperty('checked', false) + + if (!MenuItem.types.includes(this.type)) { + throw new Error(`Unknown menu type ${this.type}`) + } + + this.commandId = ++nextCommandId + + this.click = (focusedWindow) => { + // Manually flip the checked flags when clicked. + if (this.type === 'checkbox' || this.type === 'radio') { + this.checked = !this.checked } - if ((this.type == null) && (this.submenu != null)) { - this.type = 'submenu' - } - if (this.type === 'submenu' && (this.submenu != null ? this.submenu.constructor : void 0) !== Menu) { - throw new Error('Invalid submenu') - } - this.overrideReadOnlyProperty('type', 'normal') - this.overrideReadOnlyProperty('role') - this.overrideReadOnlyProperty('accelerator') - this.overrideReadOnlyProperty('icon') - this.overrideReadOnlyProperty('submenu') - this.overrideProperty('label', '') - this.overrideProperty('sublabel', '') - this.overrideProperty('enabled', true) - this.overrideProperty('visible', true) - this.overrideProperty('checked', false) - if (MenuItem.types.indexOf(this.type) === -1) { - throw new Error('Unknown menu type ' + this.type) - } - this.commandId = ++nextCommandId - this.click = (event, focusedWindow) => { - // Manually flip the checked flags when clicked. - if (this.type === 'checkbox' || this.type === 'radio') { - this.checked = !this.checked - } - - if (this.role && rolesMap[this.role] && process.platform !== 'darwin' && (focusedWindow != null)) { - const methodName = rolesMap[this.role] - if (methodInApp[methodName]) { - return app[methodName]() - } else if (typeof methodInBrowserWindow[methodName] === 'function') { - return methodInBrowserWindow[methodName](focusedWindow) - } else if (methodInBrowserWindow[methodName]) { - return focusedWindow[methodName]() - } else { - const {webContents} = focusedWindow - return webContents != null ? webContents[methodName]() : void 0 - } - } else if (typeof click === 'function') { - return click(this, focusedWindow, event) - } else if (typeof this.selector === 'string' && process.platform === 'darwin') { - return Menu.sendActionToFirstResponder(this.selector) + + if (this.role && rolesMap[this.role] && process.platform !== 'darwin' && focusedWindow != null) { + const methodName = rolesMap[this.role] + if (methodInApp[methodName]) { + return app[methodName]() + } else if (typeof methodInBrowserWindow[methodName] === 'function') { + return methodInBrowserWindow[methodName](focusedWindow) + } else if (methodInBrowserWindow[methodName]) { + return focusedWindow[methodName]() + } else { + const {webContents} = focusedWindow + return webContents != null ? webContents[methodName]() : void 0 } + } else if (typeof click === 'function') { + return click(this, focusedWindow) + } else if (typeof this.selector === 'string' && process.platform === 'darwin') { + return Menu.sendActionToFirstResponder(this.selector) } } +} - MenuItem.prototype.overrideProperty = function (name, defaultValue) { - if (defaultValue == null) { - defaultValue = null - } - this[name] != null ? this[name] : this[name] = defaultValue +MenuItem.types = ['normal', 'separator', 'submenu', 'checkbox', 'radio'] - return this[name] +MenuItem.prototype.overrideProperty = function (name, defaultValue) { + if (defaultValue == null) { + defaultValue = null } - - MenuItem.prototype.overrideReadOnlyProperty = function (name, defaultValue) { - if (defaultValue == null) { - defaultValue = null - } - if (this[name] == null) { - this[name] = defaultValue - } - return Object.defineProperty(this, name, { - enumerable: true, - writable: false, - value: this[name] - }) + if (this[name] == null) { + this[name] = defaultValue } +} - return MenuItem -})() +MenuItem.prototype.overrideReadOnlyProperty = function (name, defaultValue) { + this.overrideProperty(name, defaultValue) + Object.defineProperty(this, name, { + enumerable: true, + writable: false, + value: this[name] + }) +} module.exports = MenuItem From 93cbe6539f601f8cc643cd84a7cbeb44ebe6e772 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 15:59:02 -0700 Subject: [PATCH 056/516] Add spec for invalid menu item type --- lib/browser/api/menu-item.js | 2 +- spec/api-menu-spec.js | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index 25d52f8fbd..b8057922cb 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -70,7 +70,7 @@ const MenuItem = function (options) { this.overrideProperty('checked', false) if (!MenuItem.types.includes(this.type)) { - throw new Error(`Unknown menu type ${this.type}`) + throw new Error(`Unknown menu item type: ${this.type}`) } this.commandId = ++nextCommandId diff --git a/spec/api-menu-spec.js b/spec/api-menu-spec.js index a8cc5b518c..a9cf511893 100644 --- a/spec/api-menu-spec.js +++ b/spec/api-menu-spec.js @@ -359,4 +359,17 @@ describe('menu module', function () { } }) }) + + describe('MenuItem with invalid type', function () { + it('throws an exception', function () { + assert.throws(function () { + var menu = Menu.buildFromTemplate([ + { + label: 'text', + type: 'not-a-type' + } + ]) + }, /Unknown menu item type: not-a-type/) + }) + }) }) From 51b8c0292c49c22585a6a9d2f087cdb0901fc87b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 16:02:15 -0700 Subject: [PATCH 057/516] Add spec for submenu type with no submenu --- spec/api-menu-spec.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/spec/api-menu-spec.js b/spec/api-menu-spec.js index a9cf511893..db897cafdc 100644 --- a/spec/api-menu-spec.js +++ b/spec/api-menu-spec.js @@ -372,4 +372,17 @@ describe('menu module', function () { }, /Unknown menu item type: not-a-type/) }) }) + + describe('MenuItem with submenu type and missing submenu', function () { + it('throws an exception', function () { + assert.throws(function () { + var menu = Menu.buildFromTemplate([ + { + label: 'text', + type: 'submenu' + } + ]) + }, /Invalid submenu/) + }) + }) }) From 38e1abc5990c82d5a5bebf88d88d4be34733289b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 16:03:41 -0700 Subject: [PATCH 058/516] :art: Destructure requires --- spec/api-menu-spec.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/spec/api-menu-spec.js b/spec/api-menu-spec.js index db897cafdc..34ce250778 100644 --- a/spec/api-menu-spec.js +++ b/spec/api-menu-spec.js @@ -1,10 +1,7 @@ const assert = require('assert') -const remote = require('electron').remote -const ipcRenderer = require('electron').ipcRenderer - -const Menu = remote.require('electron').Menu -const MenuItem = remote.require('electron').MenuItem +const {ipcRenderer, remote} = require('electron') +const {Menu, MenuItem} = remote describe('menu module', function () { describe('Menu.buildFromTemplate', function () { From 4e8d4dfda9148767467597da0013671571342a15 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 21 Jun 2016 16:07:20 -0700 Subject: [PATCH 059/516] Move click variable near this.click --- lib/browser/api/menu-item.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index b8057922cb..b895cbebea 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -34,7 +34,6 @@ const methodInApp = { const MenuItem = function (options) { const {app, Menu} = require('electron') - const click = options.click this.selector = options.selector this.type = options.type this.role = options.role @@ -75,6 +74,7 @@ const MenuItem = function (options) { this.commandId = ++nextCommandId + const click = options.click this.click = (focusedWindow) => { // Manually flip the checked flags when clicked. if (this.type === 'checkbox' || this.type === 'radio') { From 50a62429e419f4e8083fd5f07f9b6f5c383156e0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 09:35:11 -0700 Subject: [PATCH 060/516] Add back event param --- lib/browser/api/menu-item.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index b895cbebea..e1ccda4886 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -75,7 +75,7 @@ const MenuItem = function (options) { this.commandId = ++nextCommandId const click = options.click - this.click = (focusedWindow) => { + this.click = (event, focusedWindow) => { // Manually flip the checked flags when clicked. if (this.type === 'checkbox' || this.type === 'radio') { this.checked = !this.checked @@ -94,7 +94,7 @@ const MenuItem = function (options) { return webContents != null ? webContents[methodName]() : void 0 } } else if (typeof click === 'function') { - return click(this, focusedWindow) + return click(this, focusedWindow, event) } else if (typeof this.selector === 'string' && process.platform === 'darwin') { return Menu.sendActionToFirstResponder(this.selector) } From bd744125018f1c62b63c30ab76a60fc405dd7e60 Mon Sep 17 00:00:00 2001 From: Josh Abernathy Date: Wed, 22 Jun 2016 13:00:31 -0400 Subject: [PATCH 061/516] Update external frameworks version Bump to [1.1.0](https://github.com/electron/electron-frameworks/releases/tag/v1.1.0) which upgraded Squirrel.Mac. --- script/update-external-binaries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/update-external-binaries.py b/script/update-external-binaries.py index 470f735fdb..4494df2526 100755 --- a/script/update-external-binaries.py +++ b/script/update-external-binaries.py @@ -8,7 +8,7 @@ from lib.config import get_target_arch from lib.util import safe_mkdir, rm_rf, extract_zip, tempdir, download -VERSION = 'v1.0.0' +VERSION = 'v1.1.0' SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) FRAMEWORKS_URL = 'http://github.com/electron/electron-frameworks/releases' \ '/download/' + VERSION From 90600ba653d2d17bfd739cc49403a3e322caa61a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 10:06:54 -0700 Subject: [PATCH 062/516] Add failing spec for writeable command id --- spec/api-menu-spec.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/spec/api-menu-spec.js b/spec/api-menu-spec.js index 34ce250778..d6ac56475f 100644 --- a/spec/api-menu-spec.js +++ b/spec/api-menu-spec.js @@ -357,10 +357,23 @@ describe('menu module', function () { }) }) + describe('MenuItem command id', function () { + it('cannot be overwritten', function () { + var item = new MenuItem({ + label: 'item' + }) + + var commandId = item.commandId + assert(commandId != null) + item.commandId = '' + commandId + '-modified' + assert.equal(item.commandId, commandId) + }) + }) + describe('MenuItem with invalid type', function () { it('throws an exception', function () { assert.throws(function () { - var menu = Menu.buildFromTemplate([ + Menu.buildFromTemplate([ { label: 'text', type: 'not-a-type' @@ -373,7 +386,7 @@ describe('menu module', function () { describe('MenuItem with submenu type and missing submenu', function () { it('throws an exception', function () { assert.throws(function () { - var menu = Menu.buildFromTemplate([ + Menu.buildFromTemplate([ { label: 'text', type: 'submenu' From ad110fc806a94e16a5ead9288b5d041bc3e997b5 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 10:07:02 -0700 Subject: [PATCH 063/516] Make commandId a read only property --- lib/browser/api/menu-item.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index e1ccda4886..264be81790 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -72,7 +72,7 @@ const MenuItem = function (options) { throw new Error(`Unknown menu item type: ${this.type}`) } - this.commandId = ++nextCommandId + this.overrideReadOnlyProperty('commandId', ++nextCommandId) const click = options.click this.click = (event, focusedWindow) => { From 25b2724ab94e775229fe40e32d9409f0f5dd10c4 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 10:29:49 -0700 Subject: [PATCH 064/516] Add menu item role defaults --- filenames.gypi | 1 + lib/browser/api/menu-item-roles.js | 65 ++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 lib/browser/api/menu-item-roles.js diff --git a/filenames.gypi b/filenames.gypi index af7080821b..6b086e1f8b 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -21,6 +21,7 @@ 'lib/browser/api/ipc-main.js', 'lib/browser/api/menu.js', 'lib/browser/api/menu-item.js', + 'lib/browser/api/menu-item-roles.js', 'lib/browser/api/navigation-controller.js', 'lib/browser/api/power-monitor.js', 'lib/browser/api/power-save-blocker.js', diff --git a/lib/browser/api/menu-item-roles.js b/lib/browser/api/menu-item-roles.js new file mode 100644 index 0000000000..13484e5da9 --- /dev/null +++ b/lib/browser/api/menu-item-roles.js @@ -0,0 +1,65 @@ +module.exports = { + undo: { + label: 'Undo', + accelerator: 'CmdOrCtrl+Z', + method: 'undo' + }, + redo: { + label: 'Redo', + accelerator: 'Shift+CmdOrCtrl+Z', + method: 'redo' + }, + cut: { + label: 'Cut', + accelerator: 'CmdOrCtrl+X', + method: 'cut' + }, + copy: { + label: 'Copy', + accelerator: 'CmdOrCtrl+C', + method: 'copy' + }, + paste: { + label: 'Paste', + accelerator: 'CmdOrCtrl+V', + method: 'paste' + }, + pasteandmatchstyle: { + label: 'Paste and Match Style', + accelerator: 'Shift+Command+V', + method: 'pasteAndMatchStyle' + }, + selectall: { + label: 'Select All', + accelerator: 'CmdOrCtrl+A', + method: 'selectAll' + }, + minimize: { + label: 'Minimize', + accelerator: 'CmdOrCtrl+M', + method: 'minimize' + }, + close: { + label: 'Close', + accelerator: 'CmdOrCtrl+W', + method: 'close' + }, + delete: { + label: 'Delete', + accelerator: 'Delete', + method: 'delete' + }, + quit: { + get label () { + const {app} = require('electron') + return process.platform === 'win32' ? 'Exit' : `Quit ${app.getName()}` + }, + accelerator: process.platform === 'win32' ? null : 'Command+Q', + method: 'quit' + }, + togglefullscreen: { + label: 'Toggle Full Screen', + accelerator: process.platform === 'darwin' ? 'Ctrl+Command+F' : 'F11', + method: 'toggleFullScreen' + } +} From 13a6d32ee9ab48fdb5d81d6e5c5a2d106a9e7c20 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 10:45:01 -0700 Subject: [PATCH 065/516] Add default label/accelerator to role menu items --- lib/browser/api/menu-item-roles.js | 14 +++++++++++++- lib/browser/api/menu-item.js | 6 ++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/browser/api/menu-item-roles.js b/lib/browser/api/menu-item-roles.js index 13484e5da9..f26e9c5a5a 100644 --- a/lib/browser/api/menu-item-roles.js +++ b/lib/browser/api/menu-item-roles.js @@ -1,4 +1,4 @@ -module.exports = { +const roles = { undo: { label: 'Undo', accelerator: 'CmdOrCtrl+Z', @@ -63,3 +63,15 @@ module.exports = { method: 'toggleFullScreen' } } + +exports.getDefaultLabel = function (role) { + if (roles.hasOwnProperty(role)) { + return roles[role].label + } else { + return '' + } +} + +exports.getDefaultAccelerator = function (role) { + if (roles.hasOwnProperty(role)) return roles[role].accelerator +} diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index 264be81790..ba980960b5 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -1,5 +1,7 @@ 'use strict' +const roles = require('./menu-item-roles') + let nextCommandId = 0 // Maps role to methods of webContents @@ -58,11 +60,11 @@ const MenuItem = function (options) { this.overrideReadOnlyProperty('type', 'normal') this.overrideReadOnlyProperty('role') - this.overrideReadOnlyProperty('accelerator') + this.overrideReadOnlyProperty('accelerator', roles.getDefaultAccelerator(this.role)) this.overrideReadOnlyProperty('icon') this.overrideReadOnlyProperty('submenu') - this.overrideProperty('label', '') + this.overrideProperty('label', roles.getDefaultLabel(this.role)) this.overrideProperty('sublabel', '') this.overrideProperty('enabled', true) this.overrideProperty('visible', true) From 566a407b363934ee003be09151a4bf9b3a5e8a89 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 10:46:17 -0700 Subject: [PATCH 066/516] Use default labels and accelerators --- default_app/main.js | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/default_app/main.js b/default_app/main.js index 8b2fb1bbf3..085708cb44 100644 --- a/default_app/main.js +++ b/default_app/main.js @@ -52,46 +52,30 @@ app.once('ready', () => { label: 'Edit', submenu: [ { - label: 'Undo', - accelerator: 'CmdOrCtrl+Z', role: 'undo' }, { - label: 'Redo', - accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo' }, { type: 'separator' }, { - label: 'Cut', - accelerator: 'CmdOrCtrl+X', role: 'cut' }, { - label: 'Copy', - accelerator: 'CmdOrCtrl+C', role: 'copy' }, { - label: 'Paste', - accelerator: 'CmdOrCtrl+V', role: 'paste' }, { - label: 'Paste and Match Style', - accelerator: 'Shift+Command+V', role: 'pasteandmatchstyle' }, { - label: 'Delete', - accelerator: 'Delete', role: 'delete' }, { - label: 'Select All', - accelerator: 'CmdOrCtrl+A', role: 'selectall' } ] @@ -107,9 +91,7 @@ app.once('ready', () => { } }, { - label: 'Toggle Full Screen', role: 'togglefullscreen', - accelerator: process.platform === 'darwin' ? 'Ctrl+Command+F' : 'F11' }, { label: 'Toggle Developer Tools', @@ -125,13 +107,9 @@ app.once('ready', () => { role: 'window', submenu: [ { - label: 'Minimize', - accelerator: 'CmdOrCtrl+M', role: 'minimize' }, { - label: 'Close', - accelerator: 'CmdOrCtrl+W', role: 'close' } ] From 888068b59717fe1e6ae14c178b216a30cd61cce3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 10:47:25 -0700 Subject: [PATCH 067/516] Add default help/window labels --- default_app/main.js | 2 -- lib/browser/api/menu-item-roles.js | 6 ++++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/default_app/main.js b/default_app/main.js index 085708cb44..45ff78e1b9 100644 --- a/default_app/main.js +++ b/default_app/main.js @@ -103,7 +103,6 @@ app.once('ready', () => { ] }, { - label: 'Window', role: 'window', submenu: [ { @@ -115,7 +114,6 @@ app.once('ready', () => { ] }, { - label: 'Help', role: 'help', submenu: [ { diff --git a/lib/browser/api/menu-item-roles.js b/lib/browser/api/menu-item-roles.js index f26e9c5a5a..c78ff8aed8 100644 --- a/lib/browser/api/menu-item-roles.js +++ b/lib/browser/api/menu-item-roles.js @@ -61,6 +61,12 @@ const roles = { label: 'Toggle Full Screen', accelerator: process.platform === 'darwin' ? 'Ctrl+Command+F' : 'F11', method: 'toggleFullScreen' + }, + help: { + label: 'Help' + }, + window: { + label: 'Window' } } From c0562d16d58c2ee727da493c70c2730d15fefafb Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 13:09:39 -0700 Subject: [PATCH 068/516] Add more role defaults --- default_app/main.js | 16 ---------------- lib/browser/api/menu-item-roles.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/default_app/main.js b/default_app/main.js index 45ff78e1b9..a484c030db 100644 --- a/default_app/main.js +++ b/default_app/main.js @@ -151,14 +151,12 @@ app.once('ready', () => { label: 'Electron', submenu: [ { - label: 'About Electron', role: 'about' }, { type: 'separator' }, { - label: 'Services', role: 'services', submenu: [] }, @@ -166,49 +164,36 @@ app.once('ready', () => { type: 'separator' }, { - label: 'Hide Electron', - accelerator: 'Command+H', role: 'hide' }, { - label: 'Hide Others', - accelerator: 'Command+Alt+H', role: 'hideothers' }, { - label: 'Show All', role: 'unhide' }, { type: 'separator' }, { - label: 'Quit ' + app.getName(), - accelerator: 'Command+Q', role: 'quit' } ] }) template[3].submenu = [ { - label: 'Close', - accelerator: 'CmdOrCtrl+W', role: 'close' }, { - label: 'Minimize', - accelerator: 'CmdOrCtrl+M', role: 'minimize' }, { - label: 'Zoom', role: 'zoom' }, { type: 'separator' }, { - label: 'Bring All to Front', role: 'front' } ] @@ -219,7 +204,6 @@ app.once('ready', () => { label: 'File', submenu: [ { - label: 'Exit', role: 'quit' } ] diff --git a/lib/browser/api/menu-item-roles.js b/lib/browser/api/menu-item-roles.js index c78ff8aed8..a5373c65ac 100644 --- a/lib/browser/api/menu-item-roles.js +++ b/lib/browser/api/menu-item-roles.js @@ -67,6 +67,35 @@ const roles = { }, window: { label: 'Window' + }, + services: { + label: 'Services' + }, + zoom: { + label: 'Zoom' + }, + front: { + label: 'Bring All to Front' + }, + about: { + get label () { + const {app} = require('electron') + return `About ${app.getName()}` + } + }, + hide: { + get label () { + const {app} = require('electron') + return return `Hide ${app.getName()}` + }, + accelerator: 'Command+H' + }, + hideothers: { + label: 'Hide Others', + accelerator: 'Command+Alt+H' + }, + unhide: { + label: 'Show All' } } From 653370974a5029ce88bced81a553f155a7eebd2c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 13:15:20 -0700 Subject: [PATCH 069/516] :art: Sort roles alphabetically --- lib/browser/api/menu-item-roles.js | 120 ++++++++++++++--------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/lib/browser/api/menu-item-roles.js b/lib/browser/api/menu-item-roles.js index a5373c65ac..6d6b0371e8 100644 --- a/lib/browser/api/menu-item-roles.js +++ b/lib/browser/api/menu-item-roles.js @@ -1,23 +1,51 @@ const roles = { - undo: { - label: 'Undo', - accelerator: 'CmdOrCtrl+Z', - method: 'undo' + about: { + get label () { + const {app} = require('electron') + return `About ${app.getName()}` + } }, - redo: { - label: 'Redo', - accelerator: 'Shift+CmdOrCtrl+Z', - method: 'redo' + close: { + label: 'Close', + accelerator: 'CmdOrCtrl+W', + method: 'close' + }, + copy: { + label: 'Copy', + accelerator: 'CmdOrCtrl+C', + method: 'copy' }, cut: { label: 'Cut', accelerator: 'CmdOrCtrl+X', method: 'cut' }, - copy: { - label: 'Copy', - accelerator: 'CmdOrCtrl+C', - method: 'copy' + delete: { + label: 'Delete', + accelerator: 'Delete', + method: 'delete' + }, + front: { + label: 'Bring All to Front' + }, + help: { + label: 'Help' + }, + hide: { + get label () { + const {app} = require('electron') + return `Hide ${app.getName()}` + }, + accelerator: 'Command+H' + }, + hideothers: { + label: 'Hide Others', + accelerator: 'Command+Alt+H' + }, + minimize: { + label: 'Minimize', + accelerator: 'CmdOrCtrl+M', + method: 'minimize' }, paste: { label: 'Paste', @@ -29,26 +57,6 @@ const roles = { accelerator: 'Shift+Command+V', method: 'pasteAndMatchStyle' }, - selectall: { - label: 'Select All', - accelerator: 'CmdOrCtrl+A', - method: 'selectAll' - }, - minimize: { - label: 'Minimize', - accelerator: 'CmdOrCtrl+M', - method: 'minimize' - }, - close: { - label: 'Close', - accelerator: 'CmdOrCtrl+W', - method: 'close' - }, - delete: { - label: 'Delete', - accelerator: 'Delete', - method: 'delete' - }, quit: { get label () { const {app} = require('electron') @@ -57,45 +65,37 @@ const roles = { accelerator: process.platform === 'win32' ? null : 'Command+Q', method: 'quit' }, + redo: { + label: 'Redo', + accelerator: 'Shift+CmdOrCtrl+Z', + method: 'redo' + }, + selectall: { + label: 'Select All', + accelerator: 'CmdOrCtrl+A', + method: 'selectAll' + }, + services: { + label: 'Services' + }, togglefullscreen: { label: 'Toggle Full Screen', accelerator: process.platform === 'darwin' ? 'Ctrl+Command+F' : 'F11', method: 'toggleFullScreen' }, - help: { - label: 'Help' + undo: { + label: 'Undo', + accelerator: 'CmdOrCtrl+Z', + method: 'undo' + }, + unhide: { + label: 'Show All' }, window: { label: 'Window' }, - services: { - label: 'Services' - }, zoom: { label: 'Zoom' - }, - front: { - label: 'Bring All to Front' - }, - about: { - get label () { - const {app} = require('electron') - return `About ${app.getName()}` - } - }, - hide: { - get label () { - const {app} = require('electron') - return return `Hide ${app.getName()}` - }, - accelerator: 'Command+H' - }, - hideothers: { - label: 'Hide Others', - accelerator: 'Command+Alt+H' - }, - unhide: { - label: 'Show All' } } From 66f2fb2fe4ae6c0b39991db4078097067a3ae048 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 13:48:26 -0700 Subject: [PATCH 070/516] Add execute helper to roles file --- lib/browser/api/menu-item-roles.js | 57 +++++++++++++++++++++++------- lib/browser/api/menu-item.js | 49 +++---------------------- 2 files changed, 50 insertions(+), 56 deletions(-) diff --git a/lib/browser/api/menu-item-roles.js b/lib/browser/api/menu-item-roles.js index 6d6b0371e8..947bf4d28c 100644 --- a/lib/browser/api/menu-item-roles.js +++ b/lib/browser/api/menu-item-roles.js @@ -8,22 +8,22 @@ const roles = { close: { label: 'Close', accelerator: 'CmdOrCtrl+W', - method: 'close' + windowMethod: 'close' }, copy: { label: 'Copy', accelerator: 'CmdOrCtrl+C', - method: 'copy' + webContentsMethod: 'copy' }, cut: { label: 'Cut', accelerator: 'CmdOrCtrl+X', - method: 'cut' + webContentsMethod: 'cut' }, delete: { label: 'Delete', accelerator: 'Delete', - method: 'delete' + webContentsMethod: 'delete' }, front: { label: 'Bring All to Front' @@ -45,17 +45,17 @@ const roles = { minimize: { label: 'Minimize', accelerator: 'CmdOrCtrl+M', - method: 'minimize' + windowMethod: 'minimize' }, paste: { label: 'Paste', accelerator: 'CmdOrCtrl+V', - method: 'paste' + webContentsMethod: 'paste' }, pasteandmatchstyle: { label: 'Paste and Match Style', accelerator: 'Shift+Command+V', - method: 'pasteAndMatchStyle' + webContentsMethod: 'pasteAndMatchStyle' }, quit: { get label () { @@ -63,17 +63,17 @@ const roles = { return process.platform === 'win32' ? 'Exit' : `Quit ${app.getName()}` }, accelerator: process.platform === 'win32' ? null : 'Command+Q', - method: 'quit' + appMethod: 'quit' }, redo: { label: 'Redo', accelerator: 'Shift+CmdOrCtrl+Z', - method: 'redo' + webContentsMethod: 'redo' }, selectall: { label: 'Select All', accelerator: 'CmdOrCtrl+A', - method: 'selectAll' + webContentsMethod: 'selectAll' }, services: { label: 'Services' @@ -81,12 +81,14 @@ const roles = { togglefullscreen: { label: 'Toggle Full Screen', accelerator: process.platform === 'darwin' ? 'Ctrl+Command+F' : 'F11', - method: 'toggleFullScreen' + windowMethod: function (window) { + window.setFullScreen(!window.isFullScreen()) + } }, undo: { label: 'Undo', accelerator: 'CmdOrCtrl+Z', - method: 'undo' + webContentsMethod: 'undo' }, unhide: { label: 'Show All' @@ -110,3 +112,34 @@ exports.getDefaultLabel = function (role) { exports.getDefaultAccelerator = function (role) { if (roles.hasOwnProperty(role)) return roles[role].accelerator } + +exports.execute = function (role, focusedWindow) { + if (!roles.hasOwnProperty(role)) return false + if (process.platform === 'darwin') return false + + const {appMethod, webContentsMethod, windowMethod} = roles[role] + + if (appMethod) { + app[appMethod]() + return true + } + + if (focusedWindow != null) { + if (windowMethod) { + if (typeof windowMethod === 'function') { + windowMethod(focusedWindow) + } else { + focusedWindow[windowMethod]() + } + return true + } else if (webContentsMethod) { + const {webContents} = focusedWindow + if (webContents) { + webContents[webContentsMethod]() + } + return true + } + } + + return false +} diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index ba980960b5..d2d8e65198 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -4,35 +4,6 @@ const roles = require('./menu-item-roles') let nextCommandId = 0 -// Maps role to methods of webContents -const rolesMap = { - undo: 'undo', - redo: 'redo', - cut: 'cut', - copy: 'copy', - paste: 'paste', - pasteandmatchstyle: 'pasteAndMatchStyle', - selectall: 'selectAll', - minimize: 'minimize', - close: 'close', - delete: 'delete', - quit: 'quit', - togglefullscreen: 'toggleFullScreen' -} - -// Maps methods that should be called directly on the BrowserWindow instance -const methodInBrowserWindow = { - minimize: true, - close: true, - toggleFullScreen: function (window) { - window.setFullScreen(!window.isFullScreen()) - } -} - -const methodInApp = { - quit: true -} - const MenuItem = function (options) { const {app, Menu} = require('electron') @@ -83,22 +54,12 @@ const MenuItem = function (options) { this.checked = !this.checked } - if (this.role && rolesMap[this.role] && process.platform !== 'darwin' && focusedWindow != null) { - const methodName = rolesMap[this.role] - if (methodInApp[methodName]) { - return app[methodName]() - } else if (typeof methodInBrowserWindow[methodName] === 'function') { - return methodInBrowserWindow[methodName](focusedWindow) - } else if (methodInBrowserWindow[methodName]) { - return focusedWindow[methodName]() - } else { - const {webContents} = focusedWindow - return webContents != null ? webContents[methodName]() : void 0 + if (!roles.execute(this.role)) { + if (typeof click === 'function') { + click(this, focusedWindow, event) + } else if (typeof this.selector === 'string' && process.platform === 'darwin') { + Menu.sendActionToFirstResponder(this.selector) } - } else if (typeof click === 'function') { - return click(this, focusedWindow, event) - } else if (typeof this.selector === 'string' && process.platform === 'darwin') { - return Menu.sendActionToFirstResponder(this.selector) } } } From 30e3a6ed8363ff99b5c301c2b866e981b25d8b89 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 13:59:49 -0700 Subject: [PATCH 071/516] Add app require --- lib/browser/api/menu-item-roles.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/browser/api/menu-item-roles.js b/lib/browser/api/menu-item-roles.js index 947bf4d28c..a6a985a5e2 100644 --- a/lib/browser/api/menu-item-roles.js +++ b/lib/browser/api/menu-item-roles.js @@ -120,6 +120,7 @@ exports.execute = function (role, focusedWindow) { const {appMethod, webContentsMethod, windowMethod} = roles[role] if (appMethod) { + const {app} = require('electron') app[appMethod]() return true } From c6dc6a8905e3db5bf99035094d42d399325a21d9 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 14:02:31 -0700 Subject: [PATCH 072/516] Specify focused window to execute call --- lib/browser/api/menu-item.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index d2d8e65198..2f96fdd316 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -54,7 +54,7 @@ const MenuItem = function (options) { this.checked = !this.checked } - if (!roles.execute(this.role)) { + if (!roles.execute(this.role, focusedWindow)) { if (typeof click === 'function') { click(this, focusedWindow, event) } else if (typeof this.selector === 'string' && process.platform === 'darwin') { From 5096d7835f71f5d79bd6df4edeadadb489669d17 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 14:07:46 -0700 Subject: [PATCH 073/516] Add spec for default role label/accelerator --- spec/api-menu-spec.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/spec/api-menu-spec.js b/spec/api-menu-spec.js index d6ac56475f..a6c56a9a40 100644 --- a/spec/api-menu-spec.js +++ b/spec/api-menu-spec.js @@ -395,4 +395,28 @@ describe('menu module', function () { }, /Invalid submenu/) }) }) + + describe('MenuItem role', function () { + it('includes a default label and accelerator', function () { + var item = new MenuItem({role: 'close'}) + assert.equal(item.label, 'Close') + assert.equal(item.accelerator, 'CmdOrCtrl+W') + + var item = new MenuItem({role: 'close', label: 'Other'}) + assert.equal(item.label, 'Other') + assert.equal(item.accelerator, 'CmdOrCtrl+W') + + var item = new MenuItem({role: 'close', accelerator: 'D'}) + assert.equal(item.label, 'Close') + assert.equal(item.accelerator, 'D') + + var item = new MenuItem({role: 'close', label: 'C', accelerator: 'D'}) + assert.equal(item.label, 'C') + assert.equal(item.accelerator, 'D') + + var item = new MenuItem({role: 'help'}) + assert.equal(item.label, 'Help') + assert.equal(item.accelerator, undefined) + }) + }) }) From c98f419bc805a4feddaccd299191e721a900b757 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 14:10:38 -0700 Subject: [PATCH 074/516] Doc role defaults --- docs/api/menu-item.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/api/menu-item.md b/docs/api/menu-item.md index 0d05d81bcd..3a9a565a9d 100644 --- a/docs/api/menu-item.md +++ b/docs/api/menu-item.md @@ -39,6 +39,9 @@ It is best to specify `role` for any menu item that matches a standard role, rather than trying to manually implement the behavior in a `click` function. The built-in `role` behavior will give the best native experience. +The `label` and `accelerator` are optional when using a `role` and will default +to appropriate values for each platform. + The `role` property can have following values: * `undo` From 58c1d38c96499e4e4f3b498704d88b3feb29a004 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 14:13:12 -0700 Subject: [PATCH 075/516] Remove lint errors --- default_app/main.js | 2 +- lib/browser/api/menu-item.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/default_app/main.js b/default_app/main.js index a484c030db..dd887e0def 100644 --- a/default_app/main.js +++ b/default_app/main.js @@ -91,7 +91,7 @@ app.once('ready', () => { } }, { - role: 'togglefullscreen', + role: 'togglefullscreen' }, { label: 'Toggle Developer Tools', diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index 2f96fdd316..8fb1b51d1e 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -5,7 +5,7 @@ const roles = require('./menu-item-roles') let nextCommandId = 0 const MenuItem = function (options) { - const {app, Menu} = require('electron') + const {Menu} = require('electron') this.selector = options.selector this.type = options.type From ece319a6871bc76c358db8b1a033ac878cb1e5a9 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 14:14:32 -0700 Subject: [PATCH 076/516] :art: --- lib/browser/api/menu-item-roles.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/browser/api/menu-item-roles.js b/lib/browser/api/menu-item-roles.js index a6a985a5e2..aaebd56223 100644 --- a/lib/browser/api/menu-item-roles.js +++ b/lib/browser/api/menu-item-roles.js @@ -125,21 +125,21 @@ exports.execute = function (role, focusedWindow) { return true } - if (focusedWindow != null) { - if (windowMethod) { - if (typeof windowMethod === 'function') { - windowMethod(focusedWindow) - } else { - focusedWindow[windowMethod]() - } - return true - } else if (webContentsMethod) { - const {webContents} = focusedWindow - if (webContents) { - webContents[webContentsMethod]() - } - return true + if (windowMethod && focusedWindow != null) { + if (typeof windowMethod === 'function') { + windowMethod(focusedWindow) + } else { + focusedWindow[windowMethod]() } + return true + } + + if (webContentsMethod && focusedWindow != null) { + const {webContents} = focusedWindow + if (webContents) { + webContents[webContentsMethod]() + } + return true } return false From b7afe44a5c16b1e876b08a32cca731c0c777d5e0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 14:22:15 -0700 Subject: [PATCH 077/516] Add assert for role with app name in label --- spec/api-menu-spec.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spec/api-menu-spec.js b/spec/api-menu-spec.js index a6c56a9a40..7d1044b232 100644 --- a/spec/api-menu-spec.js +++ b/spec/api-menu-spec.js @@ -417,6 +417,10 @@ describe('menu module', function () { var item = new MenuItem({role: 'help'}) assert.equal(item.label, 'Help') assert.equal(item.accelerator, undefined) + + var item = new MenuItem({role: 'about'}) + assert.equal(item.label, 'About Electron Test') + assert.equal(item.accelerator, undefined) }) }) }) From 4dbdcad05ea841021a906b305161beaced5c0042 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 14:37:16 -0700 Subject: [PATCH 078/516] Remove label/accelerators with role defaults --- docs/api/menu.md | 39 ++------------------------------------- 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/docs/api/menu.md b/docs/api/menu.md index 7dea2c6b4c..d54469545e 100644 --- a/docs/api/menu.md +++ b/docs/api/menu.md @@ -39,45 +39,30 @@ const template = [ label: 'Edit', submenu: [ { - label: 'Undo', - accelerator: 'CmdOrCtrl+Z', role: 'undo' }, { - label: 'Redo', - accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo' }, { type: 'separator' }, { - label: 'Cut', - accelerator: 'CmdOrCtrl+X', role: 'cut' }, { - label: 'Copy', - accelerator: 'CmdOrCtrl+C', role: 'copy' }, { - label: 'Paste', - accelerator: 'CmdOrCtrl+V', role: 'paste' }, { - label: 'Paste and Match Style', - accelerator: 'Shift+Command+V', role: 'pasteandmatchstyle' }, { - label: 'Delete', role: 'delete' }, { - label: 'Select All', - accelerator: 'CmdOrCtrl+A', role: 'selectall' }, ] @@ -93,12 +78,7 @@ const template = [ } }, { - label: 'Toggle Full Screen', - accelerator: process.platform === 'darwin' ? 'Ctrl+Command+F' : 'F11', - click(item, focusedWindow) { - if (focusedWindow) - focusedWindow.setFullScreen(!focusedWindow.isFullScreen()); - } + role: 'togglefullscreen' }, { label: 'Toggle Developer Tools', @@ -111,23 +91,17 @@ const template = [ ] }, { - label: 'Window', role: 'window', submenu: [ { - label: 'Minimize', - accelerator: 'CmdOrCtrl+M', role: 'minimize' }, { - label: 'Close', - accelerator: 'CmdOrCtrl+W', role: 'close' }, ] }, { - label: 'Help', role: 'help', submenu: [ { @@ -144,14 +118,12 @@ if (process.platform === 'darwin') { label: name, submenu: [ { - label: 'About ' + name, role: 'about' }, { type: 'separator' }, { - label: 'Services', role: 'services', submenu: [] }, @@ -159,26 +131,19 @@ if (process.platform === 'darwin') { type: 'separator' }, { - label: 'Hide ' + name, - accelerator: 'Command+H', role: 'hide' }, { - label: 'Hide Others', - accelerator: 'Command+Alt+H', role: 'hideothers' }, { - label: 'Show All', role: 'unhide' }, { type: 'separator' }, { - label: 'Quit', - accelerator: 'Command+Q', - click() { app.quit(); } + role: 'quit' }, ] }); From be642612c02b8e7fba92b2417a135a7b092d939d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 15:21:45 -0700 Subject: [PATCH 079/516] Export app before requiring modules --- lib/browser/api/app.js | 12 ++++++------ lib/browser/api/menu-item-roles.js | 6 ++---- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/browser/api/app.js b/lib/browser/api/app.js index 09835a792e..34210f4209 100644 --- a/lib/browser/api/app.js +++ b/lib/browser/api/app.js @@ -1,12 +1,15 @@ 'use strict' +const bindings = process.atomBinding('app') +const {app} = bindings + +// Only one app object permitted. +module.exports = app + const electron = require('electron') const {deprecate, Menu} = electron const {EventEmitter} = require('events') -const bindings = process.atomBinding('app') -const {app} = bindings - Object.setPrototypeOf(app, EventEmitter.prototype) let appPath = null @@ -67,6 +70,3 @@ process.atomBinding('download_item')._setWrapDownloadItem((downloadItem) => { // downloadItem is an EventEmitter. Object.setPrototypeOf(downloadItem, EventEmitter.prototype) }) - -// Only one App object pemitted. -module.exports = app diff --git a/lib/browser/api/menu-item-roles.js b/lib/browser/api/menu-item-roles.js index aaebd56223..0df6126a15 100644 --- a/lib/browser/api/menu-item-roles.js +++ b/lib/browser/api/menu-item-roles.js @@ -1,7 +1,8 @@ +const {app} = require('electron') + const roles = { about: { get label () { - const {app} = require('electron') return `About ${app.getName()}` } }, @@ -33,7 +34,6 @@ const roles = { }, hide: { get label () { - const {app} = require('electron') return `Hide ${app.getName()}` }, accelerator: 'Command+H' @@ -59,7 +59,6 @@ const roles = { }, quit: { get label () { - const {app} = require('electron') return process.platform === 'win32' ? 'Exit' : `Quit ${app.getName()}` }, accelerator: process.platform === 'win32' ? null : 'Command+Q', @@ -120,7 +119,6 @@ exports.execute = function (role, focusedWindow) { const {appMethod, webContentsMethod, windowMethod} = roles[role] if (appMethod) { - const {app} = require('electron') app[appMethod]() return true } From 6165908ba7c0d6712d16939329d96596fbdd4a57 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 15:26:17 -0700 Subject: [PATCH 080/516] Incorporate review feedback --- lib/browser/api/menu-item-roles.js | 33 ++++++++++++++++-------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/lib/browser/api/menu-item-roles.js b/lib/browser/api/menu-item-roles.js index 0df6126a15..232c3e05b6 100644 --- a/lib/browser/api/menu-item-roles.js +++ b/lib/browser/api/menu-item-roles.js @@ -3,27 +3,26 @@ const {app} = require('electron') const roles = { about: { get label () { - return `About ${app.getName()}` + return process.platform === 'linux' ? 'About' : `About ${app.getName()}` } }, close: { label: 'Close', - accelerator: 'CmdOrCtrl+W', + accelerator: 'CommandOrControl+W', windowMethod: 'close' }, copy: { label: 'Copy', - accelerator: 'CmdOrCtrl+C', + accelerator: 'CommandOrControl+C', webContentsMethod: 'copy' }, cut: { label: 'Cut', - accelerator: 'CmdOrCtrl+X', + accelerator: 'CommandOrControl+X', webContentsMethod: 'cut' }, delete: { label: 'Delete', - accelerator: 'Delete', webContentsMethod: 'delete' }, front: { @@ -44,34 +43,38 @@ const roles = { }, minimize: { label: 'Minimize', - accelerator: 'CmdOrCtrl+M', + accelerator: 'CommandOrControl+M', windowMethod: 'minimize' }, paste: { label: 'Paste', - accelerator: 'CmdOrCtrl+V', + accelerator: 'CommandOrControl+V', webContentsMethod: 'paste' }, pasteandmatchstyle: { label: 'Paste and Match Style', - accelerator: 'Shift+Command+V', + accelerator: 'Shift+CommandOrControl+V', webContentsMethod: 'pasteAndMatchStyle' }, quit: { get label () { - return process.platform === 'win32' ? 'Exit' : `Quit ${app.getName()}` + switch (process.platform) { + case 'darwin': return `Quit ${app.getName()}` + case 'win32': return 'Exit' + default: return 'Quit' + } }, accelerator: process.platform === 'win32' ? null : 'Command+Q', appMethod: 'quit' }, redo: { label: 'Redo', - accelerator: 'Shift+CmdOrCtrl+Z', + accelerator: 'Shift+CommandOrControl+Z', webContentsMethod: 'redo' }, selectall: { label: 'Select All', - accelerator: 'CmdOrCtrl+A', + accelerator: 'CommandOrControl+A', webContentsMethod: 'selectAll' }, services: { @@ -86,7 +89,7 @@ const roles = { }, undo: { label: 'Undo', - accelerator: 'CmdOrCtrl+Z', + accelerator: 'CommandOrControl+Z', webContentsMethod: 'undo' }, unhide: { @@ -100,7 +103,7 @@ const roles = { } } -exports.getDefaultLabel = function (role) { +exports.getDefaultLabel = (role) => { if (roles.hasOwnProperty(role)) { return roles[role].label } else { @@ -108,11 +111,11 @@ exports.getDefaultLabel = function (role) { } } -exports.getDefaultAccelerator = function (role) { +exports.getDefaultAccelerator = (role) => { if (roles.hasOwnProperty(role)) return roles[role].accelerator } -exports.execute = function (role, focusedWindow) { +exports.execute = (role, focusedWindow) => { if (!roles.hasOwnProperty(role)) return false if (process.platform === 'darwin') return false From 813e528350a78730375f26d10d6aa1c0659f2f3d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 15:35:58 -0700 Subject: [PATCH 081/516] Update expected accelerator --- spec/api-menu-spec.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spec/api-menu-spec.js b/spec/api-menu-spec.js index 7d1044b232..d78b5b4e36 100644 --- a/spec/api-menu-spec.js +++ b/spec/api-menu-spec.js @@ -400,11 +400,11 @@ describe('menu module', function () { it('includes a default label and accelerator', function () { var item = new MenuItem({role: 'close'}) assert.equal(item.label, 'Close') - assert.equal(item.accelerator, 'CmdOrCtrl+W') + assert.equal(item.accelerator, 'CommandOrControl+W') var item = new MenuItem({role: 'close', label: 'Other'}) assert.equal(item.label, 'Other') - assert.equal(item.accelerator, 'CmdOrCtrl+W') + assert.equal(item.accelerator, 'CommandOrControl+W') var item = new MenuItem({role: 'close', accelerator: 'D'}) assert.equal(item.label, 'Close') @@ -418,9 +418,9 @@ describe('menu module', function () { assert.equal(item.label, 'Help') assert.equal(item.accelerator, undefined) - var item = new MenuItem({role: 'about'}) - assert.equal(item.label, 'About Electron Test') - assert.equal(item.accelerator, undefined) + var item = new MenuItem({role: 'hide'}) + assert.equal(item.label, 'Hide Electron Test') + assert.equal(item.accelerator, 'Command+H') }) }) }) From e9222583cbd354559ec0ab0bb1170567c2ec9d73 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 15:46:22 -0700 Subject: [PATCH 082/516] toPng/toJpeg -> toPNG/toJPEG --- atom/common/api/atom_api_native_image.cc | 9 ++++++--- docs/api/native-image.md | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/atom/common/api/atom_api_native_image.cc b/atom/common/api/atom_api_native_image.cc index c0b51ba2af..b666f86ba3 100644 --- a/atom/common/api/atom_api_native_image.cc +++ b/atom/common/api/atom_api_native_image.cc @@ -344,14 +344,17 @@ mate::Handle NativeImage::CreateFromDataURL( void NativeImage::BuildPrototype( v8::Isolate* isolate, v8::Local prototype) { mate::ObjectTemplateBuilder(isolate, prototype) - .SetMethod("toPng", &NativeImage::ToPNG) - .SetMethod("toJpeg", &NativeImage::ToJPEG) + .SetMethod("toPNG", &NativeImage::ToPNG) + .SetMethod("toJPEG", &NativeImage::ToJPEG) .SetMethod("getNativeHandle", &NativeImage::GetNativeHandle) .SetMethod("toDataURL", &NativeImage::ToDataURL) .SetMethod("isEmpty", &NativeImage::IsEmpty) .SetMethod("getSize", &NativeImage::GetSize) .SetMethod("setTemplateImage", &NativeImage::SetTemplateImage) - .SetMethod("isTemplateImage", &NativeImage::IsTemplateImage); + .SetMethod("isTemplateImage", &NativeImage::IsTemplateImage) + // TODO(kevinsawicki): Remove in 2.0, deprecate before then with warnings + .SetMethod("toPng", &NativeImage::ToPNG) + .SetMethod("toJpeg", &NativeImage::ToJPEG); } } // namespace api diff --git a/docs/api/native-image.md b/docs/api/native-image.md index d2a2926ca6..f03178577b 100644 --- a/docs/api/native-image.md +++ b/docs/api/native-image.md @@ -127,11 +127,11 @@ Creates a new `nativeImage` instance from `dataURL`. The following methods are available on instances of `nativeImage`: -### `image.toPng()` +### `image.toPNG()` Returns a [Buffer][buffer] that contains the image's `PNG` encoded data. -### `image.toJpeg(quality)` +### `image.toJPEG(quality)` * `quality` Integer (**required**) - Between 0 - 100. From 233355ed0999050850e2fddb38142db45cb5ec00 Mon Sep 17 00:00:00 2001 From: Jhen Date: Wed, 22 Jun 2016 19:47:07 +0800 Subject: [PATCH 083/516] Fix chrome.runtime.sendMessage add a case of not provide extension-id: (message, responseCallback) --- lib/renderer/chrome-api.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/renderer/chrome-api.js b/lib/renderer/chrome-api.js index 6c28c98edf..b49d7382c0 100644 --- a/lib/renderer/chrome-api.js +++ b/lib/renderer/chrome-api.js @@ -119,7 +119,13 @@ exports.injectTo = function (extensionId, isBackgroundPage, context) { if (args.length === 1) { message = args[0] } else if (args.length === 2) { - [targetExtensionId, message] = args + // A case of not provide extension-id: (message, responseCallback) + if (typeof args[1] === 'function') { + console.error('responseCallback is not supported') + message = args[0] + } else { + [targetExtensionId, message] = args + } } else { console.error('options and responseCallback are not supported') } From c6869972091c305c288c780a9722ae27f10aa433 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 16:56:45 -0700 Subject: [PATCH 084/516] Ctrl -> Control for consistency --- lib/browser/api/menu-item-roles.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/browser/api/menu-item-roles.js b/lib/browser/api/menu-item-roles.js index 232c3e05b6..082099818f 100644 --- a/lib/browser/api/menu-item-roles.js +++ b/lib/browser/api/menu-item-roles.js @@ -82,7 +82,7 @@ const roles = { }, togglefullscreen: { label: 'Toggle Full Screen', - accelerator: process.platform === 'darwin' ? 'Ctrl+Command+F' : 'F11', + accelerator: process.platform === 'darwin' ? 'Control+Command+F' : 'F11', windowMethod: function (window) { window.setFullScreen(!window.isFullScreen()) } From 5a122b5ea03e8220fb0d221a111a44fd0c6e4f42 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Jun 2016 18:51:39 -0700 Subject: [PATCH 085/516] Eagerly require protocol --- lib/browser/init.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/browser/init.js b/lib/browser/init.js index 924ad1420c..6326b8e80e 100644 --- a/lib/browser/init.js +++ b/lib/browser/init.js @@ -173,6 +173,9 @@ require('./chrome-extension') // Load internal desktop-capturer module. require('./desktop-capturer') +// Load protocol module to ensure it is populated on app ready +require('./api/protocol') + // Set main startup script of the app. var mainStartupScript = packageJson.main || 'index.js' From 7fa4a7889b7b22da84522cb0fbc446f999831295 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 23 Jun 2016 12:05:10 +0900 Subject: [PATCH 086/516] Update brightray for #6178 --- vendor/brightray | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/brightray b/vendor/brightray index 8244628f0c..25d39ad99a 160000 --- a/vendor/brightray +++ b/vendor/brightray @@ -1 +1 @@ -Subproject commit 8244628f0c1d0eb15c659d42e882fb5d447c77ba +Subproject commit 25d39ad99a7738385af0947804261608d99765ab From 7f3a296050b409346eae5adbbd73e49b5a5f9a88 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 23 Jun 2016 13:00:14 +0900 Subject: [PATCH 087/516] mac: Avoid calling setTitleVisibility for OS X 10.9 --- atom/browser/native_window_mac.mm | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 004d2cad23..1ef003ab2a 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -205,6 +205,7 @@ bool ScopedDisableResize::disable_resize_ = false; // have to set one, because title bar is visible here. NSWindow* window = shell_->GetNativeWindow(); if ((shell_->transparent() || !shell_->has_frame()) && + base::mac::IsOSYosemiteOrLater() && // FIXME(zcbenz): Showing titlebar for hiddenInset window is weird under // fullscreen mode. shell_->title_bar_style() != atom::NativeWindowMac::HIDDEN_INSET) { @@ -229,6 +230,7 @@ bool ScopedDisableResize::disable_resize_ = false; // Restore the titlebar visibility. NSWindow* window = shell_->GetNativeWindow(); if ((shell_->transparent() || !shell_->has_frame()) && + base::mac::IsOSYosemiteOrLater() && shell_->title_bar_style() != atom::NativeWindowMac::HIDDEN_INSET) { [window setTitleVisibility:NSWindowTitleHidden]; } @@ -532,8 +534,10 @@ NativeWindowMac::NativeWindowMac( [window_ setDisableKeyOrMainWindow:YES]; if (transparent() || !has_frame()) { - // Don't show title bar. - [window_ setTitleVisibility:NSWindowTitleHidden]; + if (base::mac::IsOSYosemiteOrLater()) { + // Don't show title bar. + [window_ setTitleVisibility:NSWindowTitleHidden]; + } // Remove non-transparent corners, see http://git.io/vfonD. [window_ setOpaque:NO]; } @@ -858,6 +862,11 @@ void NativeWindowMac::Center() { } void NativeWindowMac::SetTitle(const std::string& title) { + // For macOS <= 10.9, the setTitleVisibility API is not available, we have + // to avoid calling setTitle for frameless window. + if (!base::mac::IsOSYosemiteOrLater() && (transparent() || !has_frame())) + return; + [window_ setTitle:base::SysUTF8ToNSString(title)]; } From 71ab69314cc41706ce5ef880891df9157ec6207f Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 23 Jun 2016 13:11:19 +0900 Subject: [PATCH 088/516] spec: Put protocol registration in beforeEach --- spec/api-session-spec.js | 47 +++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/spec/api-session-spec.js b/spec/api-session-spec.js index 25a09ba313..874726db9f 100644 --- a/spec/api-session-spec.js +++ b/spec/api-session-spec.js @@ -16,10 +16,6 @@ describe('session module', function () { var fixtures = path.resolve(__dirname, 'fixtures') var w = null var url = 'http://127.0.0.1' - var partitionName = 'temp' - var protocolName = 'sp' - const partitionProtocol = session.fromPartition(partitionName).protocol - const protocol = session.defaultSession.protocol beforeEach(function () { if (w != null) { @@ -274,18 +270,25 @@ describe('session module', function () { }) describe('session.protocol', function () { - beforeEach(function () { - if (w != null) { - w.destroy() - } + const partitionName = 'temp' + const protocolName = 'sp' + const partitionProtocol = session.fromPartition(partitionName).protocol + const protocol = session.defaultSession.protocol + const handler = function (error, callback) { + callback({data: 'test'}) + } + + beforeEach(function (done) { + if (w != null) w.destroy() w = new BrowserWindow({ show: false, - width: 400, - height: 400, webPreferences: { partition: partitionName } }) + partitionProtocol.registerStringProtocol(protocolName, handler, function (error) { + done(error ? error : undefined) + }) }) afterEach(function (done) { @@ -293,24 +296,14 @@ describe('session module', function () { }) it('handles requests from a partition', function (done) { - var handler = function (error, callback) { - callback({ - data: 'test' - }) - } - partitionProtocol.registerStringProtocol(protocolName, handler, function (error) { - if (error) { - return done(error) - } - protocol.isProtocolHandled(protocolName, function (result) { - assert.equal(result, false) - partitionProtocol.isProtocolHandled(protocolName, function (result) { - assert.equal(result, true) - w.webContents.on('did-finish-load', function () { - done() - }) - w.loadURL(protocolName + "://fake-host") + protocol.isProtocolHandled(protocolName, function (result) { + assert.equal(result, false) + partitionProtocol.isProtocolHandled(protocolName, function (result) { + assert.equal(result, true) + w.webContents.on('did-finish-load', function () { + done() }) + w.loadURL(protocolName + "://fake-host") }) }) }) From a04c0ce196504db97d286b6d5eb7ae46e774f7f1 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 23 Jun 2016 13:14:33 +0900 Subject: [PATCH 089/516] spec: Split the session.protocol test into multiple tests --- spec/api-session-spec.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/spec/api-session-spec.js b/spec/api-session-spec.js index 874726db9f..f634f1ce63 100644 --- a/spec/api-session-spec.js +++ b/spec/api-session-spec.js @@ -295,17 +295,21 @@ describe('session module', function () { partitionProtocol.unregisterProtocol(protocolName, () => done()) }) - it('handles requests from a partition', function (done) { + it('does not affect defaultSession', function (done) { protocol.isProtocolHandled(protocolName, function (result) { assert.equal(result, false) partitionProtocol.isProtocolHandled(protocolName, function (result) { assert.equal(result, true) - w.webContents.on('did-finish-load', function () { - done() - }) - w.loadURL(protocolName + "://fake-host") + done() }) }) }) + + it('handles requests from partition', function (done) { + w.webContents.on('did-finish-load', function () { + done() + }) + w.loadURL(`${protocolName}://fake-host`) + }) }) }) From 2893974c05969df16a4067c3903772aa52ed4e4a Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 23 Jun 2016 13:29:18 +0900 Subject: [PATCH 090/516] spec: Set mimeType for protocol's handler --- spec/api-session-spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/api-session-spec.js b/spec/api-session-spec.js index f634f1ce63..71a51e6759 100644 --- a/spec/api-session-spec.js +++ b/spec/api-session-spec.js @@ -275,7 +275,7 @@ describe('session module', function () { const partitionProtocol = session.fromPartition(partitionName).protocol const protocol = session.defaultSession.protocol const handler = function (error, callback) { - callback({data: 'test'}) + callback({data: 'test', mimeType: 'text/html'}) } beforeEach(function (done) { From a00c5e3363c7ea89701ea7323fbf8001b20596bf Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 23 Jun 2016 14:37:58 +0900 Subject: [PATCH 091/516] Bump v1.2.5 --- atom/browser/resources/mac/Info.plist | 4 ++-- atom/browser/resources/win/atom.rc | 8 ++++---- atom/common/atom_version.h | 2 +- electron.gyp | 2 +- package.json | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/atom/browser/resources/mac/Info.plist b/atom/browser/resources/mac/Info.plist index 41d8a27ea8..33cfc66b27 100644 --- a/atom/browser/resources/mac/Info.plist +++ b/atom/browser/resources/mac/Info.plist @@ -17,9 +17,9 @@ CFBundleIconFile electron.icns CFBundleVersion - 1.2.4 + 1.2.5 CFBundleShortVersionString - 1.2.4 + 1.2.5 LSApplicationCategoryType public.app-category.developer-tools LSMinimumSystemVersion diff --git a/atom/browser/resources/win/atom.rc b/atom/browser/resources/win/atom.rc index 370a1e8f3d..91101128fe 100644 --- a/atom/browser/resources/win/atom.rc +++ b/atom/browser/resources/win/atom.rc @@ -56,8 +56,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,2,4,0 - PRODUCTVERSION 1,2,4,0 + FILEVERSION 1,2,5,0 + PRODUCTVERSION 1,2,5,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -74,12 +74,12 @@ BEGIN BEGIN VALUE "CompanyName", "GitHub, Inc." VALUE "FileDescription", "Electron" - VALUE "FileVersion", "1.2.4" + VALUE "FileVersion", "1.2.5" VALUE "InternalName", "electron.exe" VALUE "LegalCopyright", "Copyright (C) 2015 GitHub, Inc. All rights reserved." VALUE "OriginalFilename", "electron.exe" VALUE "ProductName", "Electron" - VALUE "ProductVersion", "1.2.4" + VALUE "ProductVersion", "1.2.5" VALUE "SquirrelAwareVersion", "1" END END diff --git a/atom/common/atom_version.h b/atom/common/atom_version.h index 7bf5a09702..7a61d6bc72 100644 --- a/atom/common/atom_version.h +++ b/atom/common/atom_version.h @@ -7,7 +7,7 @@ #define ATOM_MAJOR_VERSION 1 #define ATOM_MINOR_VERSION 2 -#define ATOM_PATCH_VERSION 4 +#define ATOM_PATCH_VERSION 5 #define ATOM_VERSION_IS_RELEASE 1 diff --git a/electron.gyp b/electron.gyp index d0657df31d..a4c412fc98 100644 --- a/electron.gyp +++ b/electron.gyp @@ -4,7 +4,7 @@ 'product_name%': 'Electron', 'company_name%': 'GitHub, Inc', 'company_abbr%': 'github', - 'version%': '1.2.4', + 'version%': '1.2.5', }, 'includes': [ 'filenames.gypi', diff --git a/package.json b/package.json index bce8c02dfc..87782e100d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "electron", - "version": "1.2.4", + "version": "1.2.5", "devDependencies": { "asar": "^0.11.0", "request": "*", From ed6213e9514b9dc5a1fee10d29fb192259a4bffa Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 23 Jun 2016 20:32:19 +0900 Subject: [PATCH 092/516] Do not emit did-fail-load for canceled requests --- atom/browser/api/atom_api_web_contents.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 58b6a4729a..45719d9519 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -607,7 +607,10 @@ void WebContents::DidFailProvisionalLoad( bool was_ignored_by_handler) { bool is_main_frame = !render_frame_host->GetParent(); Emit("did-fail-provisional-load", code, description, url, is_main_frame); - Emit("did-fail-load", code, description, url, is_main_frame); + + // Do not emit "did-fail-load" for canceled requests. + if (code != net::ERR_ABORTED) + Emit("did-fail-load", code, description, url, is_main_frame); } void WebContents::DidFailLoad(content::RenderFrameHost* render_frame_host, From cfebf7aa6bae16d1b12f2461df7ecafea58c3202 Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Thu, 23 Jun 2016 10:36:16 -0700 Subject: [PATCH 093/516] fix list indentation --- docs/api/web-contents.md | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index 610fa2aa6d..ce0948745b 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -360,25 +360,27 @@ Returns: able to perform the corresponding action. See more about this below. The `mediaFlags` is an object with the following properties: - * `inError` Boolean - Whether the media element has crashed. - * `isPaused` Boolean - Whether the media element is paused. - * `isMuted` Boolean - Whether the media element is muted. - * `hasAudio` Boolean - Whether the media element has audio. - * `isLooping` Boolean - Whether the media element is looping. - * `isControlsVisible` Boolean - Whether the media element's controls are - visible. - * `canToggleControls` Boolean - Whether the media element's controls are - toggleable. - * `canRotate` Boolean - Whether the media element can be rotated. + +* `inError` Boolean - Whether the media element has crashed. +* `isPaused` Boolean - Whether the media element is paused. +* `isMuted` Boolean - Whether the media element is muted. +* `hasAudio` Boolean - Whether the media element has audio. +* `isLooping` Boolean - Whether the media element is looping. +* `isControlsVisible` Boolean - Whether the media element's controls are + visible. +* `canToggleControls` Boolean - Whether the media element's controls are + toggleable. +* `canRotate` Boolean - Whether the media element can be rotated. The `editFlags` is an object with the following properties: - * `canUndo` Boolean - Whether the renderer believes it can undo. - * `canRedo` Boolean - Whether the renderer believes it can redo. - * `canCut` Boolean - Whether the renderer believes it can cut. - * `canCopy` Boolean - Whether the renderer believes it can copy - * `canPaste` Boolean - Whether the renderer believes it can paste. - * `canDelete` Boolean - Whether the renderer believes it can delete. - * `canSelectAll` Boolean - Whether the renderer believes it can select all. + +* `canUndo` Boolean - Whether the renderer believes it can undo. +* `canRedo` Boolean - Whether the renderer believes it can redo. +* `canCut` Boolean - Whether the renderer believes it can cut. +* `canCopy` Boolean - Whether the renderer believes it can copy +* `canPaste` Boolean - Whether the renderer believes it can paste. +* `canDelete` Boolean - Whether the renderer believes it can delete. +* `canSelectAll` Boolean - Whether the renderer believes it can select all. Emitted when there is a new context menu that needs to be handled. From 3dcbbe9f2013746565becbbc2e1e7826a74522e6 Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Thu, 23 Jun 2016 14:13:03 -0700 Subject: [PATCH 094/516] remove parens from type --- docs/api/browser-window.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index 22b0124442..169ab0f6fa 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -945,7 +945,7 @@ convey some sort of application status or to passively notify the user. ### `win.setHasShadow(hasShadow)` _macOS_ -* `hasShadow` (Boolean) +* `hasShadow` Boolean Sets whether the window should have a shadow. On Windows and Linux does nothing. From 5e389021ebf95dbd09e49b4830003bcf8fc1bac5 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 23 Jun 2016 14:19:23 -0700 Subject: [PATCH 095/516] Use upstream node-pre-gyp --- docs/tutorial/debugging-main-process.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/tutorial/debugging-main-process.md b/docs/tutorial/debugging-main-process.md index 714b7100cf..f4b783a9de 100644 --- a/docs/tutorial/debugging-main-process.md +++ b/docs/tutorial/debugging-main-process.md @@ -31,10 +31,10 @@ with node-inspector, and the main process will crash if you inspect the $ npm install node-inspector ``` -### 3. Install a patched version of `node-pre-gyp` +### 3. Install [node-pre-gyp][node-pre-gyp] ```bash -$ npm install git+https://git@github.com/enlight/node-pre-gyp.git#detect-electron-runtime-in-find +$ npm install node-pre-gyp ``` ### 4. Recompile the `node-inspector` `v8` modules for electron (change the target to your electron version number) @@ -73,5 +73,6 @@ browser. You may have to click pause if starting with debug-brk to see the entry line. [node-inspector]: https://github.com/node-inspector/node-inspector +[node-pre-gyp]: https://github.com/mapbox/node-pre-gyp [node-gyp-required-tools]: https://github.com/nodejs/node-gyp#installation [how-to-install-native-modules]: using-native-node-modules.md#how-to-install-native-modules From eb8c1b1a50d7cb86d59201d5c0fa22c69cfd4e38 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 23 Jun 2016 14:20:52 -0700 Subject: [PATCH 096/516] Make update number message a note --- docs/tutorial/debugging-main-process.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/tutorial/debugging-main-process.md b/docs/tutorial/debugging-main-process.md index f4b783a9de..ec2ac422d2 100644 --- a/docs/tutorial/debugging-main-process.md +++ b/docs/tutorial/debugging-main-process.md @@ -37,11 +37,13 @@ $ npm install node-inspector $ npm install node-pre-gyp ``` -### 4. Recompile the `node-inspector` `v8` modules for electron (change the target to your electron version number) +### 4. Recompile the `node-inspector` `v8` modules for Electron + +**Note:** Update the target argument to be your Electron version number ```bash -$ node_modules/.bin/node-pre-gyp --target=0.36.11 --runtime=electron --fallback-to-build --directory node_modules/v8-debug/ --dist-url=https://atom.io/download/atom-shell reinstall -$ node_modules/.bin/node-pre-gyp --target=0.36.11 --runtime=electron --fallback-to-build --directory node_modules/v8-profiler/ --dist-url=https://atom.io/download/atom-shell reinstall +$ node_modules/.bin/node-pre-gyp --target=1.2.5 --runtime=electron --fallback-to-build --directory node_modules/v8-debug/ --dist-url=https://atom.io/download/atom-shell reinstall +$ node_modules/.bin/node-pre-gyp --target=1.2.5 --runtime=electron --fallback-to-build --directory node_modules/v8-profiler/ --dist-url=https://atom.io/download/atom-shell reinstall ``` See also [How to install native modules][how-to-install-native-modules]. From adc8c54a81b7628d4cf38b96513dc73925f51cb2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 23 Jun 2016 14:23:34 -0700 Subject: [PATCH 097/516] Minor formatting updates --- docs/tutorial/debugging-main-process.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/tutorial/debugging-main-process.md b/docs/tutorial/debugging-main-process.md index ec2ac422d2..3c153061a7 100644 --- a/docs/tutorial/debugging-main-process.md +++ b/docs/tutorial/debugging-main-process.md @@ -11,7 +11,7 @@ Use the following command line switches to debug Electron's main process: ### `--debug=[port]` When this switch is used Electron will listen for V8 debugger protocol -messages on `port`. The default `port` is `5858`. +messages on the `port`. The default `port` is `5858`. ### `--debug-brk=[port]` @@ -19,11 +19,11 @@ Like `--debug` but pauses the script on the first line. ## Use node-inspector for Debugging -**Note:** Electron doesn't currently work very well -with node-inspector, and the main process will crash if you inspect the -`process` object under node-inspector's console. +**Note:** Electron doesn't currently work very well with node-inspector, and the +main process will crash if you inspect the `process` object under +node-inspector's console. -### 1. Make sure you have [node-gyp required tools][node-gyp-required-tools] installed +### 1. Install the [node-gyp required tools][node-gyp-required-tools] ### 2. Install [node-inspector][node-inspector] @@ -62,7 +62,7 @@ or, to pause your script on the first line: $ electron --debug-brk=5858 your/app ``` -### 6. Start the [node-inspector][node-inspector] server using electron +### 6. Start the [node-inspector][node-inspector] server using Electron ```bash $ ELECTRON_RUN_AS_NODE=true path/to/electron.exe node_modules/node-inspector/bin/inspector.js @@ -71,7 +71,7 @@ $ ELECTRON_RUN_AS_NODE=true path/to/electron.exe node_modules/node-inspector/bin ### 7. Load the debugger UI Open http://127.0.0.1:8080/debug?ws=127.0.0.1:8080&port=5858 in the Chrome -browser. You may have to click pause if starting with debug-brk to see the +browser. You may have to click pause if starting with `debug-brk` to see the entry line. [node-inspector]: https://github.com/node-inspector/node-inspector From eed240be1c4c0d10bacd17a266bd21f8c2ae6a60 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 23 Jun 2016 15:20:04 -0700 Subject: [PATCH 098/516] Add specs for Module._nodeModulesPath --- spec/modules-spec.js | 48 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/spec/modules-spec.js b/spec/modules-spec.js index fbc66a0825..c3ad4bc705 100644 --- a/spec/modules-spec.js +++ b/spec/modules-spec.js @@ -1,4 +1,5 @@ const assert = require('assert') +const Module = require('module') const path = require('path') const temp = require('temp') @@ -47,3 +48,50 @@ describe('third-party module', function () { }) }) }) + +describe('Module._nodeModulePaths', function () { + describe('when the path is inside the resources path', function () { + it('does not include paths outside of the resources path', function () { + let modulePath = process.resourcesPath + assert.deepEqual(Module._nodeModulePaths(modulePath), [ + path.join(process.resourcesPath, 'node_modules') + ]) + + modulePath = path.join(process.resourcesPath, 'foo') + assert.deepEqual(Module._nodeModulePaths(modulePath), [ + path.join(process.resourcesPath, 'foo', 'node_modules'), + path.join(process.resourcesPath, 'node_modules') + ]) + + modulePath = path.join(process.resourcesPath, 'node_modules', 'foo') + assert.deepEqual(Module._nodeModulePaths(modulePath), [ + path.join(process.resourcesPath, 'node_modules', 'foo', 'node_modules'), + path.join(process.resourcesPath, 'node_modules') + ]) + + modulePath = path.join(process.resourcesPath, 'node_modules', 'foo', 'bar') + assert.deepEqual(Module._nodeModulePaths(modulePath), [ + path.join(process.resourcesPath, 'node_modules', 'foo', 'bar', 'node_modules'), + path.join(process.resourcesPath, 'node_modules', 'foo', 'node_modules'), + path.join(process.resourcesPath, 'node_modules') + ]) + + modulePath = path.join(process.resourcesPath, 'node_modules', 'foo', 'node_modules', 'bar') + assert.deepEqual(Module._nodeModulePaths(modulePath), [ + path.join(process.resourcesPath, 'node_modules', 'foo', 'node_modules', 'bar', 'node_modules'), + path.join(process.resourcesPath, 'node_modules', 'foo', 'node_modules'), + path.join(process.resourcesPath, 'node_modules') + ]) + }) + }) + + describe('when the path is outside the resources path', function () { + it('includes paths outside of the resources path', function () { + let modulePath = path.resolve('/foo') + assert.deepEqual(Module._nodeModulePaths(modulePath), [ + path.join(modulePath, 'node_modules'), + path.join('node_modules') + ]) + }) + }) +}) From b273b70eee6a15808faad6f3fd5ad5d85d36e4d4 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 23 Jun 2016 15:27:45 -0700 Subject: [PATCH 099/516] Filter existing search paths instead reimplementing --- lib/common/reset-search-paths.js | 29 +++++++++-------------------- spec/modules-spec.js | 3 +-- 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/lib/common/reset-search-paths.js b/lib/common/reset-search-paths.js index 4d09f6c89c..8e217012f5 100644 --- a/lib/common/reset-search-paths.js +++ b/lib/common/reset-search-paths.js @@ -9,30 +9,19 @@ module.paths = [] module.parent.paths = [] // Prevent Node from adding paths outside this app to search paths. +const originalNodeModulePaths = Module._nodeModulePaths Module._nodeModulePaths = function (from) { - from = path.resolve(from) + const paths = originalNodeModulePaths(from) + const rootPath = process.resourcesPath // If "from" is outside the app then we do nothing. - const skipOutsidePaths = from.startsWith(process.resourcesPath) - - // Following logic is copied from module.js. - const splitRe = process.platform === 'win32' ? /[\/\\]/ : /\// - const paths = [] - const parts = from.split(splitRe) - - let tip - let i - for (tip = i = parts.length - 1; i >= 0; tip = i += -1) { - const part = parts[tip] - if (part === 'node_modules') { - continue - } - const dir = parts.slice(0, tip + 1).join(path.sep) - if (skipOutsidePaths && !dir.startsWith(process.resourcesPath)) { - break - } - paths.push(path.join(dir, 'node_modules')) + const skipOutsidePaths = path.resolve(from).startsWith(rootPath) + if (skipOutsidePaths) { + return paths.filter(function (candidate) { + return candidate.startsWith(rootPath) + }) } + return paths } diff --git a/spec/modules-spec.js b/spec/modules-spec.js index c3ad4bc705..87396ac764 100644 --- a/spec/modules-spec.js +++ b/spec/modules-spec.js @@ -89,8 +89,7 @@ describe('Module._nodeModulePaths', function () { it('includes paths outside of the resources path', function () { let modulePath = path.resolve('/foo') assert.deepEqual(Module._nodeModulePaths(modulePath), [ - path.join(modulePath, 'node_modules'), - path.join('node_modules') + path.join(modulePath, 'node_modules') ]) }) }) From c6906deef20ca3631862b84d1556cfcf8e4479de Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 23 Jun 2016 15:39:21 -0700 Subject: [PATCH 100/516] Add failing spec for trailing separator bug --- spec/modules-spec.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spec/modules-spec.js b/spec/modules-spec.js index 87396ac764..f2c45b0a71 100644 --- a/spec/modules-spec.js +++ b/spec/modules-spec.js @@ -57,6 +57,11 @@ describe('Module._nodeModulePaths', function () { path.join(process.resourcesPath, 'node_modules') ]) + modulePath = process.resourcesPath + '-foo' + let nodeModulePaths = Module._nodeModulePaths(modulePath) + assert(nodeModulePaths.includes(path.join(modulePath, 'node_modules'))) + assert(nodeModulePaths.includes(path.join(modulePath, '..', 'node_modules'))) + modulePath = path.join(process.resourcesPath, 'foo') assert.deepEqual(Module._nodeModulePaths(modulePath), [ path.join(process.resourcesPath, 'foo', 'node_modules'), From 905e9e96451e84fab6203ed8d122cae3ed8e8d1e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 23 Jun 2016 15:45:08 -0700 Subject: [PATCH 101/516] Include trailing separator in comparisons --- lib/common/reset-search-paths.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/common/reset-search-paths.js b/lib/common/reset-search-paths.js index 8e217012f5..5cec77b606 100644 --- a/lib/common/reset-search-paths.js +++ b/lib/common/reset-search-paths.js @@ -12,10 +12,11 @@ module.parent.paths = [] const originalNodeModulePaths = Module._nodeModulePaths Module._nodeModulePaths = function (from) { const paths = originalNodeModulePaths(from) - const rootPath = process.resourcesPath // If "from" is outside the app then we do nothing. - const skipOutsidePaths = path.resolve(from).startsWith(rootPath) + const rootPath = process.resourcesPath + path.sep + const fromPath = path.resolve(from) + path.sep + const skipOutsidePaths = fromPath.startsWith(rootPath) if (skipOutsidePaths) { return paths.filter(function (candidate) { return candidate.startsWith(rootPath) From bac4d51169b5b8167e90b60bd8107324de459186 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 23 Jun 2016 15:56:29 -0700 Subject: [PATCH 102/516] Reuse root path variable --- lib/common/reset-search-paths.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/common/reset-search-paths.js b/lib/common/reset-search-paths.js index 5cec77b606..924cb388d4 100644 --- a/lib/common/reset-search-paths.js +++ b/lib/common/reset-search-paths.js @@ -9,21 +9,19 @@ module.paths = [] module.parent.paths = [] // Prevent Node from adding paths outside this app to search paths. +const resourcesPathWithTrailingSlash = process.resourcesPath + path.sep const originalNodeModulePaths = Module._nodeModulePaths Module._nodeModulePaths = function (from) { const paths = originalNodeModulePaths(from) - - // If "from" is outside the app then we do nothing. - const rootPath = process.resourcesPath + path.sep const fromPath = path.resolve(from) + path.sep - const skipOutsidePaths = fromPath.startsWith(rootPath) - if (skipOutsidePaths) { + // If "from" is outside the app then we do nothing. + if (fromPath.startsWith(resourcesPathWithTrailingSlash)) { return paths.filter(function (candidate) { - return candidate.startsWith(rootPath) + return candidate.startsWith(resourcesPathWithTrailingSlash) }) + } else { + return paths } - - return paths } // Patch Module._resolveFilename to always require the Electron API when From 38592aaef77b0b163a8ac9889e1381540616425b Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 24 Jun 2016 10:45:37 +0900 Subject: [PATCH 103/516] Add details to docs/styleguide.md --- docs/styleguide.md | 259 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 198 insertions(+), 61 deletions(-) diff --git a/docs/styleguide.md b/docs/styleguide.md index 21d7c63b34..932a7b01d7 100644 --- a/docs/styleguide.md +++ b/docs/styleguide.md @@ -1,66 +1,169 @@ # Electron Documentation Styleguide -Find the appropriate section for your task: [reading Electron documentation](#reading-electron-documentation) -or [writing Electron documentation](#writing-electron-documentation). - -## Writing Electron Documentation - These are the ways that we construct the Electron documentation. -- Maximum one `h1` title per page. -- Use `bash` instead of `cmd` in code blocks (because of syntax highlighter). -- Doc `h1` titles should match object name (i.e. `browser-window` → - `BrowserWindow`). - - Hyphen separated filenames, however, are fine. -- No headers following headers, add at least a one-sentence description. -- Methods headers are wrapped in `code` ticks. -- Event headers are wrapped in single 'quotation' marks. -- No nesting lists more than 2 levels (unfortunately because of markdown +## Titles + +Each page has only one `#`-level title on the top, following chapters in the +same page must have `##`-level titles, and sub-chapters need to increase the +number of `#` in title according to its nesting depth. + +For the page's title, all words must be capitalized, for other chapters, only +the first word has to be capitalized. + +Using `Quick Start` as example: + +```markdown +# Quick Start + +... + +## Main process + +... + +## Renderer process + +... + +## Run your app + +... + +### Run as a distribution + +... + +### Manually downloaded Electron binary + +... +``` + +For API references, there are exceptions to this rule. + +## Markdown rules + +* Use `bash` instead of `cmd` in code blocks (because of syntax highlighter). +* Line length is 80-column wrapped. +* No nesting lists more than 2 levels (unfortunately because of markdown renderer). -- Add section titles: Events, Class Methods and Instance Methods. -- Use 'will' over 'would' when describing outcomes. -- Events and methods are `h3` headers. -- Optional arguments written as `function (required[, optional])`. -- Optional arguments are denoted when called out in list. -- Line length is 80-column wrapped. -- Platform specific methods are noted in italics following method header. - - ```### `method(foo, bar)` _macOS_``` -- Prefer 'in the ___ process' over 'on' -### Documentation Translations +## Picking words -Translations of the Electron docs are located within the `docs-translations` -directory. +* Use "will" over "would" when describing outcomes. +* Prefer "in the ___ process" over "on". -To add another set (or partial set): +## API references -- Create a subdirectory named by language abbreviation. -- Within that subdirectory, duplicate the `docs` directory, keeping the - names of directories and files same. -- Translate the files. -- Update the `README.md` within your language directory to link to the files - you have translated. -- Add a link to your translation directory on the main Electron [README](https://github.com/electron/electron#documentation-translations). +Following rules only apply to documentations of APIs. -## Reading Electron Documentation +### Page title -Here are some tips for understanding Electron documentation syntax. +Each page must use the actual object name returned by `require('electron')` +as name, like `BrowserWindow`, `autoUpdater`, `session`. + +Under the page tile must be a one-line description starting with `>`. + +Using `session` as example: + +```markdown +# session + +> Manage browser sessions, cookies, cache, proxy settings, etc. + +``` + +### Module methods and events + +For modules that are not classes, their methods and events must be listed under +`## Methods` and `## Events` chapters. + +Using `autoUpdater` as example: + +```markdown +# autoUpdater + +## Events + +### Event: 'error' + +## Methods + +### `autoUpdater.setFeedURL(url[, requestHeaders])` +``` + +### Classes + +For APIs that exists as classes, or for classes that are parts of modules, they +must listed under `## Class: TheClassName` chapter. One page can have multiple +classes. + +If the class has constructors, they must be listed with `###`-level titles. + +The methods, events and properties of a class must be listed under +`### Instance Methods`, `### Instance Events` and `Instance Properties` +chapters. + +Using `Session`, `Cookies` classes as example: + +```markdown +# session + +## Methods + +### session.fromPartition(partition) + +## Properties + +### session.defaultSession + +## Class: Session + +### Instance Events + +#### Event: 'will-download' + +### Instance Methods + +#### `ses.getCacheSize(callback)` + +### Instance Properties + +#### `ses.cookies` + +## Class: Cookies + +### Instance Methods + +#### `cookies.get(filter, callback)` +``` ### Methods -An example of [method](https://developer.mozilla.org/en-US/docs/Glossary/Method) -documentation: +The chapter of method must be in the following form: + +```markdown +### `objectName.methodName(required[, optional]))` + +* `required` String +* `optional` Integer (optional) + +... ``` -`methodName(required[, optional]))` -* `required` String (**required**) -* `optional` Integer -``` +The title can be `###` or `####`-levels depending on whether it is a method of +module or class. -The method name is followed by the arguments it takes. Optional arguments are -notated by brackets surrounding the optional argument as well as the comma -required if this optional argument follows another argument. +For modules, the `objectName` is the module's name, for classes, it must be the +name of instance of the class, and must not be same with the module's name. + +For example, the methods of `Session` class under `session` module must use +`ses` as `objectName`. + +The optional arguments are notated by brackets surrounding the optional argument +as well as the comma required if this optional argument follows another +argument. Below the method is more detailed information on each of the arguments. The type of argument is notated by either the common types: @@ -68,35 +171,69 @@ of argument is notated by either the common types: [`Number`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number), [`Object`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object), [`Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) -or a custom type like Electron's [`webContent`](api/web-content.md). +or a custom type like Electron's [`WebContent`](api/web-content.md). -If an argument is unique to certain platforms, those platforms are denoted -using a space-delimited italicized list following the datatype. Values can be -`macOS`, `Windows`, or `Linux`. +If an argument or a method is unique to certain platforms, those platforms are +denoted using a space-delimited italicized list following the datatype. Values +can be `macOS`, `Windows`, or `Linux`. -``` +``` markdown * `animate` Boolean (optional) _macOS_ _Windows_ ``` +For argument with `Array` type, it must be classified what elements the array +may include in the description below. + +For argument with `Function` type, the description should make it clear how it +may be called and list the types of the arguments that passed to it. + ### Events -An example of [event](https://developer.mozilla.org/en-US/docs/Web/API/Event) -documentation: +The chapter of event must be in following form: -``` -Event: 'wake-up' +```markdown +### Event: 'wake-up' Returns: * `time` String + +... + ``` -The event is a string that is used after a `.on` listener method. If it returns -a value it and its type is noted below. If you were to listen and respond to -this event it might look something like this: +The title can be `###` or `####`-levels depending on whether it is an event of +module or class. + +The arguments of an event have the same rules with methods. + +### Properties + +The chapter of property must be in following form: + +```markdown +### session.defaultSession + +... -```javascript -Alarm.on('wake-up', (time) => { - console.log(time) -}) ``` + +The title can be `###` or `####`-levels depending on whether it is a property of +module or class. + +## Documentation Translations + +Translations of the Electron docs are located within the `docs-translations` +directory. + +To add another set (or partial set): + +* Create a subdirectory named by language abbreviation. +* Translate the files. +* Update the `README.md` within your language directory to link to the files + you have translated. +* Add a link to your translation directory on the main Electron + [README](https://github.com/electron/electron#documentation-translations). + +Note that the files under `docs-translations` must only include the translated +ones, the original English files should not be copied there. From f792b6c752fbe0d8e9b35afc7de6a14aba5dcc41 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 24 Jun 2016 11:21:32 +0900 Subject: [PATCH 104/516] Remove callbackId when callback is removed from registry --- lib/common/api/callbacks-registry.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/common/api/callbacks-registry.js b/lib/common/api/callbacks-registry.js index 7a9bf534f7..459c392bc1 100644 --- a/lib/common/api/callbacks-registry.js +++ b/lib/common/api/callbacks-registry.js @@ -55,7 +55,11 @@ class CallbacksRegistry { } remove (id) { - return delete this.callbacks[id] + const callback = this.callbacks[id] + if (callback) { + v8Util.deleteHiddenValue(callback, 'callbackId') + delete this.callbacks[id] + } } } From ee28f4fc32c9c859a0e258f3a26813c030757399 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 24 Jun 2016 14:45:31 +0900 Subject: [PATCH 105/516] Handle v8::MicrotasksScope in the main process --- atom/browser/atom_browser_main_parts.cc | 4 ++++ atom/browser/javascript_environment.cc | 9 ++++++++ atom/browser/javascript_environment.h | 3 +++ atom/common/api/event_emitter_caller.cc | 7 ++----- atom/common/native_mate_converters/callback.h | 21 ++++++------------- atom/common/node_bindings.cc | 6 ++---- vendor/native_mate | 2 +- 7 files changed, 27 insertions(+), 25 deletions(-) diff --git a/atom/browser/atom_browser_main_parts.cc b/atom/browser/atom_browser_main_parts.cc index 75f71d4231..b933d1073b 100644 --- a/atom/browser/atom_browser_main_parts.cc +++ b/atom/browser/atom_browser_main_parts.cc @@ -124,6 +124,8 @@ void AtomBrowserMainParts::PostEarlyInitialization() { } void AtomBrowserMainParts::PreMainMessageLoopRun() { + js_env_->OnMessageLoopCreated(); + // Run user's main script before most things get initialized, so we can have // a chance to setup everything. node_bindings_->PrepareMessageLoop(); @@ -169,6 +171,8 @@ void AtomBrowserMainParts::PostMainMessageLoopStart() { void AtomBrowserMainParts::PostMainMessageLoopRun() { brightray::BrowserMainParts::PostMainMessageLoopRun(); + js_env_->OnMessageLoopDestroying(); + #if defined(OS_MACOSX) FreeAppDelegate(); #endif diff --git a/atom/browser/javascript_environment.cc b/atom/browser/javascript_environment.cc index 970132b47c..0f87a2ca32 100644 --- a/atom/browser/javascript_environment.cc +++ b/atom/browser/javascript_environment.cc @@ -7,6 +7,7 @@ #include #include "base/command_line.h" +#include "base/message_loop/message_loop.h" #include "content/public/common/content_switches.h" #include "gin/array_buffer.h" #include "gin/v8_initializer.h" @@ -23,6 +24,14 @@ JavascriptEnvironment::JavascriptEnvironment() context_scope_(v8::Local::New(isolate_, context_)) { } +void JavascriptEnvironment::OnMessageLoopCreated() { + isolate_holder_.AddRunMicrotasksObserver(); +} + +void JavascriptEnvironment::OnMessageLoopDestroying() { + isolate_holder_.RemoveRunMicrotasksObserver(); +} + bool JavascriptEnvironment::Initialize() { auto cmd = base::CommandLine::ForCurrentProcess(); if (cmd->HasSwitch("debug-brk")) { diff --git a/atom/browser/javascript_environment.h b/atom/browser/javascript_environment.h index 07cd602cf0..1f4d2f4534 100644 --- a/atom/browser/javascript_environment.h +++ b/atom/browser/javascript_environment.h @@ -14,6 +14,9 @@ class JavascriptEnvironment { public: JavascriptEnvironment(); + void OnMessageLoopCreated(); + void OnMessageLoopDestroying(); + v8::Isolate* isolate() const { return isolate_; } v8::Local context() const { return v8::Local::New(isolate_, context_); diff --git a/atom/common/api/event_emitter_caller.cc b/atom/common/api/event_emitter_caller.cc index 271ea705e0..ac6c9c213f 100644 --- a/atom/common/api/event_emitter_caller.cc +++ b/atom/common/api/event_emitter_caller.cc @@ -16,11 +16,8 @@ v8::Local CallEmitWithArgs(v8::Isolate* isolate, v8::Local obj, ValueVector* args) { // Perform microtask checkpoint after running JavaScript. - std::unique_ptr script_scope( - Locker::IsBrowserProcess() ? - nullptr : - new v8::MicrotasksScope(isolate, - v8::MicrotasksScope::kRunMicrotasks)); + v8::MicrotasksScope script_scope( + isolate, v8::MicrotasksScope::kRunMicrotasks); // Use node::MakeCallback to call the callback, and it will also run pending // tasks in Node.js. return node::MakeCallback( diff --git a/atom/common/native_mate_converters/callback.h b/atom/common/native_mate_converters/callback.h index 43a1baf25f..decc36eb57 100644 --- a/atom/common/native_mate_converters/callback.h +++ b/atom/common/native_mate_converters/callback.h @@ -48,11 +48,8 @@ struct V8FunctionInvoker(ArgTypes...)> { v8::EscapableHandleScope handle_scope(isolate); if (!function.IsAlive()) return v8::Null(isolate); - std::unique_ptr script_scope( - Locker::IsBrowserProcess() ? - nullptr : - new v8::MicrotasksScope(isolate, - v8::MicrotasksScope::kRunMicrotasks)); + v8::MicrotasksScope script_scope(isolate, + v8::MicrotasksScope::kRunMicrotasks); v8::Local holder = function.NewHandle(isolate); v8::Local context = holder->CreationContext(); v8::Context::Scope context_scope(context); @@ -71,11 +68,8 @@ struct V8FunctionInvoker { v8::HandleScope handle_scope(isolate); if (!function.IsAlive()) return; - std::unique_ptr script_scope( - Locker::IsBrowserProcess() ? - nullptr : - new v8::MicrotasksScope(isolate, - v8::MicrotasksScope::kRunMicrotasks)); + v8::MicrotasksScope script_scope(isolate, + v8::MicrotasksScope::kRunMicrotasks); v8::Local holder = function.NewHandle(isolate); v8::Local context = holder->CreationContext(); v8::Context::Scope context_scope(context); @@ -94,11 +88,8 @@ struct V8FunctionInvoker { ReturnType ret = ReturnType(); if (!function.IsAlive()) return ret; - std::unique_ptr script_scope( - Locker::IsBrowserProcess() ? - nullptr : - new v8::MicrotasksScope(isolate, - v8::MicrotasksScope::kRunMicrotasks)); + v8::MicrotasksScope script_scope(isolate, + v8::MicrotasksScope::kRunMicrotasks); v8::Local holder = function.NewHandle(isolate); v8::Local context = holder->CreationContext(); v8::Context::Scope context_scope(context); diff --git a/atom/common/node_bindings.cc b/atom/common/node_bindings.cc index ed2ea01675..40fa6bdb6e 100644 --- a/atom/common/node_bindings.cc +++ b/atom/common/node_bindings.cc @@ -226,10 +226,8 @@ void NodeBindings::UvRunOnce() { v8::Context::Scope context_scope(env->context()); // Perform microtask checkpoint after running JavaScript. - std::unique_ptr script_scope(is_browser_ ? - nullptr : - new v8::MicrotasksScope(env->isolate(), - v8::MicrotasksScope::kRunMicrotasks)); + v8::MicrotasksScope script_scope(env->isolate(), + v8::MicrotasksScope::kRunMicrotasks); // Deal with uv events. int r = uv_run(uv_loop_, UV_RUN_NOWAIT); diff --git a/vendor/native_mate b/vendor/native_mate index e75f2aa087..a1efa28520 160000 --- a/vendor/native_mate +++ b/vendor/native_mate @@ -1 +1 @@ -Subproject commit e75f2aa087db346efc4b530f9e1ce7d3a72a3434 +Subproject commit a1efa285204cb2fbbed450c317fb535a38ea8480 From 0e1caa5961f8bbb7d4b5bd6d6e00d1ca1be2e82a Mon Sep 17 00:00:00 2001 From: Sudar Abisheck Date: Fri, 24 Jun 2016 11:29:55 +0530 Subject: [PATCH 106/516] Update quick-start.md Corrected the anchor text --- docs/tutorial/quick-start.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial/quick-start.md b/docs/tutorial/quick-start.md index 59bfb4bb26..59a019596b 100644 --- a/docs/tutorial/quick-start.md +++ b/docs/tutorial/quick-start.md @@ -211,7 +211,7 @@ and then executing the packaged app. ### Try this Example -Clone and run the code in this tutorial by using the [`atom/electron-quick-start`](https://github.com/electron/electron-quick-start) +Clone and run the code in this tutorial by using the [`electron/electron-quick-start`](https://github.com/electron/electron-quick-start) repository. **Note**: Running this requires [Git](https://git-scm.com) and [Node.js](https://nodejs.org/en/download/) (which includes [npm](https://npmjs.org)) on your system. From dfc2f3f0c64d750de6ca0467ee40fb5630933fc8 Mon Sep 17 00:00:00 2001 From: Milan Burda Date: Fri, 24 Jun 2016 17:51:31 +0200 Subject: [PATCH 107/516] Fix uninitialized member variable in CrashReporterWin --- atom/common/crash_reporter/crash_reporter_win.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/atom/common/crash_reporter/crash_reporter_win.cc b/atom/common/crash_reporter/crash_reporter_win.cc index 4264f6af9d..7ce61d6971 100644 --- a/atom/common/crash_reporter/crash_reporter_win.cc +++ b/atom/common/crash_reporter/crash_reporter_win.cc @@ -137,7 +137,8 @@ void UnregisterNonABICompliantCodeRange(void* start) { } // namespace -CrashReporterWin::CrashReporterWin() { +CrashReporterWin::CrashReporterWin() + : skip_system_crash_handler_(false) { } CrashReporterWin::~CrashReporterWin() { From 5dd7bf67e7792cfecd428102d3965885774e5b3f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 24 Jun 2016 12:28:41 -0700 Subject: [PATCH 108/516] Minor formatting and wording tweaks --- docs/styleguide.md | 67 +++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/docs/styleguide.md b/docs/styleguide.md index 932a7b01d7..34d20df1bb 100644 --- a/docs/styleguide.md +++ b/docs/styleguide.md @@ -1,12 +1,12 @@ # Electron Documentation Styleguide -These are the ways that we construct the Electron documentation. +These are the guidelines for writing Electron documentation. ## Titles Each page has only one `#`-level title on the top, following chapters in the same page must have `##`-level titles, and sub-chapters need to increase the -number of `#` in title according to its nesting depth. +number of `#` in the title according to its nesting depth. For the page's title, all words must be capitalized, for other chapters, only the first word has to be capitalized. @@ -43,10 +43,9 @@ For API references, there are exceptions to this rule. ## Markdown rules -* Use `bash` instead of `cmd` in code blocks (because of syntax highlighter). -* Line length is 80-column wrapped. -* No nesting lists more than 2 levels (unfortunately because of markdown - renderer). +* Use `bash` instead of `cmd` in code blocks (due to the syntax highlighter). +* Lines should be wrapped at 80 columns. +* No nesting lists more than 2 levels (due to the markdown renderer). ## Picking words @@ -55,12 +54,12 @@ For API references, there are exceptions to this rule. ## API references -Following rules only apply to documentations of APIs. +The following rules only apply to the documentation of APIs. ### Page title Each page must use the actual object name returned by `require('electron')` -as name, like `BrowserWindow`, `autoUpdater`, `session`. +as the title, such as `BrowserWindow`, `autoUpdater`, `session`, etc. Under the page tile must be a one-line description starting with `>`. @@ -78,7 +77,7 @@ Using `session` as example: For modules that are not classes, their methods and events must be listed under `## Methods` and `## Events` chapters. -Using `autoUpdater` as example: +Using `autoUpdater` as an example: ```markdown # autoUpdater @@ -94,17 +93,17 @@ Using `autoUpdater` as example: ### Classes -For APIs that exists as classes, or for classes that are parts of modules, they -must listed under `## Class: TheClassName` chapter. One page can have multiple +For APIs that exists as classes, or for classes that are part of modules, they +must listed under a `## Class: TheClassName` chapter. One page can have multiple classes. If the class has constructors, they must be listed with `###`-level titles. The methods, events and properties of a class must be listed under -`### Instance Methods`, `### Instance Events` and `Instance Properties` +`### Instance Methods`, `### Instance Events`, and `Instance Properties` chapters. -Using `Session`, `Cookies` classes as example: +Using `Session`, `Cookies` classes as an example: ```markdown # session @@ -140,7 +139,7 @@ Using `Session`, `Cookies` classes as example: ### Methods -The chapter of method must be in the following form: +The methods chapter must be in the following form: ```markdown ### `objectName.methodName(required[, optional]))` @@ -153,13 +152,14 @@ The chapter of method must be in the following form: ``` The title can be `###` or `####`-levels depending on whether it is a method of -module or class. +a module or a class. For modules, the `objectName` is the module's name, for classes, it must be the -name of instance of the class, and must not be same with the module's name. +name of the instance of the class, and must not be the same as the module's +name. -For example, the methods of `Session` class under `session` module must use -`ses` as `objectName`. +For example, the methods of the `Session` class under the `session` module must +use `ses` as the `objectName`. The optional arguments are notated by brackets surrounding the optional argument as well as the comma required if this optional argument follows another @@ -167,29 +167,30 @@ argument. Below the method is more detailed information on each of the arguments. The type of argument is notated by either the common types: -[`String`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), -[`Number`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number), -[`Object`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object), -[`Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) -or a custom type like Electron's [`WebContent`](api/web-content.md). + +- [`String`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) +- [`Number`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number) +- [`Object`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) +- [`Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) +- Or a custom type like Electron's [`WebContent`](api/web-content.md) If an argument or a method is unique to certain platforms, those platforms are denoted using a space-delimited italicized list following the datatype. Values can be `macOS`, `Windows`, or `Linux`. -``` markdown +```markdown * `animate` Boolean (optional) _macOS_ _Windows_ ``` -For argument with `Array` type, it must be classified what elements the array -may include in the description below. +For any argument with `Array` type, it must be classified what elements the +array may include in the description below. -For argument with `Function` type, the description should make it clear how it -may be called and list the types of the arguments that passed to it. +For any argument with `Function` type, the description should make it clear how +it may be called and list the types of the arguments that will be passed to it. ### Events -The chapter of event must be in following form: +The events chapter must be in following form: ```markdown ### Event: 'wake-up' @@ -203,13 +204,13 @@ Returns: ``` The title can be `###` or `####`-levels depending on whether it is an event of -module or class. +a module or a class. -The arguments of an event have the same rules with methods. +The arguments of an event have the same rules as methods. ### Properties -The chapter of property must be in following form: +The properties chapter must be in following form: ```markdown ### session.defaultSession @@ -219,7 +220,7 @@ The chapter of property must be in following form: ``` The title can be `###` or `####`-levels depending on whether it is a property of -module or class. +a module or a class. ## Documentation Translations From 47504c5a53d21c2e4961fd3dca29c97bc6dc9bf8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 24 Jun 2016 12:40:55 -0700 Subject: [PATCH 109/516] Use more lists --- docs/styleguide.md | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/docs/styleguide.md b/docs/styleguide.md index 34d20df1bb..0d93df5e6d 100644 --- a/docs/styleguide.md +++ b/docs/styleguide.md @@ -4,12 +4,12 @@ These are the guidelines for writing Electron documentation. ## Titles -Each page has only one `#`-level title on the top, following chapters in the -same page must have `##`-level titles, and sub-chapters need to increase the -number of `#` in the title according to its nesting depth. - -For the page's title, all words must be capitalized, for other chapters, only -the first word has to be capitalized. +* Each page must have a single `#`-level title at the top. +* Chapters in the same page must have `##`-level titles. +* Sub-chapters need to increase the number of `#` in the title according to its + nesting depth. +* All words in the page's title must be capitalized. +* Only the first word of a chapter title must be capitalized. Using `Quick Start` as example: @@ -59,7 +59,7 @@ The following rules only apply to the documentation of APIs. ### Page title Each page must use the actual object name returned by `require('electron')` -as the title, such as `BrowserWindow`, `autoUpdater`, `session`, etc. +as the title, such as `BrowserWindow`, `autoUpdater`, and `session`. Under the page tile must be a one-line description starting with `>`. @@ -75,7 +75,7 @@ Using `session` as example: ### Module methods and events For modules that are not classes, their methods and events must be listed under -`## Methods` and `## Events` chapters. +the `## Methods` and `## Events` chapters. Using `autoUpdater` as an example: @@ -93,17 +93,15 @@ Using `autoUpdater` as an example: ### Classes -For APIs that exists as classes, or for classes that are part of modules, they -must listed under a `## Class: TheClassName` chapter. One page can have multiple -classes. +- API classes or classes that are part of modules must be listed under a + `## Class: TheClassName` chapter. +- One page can have multiple classes. +- The constructors must be listed with `###`-level titles. +- The methods must be listed under a `### Instance Methods` chapter. +- The events must be listed under a `### Instance Events` chapter. +- The properties must be listed under a `Instance Properties` chapter. -If the class has constructors, they must be listed with `###`-level titles. - -The methods, events and properties of a class must be listed under -`### Instance Methods`, `### Instance Events`, and `Instance Properties` -chapters. - -Using `Session`, `Cookies` classes as an example: +Using the `Session` and `Cookies` classes as an example: ```markdown # session @@ -182,11 +180,11 @@ can be `macOS`, `Windows`, or `Linux`. * `animate` Boolean (optional) _macOS_ _Windows_ ``` -For any argument with `Array` type, it must be classified what elements the -array may include in the description below. +`Array` type arguments must be classified what elements the array may include in +the description below. -For any argument with `Function` type, the description should make it clear how -it may be called and list the types of the arguments that will be passed to it. +The description for `Function` type arguments should make it clear how it may be +called and list the types of the parameters that will be passed to it. ### Events @@ -206,7 +204,7 @@ Returns: The title can be `###` or `####`-levels depending on whether it is an event of a module or a class. -The arguments of an event have the same rules as methods. +The arguments of an event follow the same rules as methods. ### Properties From 63e2ee8e105df6d0254220d3542481b8897a81c0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 24 Jun 2016 12:45:22 -0700 Subject: [PATCH 110/516] Add link to Boolean --- docs/styleguide.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/styleguide.md b/docs/styleguide.md index 0d93df5e6d..21af8a0fe0 100644 --- a/docs/styleguide.md +++ b/docs/styleguide.md @@ -170,6 +170,7 @@ of argument is notated by either the common types: - [`Number`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number) - [`Object`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) - [`Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) +- [`Boolean`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean) - Or a custom type like Electron's [`WebContent`](api/web-content.md) If an argument or a method is unique to certain platforms, those platforms are From 271808b2780feb0872e29bc8ac47457cb671fc5d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 24 Jun 2016 15:08:12 -0700 Subject: [PATCH 111/516] Support reading/writing bookmarks to clipboard --- atom/common/api/atom_api_clipboard.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/atom/common/api/atom_api_clipboard.cc b/atom/common/api/atom_api_clipboard.cc index cb413800be..bda3b0c38c 100644 --- a/atom/common/api/atom_api_clipboard.cc +++ b/atom/common/api/atom_api_clipboard.cc @@ -122,6 +122,23 @@ void WriteHtml(const base::string16& html, mate::Arguments* args) { writer.WriteHTML(html, std::string()); } +v8::Local ReadBookmark(mate::Arguments* args) { + base::string16 title; + std::string url; + mate::Dictionary dict = mate::Dictionary::CreateEmpty(args->isolate()); + ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread(); + clipboard->ReadBookmark(&title, &url); + dict.Set("title", title); + dict.Set("url", url); + return dict.GetHandle(); +} + +void WriteBookmark(const base::string16& title, const std::string& url, + mate::Arguments* args) { + ui::ScopedClipboardWriter writer(GetClipboardType(args)); + writer.WriteBookmark(title, url); +} + gfx::Image ReadImage(mate::Arguments* args) { ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread(); SkBitmap bitmap = clipboard->ReadImage(GetClipboardType(args)); @@ -150,6 +167,8 @@ void Initialize(v8::Local exports, v8::Local unused, dict.SetMethod("writeRTF", &WriteRtf); dict.SetMethod("readHTML", &ReadHtml); dict.SetMethod("writeHTML", &WriteHtml); + dict.SetMethod("readBookmark", &ReadBookmark); + dict.SetMethod("writeBookmark", &WriteBookmark); dict.SetMethod("readImage", &ReadImage); dict.SetMethod("writeImage", &WriteImage); dict.SetMethod("clear", &Clear); From 358bf1bf69104e38cfd0cf7f7d893c7b003dcd95 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 24 Jun 2016 15:10:32 -0700 Subject: [PATCH 112/516] Add read/writeBookmark spec --- spec/api-clipboard-spec.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/spec/api-clipboard-spec.js b/spec/api-clipboard-spec.js index 344e01452f..1c3682ba2b 100644 --- a/spec/api-clipboard-spec.js +++ b/spec/api-clipboard-spec.js @@ -41,6 +41,16 @@ describe('clipboard module', function () { }) }) + describe('clipboard.readBookmark', function () { + it('returns title and url', function () { + clipboard.writeBookmark('a title', 'http://electron.atom.io') + assert.deepEqual(clipboard.readBookmark(), { + title: 'a title', + url: 'https://electron.atom.io' + }) + }) + }) + describe('clipboard.write()', function () { it('returns data correctly', function () { var text = 'test' From e802d0e4a098d97a91ef247f395e9fa0ca1551c7 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 24 Jun 2016 15:14:28 -0700 Subject: [PATCH 113/516] Add bookmark key to clipboard.write --- atom/common/api/atom_api_clipboard.cc | 8 ++++++-- spec/api-clipboard-spec.js | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/atom/common/api/atom_api_clipboard.cc b/atom/common/api/atom_api_clipboard.cc index bda3b0c38c..01e670be92 100644 --- a/atom/common/api/atom_api_clipboard.cc +++ b/atom/common/api/atom_api_clipboard.cc @@ -54,12 +54,16 @@ std::string Read(const std::string& format_string, void Write(const mate::Dictionary& data, mate::Arguments* args) { ui::ScopedClipboardWriter writer(GetClipboardType(args)); - base::string16 text, html; + base::string16 text, html, bookmark; gfx::Image image; - if (data.Get("text", &text)) + if (data.Get("text", &text)) { writer.WriteText(text); + if (data.Get("bookmark", &bookmark)) + writer.WriteBookmark(bookmark, base::UTF16ToUTF8(text)); + } + if (data.Get("rtf", &text)) { std::string rtf = base::UTF16ToUTF8(text); writer.WriteRTF(rtf); diff --git a/spec/api-clipboard-spec.js b/spec/api-clipboard-spec.js index 1c3682ba2b..3915b550e2 100644 --- a/spec/api-clipboard-spec.js +++ b/spec/api-clipboard-spec.js @@ -58,16 +58,19 @@ describe('clipboard module', function () { var p = path.join(fixtures, 'assets', 'logo.png') var i = nativeImage.createFromPath(p) var markup = process.platform === 'darwin' ? "Hi" : process.platform === 'linux' ? 'Hi' : 'Hi' + var bookmark = {title: 'a title', url: 'test'} clipboard.write({ text: 'test', html: 'Hi', rtf: '{\\rtf1\\utf8 text}', + bookmark: 'a title', image: p }) assert.equal(clipboard.readText(), text) assert.equal(clipboard.readHTML(), markup) assert.equal(clipboard.readRTF(), rtf) assert.equal(clipboard.readImage().toDataURL(), i.toDataURL()) + assert.deepEqual(clipboard.readBookmark(), bookmark) }) }) }) From 9fab641ecb13a94177e1eb4ea30761757f7647a7 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 24 Jun 2016 15:16:05 -0700 Subject: [PATCH 114/516] Add missing rtf key --- docs/api/clipboard.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/api/clipboard.md b/docs/api/clipboard.md index c2a16a79b9..47fd0564ac 100644 --- a/docs/api/clipboard.md +++ b/docs/api/clipboard.md @@ -111,6 +111,7 @@ Reads `data` from the clipboard. * `text` String * `html` String * `image` [NativeImage](native-image.md) + * `rtf` String * `type` String (optional) ```javascript From a2ba778adcf6b776bc7122ba174a611c498990c2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 24 Jun 2016 15:20:49 -0700 Subject: [PATCH 115/516] Document clipboard bookmark support --- docs/api/clipboard.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/api/clipboard.md b/docs/api/clipboard.md index 47fd0564ac..ecd73a71cc 100644 --- a/docs/api/clipboard.md +++ b/docs/api/clipboard.md @@ -75,6 +75,21 @@ Returns the content in the clipboard as RTF. Writes the `text` into the clipboard in RTF. +### `clipboard.readBookmark([type])` + +* `type` String (optional) + +Returns an Object containing `title` and `url` string keys representing the +bookmark in clipboard. + +### `clipboard.writeBookmark(title, url[, type])` + +* `title` String +* `url` String +* `type` String (optional) + +Writes the `title` and `url` into the clipboard as a bookmark. + ### `clipboard.clear([type])` * `type` String (optional) @@ -112,6 +127,7 @@ Reads `data` from the clipboard. * `html` String * `image` [NativeImage](native-image.md) * `rtf` String + * `bookmark` String - The title of the url at `text`. * `type` String (optional) ```javascript From 30a628b46f0e6932ee164988cf38e41e7c02c8f1 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 24 Jun 2016 15:29:39 -0700 Subject: [PATCH 116/516] Remove unsupported type --- docs/api/clipboard.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/api/clipboard.md b/docs/api/clipboard.md index ecd73a71cc..9ac11706b9 100644 --- a/docs/api/clipboard.md +++ b/docs/api/clipboard.md @@ -75,9 +75,7 @@ Returns the content in the clipboard as RTF. Writes the `text` into the clipboard in RTF. -### `clipboard.readBookmark([type])` - -* `type` String (optional) +### `clipboard.readBookmark()` Returns an Object containing `title` and `url` string keys representing the bookmark in clipboard. From 6588b85ac951cf6ed24d89efdfaf5d5857c8324d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 24 Jun 2016 15:31:15 -0700 Subject: [PATCH 117/516] Mention empty strings --- docs/api/clipboard.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/api/clipboard.md b/docs/api/clipboard.md index 9ac11706b9..a8c4605efa 100644 --- a/docs/api/clipboard.md +++ b/docs/api/clipboard.md @@ -78,7 +78,8 @@ Writes the `text` into the clipboard in RTF. ### `clipboard.readBookmark()` Returns an Object containing `title` and `url` string keys representing the -bookmark in clipboard. +bookmark in the clipboard. The `title` and `url` values will be empty strings +when the bookmark is unavailable. ### `clipboard.writeBookmark(title, url[, type])` From 5fbba2d27b98df0fd34deea563e85729383d3b43 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 24 Jun 2016 15:32:52 -0700 Subject: [PATCH 118/516] Add assertions for no available bookmark --- spec/api-clipboard-spec.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/spec/api-clipboard-spec.js b/spec/api-clipboard-spec.js index 3915b550e2..5116bd80c4 100644 --- a/spec/api-clipboard-spec.js +++ b/spec/api-clipboard-spec.js @@ -46,7 +46,13 @@ describe('clipboard module', function () { clipboard.writeBookmark('a title', 'http://electron.atom.io') assert.deepEqual(clipboard.readBookmark(), { title: 'a title', - url: 'https://electron.atom.io' + url: 'http://electron.atom.io' + }) + + clipboard.writeText('no bookmark') + assert.deepEqual(clipboard.readBookmark(), { + title: '', + url: '' }) }) }) From 9479536bb8cc8d15e043de0b07eee3d5d83b141d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 24 Jun 2016 15:35:30 -0700 Subject: [PATCH 119/516] Tweak return value description --- docs/api/clipboard.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/api/clipboard.md b/docs/api/clipboard.md index a8c4605efa..c4ae96c4b1 100644 --- a/docs/api/clipboard.md +++ b/docs/api/clipboard.md @@ -77,9 +77,9 @@ Writes the `text` into the clipboard in RTF. ### `clipboard.readBookmark()` -Returns an Object containing `title` and `url` string keys representing the -bookmark in the clipboard. The `title` and `url` values will be empty strings -when the bookmark is unavailable. +Returns an Object containing `title` and `url` keys representing the bookmark in +the clipboard. The `title` and `url` values will be empty strings when the +bookmark is unavailable. ### `clipboard.writeBookmark(title, url[, type])` From aee111bf2f372afe98c5643a2a916f40e7187701 Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Fri, 24 Jun 2016 15:59:30 -0700 Subject: [PATCH 120/516] minor wording changes and tweaks --- docs/styleguide.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/styleguide.md b/docs/styleguide.md index 21af8a0fe0..e0080ba08c 100644 --- a/docs/styleguide.md +++ b/docs/styleguide.md @@ -6,7 +6,7 @@ These are the guidelines for writing Electron documentation. * Each page must have a single `#`-level title at the top. * Chapters in the same page must have `##`-level titles. -* Sub-chapters need to increase the number of `#` in the title according to its +* Sub-chapters need to increase the number of `#` in the title according to their nesting depth. * All words in the page's title must be capitalized. * Only the first word of a chapter title must be capitalized. @@ -69,7 +69,6 @@ Using `session` as example: # session > Manage browser sessions, cookies, cache, proxy settings, etc. - ``` ### Module methods and events @@ -97,9 +96,9 @@ Using `autoUpdater` as an example: `## Class: TheClassName` chapter. - One page can have multiple classes. - The constructors must be listed with `###`-level titles. -- The methods must be listed under a `### Instance Methods` chapter. -- The events must be listed under a `### Instance Events` chapter. -- The properties must be listed under a `Instance Properties` chapter. +- The methods must be listed under an `### Instance Methods` chapter. +- The events must be listed under an `### Instance Events` chapter. +- The properties must be listed under an `### Instance Properties` chapter. Using the `Session` and `Cookies` classes as an example: @@ -146,22 +145,25 @@ The methods chapter must be in the following form: * `optional` Integer (optional) ... - ``` The title can be `###` or `####`-levels depending on whether it is a method of a module or a class. -For modules, the `objectName` is the module's name, for classes, it must be the +For modules, the `objectName` is the module's name. For classes, it must be the name of the instance of the class, and must not be the same as the module's name. For example, the methods of the `Session` class under the `session` module must use `ses` as the `objectName`. -The optional arguments are notated by brackets surrounding the optional argument +The optional arguments are notated by square brackets `[]` surrounding the optional argument as well as the comma required if this optional argument follows another -argument. +argument: + +``` +required[, optional] +``` Below the method is more detailed information on each of the arguments. The type of argument is notated by either the common types: @@ -181,7 +183,7 @@ can be `macOS`, `Windows`, or `Linux`. * `animate` Boolean (optional) _macOS_ _Windows_ ``` -`Array` type arguments must be classified what elements the array may include in +`Array` type arguments must specify what elements the array may include in the description below. The description for `Function` type arguments should make it clear how it may be @@ -199,7 +201,6 @@ Returns: * `time` String ... - ``` The title can be `###` or `####`-levels depending on whether it is an event of @@ -215,7 +216,6 @@ The properties chapter must be in following form: ### session.defaultSession ... - ``` The title can be `###` or `####`-levels depending on whether it is a property of From f90ef128145600899427ef8c5629fa0cd794232d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 24 Jun 2016 17:16:38 -0700 Subject: [PATCH 121/516] read/writeBookmark is not implemented on Linux --- docs/api/clipboard.md | 4 ++-- spec/api-clipboard-spec.js | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/api/clipboard.md b/docs/api/clipboard.md index c4ae96c4b1..85712bc651 100644 --- a/docs/api/clipboard.md +++ b/docs/api/clipboard.md @@ -75,13 +75,13 @@ Returns the content in the clipboard as RTF. Writes the `text` into the clipboard in RTF. -### `clipboard.readBookmark()` +### `clipboard.readBookmark()` _macOS_ _Windows_ Returns an Object containing `title` and `url` keys representing the bookmark in the clipboard. The `title` and `url` values will be empty strings when the bookmark is unavailable. -### `clipboard.writeBookmark(title, url[, type])` +### `clipboard.writeBookmark(title, url[, type])` _macOS_ _Windows_ * `title` String * `url` String diff --git a/spec/api-clipboard-spec.js b/spec/api-clipboard-spec.js index 5116bd80c4..25b65b4784 100644 --- a/spec/api-clipboard-spec.js +++ b/spec/api-clipboard-spec.js @@ -43,6 +43,8 @@ describe('clipboard module', function () { describe('clipboard.readBookmark', function () { it('returns title and url', function () { + if (process.platform === 'linux') return + clipboard.writeBookmark('a title', 'http://electron.atom.io') assert.deepEqual(clipboard.readBookmark(), { title: 'a title', @@ -76,7 +78,10 @@ describe('clipboard module', function () { assert.equal(clipboard.readHTML(), markup) assert.equal(clipboard.readRTF(), rtf) assert.equal(clipboard.readImage().toDataURL(), i.toDataURL()) - assert.deepEqual(clipboard.readBookmark(), bookmark) + + if (process.platform !== 'linux') { + assert.deepEqual(clipboard.readBookmark(), bookmark) + } }) }) }) From 4d55175649f1fb8d90349d2941997ede547995d8 Mon Sep 17 00:00:00 2001 From: Florent Delayen Date: Sat, 25 Jun 2016 16:51:43 +0200 Subject: [PATCH 122/516] Execute click handlers for top level menu items --- atom/browser/ui/views/menu_bar.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/atom/browser/ui/views/menu_bar.cc b/atom/browser/ui/views/menu_bar.cc index 796e6ef804..0538421bfe 100644 --- a/atom/browser/ui/views/menu_bar.cc +++ b/atom/browser/ui/views/menu_bar.cc @@ -145,8 +145,10 @@ void MenuBar::OnMenuButtonClicked(views::MenuButton* source, int id = source->tag(); ui::MenuModel::ItemType type = menu_model_->GetTypeAt(id); - if (type != ui::MenuModel::TYPE_SUBMENU) + if (type != ui::MenuModel::TYPE_SUBMENU) { + menu_model_->ActivatedAt(id, 0); return; + } MenuDelegate menu_delegate(this); menu_delegate.RunMenu(menu_model_->GetSubmenuModelAt(id), source); From e1ad64013ecbaf1f4a3f957a37ca2fdb8ab14c02 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 26 Jun 2016 11:46:40 +0900 Subject: [PATCH 123/516] Cleanup code of beginFrameSubscription --- atom/browser/api/atom_api_web_contents.cc | 11 +++++------ atom/browser/api/frame_subscriber.cc | 16 ++++++++++------ atom/browser/api/frame_subscriber.h | 7 ++++--- docs/api/web-contents.md | 2 +- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index f19ac34a5d..e6959c8871 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -1181,15 +1181,14 @@ void WebContents::SendInputEvent(v8::Isolate* isolate, isolate, "Invalid event object"))); } -void WebContents::BeginFrameSubscription( - mate::Arguments* args) { - FrameSubscriber::FrameCaptureCallback callback; +void WebContents::BeginFrameSubscription(mate::Arguments* args) { bool only_dirty = false; + FrameSubscriber::FrameCaptureCallback callback; + args->GetNext(&only_dirty); if (!args->GetNext(&callback)) { - args->GetNext(&only_dirty); - if (!args->GetNext(&callback)) - args->ThrowTypeError("'callback' must be defined"); + args->ThrowError(); + return; } const auto view = web_contents()->GetRenderWidgetHostView(); diff --git a/atom/browser/api/frame_subscriber.cc b/atom/browser/api/frame_subscriber.cc index 91b6765db1..d6d2cf759e 100644 --- a/atom/browser/api/frame_subscriber.cc +++ b/atom/browser/api/frame_subscriber.cc @@ -5,8 +5,8 @@ #include "atom/browser/api/frame_subscriber.h" #include "base/bind.h" -#include "atom/common/node_includes.h" #include "atom/common/native_mate_converters/gfx_converter.h" +#include "atom/common/node_includes.h" #include "content/public/browser/render_widget_host.h" namespace atom { @@ -17,8 +17,11 @@ FrameSubscriber::FrameSubscriber(v8::Isolate* isolate, content::RenderWidgetHostView* view, const FrameCaptureCallback& callback, bool only_dirty) - : isolate_(isolate), view_(view), callback_(callback), - only_dirty_(only_dirty), weak_factory_(this) { + : isolate_(isolate), + view_(view), + callback_(callback), + only_dirty_(only_dirty), + weak_factory_(this) { } bool FrameSubscriber::ShouldCaptureFrame( @@ -48,8 +51,9 @@ bool FrameSubscriber::ShouldCaptureFrame( } void FrameSubscriber::OnFrameDelivered(const FrameCaptureCallback& callback, - const gfx::Rect& damage_rect, const SkBitmap& bitmap, - content::ReadbackResponse response) { + const gfx::Rect& damage_rect, + const SkBitmap& bitmap, + content::ReadbackResponse response) { if (response != content::ReadbackResponse::READBACK_SUCCESS) return; @@ -67,7 +71,7 @@ void FrameSubscriber::OnFrameDelivered(const FrameCaptureCallback& callback, rgb_arr_size); v8::Local damage = - mate::Converter::ToV8(isolate_, damage_rect); + mate::Converter::ToV8(isolate_, damage_rect); callback_.Run(buffer.ToLocalChecked(), damage); } diff --git a/atom/browser/api/frame_subscriber.h b/atom/browser/api/frame_subscriber.h index b6cff3da81..0da554ac47 100644 --- a/atom/browser/api/frame_subscriber.h +++ b/atom/browser/api/frame_subscriber.h @@ -21,7 +21,7 @@ namespace api { class FrameSubscriber : public content::RenderWidgetHostViewFrameSubscriber { public: using FrameCaptureCallback = - base::Callback, v8::Local)>; + base::Callback, v8::Local)>; FrameSubscriber(v8::Isolate* isolate, content::RenderWidgetHostView* view, @@ -35,8 +35,9 @@ class FrameSubscriber : public content::RenderWidgetHostViewFrameSubscriber { private: void OnFrameDelivered(const FrameCaptureCallback& callback, - const gfx::Rect& damage_rect, const SkBitmap& bitmap, - content::ReadbackResponse response); + const gfx::Rect& damage_rect, + const SkBitmap& bitmap, + content::ReadbackResponse response); v8::Isolate* isolate_; content::RenderWidgetHostView* view_; diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index c25b640f91..913504cd37 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -921,7 +921,7 @@ For the `mouseWheel` event, the `event` object also have following properties: ### `webContents.beginFrameSubscription([onlyDirty ,]callback)` -* `onlyDirty` Boolean +* `onlyDirty` Boolean (optional) - Defaults to `false` * `callback` Function Begin subscribing for presentation events and captured frames, the `callback` From 090c8b89bb6e98a5e6d6e1968d5b8eef0cca04d8 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 26 Jun 2016 11:53:58 +0900 Subject: [PATCH 124/516] spec: Make beginFrameSubscription test more reliable --- spec/api-browser-window-spec.js | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index b5f5590558..25b852946f 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -44,7 +44,10 @@ describe('browser-window module', function () { w = new BrowserWindow({ show: false, width: 400, - height: 400 + height: 400, + webPreferences: { + backgroundThrottling: false + } }) }) @@ -603,12 +606,20 @@ describe('browser-window module', function () { }) describe('beginFrameSubscription method', function () { - it('subscribes to frame updates', function (done) { - this.timeout(20000) + // This test is too slow, only test it on CI. + if (!isCI) return + this.timeout(20000) + + it('subscribes to frame updates', function (done) { + let called = false w.loadURL('file://' + fixtures + '/api/frame-subscriber.html') w.webContents.on('dom-ready', function () { w.webContents.beginFrameSubscription(function (data) { + // This callback might be called twice. + if (called) return + called = true + assert.notEqual(data.length, 0) w.webContents.endFrameSubscription() done() @@ -617,11 +628,14 @@ describe('browser-window module', function () { }) it('subscribes to frame updates (only dirty rectangle)', function (done) { - this.timeout(20000) - + let called = false w.loadURL('file://' + fixtures + '/api/frame-subscriber.html') w.webContents.on('dom-ready', function () { w.webContents.beginFrameSubscription(true, function (data) { + // This callback might be called twice. + if (called) return + called = true + assert.notEqual(data.length, 0) w.webContents.endFrameSubscription() done() @@ -630,10 +644,8 @@ describe('browser-window module', function () { }) it('throws error when subscriber is not well defined', function (done) { - this.timeout(20000) - w.loadURL('file://' + fixtures + '/api/frame-subscriber.html') - try{ + try { w.webContents.beginFrameSubscription(true, true) } catch(e) { done() From 4e747b56b03bf47ab1f353e7222bd8c4ab64985c Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 26 Jun 2016 13:36:05 +0900 Subject: [PATCH 125/516] Update docs-translations/zh-CN/api/shell.md Close #6099. --- docs-translations/zh-CN/api/shell.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-translations/zh-CN/api/shell.md b/docs-translations/zh-CN/api/shell.md index a30334dcdc..17ebe5511a 100644 --- a/docs-translations/zh-CN/api/shell.md +++ b/docs-translations/zh-CN/api/shell.md @@ -6,7 +6,7 @@ 在用户默认浏览器中打开URL的示例: ```javascript -var shell = require('shell'); +const {shell} = require('electron'); shell.openExternal('https://github.com'); ``` From e457207b20f6e5c330bb0218f45503eb42b4bc0b Mon Sep 17 00:00:00 2001 From: Emerson Thompson Date: Mon, 27 Jun 2016 20:19:46 -0300 Subject: [PATCH 126/516] Portuguese error --- docs-translations/pt-BR/api/auto-updater.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-translations/pt-BR/api/auto-updater.md b/docs-translations/pt-BR/api/auto-updater.md index f7c49db8ff..ff4db562a0 100644 --- a/docs-translations/pt-BR/api/auto-updater.md +++ b/docs-translations/pt-BR/api/auto-updater.md @@ -40,7 +40,7 @@ Emitido quando está verificando se uma atualização foi inicializada. ### Evento: 'update-available' -Emitido quando há uma atualização disponível. A autalização é baixada automaticamente. +Emitido quando há uma atualização disponível. A atualização é baixada automaticamente. ### Evento: 'update-not-available' From 3da41e03aadc26b519fc31b9f5a3ab9cb0063f82 Mon Sep 17 00:00:00 2001 From: Emerson Thompson Date: Mon, 27 Jun 2016 20:27:09 -0300 Subject: [PATCH 127/516] broken link (404) Broken link (404) to DesktopCapturer --- docs-translations/pt-BR/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-translations/pt-BR/README.md b/docs-translations/pt-BR/README.md index 8498ca420f..ba6abc39aa 100644 --- a/docs-translations/pt-BR/README.md +++ b/docs-translations/pt-BR/README.md @@ -64,7 +64,7 @@ Existem muitas perguntas comuns que são feitas, verifique antes de criar uma is ### Módulos para o Processo Renderizador: -* [DesktopCapturer](../../docs/api/desktop-capturer) +* [DesktopCapturer](../../docs/api/desktop-capturer.md) * [ipcRenderer](../../docs/api/ipc-renderer.md) * [remote](../../docs/api/remote.md) * [webFrame](../../docs/api/web-frame.md) From 393829b6745589c5647da52b52b4e5d4be85f112 Mon Sep 17 00:00:00 2001 From: Emerson Thompson Date: Mon, 27 Jun 2016 20:48:58 -0300 Subject: [PATCH 128/516] Translated: power-monitor.md --- docs-translations/pt-BR/api/power-monitor.md | 35 ++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 docs-translations/pt-BR/api/power-monitor.md diff --git a/docs-translations/pt-BR/api/power-monitor.md b/docs-translations/pt-BR/api/power-monitor.md new file mode 100644 index 0000000000..0075601293 --- /dev/null +++ b/docs-translations/pt-BR/api/power-monitor.md @@ -0,0 +1,35 @@ +# powerMonitor + +> Monitorar as mudanças de estado de energia. + +Você só pode usá-lo no processo principal. Você não deve usar este módulo até que o evento `ready` do modulo `app` seja emitido. + +Por exemplo: + +```javascript +app.on('ready', () => { + require('electron').powerMonitor.on('suspend', () => { + console.log('O sistema está indo dormir'); + }); +}); +``` + +## Eventos + +O módulo `power-monitor` emite os seguintes eventos: + +### Evento: 'suspend' + +Emitido quando o sistema está a suspender. + +### Evento: 'resume' + +Emitido quando o sistema está a retomar. + +### Evento: 'on-ac' _Windows_ + +Emitido quando o sistema muda para energia AC. + +### Evento: 'on-battery' _Windows_ + +Emitido quando o sistema muda para a energia da bateria. From d6ab3534387e4be2cea0309663f2586941f2f61c Mon Sep 17 00:00:00 2001 From: Ian Ornelas Date: Tue, 28 Jun 2016 06:02:25 -0300 Subject: [PATCH 129/516] Add chrome.storage.local --- lib/renderer/extensions/storage.js | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/renderer/extensions/storage.js b/lib/renderer/extensions/storage.js index 7b880f0831..b0941d98c8 100644 --- a/lib/renderer/extensions/storage.js +++ b/lib/renderer/extensions/storage.js @@ -1,5 +1,5 @@ -const getStorage = () => { - const data = window.localStorage.getItem('__chrome.storage.sync__') +const getStorage = (storageType) => { + const data = window.localStorage.getItem(`__chrome.storage.${storageType}__`) if (data != null) { return JSON.parse(data) } else { @@ -7,15 +7,15 @@ const getStorage = () => { } } -const setStorage = (storage) => { +const setStorage = (storageType, storage) => { const json = JSON.stringify(storage) - window.localStorage.setItem('__chrome.storage.sync__', json) + window.localStorage.setItem(`__chrome.storage.${storageType}__`, json) } -module.exports = { - sync: { +const getStorageManager = (storageType) => { + return { get (keys, callback) { - const storage = getStorage() + const storage = getStorage(storageType) if (keys == null) return storage let defaults = {} @@ -45,15 +45,20 @@ module.exports = { }, set (items, callback) { - const storage = getStorage() + const storage = getStorage(storageType) Object.keys(items).forEach(function (name) { storage[name] = items[name] }) - setStorage(storage) + setStorage(storageType, storage) setTimeout(callback) } } } + +module.exports = { + sync: getStorageManager('sync'), + local: getStorageManager('local') +} From 918f25b76c194325c9d3a0958fff8c142c2e91a7 Mon Sep 17 00:00:00 2001 From: Emerson Thompson Date: Tue, 28 Jun 2016 09:22:53 -0300 Subject: [PATCH 130/516] link correction --- docs-translations/pt-BR/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-translations/pt-BR/README.md b/docs-translations/pt-BR/README.md index ba6abc39aa..0c442ef89d 100644 --- a/docs-translations/pt-BR/README.md +++ b/docs-translations/pt-BR/README.md @@ -52,7 +52,7 @@ Existem muitas perguntas comuns que são feitas, verifique antes de criar uma is * [contentTracing](../../docs/api/content-tracing.md) * [dialog](../../docs/api/dialog.md) * [globalShortcut](../../docs/api/global-shortcut.md) -* [ipcMain](../../docs/api/ipc-main-process.md) +* [ipcMain](../../docs/api/ipc-main.md) * [Menu](../../docs/api/menu.md) * [MenuItem](../../docs/api/menu-item.md) * [powerMonitor](../../docs/api/power-monitor.md) From 8faf2f10e1ff35b63cadb348cd6089d321c0ddb5 Mon Sep 17 00:00:00 2001 From: Emerson Thompson Date: Tue, 28 Jun 2016 09:38:02 -0300 Subject: [PATCH 131/516] link to the translation --- docs-translations/pt-BR/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-translations/pt-BR/README.md b/docs-translations/pt-BR/README.md index ba6abc39aa..e1682d27d2 100644 --- a/docs-translations/pt-BR/README.md +++ b/docs-translations/pt-BR/README.md @@ -55,7 +55,7 @@ Existem muitas perguntas comuns que são feitas, verifique antes de criar uma is * [ipcMain](../../docs/api/ipc-main-process.md) * [Menu](../../docs/api/menu.md) * [MenuItem](../../docs/api/menu-item.md) -* [powerMonitor](../../docs/api/power-monitor.md) +* [powerMonitor](api/power-monitor.md) * [powerSaveBlocker](../../docs/api/power-save-blocker.md) * [protocol](../../docs/api/protocol.md) * [session](../../docs/api/session.md) From 1551a96223612aeb2bcb57778199f69e8d818fa1 Mon Sep 17 00:00:00 2001 From: Emerson Thompson Date: Tue, 28 Jun 2016 09:43:10 -0300 Subject: [PATCH 132/516] word correction --- docs-translations/pt-BR/tutorial/devtools-extension.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-translations/pt-BR/tutorial/devtools-extension.md b/docs-translations/pt-BR/tutorial/devtools-extension.md index 958b70c2e1..c488cee959 100644 --- a/docs-translations/pt-BR/tutorial/devtools-extension.md +++ b/docs-translations/pt-BR/tutorial/devtools-extension.md @@ -41,6 +41,6 @@ Atualmente o Electron não suporta páginas em segundo plano nas extensões do C Algumas extensões do Chrome podem usar a API `chrome.*`. Apesar de um esforço na implementação destas APIs no Electron, elas ainda não estão finalizadas. -Dado que nem todas as funções `chrome.*` esstão implementadas, algumas extensões que utilizam `chrome.devtools.*` podem não funcionar. Você pode reportar este erro no issue tracker para que possamos adicionar suporte a essas APIs. +Dado que nem todas as funções `chrome.*` estão implementadas, algumas extensões que utilizam `chrome.devtools.*` podem não funcionar. Você pode reportar este erro no issue tracker para que possamos adicionar suporte a essas APIs. [devtools-extension]: https://developer.chrome.com/extensions/devtools From a88626151868a55925d613ccdd21fe3191d368a5 Mon Sep 17 00:00:00 2001 From: Milan Burda Date: Mon, 27 Jun 2016 14:38:12 +0200 Subject: [PATCH 133/516] Fix crash in ReadImageSkiaFromICO when CreateSkBitmapFromHICON fails --- atom/common/api/atom_api_native_image.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/atom/common/api/atom_api_native_image.cc b/atom/common/api/atom_api_native_image.cc index b666f86ba3..14500496eb 100644 --- a/atom/common/api/atom_api_native_image.cc +++ b/atom/common/api/atom_api_native_image.cc @@ -160,10 +160,14 @@ base::win::ScopedHICON ReadICOFromPath(int size, const base::FilePath& path) { LR_LOADFROMFILE))); } -void ReadImageSkiaFromICO(gfx::ImageSkia* image, HICON icon) { +bool ReadImageSkiaFromICO(gfx::ImageSkia* image, HICON icon) { // Convert the icon from the Windows specific HICON to gfx::ImageSkia. std::unique_ptr bitmap(IconUtil::CreateSkBitmapFromHICON(icon)); + if (!bitmap) + return false; + image->AddRepresentation(gfx::ImageSkiaRep(*bitmap, 1.0f)); + return true; } #endif From 8fb86e10fc9b236488dcb1759e10d2c867502e6d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Jun 2016 11:46:04 -0700 Subject: [PATCH 134/516] Add assert for non-existent .ico --- spec/api-native-image-spec.js | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/api-native-image-spec.js b/spec/api-native-image-spec.js index 4ada22af9e..e8dda25348 100644 --- a/spec/api-native-image-spec.js +++ b/spec/api-native-image-spec.js @@ -9,6 +9,7 @@ describe('nativeImage module', () => { it('returns an empty image for invalid paths', () => { assert(nativeImage.createFromPath('').isEmpty()) assert(nativeImage.createFromPath('does-not-exist.png').isEmpty()) + assert(nativeImage.createFromPath('does-not-exist.ico').isEmpty()) }) it('loads images from paths relative to the current working directory', () => { From 14df90fd19b9081cf3c3964c1ebfd03166e27970 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Jun 2016 11:58:34 -0700 Subject: [PATCH 135/516] Add spec for valid .ico file --- spec/api-native-image-spec.js | 10 ++++++++++ spec/fixtures/assets/icon.ico | Bin 0 -> 77776 bytes 2 files changed, 10 insertions(+) create mode 100644 spec/fixtures/assets/icon.ico diff --git a/spec/api-native-image-spec.js b/spec/api-native-image-spec.js index e8dda25348..7e49cbf78e 100644 --- a/spec/api-native-image-spec.js +++ b/spec/api-native-image-spec.js @@ -48,5 +48,15 @@ describe('nativeImage module', () => { // If all bytes are null, that's Bad assert.equal(nsimage.reduce((acc, x) => acc || (x !== 0), false), true) }) + + it('loads images from .ico files on Windows', () => { + if (process.platform !== 'win32') return + + const imagePath = path.join(__dirname, 'fixtures', 'assets', 'icon.ico') + const image = nativeImage.createFromPath(imagePath) + assert(!image.isEmpty()) + assert.equal(image.getSize().height, 256) + assert.equal(image.getSize().width, 256) + }) }) }) diff --git a/spec/fixtures/assets/icon.ico b/spec/fixtures/assets/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..aa09177554651fb38078881c4dd73f7d1d17ae7f GIT binary patch literal 77776 zcmeFZbzGLq_BV{uAYp=_5{iLcARv-bqJV&?vL zBje`pJ$QK9u~GBa2$kfe>EO}D5Bm*PnW(Xk99a6bl1Cs!qj)5B*zp$8K4)| z^)-5|qdutb?{d)Z{${V-z9vu54^vNrJ8-d+1)o0100&D+;PY7?tKVwxgMELOG1%n4e@OHWfhTFW?2jSR} zc3;Qgc3+5B4tO};2ha`>ANCU17>R=1WD_vjoeCy;lY!}5elXG%2mD;sfWNCM9Pb0r z*wJ>s`jHM_kQ$>0VuPOpFGo2L?4=HdyOO|oPYfL64@Nrtz$Y6S(E8H}O!cRL$$=Cw z3df9f`qhth`OS`X`h%XvAYiJ`2V#P>!1NH(83e+7R6$&bCK&Jb2f>~Xp%2tRh^Gn| zhce+`VawyO>nr22V0kDJxg zK8@bD=>3cGf0~HbzMc>MQmXJtV3X+YEi9v2Qrce=noDt&|w51>79& zgVCNOFx(yrMmi%vS3@K)(-(r@FKgUhVYC15GO#klhH{w9exC*8lc5%$xy`n%KA^YB z{TB|TzoXh2?i&O_cVjrL_d$CNT;Endkegxwzkkm`PNFWzPu7Fq^iNnDnvXxrMY?{U zhv8NqH@H^;LvZh~m4|vi00u9(;rCeurw6v9{ZCZDbGXOw149r`X^t_Re+6K!F9^Ty z(r{iBK&ZDm2!P*rD??#yk7M+j7ktYyhH`OuxAH-#6Zrt`w?^80r_sJ;sLdPOzYMl| z0i!p(*q+GnH4nt^h1GXA_=ADA2=FEIJ+@!?WPKYH!~Il$dmNY;NCWAy1|TKoEtu#_ zf_nygZ2bF|*Fb=q3T79k1KNS@k)Tebd$`k282!dl`yY9PzZNit7?Pv)v3(NUQ$hc` z!u{Vp;9@HSD!;ja$-#6m)*T5(;XY}k!v|EreT)zE0qWb+6aXA8Zv!(pUq6Z*;aY*R z|D2$1xJPqE`?P;ZaC}9vBk=m92*!KkF#Y9uroh@z2xKJ~LcM8l4;l{lYW|pRl#jIg z!Dqt{SiTd2^?q2}^k62K8q9`$BQQ)OP(P*z<+!rzXs2I3)*p@^g?iDR5cL^o4uH>< zAQ*tpTT#Y4U<>z2&DDX>x3SnB4~~O5(vQora#sMbG`J3*KMxGU7~BtTwU5AlI9$Kw zP&XXcjQaeZuzh4#AV`jS3-`uKaK8@sNllS(zZeE4pbnJa{t`M3d920O)i_`B9hTtCUqnS9UDfNK! z5Q5VQ_q1qVI|28ufo=*Q&|MLZ3B>lY<1lwY`{^1Nke_M<_w#aa43Y=?qr4l+M|IrC>g!(3-KFls88`{>};08Vz z3&V3p3}~qi!uH-j3QRHGNdI&%+$RrbU}?H97)-;xI;yiaybdP&LSesP&`{xt`2b-< zW0218ekaCAF7|~ zgJ~;=7|?sd5!#RNOu;nS8v$(Ko_$L{l8r0l=4-k)plG%)*mJ5c@DIDtSg60Y!~s5k z_b^%LoH5-W31)_}Kw9h@_^!JN-$C!-dP`enRJ(DTrmJFUWJIFHjtnF(38^!Es0?>K6&z>}0^VY(q@eEYvYO7!J=p zsh|`3A}T-w!;um90<=~-!akwc`R9AC4fGfMF2VI3;;95uqIIz|4U#`IusKgq&os0d z=|=BBc;1$c zSMPxDCpq|>%0oQjASDu>HJxPOJcxqSsMqjJl(Z>xQ$A*22$&rRnb|sP&kct9VRl0d z$j+HTWNRpx8-nMW@mw(6od}vMec-vv3-mNc!1_3NR*D4k!?9ptEFGSy3PE9-8PxX% z^frfr{TgwG1ZH5>=eVzF>s1Xvh`Scj1eoIGR` zPDkiG(z&G{<*@I^E#0^rryI#ZXGoM5px&)KC*d_b1763HtIaL=ZVmwRBQfy&2z`e2 zhvU##WCw-;XAhE%bp5Uyl>zW4SsIC`+`@{}gKU6$k<6_G&!G!2rNzF6=U-tgHT>|w z&a?|7uH4#N^m}1E_Q2wBPY3l2BtKj@3ak;oyWLu*V4Ru4=%TPBudoPd2L0xgMoB&p)@?gq><#;TiHh9k7>>GoP$H{;;K$$CJ zQEXd!{#6bZqYf>PN7W)5md23nTQZS+s0*g$i3IE{zXZ?oTM4yc7!cMiUqCyS$75=d z%zvfx&uySLiWJ)IwmcTIxHJy!hqkRuAo9-juUsU3GWqWdYU}mBia7}g#W4w+>_(OyG@OrM$dsi z?p?R;U(p@xALYMl|8)n8?qX5ex}!xoN>Db^fpq;>Apc@eZ?ijnPoqaUx&y`TiZ|~= zG0a#U4nO++d&1o*Z{GDH`_QALfmoNyvGwv=L*|b%+Y2Pm$o&!Tr_rC@BFFN!#c_{QYc`k10|NU+n zmH(VjzpXy4RiD6*LQBw4X8)J>>RWxcXt6hMvvm(&b;RbKCIDxJf7qEc$(7B0ku|Al*-}-Nj`&}1ySH9^VR7P0- z66il^K=TIg%NKu_`FnXw{y*Hs!#n7zuOEQrdl7iQ%L5|)Ux06UpFv)_4REx&gV_=4 zt%keD-}K9$$74FMyLg;mFk4Yyh~+I8@O~)}#iZ6*nnaJID7~rc1ORJiZ1nKfeYl zzgXd9Y{~kQuD{X`c?;$L>fJif=Bu0QM_29n8OoL~SOi{c+Bp_mHH zo5~%)cNo|2s&oBi3r+{l9u%)aYiFx<2r&^ z%*FD(5ODn{i><5Xa(no``UrmHo5A;j`=;;y(VtM>0K)ob8(@s(J;I9OEEx7p{28&Y z;JUbm#az(6dtHg`FB?!_^nOI~n2dO1Y~1hT(Oqe%@U0Cro;AREFLu6?hoHdD28K$_4$!+fyKX&zN#-DvAUv6OVD0}i*qH0 zzr@x97Jq~O!Z2>;2=f;H;Wpp+U$Lsqc3j-b7tXOZFoYZ;WCzMi3mpE4H=({T-UIjc zAjCrji;LM?NP^<5kMNy|Vp!2&1jh8Bd}uQ+HiG2#xA(Y-Y4x0U1MdP59xSiB8!qUwLZxDkq3!Fzt>N0iF* z%%HDDfw3+x_6(r)G2Rn}#jCdBN?1$>i+%kOV{);T13u15m@E|Y!eVe;2_Prg9Hhm( z10D5HPiGLs^GAFR!v=q&9AQS-Va(_j!hB+mKDDAHo3RMUa;?(H93s zyMl4DHs^Rt?pBV|;d=|lx*UJW$7F2Uf|cRi!#u?65sWp#du*g@GhP?r`w;VaLf9Ml zOv1QhcL)yaX3P$YWo^c@evjd8%}I8mA)Hqp>>at)jyPfn%h)CkoK4U+=*wT_%{I(8 z5c_DCfBKgFIN3O#A(_ZGNM;%2h#Bkhfbv2!xK6#X*qjMmFIfr3klU8D8H@A-D9(rC zmE$OF#o}Pyuiq#hhx)+0DANpb^mwsn2NxT~jUDYoJUPU7g9&0qG2ktH80M`tf@@13 z?ec3y7`Oa_mAl|?OcyRDI055TpFc>$Bn5I3-T;%geDE2yg?HWYSnP2O#R#_&7RQ4z zO8D)|OMZ*->`)uRjEi5wSRefTqtFIEqr9M{@)OpU1G$Rm+XXp#IDfz#=L2L5&X3rf zZu)c+XDjS8_7Clt?Koee@ms07#0}FI7or6^8p6S3e=Niv2orpNq8!HhaPde~7XZ10 z53v5GdVG+_=Y+EliAd&K8to z_W6y$_GN5-q0Fr{i^W>uZwwEX2g0^6>^oov@t|`FF3ya@g7ZBtc8HCIwuE@9Vfax0 z<{zK2SS)HoF-?@$LHww#uG9h3(_R+@EZzyiSlRGk*@F5#;v191B zt^kC6dFwZZV{;5Ht_=I2*fFg0cDe)i^qP>Dp#(V?g3y09SS%UoK{4eCEQXAWgQ9qB ze_Iqtg&YSIN15u6z+$wh9_tTd%|8mQG5qb-?zq@#Ul{yG;J#E2APXcg*bB*H3XdjG= z9pmEOTk%sYmJ4IevqQ-+{u=iyhKqcUVyY>##QX-b8%UAU7o# zgU0yCEFAd^{q7AIgR$y1REM=;bvRkLzPNIfzXrB1nCg$gV$&ntNpMeu z_M8GRKBnbVuTLLA-LARSCME{2Zc z>!~2jR}=C|_(3q_I-qkD7ORG_cf^%NF=G@TM>!UYN7zwZ9@z-0G}&l2eu}+<_Y>AVTS&7o*nSNjk6Qi4_m_!`ycp&AU08u9Qgv1zvW}3 z7h#$mPQv)hh_h}5*Hfss5@@b~aeo-wMzQ~C#5q7^>^H6s@ku@yU59g^i^;%bLF_2T z-wpX4R`2;CkKPiF#mxzhn}F;?YXaGVd>sg5=RvpOd6IOtKWHACgH8XU{s`wR#w!TM zIO3nIZ^6BU53Iv+39xuRis{2NI~W7!A{Ttkw#B#$)`kL*U!Z`+&wpXxvz4bI0^xxFM!l7&k{ef;q^+m>)?7GtiEbTsz43kpdqeMo$MB zkQMh5`_AIH2H_Y-(#H5Y#?`{r;qVt{=tFMJb$D0t0Q6sKzwL5rOLgwqd?NYXkE&lsy;;T51A;1LR(OFcO6PAVrWB{}O!7dJjtT zOyIlZ4diD$gU_59b|%7*iy{f3|fw&-$qcD;JmL~GR z^l%=iDf5E7u{Utfrwh*uf{>Hv06G4MyMGTN^0fLQIh3zc`T(QxUW$8}bvgu=3(0 z(IVi0|@8f;cvLBRI|m!WF%l{@|b> z4h%|&V}Wr+P`;T8Qgnfx$#uw$@x|E*`=NQl_%y$BQGV$`{1{xq`7;zO422CNtbfLj ze#5rss2|3q!R7(28yv@Gep5ce{)-2L@nLW{w=m*(DpByh$QXn|Zc`Fm+vp7Uv&aIj zm+SCss0TS4Nf-wOXD8y|Y|aznvTSmD&^&DMb~d>^7_NnZu;>2_JE}u>b8vjk0w!nE z_AT5fhY503aQZfRFbFrs?ZN)m1M-pJ?@Guw`)DQvd5DVOv&~KTY>LCZu@Hz3dJ5NH z7RJ*-T$n8$4C2$^_&kVPgKXL21|gmj!~uUp--1Pm?O)v=A{!P5!x`b+_?+ZI?1*!<#p8iFW*>;1)H1eipe&pY=y!~FwTT_W zg2RvFSs|Q|>oZjd7AL=e)tM5=iGo}}gnyHVgyss(8RAbNJ0O<{%W?9N9cYfBkD%_Q ziRk|d`<9KXvr+u;Z>YwQJfsKt3dfs5+%3o#!?mrIL;R0Q6bI}`Wr69rP|_j zp>|Y{ajrJU{mv`H@MG%}al4|&R;Qx)w{ZM#axfLk3^`kkNIvE(%y-ad*x!vo+!zOJ zlm7+rVcf4R+%Vs=0pn>Qt`&}LL0w4a{|57)$D;QZASVvTheJ7LAI6b`YY2_od>)Xjm9f~* zNcR5(%m1b?7*3>te_!}^bu!`0>Qv$qh8_8Ti^GTEPKEfP4O5$TY|aaM9?%$UER=y{ z{co`RZ^y#<-mx;3sJ=Fn7zO!$Ki8&`hu5Z4=hmmwR#8G_REM>}KBzAm^S{;m_xQg( z@V5v4_Q2mB_}c@2d*E*m{J-b{8_8S36l8RWPeUOpB6u6IrBNawf|UfGxgtPuIH^A4vytE<}@n3^EdpKu4z@{L~M2ST%Rcu)ee1?@Av|TXlDxk z|Em)IOl);f^c!Wffyg1fNW+{#rxeQb2Y149;S0e_GjE>tsjRcp#&i8r2M4Yi`&MAItlnMhE(vg85&~WmVcj&XZY}w$xE&p z-<+^KI>Jb#p7GGoLg_}C9y4p)@wf>?Ro7+fAi9LhWf|g5ntgbp(Sc0D8Wnaq9!$RVXZ2C&ywh>K^XJhv z%KlatozB#!jpQwUt(mU|v&LJ~<6E=djINxPPm3{J84mZ)n9N%}1XlCGYDxZT`=s{X z)6Uyk9on3VE%>5L^V4%~s96QJM~|A4rO3&RI;G95=FQNJsr8*nlggi$&%ZpHJ83vc zdc*A$hiaM2iSlob4Eciit3%zz)|H&p?oXbxb9CKQQlBZT*%*2|*^w*c{3WWwo1JH7 zZML#=@%v%NHsfY>_jWL7yfOInh$E?K>6hKMFOOR0-XvIm{)sYFt{C5ZaV!g39f}EH3|P~&=j?AAMeGPat4p4ty5H;Io9TEFWQDDU!PB|%#Z3AE_GY$tj~q>7`Dpguhb8It+X{IHO(>RAMz)NI#UxkC#D~; zeaiJSC_a?5w&i8OO@w&v?7l|KBxt*)IuN*l?BG@IoE)9#H?v$u9d2m~=qNaoB z3cg`N3cEq|L`R}pi6K4PvyA@4l0(@W(*7%T^U51D?*6-dYyyrF3NmM;MZJAhCNQi% z$4l5#etgDSNoG04TRM&t-zev2b;lf-0jb$xboQH zONh;b@H-^wG53-Ovgoxlx?6d`ERS*gh#H_c^aIRhSV;Fj zNFy$Dzuc7l#$j$Z?VR#b5zQ^GL7!Jf4+nmDx|6WQJ9vpiT;PZ_-ab^~9g+MlbeJoO z==7l|Bi{>GQ+3B%PF~utuu;piUYkCDlc?QP*?Id4`L&4C0tNW9yoAH1QdCm&?*i5u zD^4W8kk<}MBL!=f;Qb6Cjlz`D!C_-Tn(=)k11b626koeCjNq9&*2U`>&n#G<&0cU@ zoL#J)Z^c(~F5G>8zk<*a#o>93|GnU`+xutFDS1k}mRdg@R8aS$ zqYKP_qh>|*R)1}ZyFzfMcvWeI-cSz{^B~DcI@MkF`P#QHTvnG?hYLpoL%j1A;bS=v zWOpX()+up<7_!G=;HYG)V3~j>HC0ukfac_(uLs^>`On_BuzW#LCVgu;I>yqfIrF3eB!p? zMe(a{)w>(YEOt&EAOBXmd$;=J9&Ya|*XJV-uRjb_pN!`|Ix@B(-1+q>bH=O#*ThnE zdhWPZXWjK;nj==Rey0oOTB^FjBx%L)xp{dgLuufW;_qmuU2>k!7_U1Sm(e49i*q={ zadgdZb>6LtLK1Hsze$idv6U&Ya)_z*QL0u|KxfEQ$LXh6zm!@ECsWj&i6Oc2Bn9uB zJ?SovkNeJvs}OB_bzax@2jAtujDyT$PBux!cP{i1+wKlgoB5zxAs)MD;ISL+GV`ru zhB@tXU_|uG>SWev92oq3<4mRk4OQcfAtEh--G$o>+&AbTN)w3{cB={(mK$#3wY#-= zjMk=0jK$?<-FG}}HP%YNJ44%cs@A_j<&k{&VeWDRtM+rJ3m1=v1Sc=(T{%yxM?z1F zAAcNg+)5&oX15=y3=`9C!9ydT_Oa1E-5DT$m~$?T^jfF~HFdqbmW8Ya)s-BQ&l8EP z618NiacRvhLihE`q&SXxIT=R0yGh_UbkH)t`fKBjd65~;((XBx1RK0`iqJV;-C-x5 zKGPXO4tjIH_eFiB&X0z2X2Tsg20Vb&*~TC7Cb5M#jE<9Xw1zyWPvfqj^YziG>dtkT z3Oq~{P8?0ut{GBiDm;3QB4JyvJTF6=rClLKW!J)fI<-9yr0?xJcV9wj>REs~UHvg> zi!_q;ecuYKjMGQF3U)Y4r+)SfaV>lnOYKlID&G70rmD`yYkIETUrd+ecNaQSU0dpU zG-pyzGiS72g1+Hv(ZoaErw`jDM@GLgh*`T(eb1)XX{}gl8@%>5%dZ?%a+dI@8*giN zoLtl(oYE$oSG(WIljr+N|2nf=$JHACTwLC@v52?( zS~1;)&zYyLEt$H02q4uDLIXAvcF2bhU0s-v48q@=)c6ssL zB0$$h&Gx7{VOEQt%dNdKS0m~sCuhzsr)jlLRYM|wZxM0U9h$@4!cF= z&>(nDc-b^$eOZ2~-JoddRsO=$`~~H_xzMxROr8pdhl~ThYhR%@j2HGA$!k<=U8oOx z!p=dzQ|xDNR&7d~aehZE&^oC9sE%>p#P!JMht8cXB2qE$S(Q=@Q;w~$W+XH?acoNT zkW*5@%noXw1Of_fb2dJo`rA6wRWz~Wcn>%~+*Y8XJ>%zeR;h`_ouBfiYw)4syXFe> zel7(`j(pY>-&JaFsaH~q$f!BVWF6=7Jo@}x2CHCIq~yYhN5hxpqRqYrTVICzOUbZ@ zEg=`X@ZR>wznjcm+$hZ)^jkffrB*O+8dz&Kr>M7pcW{}LDY#?%bmP5Yi?@Vru-igzf&3pz0Q_&zi_>&Nb*sJ_DRat z_EQJBb37|+MLh#f`frcAu-x(aIhS0#(mGZCl3o6ia(vE=*e&u5d6ViZXYA!pl%2`( zd;4y&ZZx_+CD~XlpmL>$CSNZuFKJe@y}>&_AFoBO;Dt7Dy7nf~2CqT?bovBs%5j#c z`@(Y1HM(eiW;uTjuW9W$?UhE0Ip$JWfgSp`x zVpIp_7v+pWhzr|j&8zgTQDv~Avr#9pUbiS%@Qx_!f*OlQO}mWYdf3QfqYnAuG|gl3 z2j@$M$+<4hA89U``wEG^>{Ttn8-<(?LVu3S4SmSJci5U|yDRVP@u2~Qu_B9%hdN@f zWxK4Ey7!+KDZ2l;a(O3>vyJ+mxPAvd+8r(OLJeJNCZf;8Pn|zMzlS%TBK6@>ag*}v zRBZhr8?-S|9tXH%J)G1mLep}Z_8D!Db6LqKSLHe%^6WV9j5%rS!EpWBw?@)aU$ZCh zh^u&*=6bIuz4~gq7Yv>V_nB$TdO8&|^4=Lw;tU72oCBg~7*9P_>uO{h ze`GZ9$RT?LhL9(llOMtOH^CBLxGQImv2km{fapy;uG{vm=SlWlaB1ZeBJ|kKxj__l zQtyK1$1l^AdIe5<>E#*^voMn0Z&`36-yb!dfulYHYsW|(57K;HOzW2 z{hsmj*e>dtDb3n2-^J1VjnQK~%YDx2o$!n^Pa*Jh>^s+y?t>e}X-fuLwBsY4SKj%= z+VKu<3^{Hbzp;^NU30Q>w5LOn%z2*d8r3!-bJ-JeP8SHqWC~Q?Q~678=QB-|TG)9u zD$IP}2Cd@fZQNg2c1JSRnR8285gr}NNLMP?>uQqO6*1Gr+f>I9w2)f(#H^XEikT>{ z*;kW>eU)N&%lLU))0UbD@zjy;J0qjHRioYpP!AFaR%=~f~2yrbg%Uq9~P%xRVIe$qR1%aa9+wd&;i zvH+dOr94Ar;Y2Egis_zhSM!7!qVIGs{vjFQo1jIRg@puOOC1&2~lusL8Y77KRGGSNMw5la?fpSJZkF)mr}U}s7OfwgRQZ@_LbS$Zoex>0S$Jn3wq?Vc z)x5sbhDn8Kduzp`46$Kzr;|P!rMlAs-WKr-K{>LM3ueOF{Id1NO>u1tuSGuYj=eX^ zEO73Fp2S7P&a+qU=`i2?u}oGE~hvbB=RmvafyDKHRKt z7k-BSP%qWgCr(36{o){f=hC$vpA(!F?e8HL^n6Zbgx6H4AG`B} zxmZY-Z1aWg%Wnrn@g4RQ1&?tj(p_0l=$xpLT;yWtZd_M;#CfLwxcGN-}+I?S5}%AURj7AKa*pKOUJd( z;@VnY7bb)nSI*D8o5&oLd!0CGta&2&++AXt9iPMJL}Rnl>>sCb@X8<6{6t3>f`9!w zvB!2tPNFa6SN0qyJ{9?qScz}o@jlJ^gKG}Y3BoC-EcO&t4@_MMeKK^J_T!T$Y+oYH z7ZS1_6BEkS?HAYJS5n|rYx?wq_4A&cx~54JwBpTTwdN{GVrDp6W@!SRoG^Dk0N7V;)7j= zc!sSs_bB({Pp?=8^Kegp*$srAiEqEkzn0}eP$vDPa;IxTHd~SD%w5G{|94=05iIy{ zyt?)>AvRO~#)fN_o*;8tP~S*_BE5=30h``^W;8E&-^Sso}>TG+=;m+q$*UK#aoP8!Chotd$TTi7O9L?kt@?mDVIQE)&2_#Z<9?$ z>BcO>++*;#?#8~LDZFGxZk7LPg<9e4{z&^r4)knYE(IUf#~Nbg7iE1Z*W!$N#$J4S z=}lddq-vzadT9TNcjMpB-MRBXM{Dj}E5V!ZpUcnYuT{=J&D7aX%iBD?--ps{2hsFp ziP2)O^x^OM7xBsN61?#{DJ{o%xb}ujR{B+;TZ$*X(D1+MIxy@qGW5`6Bu(PuH`_BJ zPYurFKhugLCH*=Sxz{XM8LuzX$7u-ZBXer^m|o zW%`Zq?^`LFW3_>C!n!#^J>($O>d|G(ha{HqvjdpF=&Bo#NPn~sd!h|h)>L0{B5Kx3B zZw!kVP?{)3#S-!G6udCIwlLL5w>H?NP4!{!ohxyX-qQK z{Cr8m80vIFtbTQv@Dhd87<10H(%dHl(NQD&6HdoVP6cr3sp*K6O6VqSSG_?Ib^NK$ zk+qg3Ic_3-61;Xwl}khgb3@1GTaGs#F0=AXJj`>vn#!j22&ePyvqE$9bkqfxIyn{2 zz5RYU*3&tokKl){fReLb8L2OS)jpO^!ax-s??MK3{oC$yx+h3998Af+gkfF6x{Lb0BuAQDmT-N!+P50pS)imb}L$JId@bBp4aXl)iQgZ5+ zq0YsXSh_Wd=cnZ~l_?n+4?8hmQJ~~4Kd_d0?Cw)WySVKlZXrG@z+X_?dq9m zc5P|&QbAHcy^z}z?t%&;KJt(UQ3cUEeTWZ7vpc<{w%n$vL#Cr{xg&~g&qkW!>JO@a6PqjTBR`72Akj`6$p(h!keWINIr*3<1d zlv~W9s;qT+DRn!2?sIrDFfJm@*Zsy2ve)u(WBI!ZdwJ_smP1Ft zxB0O~{h}WL&Mu!9@798konAH~%R0A|3UAHU(u`s($j#y0 zeefWlm9c&rRQV*ju#(=8e9kZ($i}~zSbSnk;TF4VcGAGj_+Y-BtFNNHZb8(p7g4<5 zRqDtEc1re8P&1kFT@W?#Aafd|-Eo70g@o|S%Rs|w2WGji_+|O zu&G(hFFa)Gd|B1#e@cRPDS=!!F688(S=eYnSF}Mj%KXa9xm={f*^R>g-JVuOGy1y=(HD!XVpL^py8MCZ+`4YFo zC*#J{^$Od)dfD`^729PSR`Gd+#L04b>CfMvwjF7axw=-<&AClR&TaO4rV59Ig!+2T z+VZS%AjMTe(RAmP^2$+Sw!GwfJi%WDe2xT}IIv`7;S1LfNy^B^i|P_a1O|0i9vM@) zJ)p&ViPZUJpK9NOvo%-xEXKvpCEh-#^p-;JZs_OMK(do$yRN3u+!G0+xbwq=?RuAU z$5GN9sUqjMGY`6nw!7DKMXt4(2DhJ3CREYR zC)2ih$x|0%*dCd1P@nzl#%wpImyHo8b8ZwFOLU#zcJ-7m7K3J~{CgwC7K~RYnuKy! zrzh{9&MV+zG;6%`dVyOj_@L)*=PzMRgPMo$?3DGkJ>$%9Cz9rcwd*~$Fdu9CE3YTs zG%7BdhTd@BsI1>6Db*o=Kb+i87VC!ts5G2-3_B(kVrEvmH?1o)!{V2Lk2qwmPw8<`R})Z8=Rr$$ROm zZEX?@WvTd~Kt)$J%b!tMdmq>a(n)%UGq0IS5wi6?!M|gYARrrm#-dO|R_o%oJ}u#) zcBP{nR0@5MmYN%nQ}Y;^SF%aPQ&5*hde>!FY5YuJ6)DTnoq8ZFo-ni9p5$cpk8`lfp~Y|ON{EbS$2T4MKi z4&~LB#ty>)&qqcxyr<{8I^!5VFfy`y3V0zLb@pyY?Xh=z_V~45=M}%cD-mCC?lggO z#NIEey{rN)qMmBm_CGDi@5v3G=F^i9D!TYg|y@-(KU*xq+h zR?81Jh!ig!b)&qrGx$r?kp61Q(QR~=L+5T-7PF{!b-R>_US2AFv{uo%R$;mF#xGx{ z#9o(C{oEYAQilCV8+{suPTI*lkNJBXyS`IC0t*AY0*c9S4S=!dUqG26jgyYX@*>G2s_j}FloxUK)3T>A-59+TjvKC9i3 zxk14-$4^DGCc+_UV7}ese1|Ll%YyxHcM^~uVWdrwv^cQW`O`--BK%%FB5uCIZ|9CK z{fN#wwv9ymz$L9QdOx!o?GCeOsS#easV0$=(*!iT$sJe4qTVv`6w%|^bjcEVKQ*Iw z;#iS6t1!%O)p|5#W4FXMz9;_A&R>l>lXR{WKe?M& zNfW7O5`0K> z+<^AU5ylf$gkyz5yZT+I@g`pty#DINMx^9KLVEFpr8@k0TE-WOdkbrJT_~;*+Wy}9 z{dNhDxZC?#XiwZ68$RzO$}%pp5=8!rpZT+*nU$G7i?sStkz~3vSGS8Fu#mFfAWd^} zWp-haNHmo+D}EqzhF7*`z3xt$ z)A#2X-n@Gr8liumx-pq4i*2uRcAe*-64&9|7qw#xC7%7P-F=6ly|F7?K(sGA}?fq5WYBQ zPZucnzs;aMv1hxa%~AiOpnNnwU@|FjbcWJfnk61dhmza5AZ>VZOZUgC~1lLyynpQ@UgQvy(#WF6e zNFEFf_*keWnVl^Wms5;i(a#S;* zlJ;^=b>+DJshE4|arbfung=o|&R*iu9e?u8k^ZF5HUCgiyp?gyoYwFx^)PUnH$hC# zEcx?3W`)tS<)mVFe}pMkeCod5a@;G5vD8BAPV7#hBx${J>6R|l+otgKb|ceDlu-8A zV<*?o=6nafPg$y|GO-C%Ney~_p6AR}81lTJuHL}lzjTW#+BY;CKizOXT6sK=|EkmU z<(N$U_(Y>;DpSrEmyT^LIf5loFhvEX^c4$wb<32T&E>0~mn`hupnmw;ZQ#*-8rNAa zcFv<`qIPoc-9d8HJCHAV=bbXJq7`fy)^08dM`0IXeJmB4#<1G zlZ$zr_UxdZ))SwjCjB=YG|yZa{ixC6Qc4jo%9HLqxQE%2J}6cyO_Te`MU&g^KZPD} zed~EFl5wbL#Om4w>!^EpX8B@5DGYb?%)jHytLKoYE$!lSsnE=n+I}j}#fIRaTji-D zpATf5tFZz)s)^)WF=}^{CC^g%vfZJ({*;R)yey6VjZ{P0eTK00D!IHF*K9(KPi4|4 zJdO`u(W#JKm%Z6tFDI)W{bN0ljw9HraB_A7Me-X(osTNs^-W|aw#&}7XwUYWPHC2=>MHdFDlVLPtuGp`hm#&65>nZz7owd&bYzi9Tq9t&=UnVV5~V?R zme%nnG@r%At9r~*cHaA3+i#ynVyYPPl9A?El3};4F5&kFJDhho3`t+wrtr45q9R>8 zr`cKbiD}Es{pP5bjeS}=oY9$6F&DiDFK>JHBmCGndu_ICjjO5hIAM67G%J}EzEedS z`)YAUTQ@yN-8eyC-6$1ZPobc9`xU+#_PaYzPFcY1i)_<+Q6wCz{`_UM@7TYySm8UH>4mU>N_OJ}vquQ*^V39QPqQIuCrLn^YK#(vsLXd8YRi&^nHHw`QxC{ z$A!1Xx*}-ldZ)Wnn%PMG()7)wsQE`sUhzf+wHYuH#`9S}I{I`<*`U9^qMp5N&rE39 zHoGTmxBFRN#;=V`wm&|k_enL|mdYSCfWn|LrMPp)zN)eIjXgg`zLJcD?%?^ZA!}bl z>8+W~Ewe#wN}T^P+a}MVRAE5o{KI`7%G_i<0Z-zcJ@CknM30d+?4g<2A*MG(meQ0I zps>PFBMrVVZrJ46U1-`66yM!y_KF)Xz2VM2lDU!a#t}L^dySLFR7%9xuPzd<*iM?v zZscY@^yXauHeNh`-jVDCS+(idxa>Glo7wI;qSqE3%j&H>FFx`M&EB4_sN1amUezO>)Y8ml@&3ad1#(>7WfN8u zYCpLb+k#(L0>?K5Gji|CZCuqJx|ZhWYdId8v%w=Zu6>tl^1<9p<&8|x;h;f77peH~ zWRbcis<(vmjtAFXX`xlW9po%wP;B-yA)Nig;d9q@{76>JQu!V#)yJ?;Qe+%>pJ1@x zKG!T;%gy@WP>sK7C_~1sm#+KIa*-~?(z9P`eA2Ar$@hS6@=CF4f??QdThlgxZJEkhmjlI6$>eR1%V$9~ErPep5=}8}7Ek3sJ z%Vp`KZ#A?VbcFF7H*9lSlsWjXU%Z_!v{v#ZE9$+glN*Zbk3_pG+3m%%5A9Apum7|0 z?BbeLM-*rNXaeiv;NtLiAecQz!|wZ#CMkGi;_0eO0m+Be9WUQ{EQlV=t?ZzRKOX){ zfX=ncJV%9g(#0gaV8?T$Iay7WdD)kfEkw|TR^{^A)) zx#5>NM>>O#t+P^RaVU^DZetK*es17fzi>ZFWvAphJ>TPxUp>lddT^D`{c-H(9+wwKZqTJGJvO7g@QK>RP2fz^(9UA-lku5h z&3T87vT0w0^q0fkR(98R<*|#oEtQt}!88YBx$xyLkxn`5)fa{7Z&=cJUA)Cz@0hgh z8{OxM1CpjEU94|1szw|*x~>*sSFP=CN`K$u`?$PX*`Z6k_b!;(+&|EYPkuSlRg;)7 zg_xXdfJTC#>>&B$Tqa>t*q4Wje`MM|M%&={UL|KhOB>%$cO- zD!ELes1gKd+b(ZU2!=jvz?fZDkFx>k7d3+=F+Llws)*r_l;d*)n%BG+=58c%%- zI6PM%oMgh5?zJyW)@(aN#buA0HmCmsXF!<04SOCbkpo?^+BOplWTEK6p7M)wfi`a9 z6Lr=0$mh(Q-i#Whc(d^X?M2p@(W9Cu&4ZTf+yPuBI^}Zv_EVMiJ=z>@sAM_ zXqoK6i!bZgjt7lFaXT`MFx)(zZi+H2#D3Ct@!zJ`&&zkfC|ANp61kpmJwvhoqpHr- z##pFv5kvyK8mVpOE3Ax0bvN{mz38Hg7M*d%8NcDqBLL`-%)4b^5AGPQAL)#lSA=qT zI-dcVwdiT&5L~LY>w7vZZWPkx<>BfY`pEs%0xZcc>46YPExA=h652Vxha)=PY_`GV zU{p{Ok|rczN67}`qcMe4!!R2)~1%>M1Hv(EZYi~$MKmk7f| z9C+O|=mqp3xD;a^WmNYt}y34BxTc1Dzq4oaUdZ zH(ZAA+}=P_emAeEHf-G3eBrVyn$Lgz@@AW!Ae^n|iS?tq!eC9<6||CxP1<2oH(_7E zf(yQ6S1y<)uviti8VzEip?{gk#T?o~Hnszg0VYkR3mv|7sygjpiSK@g+4D!#5oViO zL$OCv*|62{C|DzPWH^=Ysx1H^pks8f(nn|g0F`P3eJMaE5&OCr_;G=F;uYo)5W+f? zuUwI($19!iOnC==Y}5bj&;IP33opFzcfmym;rQq@@^0c$Uw*2)O~TVrqzDHWv}=2) zSC*(aLWRtpNSm@wFW2P#YLA$g^KaDa);IS&_)xQC;euxN#0mb;Dj!=Vg?IAw3jlUh`&>3r?1XZg z3lDv&iS~zo0C@oQnq@M0Ex%M`n=!>=D4;`GFoY@Q16Dv27!bsgTLad*CBZSt5=%U- zZH&`ulk%XAJ<>pJ)+D$MGt9;DR7&-;6=?vg}{!2>`Fu z#_Wc^QMv+p)ZhN?-~PESg7DQ8JJycIncYrMnICS5M}0-7fQ>*iR|qB;+)*6UDkU8~ z;Y8LFe^M~@I%ZAuj) z$^^etVFXD26z#Tvt>CmyJT2f0FKpCRec}r0kih_7_x$tCVh!RkBS(5Z+OlP9^Yw3C z)7)|2{i54<(zo!NJMO=~nKfftbJWZk{#B)&_A~7d`^Y@O*)W|V*+(f?1H&H}@q`{W zRa=6hYT&d{%`A%o&_9JBM_+7FNI(mZzJbo86F6mdmJ>2uW?mN9D;eQDA>dD7+T2$Z zRC65~;65t!#BGv*i3%FFN)_8-JG5biesuKs&wS=HS8B56+W|22n2Pxo%CqIKkaYaj zTiW18u6WM5`s%AcqH}+a{sU6Kg9xl^w~f>zQxfA@cmR1@i2)>^^|uB$hLcr@nVPyE z;^1Kw{G7q-T>Q4d{+CqHsl}aT+K|~jQlQ^-+1X_Vu;L3EY=E|;hAgu=kbs-3B&r^% zqdG}KOYDOO2lQkQYc}g4o-cmxzco8|*1IRsT)RXpGp9|rd)7SnT+l1YysKGu?6J)n{i^bIh|sRwZ8n!dW(yf?u3VP>FJL1cNBP>`tD zk06!UhaV_JsoOscW~hP(TG{D#02c}L>ZT0RG5_^GeoHl&KMDJ*z)-E)lxKUE9KL7+0aE_mzPnv37{?q=NB zv2K$@IFWN(^-EWLv$^l#70t}idS?KBrLYlY51}AcDu4hi!_DX_F zlIcI?EuRP+3lN$Z+OWU%m+Jm+bzl^FLuVaafV8RbEdb$4v`d0p+fb>X>=vRH-tMWb*-}SpwPyEp-(ZSgPEmzbB zK;1E1#fFcGGZLNUqZ#1?!vH4tXB-6*)#`MekP8-KqGfFh4kJ+@$Ki<<+ijRJ19u^@ z9~SlCCEQCvXpdULDhpIJAUqX9Y-j|jf=W;M>EhlqdLl6CE4PYPhFDcj*5-|;oZ6gv z+G)*{sZ*P!#~f1fn#(!F=y&ze@j0M2z<4{IeL^bYyH!M zfP}Jqmt`9Z6`W}8rLv`kh&HB*$j#C=wxcPHsOiP=qFFbwrcJA0Yz*k7>O5{0#^DelsIqrmIW~Dz!yL1|H z)i?jOdHk_e0~o+g7&or@*oS_q88LoRvtF+d_Yzn3MQ(d?fJH^X?ll`)6na=$)TxK% zK(7?-rd>g4XyQzeaMKzNUG$w}N)p_b5NC-vDYT}I_JmM^x2fn8)M|$YJ#1Zi7zL{s z<1WN3JtBP07;b0wVxg7aDd@55NA)q$4{q47;XZ-+g`s+77^h-E$1v4ihV)9U0B~D( z@cZbmU-5n4;>C;KPf)XwD({w`)P2-P^sGN54j?YDrISsMBXtf+GMuttc*hr?K!~@3 zrux-DsnQyWTU%=!SJ7vI5 zcUq8e))eiRVKhp{xQ~?cM#Yzvk0JUWb zNdifx=VjpVpoX${FvuQO1J-X6n_=m>{D-f#Ep0?ZsAB?)euIwkW+8M_R-a=-UN08l zu^tLaIxtSvwXsJ&|M|~9tm><>3UITn{pH&slZ_F|#yO2H_>VeHKcM(|J^H(}8ePsH z@1|?EjhKUBJRV>?AR?8JwgW5$(m$mqKp~JliLlDI-c_pMK#-s`XuKzI zCSM*IO=Z zR*8n;hH+E9K|A>}EPu~B6J4fo(Le`agKP>~j0E3=jy#xdA>VykuZjv0-s zUN2z+GDEm`;LS3&8p@0iJL2y97fp=Sx7irtJ zZ4VuF)KMSO9f1c0;T~@Hf*^!F;$V46`)I{W5-}(6I+#NloJKn#^qw=`%6PuZ{W;Ziu%+l;UMt&Bx;E1U_c(F(D+(zow;l=NH zZ!=}`loSR6tlmDn^Uh}FV~_dcqSymCa>}mQc6{Q^H8_KxQVj@>oLFD&0!Okce5B5Z z3%a2vi9HBuK+6|ugBg8khjprKe;J1ESgp|^&;=>FqVJO|%@r>;VkF7-qD(~@@3$uf zmK3*jlVm)`a0X`C(dO39Ks9=PW9er<``NdsI!znWYYdg9qTpDv7kbU+&}9?A5s1-AKpC`1j{q@qmZ7y?$>Oh4>4rBp8EbSrzleNHHB5oqu3#{y zvr)kgx0zf_!wK}13xCwYK2`WPPYSmZ+pZGWu+zqvwoCUSeuN1~`^StP-CXppcQqqN z=}Q=bd!n+kruoWMS2rWHN*I|w#a{H#ZwyT9w8~EV1?8WO_EU_BP6a8TPTSr7=#Z8k z-Q`0cfrEv;6Y+xpq)3D-_z7T4HWb0(ds+u=;3>myyRFB9RF7dp9MK+lgOXkeTWL2H zbhyo`tjJf`g&8!39Nm4n;DV2cp!<#h(z@HA{D%T$aK4-gBk>L!vdO3Gp`VLSI_adJ zS9w5+4p7(FTTSzn9JETW`;zRqbeivV-{ANv1st&);RQ~4Nh7Nw z7>XVWCHNg+&+-6{2+8_98SDLR!JWC*x^92^n;vWhFDHak}s~R@|)&&2%C^kaKqlJ?y&^S3K`4;{ac1`4Z>}Z0GolVERYcoB=!ZT5`!<`P=Sl_Ys%#4 zWg!MGM;IJJDs?hUt-%`f5tCI$a?r!%n)ULm#6(r=;UL~}h z0CbEp=S=;8LeA`$ZOtqtNg@m)_79$@ zjLn=Xg(p=u77CTHi5w$UhK8pm(VdEw^<jL$he{VlfU(x7>ACvtADuja4VO zpDi=|gc|Eg7OW$ogRNEoh6!h%I+tafs_}cC{x+Jy-)Nf7;{Hr z6Icj1RI8pKzyV=dXKFx+P9pKRvyhh{@`A-cLQ24_-}t1bj0|ZCDwCF>&LfagPogWx z!{)FrTVx7kh3(jzh6zHsZ8Bi=!;yXqT>v71D>*>i9yJb0Ze%pn@aP-i1Or^{sXQbm z8xm5)o6moXUor0XDQ^^h`kBAgPaDMl3@f8h z*5*)$KO)yhL{Dez2&{`OFPa1(e_7JYIRS*P@NO84>}i)=a>@G+#L|a$a>l?wf?azu zcU%O8D)FC=ql&}mL{jU}IEJ}z7%<55(acmK-R6l6y!XiI>IG`N1#72D)uB|G9`zMq zY?MwwX^L>jHA`u07XAPLKmbWZK~!4?X)tyR2SwPWnsB}~W(=Gp&XI#Q=v!-zW#{%G z*K|b{vT09QQRSe6GyDKYr7HJmU(6qTp{G1KVdD7aOg(K#U${TiNb*M>f4o_-VufEg zidJ;&vd?<$$1Z%sH5}8XEZbzK6>mwBZK9!pZNFQu>RuUv(w}82uf~ORn9>6xNL*y> zV~Y#RRp;WM%F^jRH&w`GMP^jVc2#myFz6JiLcn>oeX!JR3+4B`=RJ&_soG$uaDWx5 zFH0KSl7kmr232#BJNle+&Y3f7)~t(ZOt*3U;@9eFsdXF(l^9IXxzRZU8g7d=6I}Ek zxP*IIs46gR3?wkYLpgZEu#!}G;d1KdTl;0Bc@T#b%aw7a!wgBMY{{a8SP{nJ)J=dM zPUY<*%qr`0Su*+bz@lkcb0b?Iq`>_H_r)c_VP)cCKZr;>HUDRXkwk((rj1vp$! z7YG<|gj7O_36l=J-jVXgQk5fBG2+tqC<=5)(7)YC2Be=R})dH$xOs}G8MC2*jR{%Y0 zVou`3XE|bq)glduh&D2C_LXc3-pB{g87VWudJ{BCs3TP#wL{$Vkj_g@w6-=i*JUPw8G6le!1BKuRym5f=l^W$ zhj3idz$eYq!Sgu1T={~qB(}FTf1Jr#kZ!}q;Kr$VUK3Bwr#p%zE%0oT|1jm zy1zbJx7E1CrmMis=#iuJ63&=rn(ntxn>wYLs)uz(YEUrt`7+N$=~$CUU7CfzgJNy(!Ngxx@7*%K|z4L;8oZ+ZNi<^1#7c{G%d@_|P zQ@Zws8=4RQ^rB|#cKw2m>f5}*7pl0=%u6SdiP+4Hh!wi zlOY2_6CbVFtOty^pT5;cVx)(EE!exxZ8@>H4Z-TZqE8)76-NjV-tA9f@US@f=nsLE zipOxr3Sq8Zl{;JCfmA&PFge~2fBUc)#LXTKSdz!@3DB1QkBB0#n{o{Oi(q`MRU9Er zd6_woL5PD%FUJIcK8&di?@avUCqKDN4>g zwJ!}7p9w{QmTEd+{S{xyFTE+;4A7MJ?9x_H1xLgJfgnoTCfNd-Pj#mp?RBw$=bKeK9Gg$Z5k^H7$5$rpwGIh`$9%hTXDkL-I)cfC#+Wy4G3fE-!+ zUgimmrQiSk-+x@l=e5}kC+U+!b!;5I{Ll zaKyFSN2xREtuUqbMawxB9l)gDIvW}K z;E!{95R7xo#XNAf&-M7lUB0Y?zO6c%->*00?s?$B=HXS3`k;Zj{!~F0miA+*+nCI$ zmsWDH(RT88zV*Up;j$AA?_#<<{nC6t%KlEawsCHh`-amIpMI!q8r$V&`(Vx5bm)PUlU8)Hev701tbUF^W=V7E^5xC3ix;_H`AK+I9~<{CGrwk1fR&Z1dgnyz9L7;v4 z!$q}9CP8=Ot#>pF-=GNqkQxjbm0l34-8t9;C&pYp<0*@!c`9&Eoof_){+srZ*ss^` z0zC4VuIOvPuT=g5uLO&}f|l|(zI|OYdg`=h#@zXOjrg?YYP~hsZR7n~4ZTw@AT?vg z>-1){`K(5vKk6#S4Gc%?{iGz&>j_-n}cZ4@G+lFv!6Tf&>b}o`? zANY+TdrqeU)8ncq0tQVB7A&|(W9l#Uet^f9i0b$TJ&M9uY6qD(V!xDx@-hlplqdh; zAO7Kax_bE^`UO|eRQ|A@{Nvt#w83t5YX}NDFj^M5WeMP5fkQ;m6_JMv=olsouFi&3 z461U-!$>QzNOoxGdJwwWN=HHXjvgPt*rTJ)_inkh`O-JO(X4v>N%cr7EXK@fi`6N2 znJTbKRjwTPVC8~!@^Kmn%a@-Nwr2yJ*=P~sti2@}!8oTqQ%8^Vg-R|wvczAjZ~xtN z`yI_?`b^ljuK!+h-$N^!r*#^$O&=7sGHfW(S)M$7nto<%p1vP2t$Fyt2XuWyZyO3n zTOl2-<@@{v3!8~krs_Ju6U|0_Xw(UQQssLq7hXAUA2KQ3cJB{-?PTF>U1-!P7;ho+ zjY9g9{@@Qb^cOp2uLcZ=eg{?q)7c&_L_zIwF={uRxJ4GLn|O0gyM0|Gg2-1ugyKEXA0x-M|( zMV!(42LDK1=+p0^E7#m9n|O?Ny9U_~JxaSnU+CSc^W+WdH#8ewSl?{Y_x&P;eBAYp zcfUtZ;w@3TqWwwGT0x;qBX?4PPMV~4aGMbd_I&yGZk@i|{e$~`-fmiUAgf6&uv19f zB|r8)Uj)RMJ8!+Uxmn*Hh!g@Q=`O*qeB>9Jby~9X4E^e-o@ids#lRhE^A5c`uzlP1 zW}{Xc8#b(OHa;)-u6lDuQpyGkEMv$?`f<*AbDN*M-mhA<>T{=`e)=B^vq~Fp2zK8R?5+r2%)AdswR0aNdqu&^R!4r~N*A+7o~YM; zzpQtg=P=+rTPp8QJokT_e&WlC&PW$P86A+$RHe@2aU6~fykwhMbXuOZ_uSE?-tfgk znTKcmNNn=K9U-4u=(H#%JmmJIM7SwN25Own_nf$>vVM#tj>q=Qljx?9gDDJ$J6Z*5ema zxU$ToMhYh9RSZO2$eXNX{#Xrs0+zcG_dN7abJq{c@^9JFYqH zj5C`P^(_JXh`n2M5%dfH_zxcFU3-4^Cw`(CGl$#San9X(z@sOJjLM9~4f)KBbVVxV9JS|>zn@}X8i&a8- z5PXcW=sRLYILkqbY?f#uK`Z*;O&CY{xKtSfzvdZBrmf;SeblaIUf(Uj*0wC@VkvP0zoeIqTf>nuSL%Y9{io zz0OlBL0k5eyj+r~F*`nK{JSWi(IQ!JX zwF@25Z`DRLBPpPiaIWnNltBRpMO=!3iNUg?^*&e$P8$G6yfXOvq(fsJJkK$#nLm8r z*N-G`qWtv!GjyaMAML1%ZM4a{(3T0+K4_~zS=P{g zUr<6Iw)=os_9dApk>$XP63kA(O)VsHSl#o@|4EvZhOz1p?4gy9HaFaQTl3JPj~3gY z?Ws0GggJaSVE)2|-sa4i-wfA%`FL6|>`8-U0SQZ*=2(44aOEQ_T#uIP`+-_*y#1|j z(b1U!p+6KsO#drmw8-@V2OvCsF73pAl_IAeWt$F1M@bq3hGiTYQxI-}1| zIBse4)HYUIs6env&|9YZ#Jt*tLLqE{@xB890b820hOFyY(*IuiLv#mPkrh}6>G)@QCm+u#0QuTbpi;B zddjI2vXd7rTJ)yUU5%***lB7E%YUw_!sG#;rn^(L<6#Lun(H15X$}~1luVf6w+u)m z$T+#%gDKd24(84mVRROGbV!i6$J)+DU<3@Z^?0rZ|5K}<^5BO)`=ZUK&zRY~LtoCF z$Okf^=ji}Jrs4p z+uzX~|Aytwb>F(m*AYrS*5Rjr`PXkYAJwxGQ)bN2Hwxp(+AiT`ZwxT(?S5^Dn7{@% zDR%()$KQ#NgW^2_a%`kOgf1HAK@JQZIC~FA66MkLDl74|BV?obNsWm`BjSreMrv0R zLFGBNCJR+R_JE)e7P&1c{sYMmbpk+kS25i<>a^2No1v?fCzru{%hzZm`kcLux-=E< z;4pQ1Ob`*o1RKdUIkA>mxGp@ZP94VZ4wF0-Qk-$^{raYbujHBoX z4WKVy@vr(_y^cWml$PildFQ|F?OyW2+j@kuQrL%yOauudL#JrUE|VK3xF)~yP0yy7 zERo2+gUV&3mK;5as3ZOq9q~CA;|W7nEjQnBSF>f?R+}fV+ip`!dBVU=)}T371Dv{oNGn#WeIG$1|GY}mB1d6Q0+I1Tg>A6cTWc18tQ z2w`vi+5?LIqoANuyO$iZv{|cLlpEHsLsHtO$AgB&=*_Km)G?N83g-AYKGT6b+I+x&x$%Z}D(``?{B^t(Fh# zo;}0$g3!H}UV7<+s`8-_T2(DmaX^{+e$%0>00!774b<5tE?>U1lTXupU&T%8upzw>RQfK+NHvxr&@MUOldj|9!ZPWV!ib#y%eJ#l_$OXON6amCIS#5M`+S}`^E2RF2D4@H*23=Bf98g@|*6s zqdDiSGetX6skLYLCi+>)czXDA}(2{U^U4X(*(J3l;fJvr~HoFzQTwoC>Ix-kb*#HN_ zAJSE_9%L!{w<&mZf4o1Pa^_jOD2D$@Vu=3?Dp@TdHM!`}Cz9^_F!@#!|^|ksu_~gfuC(9#=7XQmnBy-vEF*Z20FC6&(GGmOf zcGq2ZF?M+vB@{z^2&t?(7*-T^H)Krw*vCHh1{pg*UKvl$wnI*O0mq7g=Gz6T81Fm= zir>659kiMbaF9~)g;QGz5)yjAO1&}%NjlgcY{22dMhIz0DY(od8qc;Vzl>)9KK10| zTAnfZY^C$Dy7zwkGJY|qBn7VQvSq6D>X1Ssh;p~HTSra?cKARNL>}!Im&!5Jb^l(2 zaE>0?ovynQynpb;%Pw#J+rL~IgTHJ{%aqwd+;PH5CpJI%GauHK^S3qA^lQGhn8Ae} z_^=BGrK(3f3Q9w?18zSB!2JPDcMFe*mZpl%y)3>(i;qP`n-KZL)2nqN$Pmf)V@3@% zg^&jug3#CYO~?#U)l;UhY^ax=cw&)xZP zvA+m+uq%MBb(Cuxf9k2HF7KBfL4#w1?YX!k;{nJK1}Nvo3~+z&vwFZ@jt&U#m6Ni= zaG(cH$b~KL^`}MV_p#F}0XoE!f(YXZGkJ87PZ1=~w`7!uzG2NHD_5a31ZIBh@ym1% zJX{vsYMTn~GtuyeEp%v|;uGd>XNqD-$I(O<(FW1t9|wVG;MZ7)>uSgro(Fg)>*XU( zHNJo6T|Vk>)s_80lV}jKWa-l8jI+G3tnJ%&G@Eowa`@EgmS+LSkuvtu zVX6aXfY-Al;kWEXbk;l|iP!qs$C?3b9>UELwNEJ1Dv(`i~C7D#26;7!Xb+NP-}jB7gu!4p0%)N+SSc zs%Ta{@wmzZ(_DS&_$#E?mDOlcCSvh@i}Jdk3NP@zt)GY4HAYuVz&Ct3*l zk=+@((yg)IJge7mzjl@GNIdZ*7NpH)Mkqp*H+ooRadYN5=Qh)4>JweI7O5m_QWkZ5 zWoYK6$@be@hI5}B-$zcX+-_jOu6=q>fSOEWb+r`~9HA_U{V+ChPq9j&_pD_1;HL1hrb-J zq9;+03EHD{70|3?EpjcKqNSFd?64zX*q`oY(egsF!!;OuT?z>Ap&fgH*NP-41D$LY(z#}#64`EwN%m{{B{C;;p% zoR4D}_V$nK;bdr{Z4n6J`0zQxfQr>RLY`sb0bV@F0#F0k0nQ8zT?p_!&GmXw#Z_}+ z?w)4u{CTFKQ*Ec^f&rg8T!@YbUhN6t0s!+si?U}1)&0t-K*&Y}PapEFft|XockNBz zZ@#1N>&5HFZb35lGTse1^W1ZrxpNm-Bmo{xRZiPduFVt9pHdTh+2^*yf-Q&z0FSm> zHKE!5DzuQ{hsuM;Vtf%(TTmpuFzF!a_WYUN;LhX<*U z;B9{^3Hv$-QB2XJz>%Piv|1k}u|Kk2M_Z~f!O=)+(LQVO0ScIsY>0jdJoeyTn8J3| zEg;PbMx}kQ511f#<;=s{q>}`mK5+PcL6s9{oXcM(elp{1aL#qiGnot|)3( zla;GUPluD>b;sK$f+Zg80K2J)htFWm)VcmhwPV#2Pc>iHgD%fJ`<&$<4<1ZN?ag>S zdiG@K5sNuv)I!Y{@{r%I;uyYUl$W`mG@3 zQ#7A)w{c+mLzI4@S8IJ9J?0hJ%dh*cp5nX1z6nXO&sJFskHemI?wkERy$a}Px|HDz z5i2b2zG0_Z9z;lRe}%cV=ou*xB*GWkYr zc7+;8OIiAbKta`TH_lA7gh7`bg2!;7|Ai?z0@!hqQ%4Ep_1rB6G>|!0LDiVKkppqk zWGA`@U=WhON|gQ1zENnvKK2sfStn>i8tv)vh5@FuZ83?7$ut3{g)I5`3>V8)p5j}p z0TS)AIbo^|(lU42wC4P`yj^eQ%?~>yrqxLlk${nB)lCI#TICL~Y=_&Q$O?X7#h*M> z`%}q=vN8YKjdEIjw^!QD1@-<;Se?J>#2>=mY1(eyw z>7v9jWmx49SDAc+E&xKzz;;(=poYNgSmC423N~B@eY`XgZlVi94jPm^nZReLLD6z+ zkv`!Zh{CH<=ilK+C`AX2N&!<@&#_0x0klXzThAgntv8>!k&Rp=SOAhpDO-5JHbFG_ zA_f3Dcl-9<>@g#h>z?)Pw>STG?RWf@;IJt8il4XQPCo67=H$~)*Kf(|-7!b4bo)s= z^szCr$&t{rrTk+PZAT~Uf;{+Kjy^7w)}-0YYWN_U&MQ_4b|7kjdvTw5*c4Ep0sJr$_c z2Hs>FrB8luWyyvN(MHFyQn4`hmK&Yynu;dQQ->g^7~qJ{kArN}QuxdNdZoW4jQ)@u zh8FFtIrEzH-u8BVRVZH43A$8>{o;#8;YZc|pHvd!wx!*0rSoxuXv1%|6fyBU^uJQ))3^U{ilcQ6>G2wj^LeY57nl zy|^?IWnqa+Q0y5S$bn9b7y=kC3tHmS}#-|CzbO$R#AKoc6e$%vezEC~yZq#1c^uQki|#kuqG%{gA{9D8Zm znu~K`TVCs|IUbMEDA-801PVxi2oi`W5Sd1Vrkf_ybf)PX&j0s+_ES}FeeV~#Y0y~v z`>LL&_I~mX72aLDK5ziEgUgkz0LyX0=gV>j0ip;xO#<4uWNw-UM~wG@6FI&~Djnc-G(V7Er?u8duCog9PXxI{7$`jkc zuG0u{OE$Y4qgsu~4m!`)B2rllxRPT!`Ap;Fo|r6(Z8180fN&wDP|$~_tO=6Pkod8< zM`}#CSxbMxTR(GvU1CKp8wwRRk*@^g2%CK50_E70$lbdmzn@_u*WGw6M5+g8=8JX% zgXCDCa1{E=Ns&}6xZ?DKXvahxD&{tmWRjpH~qgVn;EX71e4S&E<1Jt!`(jqSe z3R5QSL~ZANz8d85DhMqH&hZ$%qdZwpkY{J7Pnbjr zcle?{0~n$rAmphLDGTSaGm@LJq0$Ld(oqtX7e5*$9Te_sbU?LN=;HZ+D6&DhwS;Uc z55lI?LC0&rdKfojmVSHR;Kn5}hMTp@%|!jARX;gS=Uj{71A4MjV;~5b_=mq}oUIpl z_)Hkfi}BhjYXD|){0i-K{iJopb=T=PeRUp*p_<*`ip{=1wU>AhsgSveVz+)5jYXX!!tMx(HWp9n-6rgR z=&>5p;(HNZ^b$rlHsYYXIF^3eAgLjjO(m$2-84z)AeSQS*d@BKm4g0>K1bhMyLK&; zYhr!6Ahjf+(mZ@>EE=9RDN+G&!nN04t82UdDV^A<_QV?QZW08LRG=$Uc>GRUD#o@G z4E?z#88v09G@2fE{))`dgIuB=vMGn36eWZ<+(otd*{jCDP3M!Gu1eG(XK101l$CJf z`gPQi&kp86yfR$r6d+fdwc?ZHAlaLaY1nh={CXt*^9LWQ{_RJ%>gTCF_QM9SGjmlP zqnUia`^Eq0&Tl`QFWYp6;uy*KQ)6g=8BLKO_f}dY9oU^%cGR6&xc)86tTt3!f?awS z75U&9TeNXZ4v+yD+ZrCT(=p^N1x)NfsF}9Fd&gl1@!<*i$HIlMZtpxyTS0GoYCP`BAXK1O$M@y4D&kA znYAnra-4udq+y8;&cR`b9Q68X4L!oKaj)Pm>Wem|1Z?BZ)UNcs4|N+b(g7eWvHOIe zPUBasSTX1TkW{MTf=08+BQhNqo~6odiD!N7FF~e*4d(HVsLy+4^IbA}7J3wEDHz^rSv6B^?Uo+dj#1Wr`;JaVbs7 zeCT1h?Ro0_W8~9!fASN*wi|`Ldu}~gQ}Bvwu8Xw<#q0Y+;^0Oeo}fV@5p54#Ort@Z z)rMyrG?g6wl1GC~-?@%z{*VVpvAxEy1L@I0;D*vaAJ#B(v(9Xb$`VemS4|RYN!zs= zF)_1EsAUAvp?@9=r*x3ENPc~GEOMJ753H=%+|Z*$b*UGiXbTJwp(>ctXLS3j!-lGj zh$#PJh=|^dUlAKrgjZ4j97`tU;x(?~9N5U$C4p>F>@dK*Ca^tN!_VSz(SQyutjZof zC14wOrgo+8mB|gx#V9sX!Z;da-?WWE2wK@~fvITx;>C;S4Q62S?x=$m_my^r&dF9g zDQXTS*_9tdemJf?cilR;O>odb2O(6^B*4f6YJ~L>#~d~;n96y^L@CIB$y;#r(Gfx_ z3^qYNj4@%quC`o>rBcK|MVmy>(%gtsmnQcp%Ja0_qg8sodGq)5af_EtXWHZuoH}({ z_36)jp<1T5+CpG4zK9Cb%9#&7Z5Zvdh)Ik78iyvBP-qsfgA}$6J)gA16gY@mL>igM9>An7-s#XJ+pcK;65D2g|*^=jX@QFo&0OdGjhZgJz)j|Wn5{P!n0WgYw5qE@2RBy93TmYXD*Zn^9-OZ z90hFSG%ayPjNlQ(dIW?(6-QuqFuRE;mV|Fvzf?v5X+W00E&@t3;LMy0ELusC;oys( zGo&kyeElIOAG#se@+hg*DYytysw*fBa6W{T6e6I6^4jbaz4proEGU7BrNH0Nn`JY! z%FG^(ZB^g)=$w==}t}Mc&YQ*=rjc|lX9d09Y~@6Nr78U5aW|_S?ze$%P)HBG&)nx z)G1SSHK!|pI=RMFE(!^UHj{ZI550AaihO9G#gBHUx1x+E0^0QtlPd>%ODrYCu@{eJ zY445?EgI0TG6sOKAt0sMpR&Kv_ms_gFlf$A=*ZK-Tmf{YqHqjGU})P|3~U>_OXYEy zDgOuneimtR&%xo4vkc{KV5Xszb9h{8`b_V9f@TD6ceW@a4|zp6oZ!kfWcsQK!C@yq zZLj$)5smR;O^O1tJ-zZde+U%Z4I4R0RB+B@-F&P#&7>?wV~DdVM(?# zKXG1l_3wPT%;=+`M5AbI3wbawIM`=pMF>D7%sV3m5Bc^RT~;Vgk);3T*Uo2GuA+oP zmQ%5j$zLR3ls9?GDaDjnUa2qY4LaHZ7*;a?q|Y`-5*ZjNbDKc}_UX?yan`o-sQzEB%@cgzX#iV8CAo0uHo!jBN-pa}m%dWjchvK~I#6i3)f!d@pG zS{^0HP)-vJmg(yKc?ye}*mKEM*HmYmbB=VPM;m%56wHJU4rzW^8L=oa zh#YdY6<%tL4e@&BGBkVuM0DF13oQKt>w*@9E7m=t zNqHGV%d_oZnu9-aB7HAjv8}C0YfLiiE?fVwgd!+z_P}w)h#~p+xbc*REq0u>IGpqm zp$3aE0KicgxnK+&u0{n$_o$^Lf)sq_=S(Kbq>ZqKEC=7EdDbg@t)P0uSEJ%=!>YEt z&yJ3)R7jtE_8Bj`Z5xyUjD{slJ~1TEn>bGIp|7jH@x7Z{U$v1nMHin0yY|zct&Tgf zyhJHJQbY%PW3&I_35a}Q_A&G_zLioz#fW3;2;Yzj4arfatTZm@Ol6pwOJ0$h{P;(w zqcrxRAG!F?y|m?l*7A}bDy>?qXB=T$p%EQlIubBHH07Ycj0Yw9!#DjQ6`gG4@ztg$ zo_iK0J@T0}HG7tR&5;7$zJ?D8Nf)+Aj_p-`k#7R+Xl0=hou!S+Pq55q*jJ)lUtGR+bYsjMp|_o&PN@ zd-YA7`FH4Nu68W2ck<*Zdf4~*YMx#%E=CCYKWxQjbZHBZqS>GXU2Z%;ZTPBx``{QT zGu&byod-R)6(6LiKPUzn$;z(Zj@47*U>cY2Ojuoe*sy*B|Vn_ z;l*yuCBw(LF9KbH4w7_Zn~T(GYdh6$9iI|6mHSr&IP7oO${smf?UJxNPD1ELXbcoM z9`@jC*uFbhicYf+*wOctIoNZ&aBu)uZ$^n~Z{`q32u;Djv6^8ujf%|1l&~!WXZ)a# z5LhD_`d3S_up*J7K*M`iI@gBECHRqBXk0Pm>Ca^$6Qax`u(3s+8>J0U<3zWV5pdfg zE_BzjR5{>Fm!0fOb?56CnjM-I_|T(|`F(xzkxS>G!Oxj6TKD|xtAF|a56hhNh)u>w zYr9vUy5T?gg&yZg9tpYb%reI|TPg-p5YVQgueIST^gavO=5p<$xG7tuEofnq$C(D1 zY|6t9%h8_ufAat(zyoMPSPLZ_=0b_^P*$XnWtn6vuWS=1Y3jOgw-NZX@x@`A5-gG# zzQ%VU)FPlqlj%idU9z8iZLE|;T`>Q@o%js-@p@Y_`RtQ;-9aJ5bvFFSIFKco{JF?w zv`RaqLg5tnH|C(D-eHfyF=8LM$|mZZHFbBqsq;jdF%T4;$qVxcveb;=qxiE%Jq;U!*Br3~dNIYmHM6QKv2A2w^>h5uxrX-Jt$N?|Bh%Xz18aR-RM91&y zF9im+)4o9~ZrIGKS(aK-&GlBY{PUQ8zKgnydaw`%Ag&N$$2Q`C5X%vT^2h7J-vJHA z@!E960b1g*?9@|Tci7G#mJ^#K)vkuL5XSI{Ks>Fl7F`$6hEB&AVJLROv(U*Qu|}HX zO-A9P0Mvs_!7anp8?re@kK2Fon-!r#Oh6xWc9O|20NIDrunyJGhsit?)nJ0j_W&>y zGiCgyOn9<#93@{T5<-L&6#`8o7k#jaKsbW{fwZKcC+Jk06CDPehNt|dbCXS(5&|Gc zAJ7|lWusD%Nj@Z{R^#ovxYBZiQ1LFkv;Rvi8}6Eypd%-Yt9EIz&TrlPeO=aW7eyqA zahj!xMV$Gk=swtDX$-Q%-Ag!m(9%#+hZ$uHQF0!3mZXT3_<+f91dwdI@FY!Nf!d~M zfLt_rTr4oE&d(yF^R)oU0^PQFnQ@EJ4ye`<_60OxEZ^swTn15w&)5V2LPD*rNQ!R+K~(ZNgS5tQ9xZW9l(eoQ+*jJ2jkvf06A6)rjFS{ip%o1_n@Op$%3GwA!s98@i(GIW-9Lx9$Qpf zNLFSwQS$*#))}Qptl^s1-mv_cYH(xq`RGwk`t{fRljR)!YQY0FQEP)IBY`ZRJENq?wQSoU{d5NVCi_dd?Fv&Y5>nPx zuypf*>46v1p`EK^dOh_o-Qf(Dv=VXB-%Jf!@2-1W&tskqAMH5K>s@($@Prq-p!C0E zp#qB}Pn+^Q*uvmO0RjOVBmsSFoz9NB;5h9Qoge=RW*tOFE|SO>E98i5_(EQszv&B+ z2qSsO%=$}cdnE)|wtjsNQ7NuS9UKhy0AX;B5S|M39Bg!L1cs)OZ2^8=ogfnoRj`{F z!9YrZ**P6921w{BCvt)Yj-Xj2gF*ro_jP_?Sa@7{B}h@9DB(Z;+%REQo>LkUM9M-o zwgwNAlUAH@cJ-p>0I;+a3D)U)$~;Ab$aMYS|F1u|y?RIY{!YbLa2|YJ_q(6finYAD zEj}^&Cs4_>dhcYBpnd1eM;;kPPIO5VhGiB~TN%9Oi99YP^PyBxSWT2%79Dx=x#z08 zwC2F}9eh~|J@QrbN644UFT9{SP0OC|QAgfc)}wHpN^6>AD~oAS1L%xcSzOt<6ToGE z3WJW@%W^@A?!Ei=RAWtINww=BF)1n_y3xs`AJ)Xa>GnJA9%3@_>&hvopAl}6Dfvxx zgq^envytMNLR%FN0XnX?p8$$|eJWZ80=`&m4hC7U3>j!H33FH*U}P{ z--r(yIbzy)CZRlMmj;<6<`SpuCkq)VC!s4+@|lFfd?!yvfwp!LiM}Bz6o&Ii~ zm3jw}mgv&A^=`TCw(5~5pR8u;eFry6<-3k_|6j(Ag` zr^b}JZd^amYlbBX%DEI3kz7}hQ#Zh{XO0H42Oj-pwN7tqW~>dR>#R?lUtT(bo=z9B zfVtGLXK#$t>}_-Q7W3+uWR8%a7l868d40y!!U47`}CwKo0u2fW`)?k5E zb;r+sUd`5*fhTAIlAJ;v%EV?44YH{Z2c(4fm7%y$80ah;_tIJSz;U`=LXcS?6TX)x z_!dF|bpT)1a>$Ch)E8*=)PIYd7uY~!C8mIPL}J#=6@d5&9H zq*DdHwilHMwWzdx`I6TP2yuSBPQ5N!AA$u zkKr^7W{z%q_U|EpQ9)E*Y23we0uWDug#N|JY!`jq9jR}&tza$oP z=#WJ$;;IMv$cVv3#U_y~&LYAY03LmU^&`z%L-fFxF!B5JV2uSdqP}D^^+nvgg*@!12M@kT{( zvM)--fF0&`9EBr9dA5(3>cIX}|A|9DiTyEJ`fc&0}4|@f$U(09j z(NounNW~~O!j{qG`vo6628{w+>V$*F`sm2npn&|9e2h%FD*P(*Lq?P*MIWE>0YK~J5 z@jwlBKn3o-cIb*cLmGwY)1R;%YSU7zl)8KiRPrKUB~q4u9?Z(|F5U0HxO$a%BgP3W zP`j2G<8NpZ(@yb>)j;Ps*|cJ-a0Vh13eP&nF;mzKFf$1X=g`ZD^AK>XN}?W=>zK0& zvIjTp)kddx2Q?$qdapvAakd`(-TKoztGBgqDtV-Yr=4|nHA^r3aO*<^vn;}D1Dt1n zgaK`_36x>IK$USDC4EVYj%aTtD_1tcaSeL?MK=yystWP|06+jqL_t)!5+yO=BRF-= zz+TL%^|~!!no}UzfAXdCECpu!OsIi#r~#nOIw<~O2LJ^73IHUHPXp`5f#-~LcuX|e z5s(6KooqIbs*HrH1ZNN~P5_Ez29|RpXK2En0|E^`#k=BEfykpVS&$BlOKjG;WkM4a z1>y2j#I7(m5y^=^2spzWp{M0{{Oo7dyZYh`2|byX9JjPuu7^m{>1^k7YzVAin%MqlRX^@I%Ly zSpK>NeGU*PkT|EPD@(0;9Vd99P!&aKK(fLXAniE>C8WHQe&YjxZvlL{D9h5&gcu91 zE4OMlLDq4*5xQKVph3pST>?Rn%aH0{4a7(&+?NCM1!&02(OHt!(Bg(8beV@7DwNA- zL4xkVMU@J_V=N@}lS2|G%p@8}4n``TrAy>@wpgwGCJ`6sSBOnT^$@(dB z(&S0ij{I1L3(PJ(5aD+~@ELjtI90P1liwww4oAWlI)gFdM}09WBnx>(E|}1)r9GN2 z(bh$r;&QvtC={+8_W5Cb2n?Nko zv+cnjA(kbf*c2Vr4q8c&6#KDD#Lzd^g$-o7P04Cgs4~)j+Y28`@eKP!=5n%}3IcnP z;onNklf0n=IiX9j*}tFPqfX{r=&sltYc zq=rI8GfO|E-Sxoz)fRs_NPL)MomF-A`4_3<%&g{U*)KltHBQ@1J+VGg>j6MW<8)k* zssG>=L`~Tnqrmn-qq?a?BUdGV2ricFM|k`DYN zeP-K<%oJxGAq;+3gAV-9JEH6E>**Gd`3fSTWM)WYgS zEkT}*4}L-sm%Kux-umQ!@Y1AfBKJA!H+ef zmXNR$nMER?PP+LsX~qWzWpIKsopvJduN6L4nd8AhXybMDYvTxcZ?4 z`@?T|$Li;|Yp(xYec_l-oVQaRX~p9C3#zL>{TV;0cN{`-$f<3J4iWY=cy#*am_{G= zi&DI73`%?a;2Q3%1N99*7?iCxr75vW(aqPO)J_xhg4X5NeX88|2b+DhB6Kyf#I6*Q zY=rO}RGlv#{!q>4HsS#R9+e2#b{+Xxd66HGICC692NpV*H~^3mDle+Vgvt-?$~95s zYQ97%HgDNwdyF=rHz}j<_5X%gn{fzyq*nm_L}2k=efRzS`I>-1s)J|eo#ov)d(2%; z(6|-bafOIr3(tEuis3k9X6H*g z0_qX~PSa1-r@~&=OuyIOe6!e9XjFcNmh+lCiHWII_1?zyehbh_i#g9c|7)DAZusQy zXtWqxy|;_cR;e&rfpOd98&KubdpTp!*&Tqe6(49SB`Bo~t@6UUysOKhi+o4GbPQIX zyx|623A|pt^!&?k3ft9SxCN-|mLk;_${c{O8_9Lti|ytHS6Me%bli)Wk1HT#c&>`C5O~Zh&InD-?n7sqyx33| z%Pe~urYpN0&!DnZmHUj{D0Vj@YE0`@zOMtW00ufxQw@zA$^a0N2)TQA?AS5r6+k){ zR{&w7>qPbvBZ5V81w?_5A~Q>=K!|}+nUH3KK}ZZd=89dRLnD`T)SWmLY`C&<<#T$M zh?4T4H8o74W-`cBwXK`(zds5^V}XK4=;70{Q&*T*yK1Ip{c$$))K&~52`~r{i_hvK zAEWe;klTTF8!@T%iC${mP|3uE$goZ%rmsNCVsAC#(7m{FOxM}R*O;Lmty`AG+Kv`Z zA}=`Nssa7N$hNF_8jfry^0nhh07vrD@>s znH<@4UR8>$w=R0Q6EJXhc6Io;+J;v;bU)A8)*sU>mu@&^S-BT!+K&ugqIu!P7xX#n z&2@A$%I95txwr|T1{JmW36m!4GhUZOHBf2AC*V`ht*m~iuK@8ypxOFaE6yKc6&caM z|9a#0!?z%U?g*u^L236el12$<&IgPh5J${lixT8JTJoJ(;J;&HoSpcL6Psd{AR$c~ zLo&Kh&c+}^Y0Sgm$nL5n9tP^TYrk|*Z+y4U^{Hd@BF-N=6>k5XEq{xV)|tXZjQ@19 z@Ev|xA!D&2Y-7){i`dxt!g+9DR4CAWn3yV;#E9hu;!jo_vT1<3kvpB<- z(_kh*2DBoUVC!(>L567DB0`p*W*44lD9F^CetJFjp~rq@yKGyCsumu-q?&Woe92d? z__$J_>6~=RDLzxdP0BU`e0t@|>PL6}w3;fJbM;`*w<7WrSNv;*XrKd6h4H(2_+Ve9 z3kU&x@&xt5$xB}ai4hbMh5sHbA(#JH3J*ACj*pMoSqeMz(kU~~F$$@sVh~DOZL)TL zcq*M~zbi~UWbp-LKC%jJog{vYZm~vdw$CUw({iZ|MVtt1k?j^>2dUFZEA*0u4bi5OIhtj*Vb2z+1=|fXS~@88~$8UmT>*e##EhVI+PN zBjjrDKgU8?p-&inrWS4_Y(an6_4@0t^ZMy7ZEZu^OoQduG$R=RYT_1>f_JZ6xw5@SXK7}|}w5lv5JG*%7 zIo=*wBKTxyg$5oS@r~Ek>I0s7>#UQ`IQv{$N*GBQl>(HJCoMm%I#*x!aSkMuP^j%m z&1Cz*ZFlG)j~;I6N`Ov5d7OM?0i6;@V9|!pWEg@w2!c+~mn=aaz!6DC z*-=BJhlJw4;)PIb(muik7I@YbkU^9Ig2BdT?~I4YkxR0DI--2f&fW14P~}MHk9Pxj zKxw(ifdpLoIPtl$;y1TTLUC|L>yZNYw$rvzu7 z^+Sp^xeS>m6B0IJpTx)x{wPczf`L3qkzElUQ6WUTq)Q0B%LJp(Kp66pCL#Hy@5TG+ zA|vl$Q`GOsxomnN2j6|qJ@?cDKpF>ZZ#>W#!-$yyF3@t)?37HIZ~*iKHz5I}P?8F4 zf*K`3%eep^sIoT^Slfqf%J!Mfcr;}4;u0_#GpxLP^5_#!S|eQk6VJjWORCxP=BhD@ z2pjbm1|uVMFI#bXb?!x%A|~uG20ltx0?$|f{N0AM(I~C`=sP;K+9z1u>gAH&-vR z2S&w(RiLmPAJ7ZkuAO{jMTo_K>An7Zm^MD79m_i0c!l8l4PPsNhu<{5Ab}>Gr zo!AFCy4@b(6AfbO&I^h1?57n(xw6eG?m%rz_?#3u2>I$N+d{3+s_Z{viG%HtH0-Gp z#*l!8mqk*?>j3#A>uKT6)UNbB27r!~q!=Dz_DE7HNZLH!_s%=-?9?I|8wsK-tiZPM zFij*1`nMkif+Hv)I2k~1+7SX+9bX~f&MWzx+!=jcK%o+W26H>y zI64xSeb$GS%4guo-`MHo@F53Cxsx&&w6a4|m}mU(BzUltE!liT28j{Fwu%|3eA}VJ z(1+gz7mWHSvP4Un%T<&R(eUQkKV#Gn(&yCoSk)ze286wxy2tIZ8XxHZ07D9FLvX!p zwnHCe!}uslgWGvi6eUU>sDvh`A()a}5G9&_Nf|r>=Bz9MiY_vRsZp>gn-a1KEGZ}h z_mPO=emZT6h60734XB((^zw@@i4NK*N8Ge&Gqf(i5-SMZYH%K1&@br-kYe)*Kl!xN zt4~~fvC85P9bhCr6L#aje7kyGKQFQz*Gw&R0Us1L9UR>{2v?#^#-T`=MW&#xlHDdD z#w#SGeW}^pmLD_>Adx31e&g28RRQwIp;MJO=_m}r8kMP&*Ra@a%`O%uA?Xj4+snsM zpvg2@%dPp!3!lh$rSw>hLxm&iQI%EKforMK9Hr1GY<7x;QNO68m9(LPK zWJ8BsC9!L#qxKm^xM`#hpAiOK_#V*5&eL&15FMerHdPt)Bh$uQdRS)pLPy`qYblRj@%J1sU#y z&crwP#SCPVNJYgP93eYxD8{*=$C=O5lHq~Td;!6olpkdwmjixALR$JsW@ z0*}+7<5TF}Da0LL0+s;VA3CN?nHDlt4tX)jKH3PfMeq7_p{%ekSfgti`%jILurKYT zQ}c@lbmRvGl(Y<*BROJ6iZBj>+a&}*y!MH5(@PdUb129koY+^72g=CKitKKJo&*d$ zZEtd>7NUq@$d4EhhuHM%8-1>O`H$#6TFLI84t4-&OG!oB-+c4Uwe5n$+YU@Q5InifM5&roS%KUa7u!bd z-Ce!)jwZ@D2MJMf%rQ$PqYN&sQgWP&C=5p|O3|gp!W#A0Xn8Q!t0yyU(}6!addp94 z*UZ6({5)X6q;b_GZf0qKG%d;G?Lo}s0Bge85<$+;IB#{zb09DT2IwQt4Hsd`@1a33 z4LfBEcY?0u`I(6gfLG3$gi^#62$M2wp$o8-0N7%G9xe1X{!g01H1Z-7Qe;R^%B}0a zJaC~TV!}kBpo1%(=~z^B`VfS6C(CoOYbiMKN4ERdjXEY+Y!9NN!(%dRw9vxa$OVg^ zYYVM2?0GK{boz^8Fz^O~lcv^J^**e3Ij{iVe*5jUD#+!hgR!O@IdUiiKv*5tg70|l zx#wORPUSQOJ1Zk$f1dOu)C>rcoR2)DXlpe__YgM}@w(B4d#*Rp`OIbIA%Pn9U?Orl z2ODky*1i3fD!ggv)Xglt?mJDh<|vPbDXcUKpNT?|8;ai{S21l2lc==$3l>$M`urEF zX}oFIC*7y1!{7SecdMP-Kd9zS8e7fMszZ6^^B{*}4Fv9R>7R8<0WRBK6A4E_gBw$M zG-3)B0}V9e3V&=bISS-6D_?&`GMO<`YneDj~5{;pqbAbTwt3X|&^?z_6*Z zkkn4fZKCYDM!qUlxM}kYCo)%?)tgHh5FM!Ac!Mh}6__C)zx|tDvN+@T%;5$Yq?FMx z=>uU^TyAoa=`)nbX3W(00sg}mt2y&xxiBo?KXwPIHEUn5{@XXcQLS3N#?J&6Od22a z!lA)#?8B&*|HdtZhAS(eb+3UQ2O>Y94$Th@VjvEGLL`^X6i_Z*=5OdsPX{S~I16qD z*G0rCx(B-9)f@nIt}RKQkq!VU5STb3!FN6K$RnHd z^2jDKa)bm=W7C1@T-p=|4BI#iPL7_i5+EOHR}LLz4vBWuT%iqa9>PId%jW<+#p<*v z>Q$LhYa-GaMYubz8vVOkcB;uG z+6K`m%ViW59$%jLP_~mt1ndX0kSmb%QL5wchYk|)qCotj^Hqp)f$k#3|Is>Lzj1>_ zL5N5;7EN{gux@4e%xx<|wmL(aU(B=bX!bJzSWKy7yC|uQ8uWH-u%ZGBt;aN6OW!g- z3xJgMOAHDm%LNgkaTtgO2jDe9!39V*sK7SvLM=64&i>g>6P98FEyK5oKBt3x2$;o# zD9z%5aHIo3n=_TP;SN2Ncm<+<1}F2((K!TXj$j5l;uisO{3KohiV6(a#-ohU8d*&_ z4V=2KQ`SX#>dFn8XuK9sWJr$asYHLax)u`15p(9Mu;>z<+l!2HwcFfs_Hg5q6y?!T zfqACE9DE+Dci=C*_PXkHy-ehZOqjt&D)14_K>XUbzf*0}n}xHr&cHmqOvHQQZu|~L zoTRu6<*dlhUTuDKWxoP?gM

_Y>?F?q4r#Fl7`5y=^J<`QXd?$+K?=)P@b>vkAh1 zh#^M654LQs_V42|yyzC3I&G?^PfxNrmfhzI%F&N$~>KOCH>H5DQ+XjJI*mev>e@89_6 z>KRQVo}~8(7ET^t&D2z4(@Lp*F828(j1QKrJ$l@zh10+>1=?0acPA2kTp7TtWEsJq zctVQIgN#ClIyjLL_5e}jOz9j|ZQM}L7>|7IXKN8p;>N9%2hn0{#EO`a*jswUSVvw} zSK0QZ2|UE2)^&mO*-kQGwe*6E4~gZ1r7nlAwmn$bo7S-KSuQyAmaWo+5Dt^tb!=R` z36V2H13>l{M1f~Yy!15|;-N6NnylpI@sRLf27nZl3fu7g#~**(13(h>gVX%gb45>_ zRI)2w2MHYr7n{J*Z|7y85+cVzu_bZ#HA-Wr5nx29GmH^kxgOa?QyOv13KIz}Kmp&a z4^HkYXEfzl$0V(gd(6~{)nawPIa=jsqB^6`0;2byS_6M1Y~m+!HrHQikQ}(-;IYcm z@1qtju73AFeW_Zc8HW85Un64r@HfBv-D-ngN}8!T1B)h(*9Si3qwLINf9!Wy;**>l z;Eb7_h4=g!HOX_nn0-dYcJbEhA!IrH=25XnTQL+U4!NW=KS6@d{`1@;JFl`uL?hey zUQDOXMhu)ao29%;hlSU2WLJ?8@}qr3AVsZAuBO_@%-Ec(?*tyLZyqk0GO=0$oH{`d zQpf45O}cd|_F)Wqk?T4y^>3R*lloK~aX=aQ1-ji(n6yHXX1;=7Vk>OJ5YrF~^s(ayZ>^R=>Ko`tM)=dUd~kEzo1dYW}1NT5@c>^rJ{yyg?&0sx{(~aZ$Nq z5QAJm@Z6Mxfr=pyF_kYP{l0{31ri$%6e|Zh}56LRjtzs%J`tH z8cv^mgpL_7NR%ikFr)Qcg&;Y05<WdmU(x_u4<<*UnPmkl3ZJZ88(U| zW4?Taf=+_TkxL_pC@eqYOt0GWi@SbWZPk5q2ugu0sIjm5*@F*ilF|#+XRf`rTC!-N zZVkp&TebM;R@NCnA51O(orwwBthdgfFN9`8+Y=H(Z;4HzK|~X~pexjtXuo(U%25tB z!pE!gv4naI8j?w;Q~nW0&VkZ(M-B$2JdVJTMb$*Uj!He#;h8;2Jw2yMRD7Xnt(H97 zrRm$yj@JuD3$;+qvJ;N4&RlV7HCKc6rd@lhEqmpu1iH>szV(KNsCZeUe{zCOnDk<{ z?P=4Crkw_~M{#5xbSV#*De+k&xc{e*sjsmPKrRW6nYkene8h=g9S$a8H5&tAZpdJp z_W93${`i?QXPy)lEK5{7;5m9_#lP!U9R{(JY&4YOg(nmW6!+O$FMT2Yw11?QK7r=ERI&nn)pmMmUa zP4`()U;Y)b#)4WOY@VT5M5GvCY9{kp~zICs1Hfm$eFdOH(+#+zw7)d(V z0RWkFe4^4G0KmtuSg~TxDW{xrvGBeL2gb|JH#`88fQu3=Q;D-H5gcz4n#LKzfJ&wp zo_w?$)7RzENb_=-PUeb8mCy<2vVV>m)$MoRUETMv8mk+iHE36eIBX?4-?LinXYqph z)m(j?;sZ50I0U3Wzs;?T}9U9DZ$E_fGY^7F7w~!*0(0yf)n=bqx{lc){WYYkLck z>rOkax?X(gWqpzP2i5!ffJt_;AcGNOfuU=+ZV7(<(o44Sq+^y;ALuH8-r|&g>A+mc zu4C*?TYyek9^yl{{ikk~$$x>yVT$a+4kPU${-Rj*E##z8S}Q>i{(c+vc;9{ZeP8o# zo)j6+0J;MJR@SZwA2uEA0ATwh6_^765IOr-uUJI*#i zrfehuM`{KrDvhSvN(jm%+=tph!`Y3qB#=M;!TH+HFCTrhdhnNziONz1sR#rGbiKmT z+F0cB#Z{}T6(^lgjnSHW`K5achBZZ%7Q`iN`b@EB{0i0{cmyeY0@G&9)FLA*e09O9 z#5{Bh+3B$s+SGk7XF9H2CQg`8&DX2StYbJym&ptQdpJAW4;r4T3;QhvBpPF65E01@ zVo}I^XPeKp=A317oHE;L_fP4S+Pyh5rtpxP4MDZQ~PYl~v0B9LR zlS=v|I`5&TR0gC~?tbN!S2k!q!1Ih$dDcnTRx*1OHb+WpQ_~AVQ=V50D#p2!NDq4XEC0b~)iA(JnRIKN!L#)#^3QznOIo@2C>1oxB6SGl zr^_GSaYywJU;Cdr36`00XS-8jdc0+p`B3eWGNY#Q(iZu z!GL34-FTcyLD1GvLMCbuTCGJ@ngmf*&DSp<8G&R&JAR-NSU=1KCr@@v*6#ayZ$gt{ z5M#Q8@bHllzCSovy6v8Os{Q&vO4eWaNj-~08z5mDcY!j{0dD(jRLLv2=?YEI>A>`g znVF%7Ad+E?Bs5;Tbqd zkQ17zUqHfBv)QGE@2W{emmG_eeo9NLG+XOYzhwuMIwQfCYn~;-A zMtQZ|ORxQ;?^lh77A~yDOx4_WvAgl2!+3!(lsp?CoJJiT zT@6GyhbBsl=$b~)2J`^(_+`s0UZ7d`_Sd znNH+D0OXy3ZMry&+kl}WR5V!_yOPj8(v-AmaZ6nm9nh2GyL9g#wi5Vg2z+qz{7bK> zCQh2Dh9SFkpFLBZY3WHPS8H@n$?x+tn55^vdH&JI1~ZdeEC(%|>x#Cb-$&rtT09aE zSW0{jG-h&TnN%g{o2`#xU;|(9^+Q6$l$5pr-{1CuUNe5)i;v8lIiosq)=Yn+V7itf zqq27E)bBx9xI417bAu!$vd0hNq|gme5X-y+3FpFk9p|kL!5~(KB3u9Z+UmuZSHT%c zMMvuXf0=&m2xfaI9zp$^*A|3~nn`(lSNM^K^kpV@>J-T8%yaaT)qkv}>voAN0A#Sv zz;P!ntKQcyDH}IzP+mj7MR{lFYr=k5+GH0j>3FUWvxJaXA5Es)g9A9?Nl zf$B*0Bqz&0May)0%IT|#1E_5#5vOIXygK0f!> zR46Kd)22<=EWPuJEDAy)56vcMQqU(Z;t6)hO1S3L*TP3=`8iCzE6q;mj)f@k^3$|q zf*fUlhnlFCz~l0i&gc$l*;;5-R|A(^b&YQe=IfV;l#eaoK-(qBuj$36Z+_=rb!+f- zeO>pNYM&m8F$gT0!f)tftI2w37`kv1V|0Y=!ja`fmN)DnlLO{4kYCy#*)`87y#O@2 zdUfqu)4~&c`udRUb;3>Ygq=u2R`_cbNH3~r;`{dR)k|7@o57@ozN#*`{7T&>X-Km% z*aC@&B;?#nE~_T^E62_@@Ae%#s}1Yly8j#5&6CR_2pk=cOoPD|ZR;IgOiAA_cz7leZL7v$t+}3c- zsDE(Ie%ET9fvZ1reKkv$!OE)DgS!q2d`AP_ty-G=Z~oyQsylyvZ?#2!Pu46t-Z5CH z*>f|->8rqLyQ>pfR4euXIoYJWWq?pl+yw@e_eBO1fLQv>HpzAmaB}{rMT?ck6%ukm z4;#qgIh!sDEuq|GmY~Gq3@B=N1mib+>D4? zE7dT0L^9i*W$MI9o_iluWskU$j+`>dKh@3U5kzC@FQrs*T44ueSXFaE*Mp-)Qf z+*LjF=wsF2|BwISr|GM8mS(cf5js;YnlhnUs2PULi5REB!S)v!DU>`mn*xSO1N)kXsY5W7KE(sT63KeV z%VXd{r$ZS4+KSrBb7b25kN^0OujspF?_y0m7>NVf=4$|myl9wh+>Jn$BQm9cfx~Ob zNC#0$7)R}W&|*hyrtTrvOf|iTlMRG&@VE4n8z1%L1)QR=h&`Y;^Tt;1>($o1o_HdA z_>%&bxE`n9;oSx$!#>!6j(@f{%6;M&ZOlz)`sx^eUYvOeOl6(hS|W@yr6l=`3B>Pc zzJy-dG*}#a!b#N)zxVsq#n)Wx&wP^~aRuv5 zcw&cOY%wl=PdT<{2nt!qn=*NtbIC+48*2=V+qXwoFY!1_WKNVZTXkLaTNK^f-v#Lg z5s?-F0Rg3ZL8MCo=@bx!HV&+at#(YcgSy z2vG)Wl$Asfdt)Vz!>DH1JTKOj5u`2kua!QPx84r}rPzA>X$06d9xX@G{ek&}rp6c; ziqnlM3l^yHMx(nCmJvAWf;9n9C}(j^-D|&rdBy7Adacg8Wce-2kj%a)2<2a{At+?xpbe=NvkNI1kj(0F1&B6V zbwuZ{pMkv))KCX=sn)Hn|H_$R&ZBYdUUI>PqWazaR9jSWRB-WFagRg1wYh4aR(&{3 za~9j*Y<{TP7Dwyqx%K8T|MrE|9q2Rago;G#+D*}aIGRnX^qp8)HlJ^E$!z@O(I@lr z&g4$b6l)KT7u~DnmyPUpb)UjsFSf94&j3A-%^9iR(T^@#9XlSyh`X9Y7MRtF`4s6} zUN^vgL1Pd3kmVkK1rF}vw<$VCda5aT$S&wC;O4LIEA>M$LUI1Tui0XXZRhM(1^HWx zNrTMH0y!JxqCsuJMHdVp4H=$5i@O@M;+2hDSxZ1YFLpL!WEaGTK9Xdmm8HdWrSNfL zj~ENx4i@b!Ug}=#cCBFLFmf4UndfjEY}BbVkQ3PcEYvN-d&fRH4D5dq7lj|AG(7zJ z`_HHzS-ON%fyoSjRsXi0P#>~d|8-NC$DGDWKz5MbE zr1xLo`1fK4ji?r)TXq*C(&ngtG5GK9X==LkQTMmYZjgsy8g9OYas952r7~G1%@P_0 zF}LTsGmG-aoR8yLIFgsCyR%4HdE0zs{E`3a-E?j5g)xm?hzDZNuxamR9>oqz%T}-T zAGrNdPcN#LCoXIIB7V+(DDy`|b;$Pv!C)$vC?awJ?l8M&?4fXiYnZ^6z0VQxxG!;K z^2wX*X0(~BkwsXrLw$8r$uVz!M!s;NEq4birA=!yYbRjAZ=CTe})2+@PU{+ z5tQM5N;|9_LP!8+n&%@y8Tux#kuVk;M}}!Erg_`@745!QT57UP9CPlKMTmgs10$71 z9|Dck(O^nCTfmhoP{mFJ03czfbR~`!5)(_LA1$#J8@rA>Jz)d;U7;syLI$iZZ0<$M zqx)@2`(x!{@unpX-SxbPuTocpSdrV%s|;;P9SOg4s1nYw^y^o!Uswdk1(l>Z&e!LLZfC8t zHrcqa;DDBoYD+8M2>5-&DO2C=E@Bh^8+6=;%<%wijRT~i7+Z_-a|CaqF%|Vpx~WG? zb=V9ly)F{nswLyI-B{=1*|8r!jhx6-zg)=l+(={8iip-5puN}i&aHya264jcTzKOP zI~j94-{((1P?6XsJzx8WtEM!y_+|E86?da9kNgL+1JyC{9jqdUk9S|e@XGuw+SAur z^9!N;X;$>lp6Xq_8nnOdn`{|@)=0i|IRj~c?l(feTID+TquF83_9~KQ+dyngAWa@f z=qFA_w&r=yrL?L7!ro@I%>;F%<7pBA-yN`Gwh=1P5|UOmzdh)jjlg8)W8r*lHcUF( z*pAWm_~BK0)M8hvRS?RiBWYmdv>85&6P|I!UlS#y9H)tSQAj~gEHdX%E_&ITVW^Sk z-h(x3TVYaWJZIIr?tQIFDW?RXNX`+?nCkGps~oSqA86dhBE%-3`n}CHRn@ohW9lzn zm+U5?U7oDNvqDStA*ik?GmRC+D9+hT-=Yp|`lwt-`zw#N#xya?PX~u&OKqvq@;}MO zUV9g3dKEd-CkdA=^NhCZQuPUJV)ZCT89xOYKG3x=aRrS(bDEF=2&Fo~BWEwv*8Cb( zH$dNR5VTv?U}E{Zjr1y1ZSzLDAq!|M=)io%5yTnPfuHHK;yhsF^>EsP4s@{#xx&%H z_AaU-zxfqj(Umzc?};)b|oPrJ12pH(ozJd&CVaX{%heUiO!10HN@s-$#1p| z5++yvRf`QA5YdI@Wkc(BM;AIdk~pajsxoVNg&JE&f-i|W(<^xnth%z4<10L-Gt<^P zQW!oNpM&+E z1^f__Z*#F(6(zUL>9@+zxwY%NdvDs+_{?m_{Gi>3U8%Itl#S{q=MGJD zP6=A_9q%j4eAG35kaVyCu(3$yqkMkvaniIW`{8}7Gs1iX7-SH<>-n?^1g7(cP3jOZ z@JjIgaB0f20){@TEUT@~?BNuD>pK!j^WF>VZcWUgVh%!~gK=hWqbV=Ie5Z?lb~r{#TVH+|eF17B}G-|lOFEOPAbnf_%SU&Y;u z5FI1NV$=!_2wH~!Ofg1vJ{(olJc@m(n(D@r|CQzwEEr>=IKlm)HK(YnRu3@S0137!IU) z=MoZNiq$CgOk5E-u6a!1CidR@h@We)PH|mg+R}=gvaZmb)xht>dG>$!bA7)R=V79; z=OijagmxD$p{6eT-wB>PdSRbk(zwSIsrkkuthhkMO9P9XMBKY2DJQsJD9FGL)U+Co zHm4=#8xwWARQM;EzwZcN90hOIPpi$B|6{Y>RIAdgXj}XlnJmdCz+KRcNB={iFAe8w z!}&zZa@fD2g;73DXRG`G>ehqd3gqW6AQ2q{_t^<ym(}*Pz9{W$p%D>IIfcM^U^1Z!gjQ$L$_P`@mzn45#QatGR~p-) zh-gF+kWvk>s_d5Qh4(|oU@N_Hw^kWqIgPDKvs#egesGEKnzoDop9j z0OzuHbElXse7<)lvjm!&<;?rz*L(?Ws+p3=Xpe%}@y*1`qhn1W0Oqsi)Y_A~uA@;* z*#6Jyy|Emy*xiaNgkw)L+kECAWS~6 z@s~mC`=*qD-{tw!3%WWO;qf(}F!Lht{v0mBqRr{c`oLBSeFfHTHfh@aMArT9RO`lG zGPBA`8Jh%@`tch4!Ff}!WPG)xW-Uft!chE=S6d6xftI|6#}**jz}_Wo_Z`=;RNs*N z>ON%*Jn9#Rc~^w&yYCoCk6ykVCQ|qrSE$cup_YY7otH3j@J~6u=|m!1u|=A~PO#EM z$A0F?&O@Lje;>zNkn^?A4Ljd?@O3)z;vrD{kTWqZqvoFd^7lV^9fGE~TiZqZ_-^=I zuOF&oU@k|?7#WL9Sw=%mMM2qd~C-ass7s(~Nyr8^&T9J}B+!<$2{Euh^j5cO2D zxa8Y|3EJlaQr|3gSOSf)-q&6b25|!E0r^$RSv4v-f~TK0Wl9F*RcEIi{!&gWMZT=W zBzmh|I26qK{AO+e;6ug|ekgWY$UXXAxyv3X%Hqj%Ksy(zH8;=Pn11A3Xx576oN+XyqmV37^cD%1@oXRHS4CdS@zEHocRBL%Ap z2lep~evNyKCs*ZizIVKNR71{qqoM@cHzPnE-MIOF%)ezmuFn0jdb96P<=smGO==6G zH+%TysV2Y2>h#s1^^W?dXi=bP6 z3qSCEP2>YX0od(CpC^A7KM`^h^_|69Xn(rwY-#MCGN7LX_U}8_A3D*@)Yzf&$Bzf| zkFwoWMKg&Pl}z;wWI-=F4o!Arb$(Xie*3f_8ym!;19B~frIsB)2WsAG7r7aXTEJO zv9-S^wu@OfDqUf$1e3QSC^fI&j}2SZ0V5U0vnM@qIf6Dz7rG|o0lMfq&jl@{^I#a7 z73sJvtcy~g3)Nb>b&8h!XhKE@l4*J%6<+(!fT?~SPOra}jB+ZnGnZ=ah^TSK`rf#Q z6+86++%NqY^3UHGo9h~$<{<&WeLG2g)s?pWH&_kp{_~&1q%x33#u_suCdj@cF-HxI)elfHE*e0t%%@n9z64474BSbS=Wqy~d;~aGnnN5%C65}sff0&S&)gCKV5W(YW zzn{AiOIYULfDqk)H0`}_A6F;Gqudu)^20F~J5**#X+MbZD>%Go}XSy!}9 z87vrZ9E?N%C!CK2sJK9^*4AttNYOFMJXplK5RF;*ldVyO?#;VOX>0bL<#e1lcgCXd z(yk(|6HEY6Xe!YgXRCDNC?D5tk0vaOxFb#X;HtNx`Zgq^$`1MyvO8x`ffvI}vS#Y4 zLZAYn$OZtp;HzF5g1P7pZ1FFGfjSwFb%G#Xv*)GF1T`IqT13K7R@?0szBdp=kDiWb zEHmcA%mD!27At;|)*@QIf&S;vxT&&Q!8QN&5T}i|E4+(I|K-(A7OHf$lw7@z0iV7) zGRWrHjg-Iq|Byx> zw#|}u`_KudcuQZB5tm33O?L)l9Q&E=!ptKEsS(~ekX${sYdxtSss8Nr97ln<$=O9$ zz_Q(#d}(~A;EnR{D+_lVPI#78w2S~L1>+mCoqxbY$UTYfbkhON_=`CXbpvvZ@P3>M zC9mo47juF->T@Or*D)EGP`U6tKPceO)*th2lkkjTZx-@ngN5p*{ zDh4M>gX1j#Nt_Usdb5`EC^cwWjDOlm7(+ig;8MM{TQL7|rcRvj@ow7W*oL`&S3#oN zM10i6i@+t`c>4DBQE}Fv@IaQX+Du8VGLx88@M=lv3 zO2~!RUoNil2{DxCIhU)aV=mx)n0@Rx;e+gi=+1;iH`)W(Se|itfzYbHwe8hivHzqI zCdV!Cd8ovO3A`1iP%8+RhKMc@fiC(Z=77e6Hb zPMxTlwxf;b=2BAoQCI4eeL%*(Z-{_pj9zc?AWVI#-q4TdLVzn-diXWtNMxPe{M0`m zJw?!DUAmcm-d;9dR%r1%%pc~54x*1LsFjwhd7gs?L(m5{_gOV6BY)K;+KJauAdREw$Kh0QySngZn5*gx{%4QJuy>4zuF=)Q zyJrRCVS^{wrk!{9xeRqLuf|YRX}8hGn`wKo`u?iYK+F_kFNJ9#J+c@8M(4Gx z)#{I@XBp28i>MrcE;9=|750o*iE9gN4B4Xam-yM?p zH|FEWdN%gt)6{8b<)6EAaPljKqnD;kOTY(ve`HIh502&$;9+bIbgh$qw*JLH==m>2 zkWj$B*!t!W2=ZXHuRh4wO$ivcya=OTgMA?a*jPe1Sa@o%o7Y{T5>Eo8-SvtotYfMr zJ&X*W4NE;^Z)bT36rWEm0EsY4d*llfuqXeL_LlT?OT3rX)VSp~{m%A$s2h7ejoA6f zb{lof&))EyK|}tu=xUEkcjpErc=!nN)F0C5{a)s5aWX4K%9~tx zzW_}66j*e21Gh9g?~<5JIRDe&GjWGheaGCKHc$9xBc|eLp@^tk;WSq;pPtpIyYZbe z&NU=HoYDq|AD6bPwyw^*K%%oPhdC_Gjr0bZ{esi&5R|M|%!8~(hJx-xbKF>Ne(^Uk zAU^;s_8mz8)X9w}wcSYzKEGplW9)JBX+ndLpjw@t1((^cI!4vzSJ6X=NRaKI$CIicbb zDe*a9bq_eM?s`+&b5uDLlBq6nmn#`5(WzgM7FTM`6?%w(J5)ZQ*Q^1QQAMRQl}BRI z%Wg({uB{}rrC@rUDq~GlLlo>gwJh78oKQ;Hp^V(x0MlC_?mv$>V>Jx934_`ny0qJQB z&iLb>7y6T^%EqQ09BeF7GHCUBo$q2AVJ!y?L^5$i>g%>pDKJeQQ{!cfdOU+~FCGFg z@Nk(l(fmPUlqwdkbYZJMoqm7boe6KQc7d_Z!&YD`@*@%#KvQ!z|ccZ6`Cdc zRA}B`xZ|h=+Gf=1vRf5+qZ86x!H0k2G9>K(XZk|mCsgGsQQ4{nOMH4n|bs<8pn>ysA2d7 zo7Lm(!y_Sp5T60Q3vpX8*^tkQVyD3bNZOR2=ykWZj@#_U|w{%*Xc>1UIgP4j6b2ZT+Jty~5^~vs}BJRM9QclOW z=*`pN<15cyl2lKp8;~~i>-bU)G^Lf&qxg>A7O?Qp68O-9z5zcTg3mOE^zB#2(FWcG ziC+d;lM;c!sV$hx{M6sji&o%Hbsfyz>krZsj?lNfagib7B!l`Yy)y;dc2RhdKNxG> zM>H)yj{H6GUWDtqBn+cQ&J@=cP0+{1~&%%&ewlMkT)KCQU}W<_cZz5%84 zLEJ<)`v#IG`sA#joWSubJ8zn9u3&np1QBJ;aI_ZKPcl-uq@z+pFK(aZ#jc}u$i&iz zl(!yAh$6fuRf3;e^}S{ae!ub6vjbp#L&xdMgG?S}6?JU(2`?7o6m_%^==84phmnW# zSpqQ?Zn4an3dij9J<)6AHEQxpk=yApLdX#Al7LFZ3F{{Tt1KXm$Lv7;t$0 zzj%RD;^5I2bqoE*fK(eyL3dyb_5=k70ShE>4=xIoa}_}2shB{~9>uJE^RFu&Rj-k2 z`;vF9t^zMrN_wo6Xfx@89V<@LqwFO-i9#J}x+lo^C;zm=2FK;txBn{- zOD&FlT^A{Nwe*lGP#et5=cl?r7!`-=ye%5HX&V52S%>62QPJfyXI<`WJ)Ux{c6Q52 zUVqaSCH9SdTAN4s&o>kXxGd4W7m(W$EtURDr&+XLXPHkWJ+fFF#thrMedu{&1 zFUi-$vK8uH%(UW6UzU%%e6cl=^o;`NJH9t<@rgB~TkRmGpv`+k52u8;@2V6!DNyT$~Qd1`)w$~?8-kn_NCU#^um#^fh|*Pt70`NL&wKegQ1 zfG0?Rgqur%w)jo1y4Jo?fUJ8jd#U!c)%ejMVW)*$$K(7h_~j=hUE*V8HHf()@Wq|5 zGx|2aIdsRv|4p@!$esU9g$b(te{3TxN$+{c>SfR2{VE@%UNV0sZdAUC(%-Ic72nCA z_9Kb1WMB^#6>|S9Y6+^4=UK5opf;IME*`)6)=-)DWi;}{V&_f%uJr6lWZ`+bP;T(e z@IZBA^wnRI)h=WINRxnhh;iUAQNEh_bm3uM#u;=M3jC7~edT|IbP(Fy{QMwK@4dq+ zvC<{WuX49LiiZ3x4qQ?>4Oqd;d&>5C6L+U6ND?Ug=8;Jd(PZ97SMLL@%2t@|jIo?n zR3F@a_M z&rvI$M*;qfC3jb~G~Ec@45YfD>zIJatUo$sc*nrh8wyV33tYo!JV)75GYDKcuVEDN zgc6BnkyuRM@sQZf&wmkGaq1)5KT3h7G+ggf0yFfoBAw(?nE9!E3-@qNs%jeAzlqV+ zyIPNBMNa$;ezVi>kAbt~gSR4xub9|kZ@2uBy(~}Yv$4EijnabeEXh02$<=?Z@#j*$ zfd;63IrIZKQp{EC8-0o?wu|T680ujWm0SMs z-(6kofrcK79#*~u>M6L6U=z8(52ZW$VVo1K^|$56v-;@^eWmLXRphkwuv z!`qJzB#4*D(Xf|oSrV*=DLufyhZfXlwVqF4G6pCZ6u2BtWqdDU5Ac8$l0(gSrj$${ z*kB>fQk$JcO4N2nKx-r6Pn@}OD=t}JSqf|;d4oj_keL>*xIk5^uLFra?#vg+Rc`uB z{cXFw#C%4YBXucx(lJM&y?-__3S4Z(GETFUvZnGC_UG2~p!%s#-NcKXZKy$7p38|H z4%GhpZ0pxS$vOpm-}G99UWC_d{%MKqsQ{*4Z}K=@`tLOOG_DgPs{g*Z`&-pB$t$I9 z?GL(4EmOHTItASGq5dOfYP+Q_EG*o{^bpHEyoiebNcT-#FmQD|pj7hYGWM7FZidNOU*a8-!e!J%u;Jg+(=@(f z3O?-Tj~p(WXF8uL?89lq?v6L5V!7Tl4rV|I5i)RW?7X=+4#?^mB3n5=aDGbzsngTc0BKS*(o z;8QwRqTCO~FIBrw8!kUtsv$O!JR6@mPSyz93*&0Ojd?KSx`md4K`;EaA>=^BL$~`{)0mSq3n)cdD z?o9j-{i#1Jg2v%qhzK|1!K=Zs3w9?Ec#E{NyFMb~3E!5s(PT)7`EgW0cR9rvA5H2= zxp&2Q>1{~wx059AAiN#R*Hz%9^Ud6w+4&Y{hN`GG&jp@m(3ZXbMk?RS%&l5xy9|FF88JDYy33fz?W`N7O$ea zHQ)0r+v?Umli?Bnhg6&e|1xMKaP7hO&=H4JmCn<(*IuW|K;_C}0*rY`y@Fw|)vmX{&dP&P34bo@* zQ5qU4!sC#*u9u>51(kc{%k@l7EfFSYh9Oq=qtDP~`s~#VOQjM?16`dd*j*yqUG~e( zR5!*Wfpcjb+;_4UzF4LkeMFB(_)8UH+;u}+fO63hzo1br3Wh27xm85embUkrE6hLG z(qfJbt2OSrR*+Uwk}TRTzCK+P@Yin#Ns==cU4QfKm5bUz9N?F=p;=8PUphhcl#-f@ zNO5K=I}r|Vc zEo5mL4D^;-OfCP!OIX5@1I;6c;QY}<=c)k=95h; zmgt)W7Pdr(mo8k3Vez|3DgKAu6bf47;!VFx{Bnq~UHz9f`Hy7epQ*c)8<4pbs6f)v zpIK&LZzwjsTNjNT8)HDTufmuGZYU-3kwj-FW0R+BI047^58_w5G>EhguV3OT!7eNp|_ zx9*m)85BNyWbVK;$Exo9i5`kD+O_;W6v03pXUgJDZ+TixjFvsm^H8q)B9#t2aU3QN?t?VdlOpVXIckX$k>7w?d1v8 z2!+*`Di$;nP1d27*O}k-*8d?#Hu^|F9Zw3qaX4<#7Z|*+>v%8ZSXO!cHj{n=jk$Z5 zBc?rZ+U$8-0M(@SrYU_u@Ly$oMH5hTAybSC=f_`sqbVK_BzlcwN9n7^LHSdE3r~<9 zw&BD!2e(BguihSml~7hg5Ve+@eC|jR_eLX>=PS6eVy`>fQKwJY0Q2yjvc&8Aq|W&} zJdoT9&~>#L;7uWyvIv|Z!p9uu=Vxj-S$bSBPdH7-y#H)Mi>Ndnobd5rbePa)V)a*S za5oOxmNw?z;vsFqT*_t^r$ck%tJjZaDVwH$NWoY8FyfSalR>K~0(vX9B{huX<)R#T z^F8X#M|}42x88ZEDTV)99fVU`N{e;z%W8`AAMEpAi6|l5eG-#VQ^N|2T9r2x?!W9%#1APQXz_N4KF@`)^3UZP zf6ujXfEwvN$*TX|YRjt22p1$}9L;f04DqT2S@x(yO4~3CNFwwv<3Mrmv5lx|L4 zkQvBUP6xCL!Y6@RdJ5m$A7>WD=uzOp{oDBiLNvLE^L&O+a$M&=hIsOt^ySnOJr`Dk z_(s_sDBm-1KM7RvzL?%eP{+;futHBAs#dBpV$c3OO>FCvo87@*E41wszlri}5ILR= zVMK~c?;ZUPp^#Tek$4hv>;1-?b2-Wq(>DpN*Yr_hhG@Od@F`FED4X-FUxPbm#vv7h zjxvn@B-}bVrSn(ZFvpT+$=Chqh+Z4Bs^8TcsnBEa;A6vAZ90+PBfkHH5GxLj(3!Q1 z?NbNtPP3|43^SHp;1N8hxWI~#9+Q9Dmy*7L5d+d&JEeykfU7UxF*7r#Cz$M4?0u4* zF1mv;9gX}hpB(BW-k1*a%xENA?n=W|^Vx&Qy_D&9Qx$#KyDNa&K}q#^;s=TzZ12QC zi_$HP8B-&?gNfeBno2)SVou?D)ETNCX;xNqW58WR+4$6VW6)5m#IP9G(A0+(uKtk5 z=kNMLN3B{#`k>qEJratALZW{67q|a|vs;O-1!}v7kN9;cvktw_lSdxSsZUJQ|;JCb!dZZSbMvaIZD1qZA=+e#ln zG`xLfuQlH#A`0*Fu@1xtFzAtdEk5CTJtnk%{Uo8*u(Muix}oFDaNc)#n2H5ilH?)= z9>~9u`6s@|biP(+KCtoBi|)p~_w!mzJc%7h3#OT*t8pioyiyf&DwHEe+|l>!*+IE9 z8^A&irCt922xz80S0w+aaL0|14uA4r!O$^N8`6kiF7X*1iHT`$|JZ0~^`*;Fav@pc zmo+%-C65II{X)Q(amYY9x}(@CE*)WY7?Cg17K!FGN3K z_H8wJ-8TS`kc$bioaryc0LMoHoLAcIQ$w?#1qL852XO9Am+#o<$SbFrdOG|nvD zZ24Z4k}%MkehjF*#$>qu?fg+L#C$QGTrVbRmRLBK;Kv+P#E7xVKqnU`k{1<^p9bcj zE$q}bh(W}B=q<|I!R1*}%~@&wbyRqW_RCv%fNgf-Axo`CnJKr88(B)^7ex_D=aC@P zp?cu$HUm171vG!>?OG$9e-2ml1l&(!Adlo1c>k8LdVBONrVLD+CI-1N&{rDQefy`c z8pb&eLL+%N{L|SK&q!0}Teh?=lFCT+0`YTlO@XR|L8 ziMyZ7;Hh*&k1c1|Hn+4iNT80WZvSYy7N;XRPG+?P9@QGu#+%|I{s$XngWPqVOEkG3 z&&{Vn^m>A7TmT{$g_zwPLeH;KndLl16CZ#Bz)VcHtssdI$&7tYG_8bo$7B0C>daj^ z{hf%;W#O;RHn%9|h2o6lJ+)u{$x~XP<>gBI-ub%-)Sk{P*)*bwVdQm7%Yc7)siBBs zX>k}aj&2dc^D;>Wv!by#8x&y+Z#Jvmzcra{Lg6%C`KsDDayb3s3F%V8z9{moajY&X zBMK1xY)4siC=DC<`GduDBS(HfYUxn)x$pxH=)R}e1TmHID0lTsSdYt>cbC$^6W2r-#ZJ)`<5unI3cPydOhaQgoCD883u7Z+PSa~0u2<|@X$$(13dGOI_D zIY~2T0xz^z_lMuk>4ObC)Ms5^mf9phoga1IG6YIsyL=M5M(#bVqaSOYfR#qK_vddf z-X!*@%B}__#NXZSP2(evOtOtG4&^)mNtg~nb~vUE7da{Mqh>uzH32sj#||Br{Sc!k z0;33={w>&P%CXRJJxko=A}L?g;%lv@xPQmrENUUCjn8?ZgUd5zCJWTpJg2qlJyDik zU>KhJkGl9n_1XOVH}%7&0Fx7~`cP z@jCKwtxP9$X1B%7S#Z1{aBn))(#XjCtm6dFt2uHLU%&kN139vZgPrlJa$2i9Z~)?P zpt18&M(7TyDC(EIydk(S_OzJKK&)-&XnwtmNEVYFV$AwAc3!p!n`9Ej0MOG(6C)2^ z3cu4Wgr-zYEpGp}i`ymadA33+F}oH?zOl}wa3XoR)5yC}BZK{FeAL$dw|Gxhe!c*l z?r2KLx+42XTzKY?Q4UlV`DmEeW2H`VK&3!GlIJ6Px*F&nxvvdGD;kZ#)jK(_{B61_ z5_#@i6Yb@;>!0oQmmvqi|n$@+40D_FckT#WUmv`|7X9Z<=#JEuF(+u8DL6w+QdZ zvgQ$N*>?ZckqP!55d-~(jneoElxoAf@zqfay6p2pArpp}z zAC~uzAD-!OJta_10@%Fr0=_;<3p@nT0)weCF5*IEk`q!jXE)9e!gbtHe>RlfPfn=(5bE~5(;e!tZ8!}rR7pe0(EY(!Zhud>5&s~UqFw}cG+PsJ1+J68@ zJq~s&PKkXnOTP$f$#J*vGL64IYxrkXirl)&T~;u7$1w7E%r#LX`GmiR%()^0wVw2D zn%{cyF!b2tY=~p7(XQh9MD$5-jTU?>8ISGiH*QJRL zJ|gBJ0k=9`S7{^T;@6|fSkH*5O9 zIX0GoFE94Uo)%aWh7X^1sHL%cV-M_P*-ink6V$q0h#zs0f4(v1RXpQ_B~A`I`X3um z8G0;Q1{PmGv(lcCI3o8HhgI0crl;4ucZqzjzgV|3J6oFK?f5i-TtnJXx69~#)ZMz3 zI`kUO!0}WQwl6(YT3xco7crP7er;VM259~>z$gl|2wfM)SS5byKqGTtPMS)5?f)Se zDsJ!^2u@Ty@hbf01SiD4Y)$aniXI&wcDXT{-G#!xZele$`Fz~Gm0;M#u_wS2l9 z1|#lMPK)mIMlEtsTDuuBJZ=&A)88C7HVD+fnb2)kI-6gso2&W3Y|{~V{y(N`sKY$! zJd)nWxsF-oc#C@f(FPRRK~u$|XuBn7M8{)(+|{b>byiED zM${#4W{!PMZ(juG7o)(Gk{a&^iLC!jw>cjJyfXOiUAfaDUIzCAwV;>@%4g4_XeQE$ zyf9bbt5ZXsi?YdjSh;O3yTiqz!Crf^R7NoB&Xx;W|D)Ikf(iS{I&5TJJ{@VX`KVR~b4-vL#j@|D)nDE;LA{qAr>$V>#~q z=@&lX7+`GX0ENrQ$h0>`&R+|icRh(h@N`yre!xFB0EmF6Loodu=6;%e?S5*!TAhF9 z-Y2`#ibNOGVI1GK1hhaH^lV;VqYC8Y*gT)L#%~|UEjn{Uc(l8j-f3leK56!G&wLHv zr4h8#t*#)fNar?cL#Aq~i5TsZPl){p+7BA1d*=RWs`FONoox;LG&sWp5!QPz{KXt| z#+Mv@pLR_=lpVnsE8Y97bfL4|p0vhPy1>6Kb5P*nh*JlvhH%TJI8fX}*?IST@dC_LH) z?Ux!2cosHBkdPXD-x=ldG4sVSTWO%~vL!j2EO7-oy?#&ALCO1_5u^`&@A7f+booN#+3# zI9ES$yE#NKzd!3=Izb0v@UJCsS8M$Ach?>qF)k&9x|9@{=QqWf!13{aNZZFcsxVD|XDlrGr6y-oO3r9tGjW8n4q<{xK4$14 zel@w1Np*IZ!rwg#_Klc27$+1$i7FlmpZL=r) zaJB3q<&7&^LV3mjgJR9J^!dfVY@4`lIk+jcWvVIt!Wi=HaWqZ|&Ko)3#&G$WCt{`e iF#f-jZVT#QG|utqfSRlZZU^A$P?S~sRQ=I3 Date: Tue, 28 Jun 2016 13:01:51 -0700 Subject: [PATCH 136/516] Add failing spec for no specified storage keys --- spec/api-browser-window-spec.js | 7 +++++-- spec/fixtures/devtools-extensions/foo/index.html | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index 25b852946f..b7b647e1c4 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -1025,7 +1025,7 @@ describe('browser-window module', function () { }, /Unexpected token }/) }) - describe('when the devtools is docked', function () { + describe.only('when the devtools is docked', function () { it('creates the extension', function (done) { w.webContents.openDevTools({mode: 'bottom'}) @@ -1033,7 +1033,10 @@ describe('browser-window module', function () { assert.equal(message.runtimeId, 'foo') assert.equal(message.tabId, w.webContents.id) assert.equal(message.i18nString, 'foo - bar (baz)') - assert.deepEqual(message.storageItems, {foo: 'bar'}) + assert.deepEqual(message.storageItems, { + local: {hello: 'world'}, + sync: {foo: 'bar'} + }) done() }) }) diff --git a/spec/fixtures/devtools-extensions/foo/index.html b/spec/fixtures/devtools-extensions/foo/index.html index b10288227a..70db43a37c 100644 --- a/spec/fixtures/devtools-extensions/foo/index.html +++ b/spec/fixtures/devtools-extensions/foo/index.html @@ -6,16 +6,25 @@ ' diff --git a/spec/api-session-spec.js b/spec/api-session-spec.js index 44f8878dd7..1adb2ed229 100644 --- a/spec/api-session-spec.js +++ b/spec/api-session-spec.js @@ -285,7 +285,7 @@ describe('session module', function () { const protocolName = 'sp' const partitionProtocol = session.fromPartition(partitionName).protocol const protocol = session.defaultSession.protocol - const handler = function (error, callback) { + const handler = function (_, callback) { callback({data: 'test', mimeType: 'text/html'}) } @@ -298,7 +298,7 @@ describe('session module', function () { } }) partitionProtocol.registerStringProtocol(protocolName, handler, function (error) { - done(error ? error : undefined) + done(error != null ? error : undefined) }) }) diff --git a/spec/api-system-preferences-spec.js b/spec/api-system-preferences-spec.js index 333c4dbacb..be7009ae6b 100644 --- a/spec/api-system-preferences-spec.js +++ b/spec/api-system-preferences-spec.js @@ -18,5 +18,4 @@ describe('systemPreferences module', function () { assert(languages.length > 0) }) }) - }) diff --git a/spec/api-web-request-spec.js b/spec/api-web-request-spec.js index 211c69a147..7b1c1556ec 100644 --- a/spec/api-web-request-spec.js +++ b/spec/api-web-request-spec.js @@ -7,7 +7,7 @@ const session = remote.session describe('webRequest module', function () { var ses = session.defaultSession var server = http.createServer(function (req, res) { - if (req.url == '/serverRedirect') { + if (req.url === '/serverRedirect') { res.statusCode = 301 res.setHeader('Location', 'http://' + req.rawHeaders[1]) res.end() @@ -308,7 +308,7 @@ describe('webRequest module', function () { ses.webRequest.onHeadersReceived(function (details, callback) { var responseHeaders = details.responseHeaders callback({ - responseHeaders: responseHeaders, + responseHeaders: responseHeaders }) }) $.ajax({ @@ -328,7 +328,7 @@ describe('webRequest module', function () { var responseHeaders = details.responseHeaders callback({ responseHeaders: responseHeaders, - statusLine: "HTTP/1.1 404 Not Found" + statusLine: 'HTTP/1.1 404 Not Found' }) }) $.ajax({ diff --git a/spec/asar-spec.js b/spec/asar-spec.js index ac0779d2f2..376e5ef080 100644 --- a/spec/asar-spec.js +++ b/spec/asar-spec.js @@ -1,5 +1,5 @@ const assert = require('assert') -const child_process = require('child_process') +const ChildProcess = require('child_process') const fs = require('fs') const path = require('path') @@ -536,7 +536,7 @@ describe('asar package', function () { describe('child_process.fork', function () { it('opens a normal js file', function (done) { - var child = child_process.fork(path.join(fixtures, 'asar', 'a.asar', 'ping.js')) + var child = ChildProcess.fork(path.join(fixtures, 'asar', 'a.asar', 'ping.js')) child.on('message', function (msg) { assert.equal(msg, 'message') done() @@ -546,7 +546,7 @@ describe('asar package', function () { it('supports asar in the forked js', function (done) { var file = path.join(fixtures, 'asar', 'a.asar', 'file1') - var child = child_process.fork(path.join(fixtures, 'module', 'asar.js')) + var child = ChildProcess.fork(path.join(fixtures, 'module', 'asar.js')) child.on('message', function (content) { assert.equal(content, fs.readFileSync(file).toString()) done() @@ -556,11 +556,10 @@ describe('asar package', function () { }) describe('child_process.exec', function () { - var child_process = require('child_process'); var echo = path.join(fixtures, 'asar', 'echo.asar', 'echo') it('should not try to extract the command if there is a reference to a file inside an .asar', function (done) { - child_process.exec('echo ' + echo + ' foo bar', function (error, stdout) { + ChildProcess.exec('echo ' + echo + ' foo bar', function (error, stdout) { assert.equal(error, null) assert.equal(stdout.toString().replace(/\r/g, ''), echo + ' foo bar\n') done() @@ -569,24 +568,22 @@ describe('asar package', function () { }) describe('child_process.execSync', function () { - var child_process = require('child_process'); var echo = path.join(fixtures, 'asar', 'echo.asar', 'echo') it('should not try to extract the command if there is a reference to a file inside an .asar', function (done) { - var stdout = child_process.execSync('echo ' + echo + ' foo bar') + var stdout = ChildProcess.execSync('echo ' + echo + ' foo bar') assert.equal(stdout.toString().replace(/\r/g, ''), echo + ' foo bar\n') done() }) }) describe('child_process.execFile', function () { - var echo, execFile, execFileSync, ref2 + var echo, execFile, execFileSync if (process.platform !== 'darwin') { return } - ref2 = require('child_process') - execFile = ref2.execFile - execFileSync = ref2.execFileSync + execFile = ChildProcess.execFile + execFileSync = ChildProcess.execFileSync echo = path.join(fixtures, 'asar', 'echo.asar', 'echo') it('executes binaries', function (done) { @@ -785,7 +782,7 @@ describe('asar package', function () { }) it('is available in forked scripts', function (done) { - var child = child_process.fork(path.join(fixtures, 'module', 'original-fs.js')) + var child = ChildProcess.fork(path.join(fixtures, 'module', 'original-fs.js')) child.on('message', function (msg) { assert.equal(msg, 'object') done() diff --git a/spec/chromium-spec.js b/spec/chromium-spec.js index 68836fb927..e682773c43 100644 --- a/spec/chromium-spec.js +++ b/spec/chromium-spec.js @@ -235,10 +235,11 @@ describe('chromium feature', function () { it('defines a window.location getter', function (done) { var b, targetURL - if (process.platform == 'win32') + if (process.platform === 'win32') { targetURL = 'file:///' + fixtures.replace(/\\/g, '/') + '/pages/base-page.html' - else + } else { targetURL = 'file://' + fixtures + '/pages/base-page.html' + } b = window.open(targetURL) webContents.fromId(b.guestId).once('did-finish-load', function () { assert.equal(b.location, targetURL) diff --git a/spec/fixtures/api/relaunch/main.js b/spec/fixtures/api/relaunch/main.js index 74cafc6f0d..27a1e07efa 100644 --- a/spec/fixtures/api/relaunch/main.js +++ b/spec/fixtures/api/relaunch/main.js @@ -1,9 +1,7 @@ -const {app, dialog} = require('electron') +const {app} = require('electron') const net = require('net') -const socketPath = process.platform === 'win32' ? - '\\\\.\\pipe\\electron-app-relaunch' : - '/tmp/electron-app-relaunch' +const socketPath = process.platform === 'win32' ? '\\\\.\\pipe\\electron-app-relaunch' : '/tmp/electron-app-relaunch' process.on('uncaughtException', () => { app.exit(1) diff --git a/spec/node-spec.js b/spec/node-spec.js index 93905b49d7..19375008ab 100644 --- a/spec/node-spec.js +++ b/spec/node-spec.js @@ -1,5 +1,5 @@ const assert = require('assert') -const child_process = require('child_process') +const ChildProcess = require('child_process') const fs = require('fs') const path = require('path') const os = require('os') @@ -13,7 +13,7 @@ describe('node feature', function () { describe('child_process', function () { describe('child_process.fork', function () { it('works in current process', function (done) { - var child = child_process.fork(path.join(fixtures, 'module', 'ping.js')) + var child = ChildProcess.fork(path.join(fixtures, 'module', 'ping.js')) child.on('message', function (msg) { assert.equal(msg, 'message') done() @@ -23,7 +23,7 @@ describe('node feature', function () { it('preserves args', function (done) { var args = ['--expose_gc', '-test', '1'] - var child = child_process.fork(path.join(fixtures, 'module', 'process_args.js'), args) + var child = ChildProcess.fork(path.join(fixtures, 'module', 'process_args.js'), args) child.on('message', function (msg) { assert.deepEqual(args, msg.slice(2)) done() @@ -32,7 +32,7 @@ describe('node feature', function () { }) it('works in forked process', function (done) { - var child = child_process.fork(path.join(fixtures, 'module', 'fork_ping.js')) + var child = ChildProcess.fork(path.join(fixtures, 'module', 'fork_ping.js')) child.on('message', function (msg) { assert.equal(msg, 'message') done() @@ -41,7 +41,7 @@ describe('node feature', function () { }) it('works in forked process when options.env is specifed', function (done) { - var child = child_process.fork(path.join(fixtures, 'module', 'fork_ping.js'), [], { + var child = ChildProcess.fork(path.join(fixtures, 'module', 'fork_ping.js'), [], { path: process.env['PATH'] }) child.on('message', function (msg) { @@ -62,7 +62,7 @@ describe('node feature', function () { }) it('has String::localeCompare working in script', function (done) { - var child = child_process.fork(path.join(fixtures, 'module', 'locale-compare.js')) + var child = ChildProcess.fork(path.join(fixtures, 'module', 'locale-compare.js')) child.on('message', function (msg) { assert.deepEqual(msg, [0, -1, 1]) done() @@ -71,7 +71,7 @@ describe('node feature', function () { }) it('has setImmediate working in script', function (done) { - var child = child_process.fork(path.join(fixtures, 'module', 'set-immediate.js')) + var child = ChildProcess.fork(path.join(fixtures, 'module', 'set-immediate.js')) child.on('message', function (msg) { assert.equal(msg, 'ok') done() @@ -80,7 +80,7 @@ describe('node feature', function () { }) it('pipes stdio', function (done) { - let child = child_process.fork(path.join(fixtures, 'module', 'process-stdout.js'), {silent: true}) + let child = ChildProcess.fork(path.join(fixtures, 'module', 'process-stdout.js'), {silent: true}) let data = '' child.stdout.on('data', (chunk) => { data += String(chunk) @@ -183,7 +183,7 @@ describe('node feature', function () { it('emit error when connect to a socket path without listeners', function (done) { var socketPath = path.join(os.tmpdir(), 'atom-shell-test.sock') var script = path.join(fixtures, 'module', 'create_socket.js') - var child = child_process.fork(script, [socketPath]) + var child = ChildProcess.fork(script, [socketPath]) child.on('exit', function (code) { assert.equal(code, 0) var client = require('net').connect(socketPath) @@ -213,8 +213,10 @@ describe('node feature', function () { }) it('does not crash when creating large Buffers', function () { - new Buffer(new Array(4096).join(' ')); - new Buffer(new Array(4097).join(' ')); + var buffer = new Buffer(new Array(4096).join(' ')) + assert.equal(buffer.length, 4096) + buffer = new Buffer(new Array(4097).join(' ')) + assert.equal(buffer.length, 4097) }) }) diff --git a/spec/static/main.js b/spec/static/main.js index 33c3bb4813..5104a0f252 100644 --- a/spec/static/main.js +++ b/spec/static/main.js @@ -95,7 +95,7 @@ app.on('ready', function () { width: 800, height: 600, webPreferences: { - backgroundThrottling: false, + backgroundThrottling: false } }) window.loadURL(url.format({ @@ -119,9 +119,9 @@ app.on('ready', function () { // For session's download test, listen 'will-download' event in browser, and // reply the result to renderer for verifying var downloadFilePath = path.join(__dirname, '..', 'fixtures', 'mock.pdf') - ipcMain.on('set-download-option', function (event, need_cancel, prevent_default) { + ipcMain.on('set-download-option', function (event, needCancel, preventDefault) { window.webContents.session.once('will-download', function (e, item) { - if (prevent_default) { + if (preventDefault) { e.preventDefault() const url = item.getURL() const filename = item.getFilename() @@ -144,7 +144,7 @@ app.on('ready', function () { item.getContentDisposition(), item.getFilename()) }) - if (need_cancel) item.cancel() + if (needCancel) item.cancel() } }) event.returnValue = 'done' diff --git a/spec/webview-spec.js b/spec/webview-spec.js index be0271e85a..8e4779d809 100644 --- a/spec/webview-spec.js +++ b/spec/webview-spec.js @@ -40,7 +40,7 @@ describe(' tag', function () { webPreferences: { nodeIntegration: false, preload: path.join(fixtures, 'module', 'preload-webview.js') - }, + } }) ipcMain.once('webview', function (event, type) { if (type === 'undefined') { @@ -776,13 +776,12 @@ describe(' tag', function () { }) describe('permission-request event', function () { - function setUpRequestHandler (webview, requested_permission, completed) { + function setUpRequestHandler (webview, requestedPermission, completed) { var listener = function (webContents, permission, callback) { if (webContents.getId() === webview.getId()) { - assert.equal(permission, requested_permission) + assert.equal(permission, requestedPermission) callback(false) - if (completed) - completed() + if (completed) completed() } } session.fromPartition(webview.partition).setPermissionRequestHandler(listener) @@ -855,7 +854,7 @@ describe(' tag', function () { 'did-get-response-details.html': 'mainFrame', 'logo.png': 'image' } - var responses = 0; + var responses = 0 webview.addEventListener('did-get-response-details', function (event) { responses++ var fileName = event.newURL.slice(event.newURL.lastIndexOf('/') + 1) From 8b35814d108706196957aaf230505cfa892039a2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 29 Jun 2016 09:42:12 -0700 Subject: [PATCH 148/516] :art: --- spec/api-browser-window-spec.js | 4 ++-- spec/api-session-spec.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index 588ff9023a..2bc55484db 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -1004,7 +1004,7 @@ describe('browser-window module', function () { var lastPanelId = WebInspector.inspectorView._tabbedPane._tabs.peekLast().id WebInspector.inspectorView.showPanel(lastPanelId) } - w.devToolsWebContents.executeJavaScript('(' + showLastPanel.toString() + ')()') + w.devToolsWebContents.executeJavaScript(`(${showLastPanel})()`) } else { clearInterval(showPanelIntevalId) } @@ -1080,7 +1080,7 @@ describe('browser-window module', function () { var lastPanelId = WebInspector.inspectorView._tabbedPane._tabs.peekLast().id WebInspector.inspectorView.showPanel(lastPanelId) } - w.devToolsWebContents.executeJavaScript('(' + showLastPanel.toString() + ')()') + w.devToolsWebContents.executeJavaScript(`(${showLastPanel})()`) } else { clearInterval(showPanelIntevalId) } diff --git a/spec/api-session-spec.js b/spec/api-session-spec.js index 1adb2ed229..a7af6d7bdb 100644 --- a/spec/api-session-spec.js +++ b/spec/api-session-spec.js @@ -285,7 +285,7 @@ describe('session module', function () { const protocolName = 'sp' const partitionProtocol = session.fromPartition(partitionName).protocol const protocol = session.defaultSession.protocol - const handler = function (_, callback) { + const handler = function (ignoredError, callback) { callback({data: 'test', mimeType: 'text/html'}) } From 03497fb984636ca3f7155468202422e0c4e4341d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 29 Jun 2016 09:44:38 -0700 Subject: [PATCH 149/516] Update buffer length asserts --- spec/node-spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/node-spec.js b/spec/node-spec.js index 19375008ab..9382c4c915 100644 --- a/spec/node-spec.js +++ b/spec/node-spec.js @@ -214,9 +214,9 @@ describe('node feature', function () { it('does not crash when creating large Buffers', function () { var buffer = new Buffer(new Array(4096).join(' ')) - assert.equal(buffer.length, 4096) + assert.equal(buffer.length, 4095) buffer = new Buffer(new Array(4097).join(' ')) - assert.equal(buffer.length, 4097) + assert.equal(buffer.length, 4096) }) }) From 4a40369b6d0e5e80641e6ab9d193dad8e12c7c34 Mon Sep 17 00:00:00 2001 From: Plusb Preco Date: Thu, 30 Jun 2016 02:50:41 +0900 Subject: [PATCH 150/516] :memo: Update Korean docs as upstream [ci skip] --- docs-translations/ko-KR/api/browser-window.md | 6 +++--- docs-translations/ko-KR/api/clipboard.md | 7 +++---- docs-translations/ko-KR/api/session.md | 12 ++++++------ docs-translations/ko-KR/api/tray.md | 2 +- docs-translations/ko-KR/api/web-contents.md | 7 +++---- docs-translations/ko-KR/styleguide.md | 6 +++--- 6 files changed, 19 insertions(+), 21 deletions(-) diff --git a/docs-translations/ko-KR/api/browser-window.md b/docs-translations/ko-KR/api/browser-window.md index e303a0c308..7adbc08a72 100644 --- a/docs-translations/ko-KR/api/browser-window.md +++ b/docs-translations/ko-KR/api/browser-window.md @@ -997,10 +997,10 @@ Linux 플랫폼에선 Unity 데스크톱 환경만 지원합니다. 그리고 ### `win.setContentProtection(enable)` _macOS_ _Windows_ -Prevents the window contents from being captured by other apps. +윈도우 콘텐츠가 외부 어플리케이션에 의해 캡쳐되는 것을 막습니다. -On macOS it sets the NSWindow's sharingType to NSWindowSharingNone. -On Windows it calls SetWindowDisplayAffinity with WDA_MONITOR. +macOS에선 NSWindow의 sharingType을 NSWindowSharingNone로 설정합니다. +Windows에선 WDA_MONITOR와 함께 SetWindowDisplayAffinity를 호출합니다. ### `win.setFocusable(focusable)` _Windows_ diff --git a/docs-translations/ko-KR/api/clipboard.md b/docs-translations/ko-KR/api/clipboard.md index de0807cb20..6536bf922b 100644 --- a/docs-translations/ko-KR/api/clipboard.md +++ b/docs-translations/ko-KR/api/clipboard.md @@ -78,9 +78,8 @@ console.log(clipboard.readText('selection')); ### `clipboard.readBookmark()` _macOS_ _Windows_ -Returns an Object containing `title` and `url` keys representing the bookmark in -the clipboard. The `title` and `url` values will be empty strings when the -bookmark is unavailable. +클립보드로부터 북마크 형식으로 표현된 `title`와 `url` 키를 담은 객체를 반환합니다. +`title`과 `url` 값들은 북마크를 사용할 수 없을 때 빈 문자열을 포함합니다. ### `clipboard.writeBookmark(title, url[, type])` _macOS_ _Windows_ @@ -88,7 +87,7 @@ bookmark is unavailable. * `url` String * `type` String (optional) -Writes the `title` and `url` into the clipboard as a bookmark. +`title`과 `url`을 클립보드에 북마크 형식으로 씁니다. ### `clipboard.clear([type])` diff --git a/docs-translations/ko-KR/api/session.md b/docs-translations/ko-KR/api/session.md index d685b6c569..c2e3ca923d 100644 --- a/docs-translations/ko-KR/api/session.md +++ b/docs-translations/ko-KR/api/session.md @@ -344,17 +344,17 @@ session.defaultSession.allowNTLMCredentialsForDomains('*') * `userAgent` String * `acceptLanguages` String (optional) -Overrides the `userAgent` and `acceptLanguages` for this session. +현재 세션에 대해 `userAgent`와 `acceptLanguages`를 덮어씁니다. -The `acceptLanguages` must a comma separated ordered list of language codes, for -example `"en-US,fr,de,ko,zh-CN,ja"`. +`acceptLanguages`는 반드시 쉼표로 구분된 순서에 맞춘 언어 코드의 리스트여야 하며 +예를 들면 `"en-US,fr,de,ko,zh-CN,ja"` 입니다. -This doesn't affect existing `WebContents`, and each `WebContents` can use -`webContents.setUserAgent` to override the session-wide user agent. +이는 현재 존재하는 `WebContents`에 적용되지 않으며 각 `WebContents`는 +`webContents.setUserAgent`를 사용하여 세션 전체의 유저 에이전트를 덮어쓸 수 있습니다. #### `ses.getUserAgent()` -Returns a `String` representing the user agent for this session. +현재 세션에 대한 유저 에이전트를 표현하는 `String`을 반환합니다. #### `ses.webRequest` diff --git a/docs-translations/ko-KR/api/tray.md b/docs-translations/ko-KR/api/tray.md index 06862cada2..46f790cd76 100644 --- a/docs-translations/ko-KR/api/tray.md +++ b/docs-translations/ko-KR/api/tray.md @@ -202,7 +202,7 @@ appIcon.setContextMenu(contextMenu) ### `tray.getBounds()` _macOS_ _Windows_ -Returns the `bounds` of this tray icon as `Object`. +이 트레이 아이콘의 `bounds`를 `Object` 형식으로 반환합니다. * `bounds` Object * `x` Integer diff --git a/docs-translations/ko-KR/api/web-contents.md b/docs-translations/ko-KR/api/web-contents.md index 87fe9ebd42..ba53f3dbd8 100644 --- a/docs-translations/ko-KR/api/web-contents.md +++ b/docs-translations/ko-KR/api/web-contents.md @@ -921,10 +921,9 @@ Input `event`를 웹 페이지로 전송합니다. 프로세서에선 little-endian 방식을 사용하므로 위의 포맷을 그대로 표현합니다. 하지만 몇몇 프로세서는 big-endian 방식을 사용하는데, 이 경우 32비트 ARGB 포맷을 사용합니다) -The `dirtyRect` is an object with `x, y, width, height` properties that -describes which part of the page was repainted. If `onlyDirty` is set to -`true`, `frameBuffer` will only contain the repainted area. `onlyDirty` -defaults to `false`. +`dirtyRect`는 페이지의 어떤 부분이 다시 그려졌는지를 표현하는 `x, y, width, height` +속성을 포함하는 객체입니다. 만약 `onlyDirty`가 `true`로 지정되어 있으면, +`frameBuffer`가 다시 그려진 부분만 포함합니다. `onlyDirty`의 기본값은 `false`입니다. ### `webContents.endFrameSubscription()` diff --git a/docs-translations/ko-KR/styleguide.md b/docs-translations/ko-KR/styleguide.md index cc1e76766b..584d3245bd 100644 --- a/docs-translations/ko-KR/styleguide.md +++ b/docs-translations/ko-KR/styleguide.md @@ -71,9 +71,9 @@ Electron 문서 구조를 이해하는 데 참고할 수 있는 유용한 도움 와 같은 일반적으로 쓰이는 타입 중 하나를 받거나 Electron의 [`webContent`](api/web-content.md) 같은 커스텀 타입을 받습니다. -If an argument is unique to certain platforms, those platforms are denoted -using a space-delimited italicized list following the datatype. Values can be -`OS X`, `Windows`, or `Linux`. +만약 인수가 특정 플랫폼에 대해서만 적용된다면, 해당하는 플랫폼들을 공백-구분된 이텔릭체 +리스트를 데이터 타입 뒤에 표기합니다. 값은 `OS X`, `Windows` 또는 `Linux`가 될 수 +있습니다. ``` * `animate` Boolean (optional) _OS X_ _Windows_ From b22ce934775537c18a953f40efb7a9526df285fe Mon Sep 17 00:00:00 2001 From: Jonas Schwabe Date: Sun, 26 Jun 2016 01:55:24 +0200 Subject: [PATCH 151/516] Implement libunity launcher badge counter to be set via electron, fixes #4193 --- atom/browser/api/atom_api_app.cc | 10 ++++++++++ atom/browser/browser.h | 11 ++++++++++- atom/browser/browser_linux.cc | 14 ++++++++++++++ lib/browser/api/app.js | 7 +++++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index 265ed8f36b..ce6a7d33c6 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -614,6 +614,16 @@ void Initialize(v8::Local exports, v8::Local unused, dict.SetMethod("dockSetMenu", &DockSetMenu); dict.SetMethod("dockSetIcon", base::Bind(&Browser::DockSetIcon, browser)); #endif + +#if defined(OS_LINUX) + auto browser = base::Unretained(Browser::Get()); + dict.SetMethod("unityLauncherAvailable", + base::Bind(&Browser::UnityLauncherAvailable, browser)); + dict.SetMethod("unityLauncherSetBadgeCount", + base::Bind(&Browser::UnityLauncherSetBadgeCount, browser)); + dict.SetMethod("unityLauncherGetBadgeCount", + base::Bind(&Browser::UnityLauncherGetBadgeCount, browser)); +#endif } } // namespace diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 2c16780830..601f40044b 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -149,7 +149,14 @@ class Browser : public WindowListObserver { // one from app's name. // The returned string managed by Browser, and should not be modified. PCWSTR GetAppUserModelID(); -#endif +#endif // defined(OS_WIN) + +#if defined(OS_LINUX) + // Set/Get unity dock's badge counter. + bool UnityLauncherAvailable(); + void UnityLauncherSetBadgeCount(int count); + int UnityLauncherGetBadgeCount(); +#endif // defined(OS_LINUX) // Tell the application to open a file. bool OpenFile(const std::string& file_path); @@ -216,6 +223,8 @@ class Browser : public WindowListObserver { std::string version_override_; std::string name_override_; + int current_badge_count_ = 0; + #if defined(OS_WIN) base::string16 app_user_model_id_; #endif diff --git a/atom/browser/browser_linux.cc b/atom/browser/browser_linux.cc index d994bb4109..668da66180 100644 --- a/atom/browser/browser_linux.cc +++ b/atom/browser/browser_linux.cc @@ -10,6 +10,7 @@ #include "atom/browser/window_list.h" #include "atom/common/atom_version.h" #include "brightray/common/application_info.h" +#include "chrome/browser/ui/libgtk2ui/unity_service.h" namespace atom { @@ -54,4 +55,17 @@ std::string Browser::GetExecutableFileProductName() const { return brightray::GetApplicationName(); } +bool Browser::UnityLauncherAvailable() { + return unity::IsRunning(); +} + +void Browser::UnityLauncherSetBadgeCount(int count) { + current_badge_count_ = count; + unity::SetDownloadCount(count); +} + +int Browser::UnityLauncherGetBadgeCount() { + return current_badge_count_; +} + } // namespace atom diff --git a/lib/browser/api/app.js b/lib/browser/api/app.js index 34210f4209..1fd972c57c 100644 --- a/lib/browser/api/app.js +++ b/lib/browser/api/app.js @@ -45,6 +45,13 @@ if (process.platform === 'darwin') { } } +if (process.platform === 'linux' && bindings.unityLauncherAvailable()) { + app.unityLauncher = { + setBadgeCount: bindings.unityLauncherSetBadgeCount, + getBadgeCount: bindings.unityLauncherGetBadgeCount + }; +} + app.allowNTLMCredentialsForAllDomains = function (allow) { if (!process.noDeprecations) { deprecate.warn('app.allowNTLMCredentialsForAllDomains', 'session.allowNTLMCredentialsForDomains') From e3ba6818af8a649e868c1d604aef00f6cd0b4bd9 Mon Sep 17 00:00:00 2001 From: Jonas Schwabe Date: Sun, 26 Jun 2016 02:00:41 +0200 Subject: [PATCH 152/516] Fix linter errors --- atom/browser/browser.h | 4 ++-- lib/browser/api/app.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 601f40044b..739a9f5eb0 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -149,14 +149,14 @@ class Browser : public WindowListObserver { // one from app's name. // The returned string managed by Browser, and should not be modified. PCWSTR GetAppUserModelID(); -#endif // defined(OS_WIN) +#endif // defined(OS_WIN) #if defined(OS_LINUX) // Set/Get unity dock's badge counter. bool UnityLauncherAvailable(); void UnityLauncherSetBadgeCount(int count); int UnityLauncherGetBadgeCount(); -#endif // defined(OS_LINUX) +#endif // defined(OS_LINUX) // Tell the application to open a file. bool OpenFile(const std::string& file_path); diff --git a/lib/browser/api/app.js b/lib/browser/api/app.js index 1fd972c57c..602a7a0df5 100644 --- a/lib/browser/api/app.js +++ b/lib/browser/api/app.js @@ -49,7 +49,7 @@ if (process.platform === 'linux' && bindings.unityLauncherAvailable()) { app.unityLauncher = { setBadgeCount: bindings.unityLauncherSetBadgeCount, getBadgeCount: bindings.unityLauncherGetBadgeCount - }; + } } app.allowNTLMCredentialsForAllDomains = function (allow) { From 336a55cb23502b89dc3cdcdca914bb2fb935e170 Mon Sep 17 00:00:00 2001 From: Jonas Schwabe Date: Sun, 26 Jun 2016 02:10:27 +0200 Subject: [PATCH 153/516] :memo: docs for unity launcher badge api --- docs/api/app.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/api/app.md b/docs/api/app.md index c014395eb1..777f31551f 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -647,6 +647,17 @@ Sets the application's [dock menu][dock-menu]. Sets the `image` associated with this dock icon. +### `app.unityLauncher.setBadgeCount(count)` _Ubuntu Unity_ +* `count` Integer + +Sets the number to be displayed next to the app icon in the unity launcher. +Setting count to `0` will hide the badge. + +### `app.unityLauncher.getBadgeCount(count)` _Ubuntu Unity_ + +Returns the current value displayed in the counter badge next to the launcher icon. + + [dock-menu]:https://developer.apple.com/library/mac/documentation/Carbon/Conceptual/customizing_docktile/concepts/dockconcepts.html#//apple_ref/doc/uid/TP30000986-CH2-TPXREF103 [tasks]:http://msdn.microsoft.com/en-us/library/windows/desktop/dd378460(v=vs.85).aspx#tasks [app-user-model-id]: https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx From e2d389fbd45510b424ea178abd22add8747b0d4c Mon Sep 17 00:00:00 2001 From: Jonas Schwabe Date: Sun, 26 Jun 2016 11:48:58 +0200 Subject: [PATCH 154/516] Rename the unityLauncher api to launcher and make it available on linux in general. + Document it only works on ubuntu --- atom/browser/browser_linux.cc | 6 ++++-- docs/api/app.md | 14 ++++++++++++-- lib/browser/api/app.js | 7 ++++--- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/atom/browser/browser_linux.cc b/atom/browser/browser_linux.cc index 668da66180..8e41ec8c19 100644 --- a/atom/browser/browser_linux.cc +++ b/atom/browser/browser_linux.cc @@ -60,8 +60,10 @@ bool Browser::UnityLauncherAvailable() { } void Browser::UnityLauncherSetBadgeCount(int count) { - current_badge_count_ = count; - unity::SetDownloadCount(count); + if (UnityLauncherAvailable()) { + current_badge_count_ = count; + unity::SetDownloadCount(count); + } } int Browser::UnityLauncherGetBadgeCount() { diff --git a/docs/api/app.md b/docs/api/app.md index 777f31551f..da14a50445 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -647,16 +647,26 @@ Sets the application's [dock menu][dock-menu]. Sets the `image` associated with this dock icon. -### `app.unityLauncher.setBadgeCount(count)` _Ubuntu Unity_ +### `app.launcher.setBadgeCount(count)` _Linux_ * `count` Integer Sets the number to be displayed next to the app icon in the unity launcher. Setting count to `0` will hide the badge. -### `app.unityLauncher.getBadgeCount(count)` _Ubuntu Unity_ +**Note:** This feature is currently only supported on Ubuntu Unity. Calling this function has no effect, when the application is running in a different environment. + +**Note:** you need to specify the .desktop file name to the desktopName field in package.json. By default, it will assume app.getName().desktop in packaged apps. + +### `app.launcher.getBadgeCount(count)` _Linux_ Returns the current value displayed in the counter badge next to the launcher icon. +**Note:** As `setBadgeCount` only supports Ubuntu Unity, the value will be 0 when the application is running in a different environment. + +### `app.launcher.isCounterBadgeAvailable()` _Linux_ + +This method checks if the current desktop environment supports an app icon counter badge and returns `true` in this case. + [dock-menu]:https://developer.apple.com/library/mac/documentation/Carbon/Conceptual/customizing_docktile/concepts/dockconcepts.html#//apple_ref/doc/uid/TP30000986-CH2-TPXREF103 [tasks]:http://msdn.microsoft.com/en-us/library/windows/desktop/dd378460(v=vs.85).aspx#tasks diff --git a/lib/browser/api/app.js b/lib/browser/api/app.js index 602a7a0df5..466d2dd791 100644 --- a/lib/browser/api/app.js +++ b/lib/browser/api/app.js @@ -45,10 +45,11 @@ if (process.platform === 'darwin') { } } -if (process.platform === 'linux' && bindings.unityLauncherAvailable()) { - app.unityLauncher = { +if (process.platform === 'linux') { + app.launcher = { setBadgeCount: bindings.unityLauncherSetBadgeCount, - getBadgeCount: bindings.unityLauncherGetBadgeCount + getBadgeCount: bindings.unityLauncherGetBadgeCount, + isCounterBadgeAvailable: bindings.unityLauncherAvailable } } From 8ac205685d2cf2323bb5b72fd4ad37c2dd95b5ef Mon Sep 17 00:00:00 2001 From: Jonas Schwabe Date: Wed, 29 Jun 2016 19:23:00 +0200 Subject: [PATCH 155/516] Add ifdef for property, which should only be availabe on Linux --- atom/browser/browser.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 739a9f5eb0..c9155d94b4 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -223,7 +223,9 @@ class Browser : public WindowListObserver { std::string version_override_; std::string name_override_; +#if defined(OS_LINUX) int current_badge_count_ = 0; +#endif #if defined(OS_WIN) base::string16 app_user_model_id_; From 768ff7af5afb18a53479c6b0be32f01c0316a1c0 Mon Sep 17 00:00:00 2001 From: Jonas Schwabe Date: Wed, 29 Jun 2016 19:23:56 +0200 Subject: [PATCH 156/516] Add additional method isUnityRunning, fix multiple typos in docs --- docs/api/app.md | 14 +++++++++----- lib/browser/api/app.js | 3 ++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/api/app.md b/docs/api/app.md index da14a50445..260e64533b 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -650,19 +650,23 @@ Sets the `image` associated with this dock icon. ### `app.launcher.setBadgeCount(count)` _Linux_ * `count` Integer -Sets the number to be displayed next to the app icon in the unity launcher. -Setting count to `0` will hide the badge. +Sets the number to be displayed next to the app icon in the Unity launcher. +Setting the count to `0` will hide the badge. -**Note:** This feature is currently only supported on Ubuntu Unity. Calling this function has no effect, when the application is running in a different environment. +**Note:** This feature is currently only supported on Ubuntu Unity. Calling this function has no effect when the application is running in a different environment. -**Note:** you need to specify the .desktop file name to the desktopName field in package.json. By default, it will assume app.getName().desktop in packaged apps. +**Note:** You need to specify the .desktop file name to the `desktopName` field in package.json. By default, it will assume `app.getName().desktop` in packaged apps. -### `app.launcher.getBadgeCount(count)` _Linux_ +### `app.launcher.getBadgeCount()` _Linux_ Returns the current value displayed in the counter badge next to the launcher icon. **Note:** As `setBadgeCount` only supports Ubuntu Unity, the value will be 0 when the application is running in a different environment. +### `app.launcher.isUnityRunning()` _Linux_ + +This method checks if the current desktop environment is Unity and returns `true` in this case. + ### `app.launcher.isCounterBadgeAvailable()` _Linux_ This method checks if the current desktop environment supports an app icon counter badge and returns `true` in this case. diff --git a/lib/browser/api/app.js b/lib/browser/api/app.js index 466d2dd791..0ea788b94a 100644 --- a/lib/browser/api/app.js +++ b/lib/browser/api/app.js @@ -49,7 +49,8 @@ if (process.platform === 'linux') { app.launcher = { setBadgeCount: bindings.unityLauncherSetBadgeCount, getBadgeCount: bindings.unityLauncherGetBadgeCount, - isCounterBadgeAvailable: bindings.unityLauncherAvailable + isCounterBadgeAvailable: bindings.unityLauncherAvailable, + isUnityRunning: bindings.unityLauncherAvailable } } From 90048abd0ab6101392d7b659f14e8a175d525378 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 29 Jun 2016 11:22:50 -0700 Subject: [PATCH 157/516] Update renamed nativeImage APIs --- docs-translations/jp/api/native-image.md | 4 ++-- docs-translations/ko-KR/api/native-image.md | 4 ++-- docs-translations/zh-CN/api/native-image.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs-translations/jp/api/native-image.md b/docs-translations/jp/api/native-image.md index a819123707..1c0c2ff9c6 100644 --- a/docs-translations/jp/api/native-image.md +++ b/docs-translations/jp/api/native-image.md @@ -112,11 +112,11 @@ const nativeImage = require('electron').nativeImage; var image = nativeImage.createFromPath('/Users/somebody/images/icon.png'); ``` -### `image.toPng()` +### `image.toPNG()` `PNG`エンコードされた画像を含む[Buffer][buffer]を返します。 -### `image.toJpeg(quality)` +### `image.toJPEG(quality)` * `quality` Integer (**required**) - Between 0 - 100. diff --git a/docs-translations/ko-KR/api/native-image.md b/docs-translations/ko-KR/api/native-image.md index d44f000a1c..dfdc180b6c 100644 --- a/docs-translations/ko-KR/api/native-image.md +++ b/docs-translations/ko-KR/api/native-image.md @@ -125,11 +125,11 @@ let image = nativeImage.createFromPath('/Users/somebody/images/icon.png'); `nativeImage` 인스턴스 객체에서 사용할 수 있는 메서드입니다. -### `image.toPng()` +### `image.toPNG()` `PNG` 이미지를 인코딩한 데이터를 [Buffer][buffer]로 반환합니다. -### `image.toJpeg(quality)` +### `image.toJPEG(quality)` * `quality` Integer (**required**) 0 - 100 사이의 값 diff --git a/docs-translations/zh-CN/api/native-image.md b/docs-translations/zh-CN/api/native-image.md index aa544d07dc..fc5955cd21 100644 --- a/docs-translations/zh-CN/api/native-image.md +++ b/docs-translations/zh-CN/api/native-image.md @@ -107,11 +107,11 @@ const nativeImage = require('electron').nativeImage; var image = nativeImage.createFromPath('/Users/somebody/images/icon.png'); ``` -### `image.toPng()` +### `image.toPNG()` 返回一个 [Buffer][buffer] ,它包含了图片的 `PNG` 编码数据. -### `image.toJpeg(quality)` +### `image.toJPEG(quality)` * `quality` Integer (**必须**) - 在 0 - 100 之间. From 9aa8807f83ac3eb16d82552ed0ebfe509838164c Mon Sep 17 00:00:00 2001 From: Jonas Schwabe Date: Wed, 29 Jun 2016 19:47:20 +0200 Subject: [PATCH 158/516] add specs for app.launcher api fix linter errors --- spec/api-app-spec.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index 6cda0e11bc..214a084f2e 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -284,4 +284,37 @@ describe('app module', function () { }) }) }) + + describe('app.launcher API', function () { + it('should be available on linux', function () { + if (process.platform !== 'linux') { + assert.equal(app.launcher, undefined) + } else { + assert.notEqual(app.launcher, undefined) + } + }) + + it('should be possible to set a badge count on supported environments', function () { + if (process.platform === 'linux' && + app.launcher.isCounterBadgeAvailable()) { + app.launcher.setBadgeCount(42) + assert.equal(app.launcher.getBadgeCount(), 42) + } + }) + + it('should be possible to set a badge count on unity', function () { + if (process.platform === 'linux' && + app.launcher.isUnityRunning()) { + assert.equal(app.launcher.isCounterBadgeAvailable(), true) + } + }) + + it('should not be possible to set a badge counter on unsupported environments', function () { + if (process.platform === 'linux' && + !app.launcher.isCounterBadgeAvailable()) { + app.launcher.setBadgeCount(42) + assert.equal(app.launcher.getBadgeCount(), 0) + } + }) + }) }) From e797eb5ca31865eb36ad2065b8a8040b4ef223f6 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Jun 2016 15:10:32 -0700 Subject: [PATCH 159/516] Use set context menu when param is not specified --- atom/browser/ui/tray_icon_cocoa.mm | 2 +- atom/browser/ui/win/notify_icon.cc | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/atom/browser/ui/tray_icon_cocoa.mm b/atom/browser/ui/tray_icon_cocoa.mm index 8b25aa3540..2510d3160c 100644 --- a/atom/browser/ui/tray_icon_cocoa.mm +++ b/atom/browser/ui/tray_icon_cocoa.mm @@ -263,7 +263,7 @@ const CGFloat kVerticalTitleMargin = 2; } if (menuController_ && ![menuController_ isMenuOpen]) { - // Redraw the dray icon to show highlight if it is enabled. + // Redraw the tray icon to show highlight if it is enabled. [self setNeedsDisplay:YES]; [statusItem_ popUpStatusItemMenu:[menuController_ menu]]; // The popUpStatusItemMenu returns only after the showing menu is closed. diff --git a/atom/browser/ui/win/notify_icon.cc b/atom/browser/ui/win/notify_icon.cc index 0ccf46b832..a360c92cc4 100644 --- a/atom/browser/ui/win/notify_icon.cc +++ b/atom/browser/ui/win/notify_icon.cc @@ -134,8 +134,9 @@ void NotifyIcon::DisplayBalloon(HICON icon, void NotifyIcon::PopUpContextMenu(const gfx::Point& pos, ui::SimpleMenuModel* menu_model) { // Returns if context menu isn't set. - if (!menu_model) + if (!menu_model && !menu_model_) return; + // Set our window as the foreground window, so the context menu closes when // we click away from it. if (!SetForegroundWindow(window_)) @@ -147,7 +148,7 @@ void NotifyIcon::PopUpContextMenu(const gfx::Point& pos, rect.set_origin(gfx::Screen::GetScreen()->GetCursorScreenPoint()); views::MenuRunner menu_runner( - menu_model, + menu_model ? menu_model : menu_model_, views::MenuRunner::CONTEXT_MENU | views::MenuRunner::HAS_MNEMONICS); ignore_result(menu_runner.RunMenuAt( NULL, NULL, rect, views::MENU_ANCHOR_TOPLEFT, ui::MENU_SOURCE_MOUSE)); From 45dbbfdfe9799259da2bd3616a1f857bba885290 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Jun 2016 15:28:27 -0700 Subject: [PATCH 160/516] Use nullptr comparisons --- atom/browser/ui/win/notify_icon.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/atom/browser/ui/win/notify_icon.cc b/atom/browser/ui/win/notify_icon.cc index a360c92cc4..a82ac36c7a 100644 --- a/atom/browser/ui/win/notify_icon.cc +++ b/atom/browser/ui/win/notify_icon.cc @@ -134,7 +134,7 @@ void NotifyIcon::DisplayBalloon(HICON icon, void NotifyIcon::PopUpContextMenu(const gfx::Point& pos, ui::SimpleMenuModel* menu_model) { // Returns if context menu isn't set. - if (!menu_model && !menu_model_) + if (menu_model == nullptr && menu_model_ == nullptr) return; // Set our window as the foreground window, so the context menu closes when @@ -148,7 +148,7 @@ void NotifyIcon::PopUpContextMenu(const gfx::Point& pos, rect.set_origin(gfx::Screen::GetScreen()->GetCursorScreenPoint()); views::MenuRunner menu_runner( - menu_model ? menu_model : menu_model_, + menu_model != nullptr ? menu_model : menu_model_, views::MenuRunner::CONTEXT_MENU | views::MenuRunner::HAS_MNEMONICS); ignore_result(menu_runner.RunMenuAt( NULL, NULL, rect, views::MENU_ANCHOR_TOPLEFT, ui::MENU_SOURCE_MOUSE)); From 21f0e65735c7a20641b22b48fa35a827e09a70d3 Mon Sep 17 00:00:00 2001 From: Plusb Preco Date: Thu, 30 Jun 2016 11:32:14 +0900 Subject: [PATCH 161/516] :memo: Update Korean docs as upstream [ci skip] --- docs-translations/ko-KR/api/app.md | 27 ++ docs-translations/ko-KR/api/browser-window.md | 54 ++++ docs-translations/ko-KR/api/menu-item.md | 38 ++- docs-translations/ko-KR/api/session.md | 285 ++++++++++-------- 4 files changed, 259 insertions(+), 145 deletions(-) diff --git a/docs-translations/ko-KR/api/app.md b/docs-translations/ko-KR/api/app.md index b6695bdf21..d8d639c866 100644 --- a/docs-translations/ko-KR/api/app.md +++ b/docs-translations/ko-KR/api/app.md @@ -647,6 +647,33 @@ dock 아이콘을 표시합니다. dock 아이콘의 `image`를 설정합니다. +### `app.launcher.setBadgeCount(count)` _Linux_ +* `count` Integer + +Unity 런처에서 앱 아이콘 옆에 표시될 숫자를 설정합니다. `0`으로 설정하면 뱃지를 +숨깁니다. + +**참고:** 이 기능은 현재 Ubuntu Unity에서만 사용할 수 있습니다. 다른 환경에서 이 +함수를 호출하는 것은 아무런 효과가 없습니다. + +**참고:** 이 기능을 사용하려면 `package.json`의 `desktopName` 필드에 `.desktop` 파일 이름을 설정해야 합니다. 기본적으로 패키징된 애플리케이션의 `app.getName().desktop`을 사용합니다. + +### `app.launcher.getBadgeCount()` _Linux_ + +런처 아이콘 옆 배지의 카운터에 표시된 현재 값을 반환합니다. + +**참고:** `setBadgeCount`가 Ubuntu Unity에서만 지원하기 때문에, 애플리케이션이 다른 +플랫폼에서 돌아가고 있다면 이 메서드는 `0`을 반환합니다. + +### `app.launcher.isUnityRunning()` _Linux_ + +현재 데스크톱 환경이 Unity인지 여부를 반환합니다. Unity가 맞다면 `true`를 반환합니다. + +### `app.launcher.isCounterBadgeAvailable()` _Linux_ + +현재 데스크톱 환경이 애플리케이션 아이콘 카운터 뱃지를 사용할 수 있는지 여부를 +반환합니다. 사용할 수 있다면 `true`를 반환합니다. + [dock-menu]:https://developer.apple.com/library/mac/documentation/Carbon/Conceptual/customizing_docktile/concepts/dockconcepts.html#//apple_ref/doc/uid/TP30000986-CH2-TPXREF103 [tasks]:http://msdn.microsoft.com/en-us/library/windows/desktop/dd378460(v=vs.85).aspx#tasks [app-user-model-id]: https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx diff --git a/docs-translations/ko-KR/api/browser-window.md b/docs-translations/ko-KR/api/browser-window.md index 7adbc08a72..d214a0270d 100644 --- a/docs-translations/ko-KR/api/browser-window.md +++ b/docs-translations/ko-KR/api/browser-window.md @@ -62,6 +62,38 @@ win.loadURL('https://github.com') 참고로 `ready-to-show` 이벤트를 사용하더라도 어플리케이션을 네이티브 느낌이 나도록 하기 위해 `backgroundColor`도 같이 설정하는 것을 권장합니다. +## 부모와 자식 윈도우 + +`parent` 옵션을 사용하면 자식 윈도우를 만들 수 있습니다: + +```javascript +let top = new BrowserWindow() +let child = new BrowserWindow({parent: top}) +``` + +`child` 윈도우는 언제나 `top` 윈도우의 상위에 표시됩니다. + +### 모달 윈도우 + +모달 윈도우는 부모 윈도우를 비활성화 시키는 자식 윈도우입니다. 모달 윈도우를 만드려면 `parent`, `modal` 옵션을 동시에 설정해야 합니다: + +```javascript +let child = new BrowserWindow({parent: top, modal: true, show: false}) +child.loadURL('https://github.com') +child.once('ready-to-show', () => { + child.show() +}) +``` + +### 플랫폼별 특이사항 + +* On macOS the child windows will keep the relative position to parent window + when parent window moves, while on Windows and Linux child windows will not + move. +* On Windows it is not supported to change parent window dynamically. +* On Linux the type of modal windows will be changed to `dialog`. +* On Linux many desktop environments do not support hiding a modal window. + ## Class: BrowserWindow `BrowserWindow`는 [EventEmitter](http://nodejs.org/api/events.html#events_class_events_eventemitter)를 @@ -125,6 +157,9 @@ On Windows it is * `show` Boolean - 윈도우가 생성되면 보여줄지 여부. 기본값은 `true`입니다. * `frame` Boolean - `false`로 지정하면 창을 [Frameless Window](frameless-window.md) 형태로 생성합니다. 기본값은 `true`입니다. +* `parent` BrowserWindow - 부모 윈도우를 설정합니다. 기본 값은 `null`입니다. +* `modal` Boolean - 이 윈도우가 모달 윈도우인지 여부를 설정합니다. 이 옵션은 자식 + 윈도우에서만 작동합니다. 기본값은 `false`입니다. * `acceptFirstMouse` Boolean - 윈도우가 비활성화 상태일 때 내부 콘텐츠 클릭 시 활성화 되는 동시에 단일 mouse-down 이벤트를 발생시킬지 여부. 기본값은 `false`입니다. * `disableAutoHideCursor` Boolean - 타이핑중 자동으로 커서를 숨길지 여부. 기본값은 @@ -528,6 +563,10 @@ let win = new BrowserWindow({width: 800, height: 600}); 윈도우가 사용자에게 표시되고 있는지 여부를 반환합니다. +### `win.isModal()` + +현재 윈도우가 모달 윈도우인지 여부를 반환합니다. + ### `win.maximize()` 윈도우를 최대화 시킵니다. @@ -1008,4 +1047,19 @@ Windows에선 WDA_MONITOR와 함께 SetWindowDisplayAffinity를 호출합니다. 윈도우가 포커스될 수 있는지 여부를 변경합니다. +### `win.setParentWindow(parent)` _Linux_ _macOS_ + +* `parent` BrowserWindow + +`parent` 인수를 현재 윈도우의 부모 윈도우로 설정합니다. `null`로 설정하면 +현재 윈도우를 상위 윈도우로 전환합니다. + +### `win.getParentWindow()` + +모든 부모 윈도우를 반환합니다. + +### `win.getChildWindows()` + +모든 자식 윈도우를 반환합니다. + [blink-feature-string]: https://cs.chromium.org/chromium/src/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in diff --git a/docs-translations/ko-KR/api/menu-item.md b/docs-translations/ko-KR/api/menu-item.md index 3e011630bc..27ad7216c9 100644 --- a/docs-translations/ko-KR/api/menu-item.md +++ b/docs-translations/ko-KR/api/menu-item.md @@ -2,7 +2,7 @@ > 네이티브 애플리케이션 메뉴와 컨텍스트 메뉴에 아이템을 추가합니다. -[`menu`](menu.md)에서 예시를 확인할 수 있습니다. +[`Menu`](menu.md)에서 예시를 확인할 수 있습니다. ## Class: MenuItem @@ -12,8 +12,8 @@ * `options` Object * `click` Function - 메뉴 아이템이 클릭될 때 `click(menuItem, browserWindow, - event)` 형태로 호출 되는 콜백 함수 - * `role` String - 메뉴 아이템의 액션을 정의합니다; 이 속성을 지정하면 `click` + event)` 형태로 호출 되는 콜백 함수. + * `role` String - 메뉴 아이템의 액션을 정의합니다. 이 속성을 지정하면 `click` 속성이 무시됩니다. * `type` String - `MenuItem`의 타입 `normal`, `separator`, `submenu`, `checkbox` 또는 `radio`를 사용할 수 있습니다. 만약 값이 `Menu`가 아니면 @@ -72,20 +72,28 @@ macOS에서의 `role`은 다음 값을 추가로 가질 수 있습니다: macOS에서는 `role`을 지정할 때, `label`과 `accelerator`만 MenuItem에 효과가 적용되도록 변경되며, 다른 옵션들은 모두 무시됩니다. -## Instance Properties +### Instance Properties -다음 속성들은 존재하는 `MenuItem`에서 계속 변경될 수 있습니다: +다음은 `MenuItem`의 인스턴스에서 사용할 수 있는 속성입니다: - * `enabled` Boolean - * `visible` Boolean - * `checked` Boolean +#### `menuItem.enabled` -이 속성들의 의미는 위 옵션에서 설명한 것과 같습니다. +아이템이 활성화되어있는지 여부를 표시하는 Boolean 값입니다. 이 속성은 동적으로 변경될 +수 있습니다. -`checkbox` 메뉴 아이템은 선택될 때 해당 아이템의 `checked` 속성을 통해 활성화 그리고 -비활성화 상태인지를 표시합니다. 또한 `click` 함수를 지정하여 추가적인 작업을 할 수도 -있습니다. +#### `menuItem.visible` -`radio` 메뉴 아이템은 클릭되었을 때 `checked` 속성을 활성화 합니다. 그리고 같은 -메뉴의 인접한 모든 다른 아이템은 비활성화됩니다. 또한 `click` 함수를 지정하여 추가적인 -작업을 할 수도 있습니다. +아이템이 보여지고있는지 여부를 표시하는 Boolean 값입니다. 이 속성은 동적으로 변경될 +수 있습니다. + +#### `menuItem.checked` + +아이템이 선택되어있는지 여부를 반환하는 Boolean 값입니다. 이 속성은 동적으로 변경될 +수 있습니다. + +`checkbox` 메뉴 아이템은 선택되면 `checked` 속성을 토글합니다. + +`radio` 메뉴 아이템은 클릭되었을 때 `checked` 속성을 활성화 합니다. 그리고 +같은 메뉴의 모든 인접한 아이템에 대한 속성이 꺼집니다. + +추가적인 작업을 위해 `click` 함수를 추가할 수도 있습니다. diff --git a/docs-translations/ko-KR/api/session.md b/docs-translations/ko-KR/api/session.md index c2e3ca923d..626ca240db 100644 --- a/docs-translations/ko-KR/api/session.md +++ b/docs-translations/ko-KR/api/session.md @@ -4,16 +4,15 @@ `session` 모듈은 새로운 `Session` 객체를 만드는데 사용할 수 있습니다. -또한 존재하는 [`BrowserWindow`](browser-window.md)의 -[`webContents`](web-contents.md)에서 `session` 속성으로 접근할 수도 있습니다. +또한 [`WebContents`](web-contents.md)의 `session` 속성이나 `session` 모듈을 통해 현재 존재하는 페이지의 `session`에 접근할 수 있습니다. ```javascript -const {BrowserWindow} = require('electron'); +const {session, BrowserWindow} = require('electron') -let win = new BrowserWindow({width: 800, height: 600}); -win.loadURL('http://github.com'); +let win = new BrowserWindow({width: 800, height: 600}) +win.loadURL('http://github.com') -let ses = win.webContents.session; +let ses = win.webContents.session ``` ## Methods @@ -75,92 +74,7 @@ session.defaultSession.on('will-download', (event, item, webContents) => { ### Instance Methods -`Session` 객체는 다음과 같은 메서드와 속성을 가지고 있습니다: - -#### `ses.cookies` - -`cookies` 속성은 쿠키를 조작하는 방법을 제공합니다. 예를 들어 다음과 같이 할 수 -있습니다: - -```javascript -// 모든 쿠키를 요청합니다. -session.defaultSession.cookies.get({}, (error, cookies) => { - console.log(cookies); -}); - -// url에 관련된 쿠키를 모두 가져옵니다. -session.defaultSession.cookies.get({url: 'http://www.github.com'}, (error, cookies) => { - console.log(cookies); -}); - -// 지정한 쿠키 데이터를 설정합니다. -// 동일한 쿠키가 있으면 해당 쿠키를 덮어씁니다. -const cookie = {url: 'http://www.github.com', name: 'dummy_name', value: 'dummy'}; -session.defaultSession.cookies.set(cookie, (error) => { - if (error) - console.error(error); -}); -``` - -#### `ses.cookies.get(filter, callback)` - -* `filter` Object - * `url` String (optional) - `url`에 해당하는 쿠키를 취득합니다. 이 속성을 - 생략하면 모든 url에서 찾습니다. - * `name` String (optional) - 쿠키의 이름입니다. - * `domain` String (optional) - 도메인 또는 서브 도메인에 일치하는 쿠키를 - 취득합니다. - * `path` String (optional) - `path`에 일치하는 쿠키를 취득합니다. - * `secure` Boolean (optional) - 보안 속성에 따라 쿠키를 필터링합니다. - * `session` Boolean (optional) - 세션 또는 지속성 쿠키를 필터링합니다. -* `callback` Function - -`details` 객체에서 묘사한 모든 쿠키를 요청합니다. 모든 작업이 끝나면 `callback`이 -`callback(error, cookies)` 형태로 호출됩니다. - -`cookies`는 `cookie` 객체의 배열입니다. - -* `cookie` Object - * `name` String - 쿠키의 이름. - * `value` String - 쿠키의 값. - * `domain` String - 쿠키의 도메인. - * `hostOnly` String - 쿠키가 호스트 전용인가에 대한 여부. - * `path` String - 쿠키의 경로. - * `secure` Boolean - 쿠키가 안전한 것으로 표시되는지에 대한 여부. - * `httpOnly` Boolean - 쿠키가 HTTP로만 표시되는지에 대한 여부. - * `session` Boolean - 쿠키가 세션 쿠키 또는 만료일이 있는 영구 쿠키인지에 대한 - 여부. - * `expirationDate` Double - (Option) UNIX 시간으로 표시되는 쿠키의 만료일에 - 대한 초 단위 시간. 세션 쿠키는 지원되지 않음. - -#### `ses.cookies.set(details, callback)` - -* `details` Object - * `url` String - 쿠키에 대한 `url` 링크. - * `name` String - 쿠키의 이름입니다. 기본적으로 비워두면 생략됩니다. - * `value` String - 쿠키의 값입니다. 기본적으로 비워두면 생략됩니다. - * `domain` String - 쿠키의 도메인입니다. 기본적으로 비워두면 생략됩니다. - * `path` String - 쿠키의 경로입니다. 기본적으로 비워두면 생략됩니다. - * `secure` Boolean - 쿠키가 안전한 것으로 표시되는지에 대한 여부입니다. 기본값은 - false입니다. - * `session` Boolean - 쿠키가 Http 전용으로 표시되는지에 대한 여부입니다. 기본값은 - false입니다. - * `expirationDate` Double (optional) - UNIX 시간으로 표시되는 쿠키의 만료일에 - 대한 초 단위 시간입니다. 생략되면 쿠키가 세션 쿠기가 되며 세션 사이에 유지되지 - 않게 됩니다. -* `callback` Function - -`details` 객체에 따라 쿠키를 설정합니다. 작업이 완료되면 `callback`이 -`callback(error)` 형태로 호출됩니다. - -#### `ses.cookies.remove(url, name, callback)` - -* `url` String - 쿠키와 관련된 URL입니다. -* `name` String - 지울 쿠키의 이름입니다. -* `callback` Function - -`url`과 `name`에 일치하는 쿠키를 삭제합니다. 작업이 완료되면 `callback`이 -`callback()` 형식으로 호출됩니다. +`Session` 객체는 다음과 같은 메서드를 가지고 있습니다: #### `ses.getCacheSize(callback)` @@ -354,16 +268,141 @@ session.defaultSession.allowNTLMCredentialsForDomains('*') #### `ses.getUserAgent()` -현재 세션에 대한 유저 에이전트를 표현하는 `String`을 반환합니다. +현재 세션의 유저 에이전트를 표현하는 `String`을 반환합니다. + +### Instance Properties + +다음은 `Session` 인스턴스에서 사용할 수 있는 속성들입니다: + +#### `ses.cookies` + +현재 세션의 `Cookies` 클래스 인스턴스를 반환합니다. #### `ses.webRequest` -`webRequest` API는 생명주기의 다양한 단계에 맞춰 요청 콘텐츠를 가로채거나 변경할 수 -있도록 합니다. +현재 세션의 `WebRequest` 클래스 인스턴스를 반환합니다. -각 API는 `filter`와 `listener`를 선택적으로 받을 수 있습니다. `listener`는 API의 -이벤트가 발생했을 때 `listener(details)` 형태로 호출되며 `defails`는 요청을 묘사하는 -객체입니다. `listener`에 `null`을 전달하면 이벤트 수신을 중지합니다. +#### `ses.protocol` + +현재 세션의 [protocol](protocol.md) 모듈 인스턴스를 반환합니다. + +```javascript +const {app, session} = require('electron') +const path = require('path') + +app.on('ready', function () { + const protocol = session.fromPartition(partitionName).protocol + protocol.registerFileProtocol('atom', function (request, callback) { + var url = request.url.substr(7) + callback({path: path.normalize(__dirname + '/' + url)}) + }, function (error) { + if (error) + console.error('Failed to register protocol') + }) +}) +``` + +## Class: Cookies + +`Cookies` 클래스는 쿠키를 탐색하고 조작하는 방법을 제공합니다. `Cookies` 클래스의 +인스턴스는 반드시 `Session` 클래스의 `cookies` 속성에서 접근해야 합니다. + +예를 들어: + +```javascript +// 모든 쿠키를 요청합니다. +session.defaultSession.cookies.get({}, (error, cookies) => { + console.log(cookies); +}); + +// url에 관련된 쿠키를 모두 가져옵니다. +session.defaultSession.cookies.get({url: 'http://www.github.com'}, (error, cookies) => { + console.log(cookies); +}); + +// 지정한 쿠키 데이터를 설정합니다. +// 동일한 쿠키가 있으면 해당 쿠키를 덮어씁니다. +const cookie = {url: 'http://www.github.com', name: 'dummy_name', value: 'dummy'}; +session.defaultSession.cookies.set(cookie, (error) => { + if (error) + console.error(error); +}); +``` + +### Instance Methods + +다음은 `Cookies` 객체에서 사용할 수 있는 메서드들입니다: + +#### `ses.cookies.get(filter, callback)` + +* `filter` Object + * `url` String (optional) - `url`에 해당하는 쿠키를 취득합니다. 이 속성을 + 생략하면 모든 url에서 찾습니다. + * `name` String (optional) - 쿠키의 이름입니다. + * `domain` String (optional) - 도메인 또는 서브 도메인에 일치하는 쿠키를 + 취득합니다. + * `path` String (optional) - `path`에 일치하는 쿠키를 취득합니다. + * `secure` Boolean (optional) - 보안 속성에 따라 쿠키를 필터링합니다. + * `session` Boolean (optional) - 세션 또는 지속성 쿠키를 필터링합니다. +* `callback` Function + +`details` 객체에서 묘사한 모든 쿠키를 요청합니다. 모든 작업이 끝나면 `callback`이 +`callback(error, cookies)` 형태로 호출됩니다. + +`cookies`는 `cookie` 객체의 배열입니다. + +* `cookie` Object + * `name` String - 쿠키의 이름. + * `value` String - 쿠키의 값. + * `domain` String - 쿠키의 도메인. + * `hostOnly` String - 쿠키가 호스트 전용인가에 대한 여부. + * `path` String - 쿠키의 경로. + * `secure` Boolean - 쿠키가 안전한 것으로 표시되는지에 대한 여부. + * `httpOnly` Boolean - 쿠키가 HTTP로만 표시되는지에 대한 여부. + * `session` Boolean - 쿠키가 세션 쿠키 또는 만료일이 있는 영구 쿠키인지에 대한 + 여부. + * `expirationDate` Double - (Option) UNIX 시간으로 표시되는 쿠키의 만료일에 + 대한 초 단위 시간. 세션 쿠키는 지원되지 않음. + +#### `ses.cookies.set(details, callback)` + +* `details` Object + * `url` String - 쿠키에 대한 `url` 링크. + * `name` String - 쿠키의 이름입니다. 기본적으로 비워두면 생략됩니다. + * `value` String - 쿠키의 값입니다. 기본적으로 비워두면 생략됩니다. + * `domain` String - 쿠키의 도메인입니다. 기본적으로 비워두면 생략됩니다. + * `path` String - 쿠키의 경로입니다. 기본적으로 비워두면 생략됩니다. + * `secure` Boolean - 쿠키가 안전한 것으로 표시되는지에 대한 여부입니다. 기본값은 + false입니다. + * `httpOnly` Boolean - 쿠키가 Http 전용으로 표시되는지에 대한 여부입니다. 기본값은 + false입니다. + * `expirationDate` Double (optional) - UNIX 시간으로 표시되는 쿠키의 만료일에 + 대한 초 단위 시간입니다. 생략되면 쿠키가 세션 쿠기가 되며 세션 사이에 유지되지 + 않게 됩니다. +* `callback` Function + +`details` 객체에 따라 쿠키를 설정합니다. 작업이 완료되면 `callback`이 +`callback(error)` 형태로 호출됩니다. + +#### `ses.cookies.remove(url, name, callback)` + +* `url` String - 쿠키와 관련된 URL입니다. +* `name` String - 지울 쿠키의 이름입니다. +* `callback` Function + +`url`과 `name`에 일치하는 쿠키를 삭제합니다. 작업이 완료되면 `callback`이 +`callback()` 형식으로 호출됩니다. + +## Class: WebRequest + +`WebRequest` 클래스는 생명 주기의 다양한 단계에서 요청의 콘텐츠를 조작하거나 가로채는 +방법을 제공합니다. `WebRequest` 클래스는 반드시 `Session` 클래스의 `webRequest` +속성에서 접근해야 합니다. + +`WebRequest`의 메서드는 선택적인 `filter`와 `listener` 속성을 허용하며 `listener`는 +API의 이벤트가 발생했을 때 `listener(details)` 형식으로 호출되고, `details`는 요청에 +관한 내용을 표현하는 객체입니다. `listener`에 `null`을 전달하면 이벤트의 구독을 +해제합니다. `filter`는 `urls` 속성을 가진 객체입니다. 이 속성은 URL 규칙의 배열이며 URL 규칙에 일치하지 않는 요청을 모두 거르는데 사용됩니다. 만약 `filter`가 생략되면 모든 요청을 @@ -372,19 +411,25 @@ session.defaultSession.allowNTLMCredentialsForDomains('*') 어떤 `listener`의 이벤트들은 `callback`을 같이 전달하는데, 이벤트 처리시 `listener`의 작업을 완료한 후 `response` 객체를 포함하여 호출해야 합니다. +다음은 요청에 `User-Agent` 헤더를 추가하는 예시입니다: + ```javascript // 다음 url에 대한 User Agent를 조작합니다. const filter = { urls: ['https://*.github.com/*', '*://electron.github.io'] -}; +} session.defaultSession.webRequest.onBeforeSendHeaders(filter, (details, callback) => { - details.requestHeaders['User-Agent'] = "MyAgent"; - callback({cancel: false, requestHeaders: details.requestHeaders}); -}); + details.requestHeaders['User-Agent'] = "MyAgent" + callback({cancel: false, requestHeaders: details.requestHeaders}) +}) ``` -#### `ses.webRequest.onBeforeRequest([filter, ]listener)` +### Instance Methods + +다음은 `WebRequest` 객체에서 사용할 수 있는 메서드들입니다: + +#### `webRequest.onBeforeRequest([filter, ]listener)` * `filter` Object * `listener` Function @@ -413,7 +458,7 @@ session.defaultSession.webRequest.onBeforeSendHeaders(filter, (details, callback * `redirectURL` String (optional) - 원래 요청은 전송과 완료가 방지되지만 이 속성을 지정하면 해당 URL로 리다이렉트됩니다. -#### `ses.webRequest.onBeforeSendHeaders([filter, ]listener)` +#### `webRequest.onBeforeSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -438,7 +483,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `requestHeaders` Object (optional) - 이 속성이 제공되면, 요청은 이 헤더로 만들어 집니다. -#### `ses.webRequest.onSendHeaders([filter, ]listener)` +#### `webRequest.onSendHeaders([filter, ]listener)` * `filter` Object * `listener` Function @@ -455,7 +500,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `timestamp` Double * `requestHeaders` Object -#### `ses.webRequest.onHeadersReceived([filter, ]listener)` +#### `webRequest.onHeadersReceived([filter, ]listener)` * `filter` Object * `listener` Function @@ -484,7 +529,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener 변경하기 위해 반드시 지정되어야 합니다. 그렇지 않은 경우, 기존의 응답 헤더의 상태가 사용됩니다. -#### `ses.webRequest.onResponseStarted([filter, ]listener)` +#### `webRequest.onResponseStarted([filter, ]listener)` * `filter` Object * `listener` Function @@ -503,7 +548,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `statusCode` Integer * `statusLine` String -#### `ses.webRequest.onBeforeRedirect([filter, ]listener)` +#### `webRequest.onBeforeRedirect([filter, ]listener)` * `filter` Object * `listener` Function @@ -523,7 +568,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `fromCache` Boolean * `responseHeaders` Object -#### `ses.webRequest.onCompleted([filter, ]listener)` +#### `webRequest.onCompleted([filter, ]listener)` * `filter` Object * `listener` Function @@ -541,7 +586,7 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `statusCode` Integer * `statusLine` String -#### `ses.webRequest.onErrorOccurred([filter, ]listener)` +#### `webRequest.onErrorOccurred([filter, ]listener)` * `filter` Object * `listener` Function @@ -556,23 +601,3 @@ HTTP 요청을 보내기 전 요청 헤더를 사용할 수 있을 때 `listener * `timestamp` Double * `fromCache` Boolean * `error` String - 에러 설명. - -#### `ses.protocol` - -현재 세션의 [protocol](protocol.md) 모듈 인스턴스를 반환합니다. - -```javascript -const {app, session} = require('electron') -const path = require('path') - -app.on('ready', function () { - const protocol = session.fromPartition(partitionName).protocol - protocol.registerFileProtocol('atom', function (request, callback) { - var url = request.url.substr(7) - callback({path: path.normalize(__dirname + '/' + url)}) - }, function (error) { - if (error) - console.error('Failed to register protocol') - }) -}) -``` From 76f4bd01eb6e9d31f39ec945a680528b8ec82323 Mon Sep 17 00:00:00 2001 From: Jhen Date: Thu, 30 Jun 2016 15:45:03 +0800 Subject: [PATCH 162/516] Support background.page in extension manifest --- lib/browser/chrome-extension.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/browser/chrome-extension.js b/lib/browser/chrome-extension.js index e3cd454078..68b86ee498 100644 --- a/lib/browser/chrome-extension.js +++ b/lib/browser/chrome-extension.js @@ -72,10 +72,15 @@ const backgroundPages = {} const startBackgroundPages = function (manifest) { if (backgroundPages[manifest.extensionId] || !manifest.background) return - const scripts = manifest.background.scripts.map((name) => { - return `` - }).join('') - const html = new Buffer(`${scripts}`) + let html + if (manifest.background.page) { + html = fs.readFileSync(path.join(manifest.srcDirectory, manifest.background.page)) + } else { + const scripts = manifest.background.scripts.map((name) => { + return `` + }).join('') + html = new Buffer(`${scripts}`) + } const contents = webContents.create({ isBackgroundPage: true, From 83e9521d1397c661914b82c659d7fd6947de2c8a Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 1 Jul 2016 14:27:56 +0900 Subject: [PATCH 163/516] Update atom-shell-vs-node-webkit.md --- docs/development/atom-shell-vs-node-webkit.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/development/atom-shell-vs-node-webkit.md b/docs/development/atom-shell-vs-node-webkit.md index 3ec11b78b7..0912a8d66e 100644 --- a/docs/development/atom-shell-vs-node-webkit.md +++ b/docs/development/atom-shell-vs-node-webkit.md @@ -47,4 +47,6 @@ By using the [multi-context](http://strongloop.com/strongblog/whats-new-node-js- feature of Node, Electron doesn't introduce a new JavaScript context in web pages. +Note: NW.js has optionally supported multi-context since 0.13. + [node-bindings]: https://github.com/electron/electron/tree/master/atom/common From 1626c3bf0ae20a4eed46d7b329739bce873065e7 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 1 Jul 2016 14:30:55 +0900 Subject: [PATCH 164/516] Use `*` instead of `-` for lists `*` is used in most lists in our docs, let's keep consistency. --- docs/styleguide.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/styleguide.md b/docs/styleguide.md index e0080ba08c..36f354b07c 100644 --- a/docs/styleguide.md +++ b/docs/styleguide.md @@ -92,13 +92,13 @@ Using `autoUpdater` as an example: ### Classes -- API classes or classes that are part of modules must be listed under a +* API classes or classes that are part of modules must be listed under a `## Class: TheClassName` chapter. -- One page can have multiple classes. -- The constructors must be listed with `###`-level titles. -- The methods must be listed under an `### Instance Methods` chapter. -- The events must be listed under an `### Instance Events` chapter. -- The properties must be listed under an `### Instance Properties` chapter. +* One page can have multiple classes. +* The constructors must be listed with `###`-level titles. +* The methods must be listed under an `### Instance Methods` chapter. +* The events must be listed under an `### Instance Events` chapter. +* The properties must be listed under an `### Instance Properties` chapter. Using the `Session` and `Cookies` classes as an example: @@ -168,12 +168,12 @@ required[, optional] Below the method is more detailed information on each of the arguments. The type of argument is notated by either the common types: -- [`String`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) -- [`Number`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number) -- [`Object`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) -- [`Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) -- [`Boolean`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean) -- Or a custom type like Electron's [`WebContent`](api/web-content.md) +* [`String`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) +* [`Number`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number) +* [`Object`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) +* [`Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) +* [`Boolean`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean) +* Or a custom type like Electron's [`WebContent`](api/web-content.md) If an argument or a method is unique to certain platforms, those platforms are denoted using a space-delimited italicized list following the datatype. Values From 39654409529b6a48cb3982bcd7c10c0a1d50920c Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 1 Jul 2016 14:33:22 +0900 Subject: [PATCH 165/516] conjunctions don't have to be capitalized --- docs/styleguide.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/styleguide.md b/docs/styleguide.md index 36f354b07c..ba7d707fd8 100644 --- a/docs/styleguide.md +++ b/docs/styleguide.md @@ -6,9 +6,10 @@ These are the guidelines for writing Electron documentation. * Each page must have a single `#`-level title at the top. * Chapters in the same page must have `##`-level titles. -* Sub-chapters need to increase the number of `#` in the title according to their - nesting depth. -* All words in the page's title must be capitalized. +* Sub-chapters need to increase the number of `#` in the title according to + their nesting depth. +* All words in the page's title must be capitalized, except for conjunctions + like "of" and "and" . * Only the first word of a chapter title must be capitalized. Using `Quick Start` as example: From cb00d3cfb3dc488f6a2d161283620f734ae7507b Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 1 Jul 2016 17:39:01 +0900 Subject: [PATCH 166/516] mac: Implement app.setBadgeCount --- atom/browser/api/atom_api_app.cc | 19 +++++++----------- atom/browser/browser.cc | 4 ++++ atom/browser/browser.h | 12 +++++------ atom/browser/browser_linux.cc | 18 ++++++----------- atom/browser/browser_mac.mm | 6 ++++++ atom/browser/browser_win.cc | 4 ++++ spec/api-app-spec.js | 34 ++++---------------------------- 7 files changed, 37 insertions(+), 60 deletions(-) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index ce6a7d33c6..a39f9809eb 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -520,6 +520,8 @@ void App::BuildPrototype( base::Bind(&Browser::SetAsDefaultProtocolClient, browser)) .SetMethod("removeAsDefaultProtocolClient", base::Bind(&Browser::RemoveAsDefaultProtocolClient, browser)) + .SetMethod("setBadgeCount", base::Bind(&Browser::SetBadgeCount, browser)) + .SetMethod("getBadgeCount", base::Bind(&Browser::GetBadgeCount, browser)) #if defined(OS_MACOSX) .SetMethod("hide", base::Bind(&Browser::Hide, browser)) .SetMethod("show", base::Bind(&Browser::Show, browser)) @@ -529,8 +531,11 @@ void App::BuildPrototype( base::Bind(&Browser::GetCurrentActivityType, browser)) #endif #if defined(OS_WIN) - .SetMethod("setUserTasks", - base::Bind(&Browser::SetUserTasks, browser)) + .SetMethod("setUserTasks", base::Bind(&Browser::SetUserTasks, browser)) +#endif +#if defined(OS_LINUX) + .SetMethod("isUnityRunning", + base::Bind(&Browser::IsUnityRunning, browser)) #endif .SetMethod("setPath", &App::SetPath) .SetMethod("getPath", &App::GetPath) @@ -614,16 +619,6 @@ void Initialize(v8::Local exports, v8::Local unused, dict.SetMethod("dockSetMenu", &DockSetMenu); dict.SetMethod("dockSetIcon", base::Bind(&Browser::DockSetIcon, browser)); #endif - -#if defined(OS_LINUX) - auto browser = base::Unretained(Browser::Get()); - dict.SetMethod("unityLauncherAvailable", - base::Bind(&Browser::UnityLauncherAvailable, browser)); - dict.SetMethod("unityLauncherSetBadgeCount", - base::Bind(&Browser::UnityLauncherSetBadgeCount, browser)); - dict.SetMethod("unityLauncherGetBadgeCount", - base::Bind(&Browser::UnityLauncherGetBadgeCount, browser)); -#endif } } // namespace diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index 8c00c12873..3267653a74 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -118,6 +118,10 @@ void Browser::SetName(const std::string& name) { name_override_ = name; } +int Browser::GetBadgeCount() { + return current_badge_count_; +} + bool Browser::OpenFile(const std::string& file_path) { bool prevent_default = false; FOR_EACH_OBSERVER(BrowserObserver, diff --git a/atom/browser/browser.h b/atom/browser/browser.h index c9155d94b4..5f496b89ee 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -87,6 +87,10 @@ class Browser : public WindowListObserver { // Query the current state of default handler for a protocol. bool IsDefaultProtocolClient(const std::string& protocol); + // Set/Get the badge count. + void SetBadgeCount(int count); + int GetBadgeCount(); + #if defined(OS_MACOSX) // Hide the application. void Hide(); @@ -152,10 +156,8 @@ class Browser : public WindowListObserver { #endif // defined(OS_WIN) #if defined(OS_LINUX) - // Set/Get unity dock's badge counter. - bool UnityLauncherAvailable(); - void UnityLauncherSetBadgeCount(int count); - int UnityLauncherGetBadgeCount(); + // Whether Unity launcher is running. + bool IsUnityRunning(); #endif // defined(OS_LINUX) // Tell the application to open a file. @@ -223,9 +225,7 @@ class Browser : public WindowListObserver { std::string version_override_; std::string name_override_; -#if defined(OS_LINUX) int current_badge_count_ = 0; -#endif #if defined(OS_WIN) base::string16 app_user_model_id_; diff --git a/atom/browser/browser_linux.cc b/atom/browser/browser_linux.cc index 8e41ec8c19..ff48e5bed0 100644 --- a/atom/browser/browser_linux.cc +++ b/atom/browser/browser_linux.cc @@ -47,6 +47,11 @@ bool Browser::IsDefaultProtocolClient(const std::string& protocol) { return false; } +void Browser::SetBadgeCount(int count) { + current_badge_count_ = count; + unity::SetDownloadCount(count); +} + std::string Browser::GetExecutableFileVersion() const { return brightray::GetApplicationVersion(); } @@ -55,19 +60,8 @@ std::string Browser::GetExecutableFileProductName() const { return brightray::GetApplicationName(); } -bool Browser::UnityLauncherAvailable() { +bool Browser::IsUnityRunning() { return unity::IsRunning(); } -void Browser::UnityLauncherSetBadgeCount(int count) { - if (UnityLauncherAvailable()) { - current_badge_count_ = count; - unity::SetDownloadCount(count); - } -} - -int Browser::UnityLauncherGetBadgeCount() { - return current_badge_count_; -} - } // namespace atom diff --git a/atom/browser/browser_mac.mm b/atom/browser/browser_mac.mm index a50de2a07f..ebd225c599 100644 --- a/atom/browser/browser_mac.mm +++ b/atom/browser/browser_mac.mm @@ -12,6 +12,7 @@ #include "base/mac/bundle_locations.h" #include "base/mac/foundation_util.h" #include "base/strings/sys_string_conversions.h" +#include "base/strings/string_number_conversions.h" #include "brightray/common/application_info.h" #include "net/base/mac/url_conversions.h" #include "url/gurl.h" @@ -114,6 +115,11 @@ bool Browser::IsDefaultProtocolClient(const std::string& protocol) { void Browser::SetAppUserModelID(const base::string16& name) { } +void Browser::SetBadgeCount(int count) { + current_badge_count_ = count; + DockSetBadgeText(count == 0 ? base::IntToString(count) : ""); +} + void Browser::SetUserActivity(const std::string& type, const base::DictionaryValue& user_info, mate::Arguments* args) { diff --git a/atom/browser/browser_win.cc b/atom/browser/browser_win.cc index 345e2bcf67..e49e3b4cee 100644 --- a/atom/browser/browser_win.cc +++ b/atom/browser/browser_win.cc @@ -269,6 +269,10 @@ bool Browser::IsDefaultProtocolClient(const std::string& protocol) { } } +void Browser::SetBadgeCount(int count) { + current_badge_count_ = count; +} + PCWSTR Browser::GetAppUserModelID() { if (app_user_model_id_.empty()) { SetAppUserModelID(base::ReplaceStringPlaceholders( diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index 214a084f2e..4d27755d27 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -285,36 +285,10 @@ describe('app module', function () { }) }) - describe('app.launcher API', function () { - it('should be available on linux', function () { - if (process.platform !== 'linux') { - assert.equal(app.launcher, undefined) - } else { - assert.notEqual(app.launcher, undefined) - } - }) - - it('should be possible to set a badge count on supported environments', function () { - if (process.platform === 'linux' && - app.launcher.isCounterBadgeAvailable()) { - app.launcher.setBadgeCount(42) - assert.equal(app.launcher.getBadgeCount(), 42) - } - }) - - it('should be possible to set a badge count on unity', function () { - if (process.platform === 'linux' && - app.launcher.isUnityRunning()) { - assert.equal(app.launcher.isCounterBadgeAvailable(), true) - } - }) - - it('should not be possible to set a badge counter on unsupported environments', function () { - if (process.platform === 'linux' && - !app.launcher.isCounterBadgeAvailable()) { - app.launcher.setBadgeCount(42) - assert.equal(app.launcher.getBadgeCount(), 0) - } + describe('app.getBadgeCount API', function () { + it('should set a badge count', function () { + app.setBadgeCount(42) + assert.equal(app.getBadgeCount(), 42) }) }) }) From f8ec3771237915d13badc31f77e042d2176ea933 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 1 Jul 2016 17:44:09 +0900 Subject: [PATCH 167/516] docs: app.setBadgeCount --- docs/api/app.md | 46 +++++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/docs/api/app.md b/docs/api/app.md index 260e64533b..128300f53a 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -577,6 +577,26 @@ Disables hardware acceleration for current app. This method can only be called before app is ready. +### `app.setBadgeCount(count)` _Linux_ _macOS_ + +* `count` Integer + +Sets the counter badge for current app. Setting the count to `0` will hide the +badge. + +On macOS it shows on the dock icon. On Linux it only works for Unity launcher, + +**Note:** Unity launcher requires the exsistence of `.desktop` file to work, for +more please read [Desktop Environment Integration][unity-requiremnt] + +### `app.getBadgeCount()` _Linux_ _macOS_ + +Returns the current value displayed in the counter badge. + +### `app.isUnityRunning()` _Linux_ + +Returns whether current desktop environment is Unity launcher. + ### `app.commandLine.appendSwitch(switch[, value])` Append a switch (with optional `value`) to Chromium's command line. @@ -647,31 +667,6 @@ Sets the application's [dock menu][dock-menu]. Sets the `image` associated with this dock icon. -### `app.launcher.setBadgeCount(count)` _Linux_ -* `count` Integer - -Sets the number to be displayed next to the app icon in the Unity launcher. -Setting the count to `0` will hide the badge. - -**Note:** This feature is currently only supported on Ubuntu Unity. Calling this function has no effect when the application is running in a different environment. - -**Note:** You need to specify the .desktop file name to the `desktopName` field in package.json. By default, it will assume `app.getName().desktop` in packaged apps. - -### `app.launcher.getBadgeCount()` _Linux_ - -Returns the current value displayed in the counter badge next to the launcher icon. - -**Note:** As `setBadgeCount` only supports Ubuntu Unity, the value will be 0 when the application is running in a different environment. - -### `app.launcher.isUnityRunning()` _Linux_ - -This method checks if the current desktop environment is Unity and returns `true` in this case. - -### `app.launcher.isCounterBadgeAvailable()` _Linux_ - -This method checks if the current desktop environment supports an app icon counter badge and returns `true` in this case. - - [dock-menu]:https://developer.apple.com/library/mac/documentation/Carbon/Conceptual/customizing_docktile/concepts/dockconcepts.html#//apple_ref/doc/uid/TP30000986-CH2-TPXREF103 [tasks]:http://msdn.microsoft.com/en-us/library/windows/desktop/dd378460(v=vs.85).aspx#tasks [app-user-model-id]: https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx @@ -679,3 +674,4 @@ This method checks if the current desktop environment supports an app icon count [LSCopyDefaultHandlerForURLScheme]: https://developer.apple.com/library/mac/documentation/Carbon/Reference/LaunchServicesReference/#//apple_ref/c/func/LSCopyDefaultHandlerForURLScheme [handoff]: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/Handoff/HandoffFundamentals/HandoffFundamentals.html [activity-type]: https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSUserActivity_Class/index.html#//apple_ref/occ/instp/NSUserActivity/activityType +[unity-requiremnt]: ../tutorial/desktop-environment-integration.md#unity-launcher-shortcuts-linux From 54f06b0ba95fed5726396ac28471972e07b426e1 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Fri, 1 Jul 2016 23:12:06 +1200 Subject: [PATCH 168/516] Override the Notification API constructor to create silent notifications when the webContents is muted --- lib/renderer/override.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/renderer/override.js b/lib/renderer/override.js index c568388876..fb81c24e55 100644 --- a/lib/renderer/override.js +++ b/lib/renderer/override.js @@ -248,3 +248,14 @@ Object.defineProperty(document, 'visibilityState', { return cachedVisibilityState } }) + +// Make notifications silent if the the current webContents is muted +const NativeNotification = window.Notification +class Notification extends NativeNotification { + constructor (title, opts) { + super(title, Object.assign({ + silent: remote.getCurrentWebContents().isAudioMuted() + }, opts)) + } +} +window.Notification = Notification From 1da2a1c2ae39a05ef5bb9e28f93632ede4e6351d Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 1 Jul 2016 22:18:39 +0900 Subject: [PATCH 169/516] app.setBadgeCount should return boolean --- atom/browser/browser.h | 2 +- atom/browser/browser_linux.cc | 11 ++++++++--- atom/browser/browser_mac.mm | 5 +++-- atom/browser/browser_win.cc | 4 ++-- docs/api/app.md | 2 +- spec/api-app-spec.js | 11 +++++++++-- 6 files changed, 24 insertions(+), 11 deletions(-) diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 5f496b89ee..bdaed5be0f 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -88,7 +88,7 @@ class Browser : public WindowListObserver { bool IsDefaultProtocolClient(const std::string& protocol); // Set/Get the badge count. - void SetBadgeCount(int count); + bool SetBadgeCount(int count); int GetBadgeCount(); #if defined(OS_MACOSX) diff --git a/atom/browser/browser_linux.cc b/atom/browser/browser_linux.cc index ff48e5bed0..e2f968613b 100644 --- a/atom/browser/browser_linux.cc +++ b/atom/browser/browser_linux.cc @@ -47,9 +47,14 @@ bool Browser::IsDefaultProtocolClient(const std::string& protocol) { return false; } -void Browser::SetBadgeCount(int count) { - current_badge_count_ = count; - unity::SetDownloadCount(count); +bool Browser::SetBadgeCount(int count) { + if (IsUnityRunning()) { + unity::SetDownloadCount(count); + current_badge_count_ = count; + return true; + } else { + return false; + } } std::string Browser::GetExecutableFileVersion() const { diff --git a/atom/browser/browser_mac.mm b/atom/browser/browser_mac.mm index ebd225c599..a02034097a 100644 --- a/atom/browser/browser_mac.mm +++ b/atom/browser/browser_mac.mm @@ -115,9 +115,10 @@ bool Browser::IsDefaultProtocolClient(const std::string& protocol) { void Browser::SetAppUserModelID(const base::string16& name) { } -void Browser::SetBadgeCount(int count) { +bool Browser::SetBadgeCount(int count) { + DockSetBadgeText(count != 0 ? base::IntToString(count) : ""); current_badge_count_ = count; - DockSetBadgeText(count == 0 ? base::IntToString(count) : ""); + return true; } void Browser::SetUserActivity(const std::string& type, diff --git a/atom/browser/browser_win.cc b/atom/browser/browser_win.cc index e49e3b4cee..5eb9275dcf 100644 --- a/atom/browser/browser_win.cc +++ b/atom/browser/browser_win.cc @@ -269,8 +269,8 @@ bool Browser::IsDefaultProtocolClient(const std::string& protocol) { } } -void Browser::SetBadgeCount(int count) { - current_badge_count_ = count; +bool Browser::SetBadgeCount(int count) { + return false; } PCWSTR Browser::GetAppUserModelID() { diff --git a/docs/api/app.md b/docs/api/app.md index 128300f53a..2a640de75e 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -582,7 +582,7 @@ This method can only be called before app is ready. * `count` Integer Sets the counter badge for current app. Setting the count to `0` will hide the -badge. +badge. Returns `true` when the call succeeded, otherwise returns `false`. On macOS it shows on the dock icon. On Linux it only works for Unity launcher, diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index 4d27755d27..44d4ddd019 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -285,10 +285,17 @@ describe('app module', function () { }) }) - describe('app.getBadgeCount API', function () { + describe('app.setBadgeCount API', function () { + const shouldFail = process.platform === 'win32' || + (process.platform === 'linux' && app.isUnityRunning()) + + it('returns false when failed', function () { + assert.equal(app.setBadgeCount(42), !shouldFail) + }) + it('should set a badge count', function () { app.setBadgeCount(42) - assert.equal(app.getBadgeCount(), 42) + assert.equal(app.getBadgeCount(), shouldFail ? 0 : 42) }) }) }) From bb92765ecf79a245c8a471c8a98e9f4b0221c22c Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 1 Jul 2016 22:24:30 +0900 Subject: [PATCH 170/516] spec: Suppress the session.protocol test --- spec/api-session-spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/api-session-spec.js b/spec/api-session-spec.js index a7af6d7bdb..0557508e6d 100644 --- a/spec/api-session-spec.js +++ b/spec/api-session-spec.js @@ -316,7 +316,7 @@ describe('session module', function () { }) }) - it('handles requests from partition', function (done) { + xit('handles requests from partition', function (done) { w.webContents.on('did-finish-load', function () { done() }) From 431ea61ff8bbb4cd77030cc01325dd896247d910 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 1 Jul 2016 22:55:15 +0900 Subject: [PATCH 171/516] Don't use MatchesExtension for matching filters MatchesExtension compares double extensions like .tar.gz, which does not match the filters. --- atom/browser/ui/file_dialog_gtk.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/atom/browser/ui/file_dialog_gtk.cc b/atom/browser/ui/file_dialog_gtk.cc index dcb7bea86b..eba1813780 100644 --- a/atom/browser/ui/file_dialog_gtk.cc +++ b/atom/browser/ui/file_dialog_gtk.cc @@ -211,7 +211,9 @@ base::FilePath FileChooserDialog::AddExtensionForFilename( const auto& extensions = filters_[i].second; for (const auto& extension : extensions) { - if (extension == "*" || path.MatchesExtension("." + extension)) + if (extension == "*" || + base::EndsWith(path.value(), "." + extension, + base::CompareCase::INSENSITIVE_ASCII)) return path; } From d4f64ce94307d3897231fd842e4a37fa42ef2d0a Mon Sep 17 00:00:00 2001 From: Jhen Date: Fri, 1 Jul 2016 23:05:00 +0800 Subject: [PATCH 172/516] Use background page path instead of generated path if extension use manifest.background.page --- lib/browser/chrome-extension.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/browser/chrome-extension.js b/lib/browser/chrome-extension.js index 68b86ee498..4bb4a51c19 100644 --- a/lib/browser/chrome-extension.js +++ b/lib/browser/chrome-extension.js @@ -73,9 +73,12 @@ const startBackgroundPages = function (manifest) { if (backgroundPages[manifest.extensionId] || !manifest.background) return let html + let name if (manifest.background.page) { + name = manifest.background.page html = fs.readFileSync(path.join(manifest.srcDirectory, manifest.background.page)) } else { + name = '_generated_background_page.html' const scripts = manifest.background.scripts.map((name) => { return `` }).join('') @@ -86,12 +89,12 @@ const startBackgroundPages = function (manifest) { isBackgroundPage: true, commandLineSwitches: ['--background-page'] }) - backgroundPages[manifest.extensionId] = { html: html, webContents: contents } + backgroundPages[manifest.extensionId] = { html: html, webContents: contents, name: name } contents.loadURL(url.format({ protocol: 'chrome-extension', slashes: true, hostname: manifest.extensionId, - pathname: '_generated_background_page.html' + pathname: name })) } @@ -314,11 +317,11 @@ app.once('ready', function () { const manifest = manifestMap[parsed.hostname] if (!manifest) return callback() - if (parsed.path === '/_generated_background_page.html' && - backgroundPages[parsed.hostname]) { + const page = backgroundPages[parsed.hostname] + if (page && parsed.path === `/${page.name}`) { return callback({ mimeType: 'text/html', - data: backgroundPages[parsed.hostname].html + data: page.html }) } From b47d0e3e583568b07f0bd9f29724f1fc9b3a66d0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 1 Jul 2016 08:51:25 -0700 Subject: [PATCH 173/516] Tweak launcher note text --- docs/api/app.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api/app.md b/docs/api/app.md index 2a640de75e..cf3d785c54 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -586,8 +586,8 @@ badge. Returns `true` when the call succeeded, otherwise returns `false`. On macOS it shows on the dock icon. On Linux it only works for Unity launcher, -**Note:** Unity launcher requires the exsistence of `.desktop` file to work, for -more please read [Desktop Environment Integration][unity-requiremnt] +**Note:** Unity launcher requires the exsistence of a `.desktop` file to work, +for more information please read [Desktop Environment Integration][unity-requiremnt]. ### `app.getBadgeCount()` _Linux_ _macOS_ From 4f660f3e6f2e64abb5815f878a4de7ea64dada6c Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Sat, 2 Jul 2016 13:28:28 +1200 Subject: [PATCH 174/516] Implement WebContenstAudioMuted in AtomBrowserClient --- atom/browser/atom_browser_client.cc | 7 +++++++ atom/browser/atom_browser_client.h | 2 ++ lib/renderer/override.js | 11 ----------- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/atom/browser/atom_browser_client.cc b/atom/browser/atom_browser_client.cc index c1b50459c6..13503ae57d 100644 --- a/atom/browser/atom_browser_client.cc +++ b/atom/browser/atom_browser_client.cc @@ -303,6 +303,13 @@ void AtomBrowserClient::WebNotificationAllowed( permission_helper->RequestWebNotificationPermission(callback); } +bool AtomBrowserClient::WebContentsAudioMuted( + int render_process_id) { + content::WebContents* web_contents = + WebContentsPreferences::GetWebContentsFromProcessID(render_process_id); + return web_contents->IsAudioMuted(); + } + void AtomBrowserClient::RenderProcessHostDestroyed( content::RenderProcessHost* host) { int process_id = host->GetID(); diff --git a/atom/browser/atom_browser_client.h b/atom/browser/atom_browser_client.h index cf1a4cc438..47d7434497 100644 --- a/atom/browser/atom_browser_client.h +++ b/atom/browser/atom_browser_client.h @@ -101,6 +101,8 @@ class AtomBrowserClient : public brightray::BrowserClient, void WebNotificationAllowed( int render_process_id, const base::Callback& callback) override; + bool WebContentsAudioMuted( + int render_process_id) override; // content::RenderProcessHostObserver: void RenderProcessHostDestroyed(content::RenderProcessHost* host) override; diff --git a/lib/renderer/override.js b/lib/renderer/override.js index fb81c24e55..c568388876 100644 --- a/lib/renderer/override.js +++ b/lib/renderer/override.js @@ -248,14 +248,3 @@ Object.defineProperty(document, 'visibilityState', { return cachedVisibilityState } }) - -// Make notifications silent if the the current webContents is muted -const NativeNotification = window.Notification -class Notification extends NativeNotification { - constructor (title, opts) { - super(title, Object.assign({ - silent: remote.getCurrentWebContents().isAudioMuted() - }, opts)) - } -} -window.Notification = Notification From 767124c45cfe1347a48b3f1ae3d640d8458f5c91 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sat, 2 Jul 2016 10:36:11 +0900 Subject: [PATCH 175/516] Update for reviews --- atom/browser/browser.cc | 2 +- atom/browser/browser.h | 2 +- atom/browser/browser_linux.cc | 2 +- atom/browser/browser_mac.mm | 4 ++-- spec/api-app-spec.js | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index 3267653a74..b7d5626a82 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -119,7 +119,7 @@ void Browser::SetName(const std::string& name) { } int Browser::GetBadgeCount() { - return current_badge_count_; + return badge_count_; } bool Browser::OpenFile(const std::string& file_path) { diff --git a/atom/browser/browser.h b/atom/browser/browser.h index bdaed5be0f..37d2e11e67 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -225,7 +225,7 @@ class Browser : public WindowListObserver { std::string version_override_; std::string name_override_; - int current_badge_count_ = 0; + int badge_count_ = 0; #if defined(OS_WIN) base::string16 app_user_model_id_; diff --git a/atom/browser/browser_linux.cc b/atom/browser/browser_linux.cc index e2f968613b..fe1a0af9ba 100644 --- a/atom/browser/browser_linux.cc +++ b/atom/browser/browser_linux.cc @@ -50,7 +50,7 @@ bool Browser::IsDefaultProtocolClient(const std::string& protocol) { bool Browser::SetBadgeCount(int count) { if (IsUnityRunning()) { unity::SetDownloadCount(count); - current_badge_count_ = count; + badge_count_ = count; return true; } else { return false; diff --git a/atom/browser/browser_mac.mm b/atom/browser/browser_mac.mm index a02034097a..bb789365ff 100644 --- a/atom/browser/browser_mac.mm +++ b/atom/browser/browser_mac.mm @@ -11,8 +11,8 @@ #include "atom/browser/window_list.h" #include "base/mac/bundle_locations.h" #include "base/mac/foundation_util.h" -#include "base/strings/sys_string_conversions.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/sys_string_conversions.h" #include "brightray/common/application_info.h" #include "net/base/mac/url_conversions.h" #include "url/gurl.h" @@ -117,7 +117,7 @@ void Browser::SetAppUserModelID(const base::string16& name) { bool Browser::SetBadgeCount(int count) { DockSetBadgeText(count != 0 ? base::IntToString(count) : ""); - current_badge_count_ = count; + badge_count_ = count; return true; } diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index 44d4ddd019..111d387d34 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -287,7 +287,7 @@ describe('app module', function () { describe('app.setBadgeCount API', function () { const shouldFail = process.platform === 'win32' || - (process.platform === 'linux' && app.isUnityRunning()) + (process.platform === 'linux' && !app.isUnityRunning()) it('returns false when failed', function () { assert.equal(app.setBadgeCount(42), !shouldFail) From cd38e5c85e43e9aa4024113032ae10d04a112dfd Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sat, 2 Jul 2016 13:54:34 +0900 Subject: [PATCH 176/516] Update to Chrome 51.0.2704.106 --- atom/common/chrome_version.h | 2 +- script/lib/config.py | 2 +- vendor/brightray | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/atom/common/chrome_version.h b/atom/common/chrome_version.h index 3c3b780b9c..66870f4d6c 100644 --- a/atom/common/chrome_version.h +++ b/atom/common/chrome_version.h @@ -8,7 +8,7 @@ #ifndef ATOM_COMMON_CHROME_VERSION_H_ #define ATOM_COMMON_CHROME_VERSION_H_ -#define CHROME_VERSION_STRING "51.0.2704.103" +#define CHROME_VERSION_STRING "51.0.2704.106" #define CHROME_VERSION "v" CHROME_VERSION_STRING #endif // ATOM_COMMON_CHROME_VERSION_H_ diff --git a/script/lib/config.py b/script/lib/config.py index 125cecb5a3..08297c58a2 100644 --- a/script/lib/config.py +++ b/script/lib/config.py @@ -8,7 +8,7 @@ import sys BASE_URL = os.getenv('LIBCHROMIUMCONTENT_MIRROR') or \ 'https://s3.amazonaws.com/github-janky-artifacts/libchromiumcontent' -LIBCHROMIUMCONTENT_COMMIT = '2932c73bec8852c8cdf4b18f8b6372075c3e651e' +LIBCHROMIUMCONTENT_COMMIT = '31144d583c19b70d8d9de7d4ef15f0f720779860' PLATFORM = { 'cygwin': 'win32', diff --git a/vendor/brightray b/vendor/brightray index 25d39ad99a..f9bc45b03c 160000 --- a/vendor/brightray +++ b/vendor/brightray @@ -1 +1 @@ -Subproject commit 25d39ad99a7738385af0947804261608d99765ab +Subproject commit f9bc45b03c94a2db729b53885691db5e04b757df From e76ec92812da70641986fe24278723ea8014fd43 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sat, 2 Jul 2016 16:16:47 +0900 Subject: [PATCH 177/516] Set window icon before showing window --- atom/browser/api/atom_api_window.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index ae6bb77cf9..ac5fb87c75 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -106,9 +106,6 @@ Window::Window(v8::Isolate* isolate, const mate::Dictionary& options) { options, parent.IsEmpty() ? nullptr : parent->window_.get())); web_contents->SetOwnerWindow(window_.get()); - window_->InitFromOptions(options); - window_->AddObserver(this); - AttachAsUserData(window_.get()); #if defined(TOOLKIT_VIEWS) // Sets the window icon. @@ -116,6 +113,10 @@ Window::Window(v8::Isolate* isolate, const mate::Dictionary& options) { if (options.Get(options::kIcon, &icon)) SetIcon(icon); #endif + + window_->InitFromOptions(options); + window_->AddObserver(this); + AttachAsUserData(window_.get()); } Window::~Window() { From 14c4be50c11a9678b12693661eeec7ce960779a6 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sat, 2 Jul 2016 16:54:12 +0900 Subject: [PATCH 178/516] Avoid calling GetWebContentsFromProcessID for twice --- atom/browser/atom_browser_client.cc | 16 +++++----------- atom/browser/atom_browser_client.h | 4 +--- vendor/brightray | 2 +- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/atom/browser/atom_browser_client.cc b/atom/browser/atom_browser_client.cc index 13503ae57d..add3154642 100644 --- a/atom/browser/atom_browser_client.cc +++ b/atom/browser/atom_browser_client.cc @@ -287,29 +287,23 @@ brightray::BrowserMainParts* AtomBrowserClient::OverrideCreateBrowserMainParts( void AtomBrowserClient::WebNotificationAllowed( int render_process_id, - const base::Callback& callback) { + const base::Callback& callback) { content::WebContents* web_contents = WebContentsPreferences::GetWebContentsFromProcessID(render_process_id); if (!web_contents) { - callback.Run(false); + callback.Run(false, false); return; } auto permission_helper = WebContentsPermissionHelper::FromWebContents(web_contents); if (!permission_helper) { - callback.Run(false); + callback.Run(false, false); return; } - permission_helper->RequestWebNotificationPermission(callback); + permission_helper->RequestWebNotificationPermission( + base::Bind(callback, web_contents->IsAudioMuted())); } -bool AtomBrowserClient::WebContentsAudioMuted( - int render_process_id) { - content::WebContents* web_contents = - WebContentsPreferences::GetWebContentsFromProcessID(render_process_id); - return web_contents->IsAudioMuted(); - } - void AtomBrowserClient::RenderProcessHostDestroyed( content::RenderProcessHost* host) { int process_id = host->GetID(); diff --git a/atom/browser/atom_browser_client.h b/atom/browser/atom_browser_client.h index 47d7434497..a61706534a 100644 --- a/atom/browser/atom_browser_client.h +++ b/atom/browser/atom_browser_client.h @@ -100,9 +100,7 @@ class AtomBrowserClient : public brightray::BrowserClient, const content::MainFunctionParams&) override; void WebNotificationAllowed( int render_process_id, - const base::Callback& callback) override; - bool WebContentsAudioMuted( - int render_process_id) override; + const base::Callback& callback) override; // content::RenderProcessHostObserver: void RenderProcessHostDestroyed(content::RenderProcessHost* host) override; diff --git a/vendor/brightray b/vendor/brightray index f9bc45b03c..0e8ffb4d65 160000 --- a/vendor/brightray +++ b/vendor/brightray @@ -1 +1 @@ -Subproject commit f9bc45b03c94a2db729b53885691db5e04b757df +Subproject commit 0e8ffb4d653f9e85722bc98df7ddde9a0e6d0650 From bbaab9b35536691ad4c8effab147c8797e629fbe Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Sat, 2 Jul 2016 21:17:37 +1200 Subject: [PATCH 179/516] Document possible getLocale returns values. Closes #5363 --- docs/api/app.md | 2 +- docs/faq/app-locale.md | 138 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 docs/faq/app-locale.md diff --git a/docs/api/app.md b/docs/api/app.md index cf3d785c54..1cdebef992 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -396,7 +396,7 @@ Overrides the current application's name. ### `app.getLocale()` -Returns the current application locale. +Returns the current application locale. Possible return values are documented [here](../faq/app-locale.md) **Note:** When distributing your packaged app, you have to also ship the `locales` folder. diff --git a/docs/faq/app-locale.md b/docs/faq/app-locale.md new file mode 100644 index 0000000000..2be03d4f4c --- /dev/null +++ b/docs/faq/app-locale.md @@ -0,0 +1,138 @@ +Possible Values of `app.getLocale()` +------------------------------------ + +Electron uses Chromium's l10n util library to fetch the locale. Possible values are listed below + + +| Language Code | Language Name | +|---------------|---------------| +| af | Afrikaans | +| ar-AE | Arabic (U.A.E.) | +| ar-IQ | Arabic (Iraq) | +| ar | Arabic (Standard) | +| ar-BH | Arabic (Bahrain) | +| ar-DZ | Arabic (Algeria) | +| ar-EG | Arabic (Egypt) | +| ar | Aragonese | +| ar-JO | Arabic (Jordan) | +| ar-KW | Arabic (Kuwait) | +| ar-LB | Arabic (Lebanon) | +| ar-LY | Arabic (Libya) | +| ar-MA | Arabic (Morocco) | +| ar-OM | Arabic (Oman) | +| ar-QA | Arabic (Qatar) | +| ar-SA | Arabic (Saudi Arabia) | +| ar-SY | Arabic (Syria) | +| ar-TN | Arabic (Tunisia) | +| ar-YE | Arabic (Yemen) | +| as | Assamese | +| ast | Asturian | +| az | Azerbaijani | +| be | Belarusian | +| bg | Bulgarian | +| bg | Bulgarian | +| bn | Bengali | +| br | Breton | +| bs | Bosnian | +| ca | Catalan | +| ce | Chechen | +| ch | Chamorro | +| co | Corsican | +| cr | Cree | +| cs | Czech | +| cv | Chuvash | +| da | Danish | +| de | German (Standard) | +| de-AT | German (Austria) | +| de-CH | German (Switzerland) | +| de-DE | German (Germany) | +| de-LI | German (Liechtenstein) | +| de-LU | German (Luxembourg) | +| el | Greek | +| en-AU | English (Australia) | +| en-BZ | English (Belize) | +| en | English | +| en-CA | English (Canada) | +| en-GB | English (United Kingdom) | +| en-IE | English (Ireland) | +| en-JM | English (Jamaica) | +| en-NZ | English (New Zealand) | +| en-PH | English (Philippines) | +| en-TT | English (Trinidad & Tobago) | +| en-US | English (United States) | +| en-ZA | English (South Africa) | +| en-ZW | English (Zimbabwe) | +| eo | Esperanto | +| et | Estonian | +| eu | Basque | +| fa | Persian | +| fa | Farsi | +| fa-IR | Persian/Iran | +| fi | Finnish | +| fj | Fijian | +| fo | Faeroese | +| fr-CH | French (Switzerland) | +| fr-FR | French (France) | +| fr-LU | French (Luxembourg) | +| fr-MC | French (Monaco) | +| fr | French (Standard) | +| fr-BE | French (Belgium) | +| fr-CA | French (Canada) | +| fur | Friulian | +| fy | Frisian | +| ga | Irish | +| gd-IE | Gaelic (Irish) | +| gd | Gaelic (Scots) | +| gl | Galacian | +| gu | Gujurati | +| he | Hebrew | +| hi | Hindi | +| hr | Croatian | +| ht | Haitian | +| hu | Hungarian | +| hy | Armenian | +| id | Indonesian | +| is | Icelandic | +| it-CH | Italian (Switzerland) | +| it | Italian (Standard) | +| iu | Inuktitut | +| ja | Japanese | +| ka | Georgian | +| kk | Kazakh | +| km | Khmer | +| kn | Kannada | +| ko | Korean | +| ko-KP | Korean (North Korea) | +| ko-KR | Korean (South Korea) | +| ks | Kashmiri | +| ky | Kirghiz | +| la | Latin | +| lb | Luxembourgish | +| lt | Lithuanian | +| lv | Latvian | +| mi | Maori | +| mk | FYRO Macedonian | +| ml | Malayalam | +| mo | Moldavian | +| mr | Marathi | +| ms | Malay | +| mt | Maltese | +| my | Burmese | +| nb | Norwegian (Bokmal) | +| ne | Nepali | +| ng | Ndonga | +| nl | Dutch (Standard) | +| nl-BE | Dutch (Belgian) | +| nn | Norwegian (Nynorsk) | +| no | Norwegian | +| nv | Navajo | +| oc | Occitan | +| om | Oromo | +| or | Oriya | +| sq | Albanian | +| tlh | Klingon | +| zh-TW | Chinese (Taiwan) | +| zh | Chinese | +| zh-CN | Chinese (PRC) | +| zh-HK | Chinese (Hong Kong) | +| zh-SG | Chinese (Singapore) | From 7f914c65de508af70b08117c18c1bde1a20c2eb2 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Sat, 2 Jul 2016 23:21:45 +1200 Subject: [PATCH 180/516] Update docs to match style guide --- docs/{faq/app-locale.md => api/app-locales.md} | 3 +-- docs/api/app.md | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) rename docs/{faq/app-locale.md => api/app-locales.md} (97%) diff --git a/docs/faq/app-locale.md b/docs/api/app-locales.md similarity index 97% rename from docs/faq/app-locale.md rename to docs/api/app-locales.md index 2be03d4f4c..96cc10e00a 100644 --- a/docs/faq/app-locale.md +++ b/docs/api/app-locales.md @@ -1,5 +1,4 @@ -Possible Values of `app.getLocale()` ------------------------------------- +# Possible Values of `app.getLocale()` Electron uses Chromium's l10n util library to fetch the locale. Possible values are listed below diff --git a/docs/api/app.md b/docs/api/app.md index 1cdebef992..e56a372983 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -396,7 +396,7 @@ Overrides the current application's name. ### `app.getLocale()` -Returns the current application locale. Possible return values are documented [here](../faq/app-locale.md) +Returns the current application locale. Possible return values are documented [here](app-locales.md) **Note:** When distributing your packaged app, you have to also ship the `locales` folder. From 74ebbf9c78956f5ecc105477d8ac678c044464f7 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sat, 2 Jul 2016 20:27:14 +0900 Subject: [PATCH 181/516] docs: Add trailing period --- docs/api/app-locales.md | 4 ++-- docs/api/app.md | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/api/app-locales.md b/docs/api/app-locales.md index 96cc10e00a..52efba6282 100644 --- a/docs/api/app-locales.md +++ b/docs/api/app-locales.md @@ -1,7 +1,7 @@ # Possible Values of `app.getLocale()` -Electron uses Chromium's l10n util library to fetch the locale. Possible values are listed below - +Electron uses Chromium's `l10n_util` library to fetch the locale. Possible +values are listed below: | Language Code | Language Name | |---------------|---------------| diff --git a/docs/api/app.md b/docs/api/app.md index e56a372983..cfda6b574b 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -396,7 +396,8 @@ Overrides the current application's name. ### `app.getLocale()` -Returns the current application locale. Possible return values are documented [here](app-locales.md) +Returns the current application locale. Possible return values are documented +[here](app-locales.md). **Note:** When distributing your packaged app, you have to also ship the `locales` folder. From 13c668f22b82579221f4aa82b9b7f9a52646646b Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 3 Jul 2016 12:26:43 +0900 Subject: [PATCH 182/516] mac: Implement webContents.startDrag --- atom/browser/api/atom_api_web_contents.cc | 9 ++++ atom/browser/api/atom_api_web_contents.h | 5 ++ atom/browser/ui/drag_util.h | 22 +++++++++ atom/browser/ui/drag_util_mac.mm | 56 +++++++++++++++++++++++ atom/browser/ui/drag_util_views.cc | 11 +++++ filenames.gypi | 3 ++ 6 files changed, 106 insertions(+) create mode 100644 atom/browser/ui/drag_util.h create mode 100644 atom/browser/ui/drag_util_mac.mm create mode 100644 atom/browser/ui/drag_util_views.cc diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index e6959c8871..370cac33fc 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -17,6 +17,7 @@ #include "atom/browser/lib/bluetooth_chooser.h" #include "atom/browser/native_window.h" #include "atom/browser/net/atom_network_delegate.h" +#include "atom/browser/ui/drag_util.h" #include "atom/browser/web_contents_permission_helper.h" #include "atom/browser/web_contents_preferences.h" #include "atom/browser/web_view_guest_delegate.h" @@ -1205,6 +1206,13 @@ void WebContents::EndFrameSubscription() { view->EndFrameSubscription(); } +void WebContents::StartDrag(const base::FilePath& file, + mate::Handle image) { + base::MessageLoop::ScopedNestableTaskAllower allow( + base::MessageLoop::current()); + DragItem(file, image->image(), web_contents()->GetNativeView()); +} + void WebContents::OnCursorChange(const content::WebCursor& cursor) { content::WebCursor::CursorInfo info; cursor.GetCursorInfo(&info); @@ -1324,6 +1332,7 @@ void WebContents::BuildPrototype(v8::Isolate* isolate, .SetMethod("beginFrameSubscription", &WebContents::BeginFrameSubscription) .SetMethod("endFrameSubscription", &WebContents::EndFrameSubscription) + .SetMethod("startDrag", &WebContents::StartDrag) .SetMethod("setSize", &WebContents::SetSize) .SetMethod("isGuest", &WebContents::IsGuest) .SetMethod("getType", &WebContents::GetType) diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 5279812be4..88eec80d33 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -39,6 +39,8 @@ class WebViewGuestDelegate; namespace api { +class NativeImage; + class WebContents : public mate::TrackableObject, public CommonWebContentsDelegate, public content::WebContentsObserver { @@ -142,6 +144,9 @@ class WebContents : public mate::TrackableObject, void BeginFrameSubscription(mate::Arguments* args); void EndFrameSubscription(); + // Dragging native items. + void StartDrag(const base::FilePath& file, mate::Handle image); + // Methods for creating . void SetSize(const SetSizeParams& params); bool IsGuest() const; diff --git a/atom/browser/ui/drag_util.h b/atom/browser/ui/drag_util.h new file mode 100644 index 0000000000..50f87c4d63 --- /dev/null +++ b/atom/browser/ui/drag_util.h @@ -0,0 +1,22 @@ +// Copyright (c) 2016 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#ifndef ATOM_BROWSER_UI_DRAG_UTIL_H_ +#define ATOM_BROWSER_UI_DRAG_UTIL_H_ + +#include "ui/gfx/image/image.h" + +namespace base { +class FilePath; +} + +namespace atom { + +void DragItem(const base::FilePath& path, + const gfx::Image& icon, + gfx::NativeView view); + +} // namespace atom + +#endif // ATOM_BROWSER_UI_DRAG_UTIL_H_ diff --git a/atom/browser/ui/drag_util_mac.mm b/atom/browser/ui/drag_util_mac.mm new file mode 100644 index 0000000000..fe4254b43c --- /dev/null +++ b/atom/browser/ui/drag_util_mac.mm @@ -0,0 +1,56 @@ +// Copyright (c) 2016 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#import + +#include "atom/browser/ui/drag_util.h" +#include "base/files/file_path.h" +#include "base/strings/sys_string_conversions.h" + +namespace atom { + +namespace { + +// Write information about the file being dragged to the pasteboard. +void AddFileToPasteboard(NSPasteboard* pasteboard, const base::FilePath& path) { + NSString* file = base::SysUTF8ToNSString(path.value()); + NSArray* fileList = [NSArray arrayWithObject:file]; + [pasteboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] + owner:nil]; + [pasteboard setPropertyList:fileList forType:NSFilenamesPboardType]; +} + +} // namespace + +void DragItem(const base::FilePath& path, + const gfx::Image& icon, + gfx::NativeView view) { + NSPasteboard* pasteboard = [NSPasteboard pasteboardWithName:NSDragPboard]; + AddFileToPasteboard(pasteboard, path); + + // Synthesize a drag event, since we don't have access to the actual event + // that initiated a drag (possibly consumed by the Web UI, for example). + NSPoint position = [[view window] mouseLocationOutsideOfEventStream]; + NSTimeInterval eventTime = [[NSApp currentEvent] timestamp]; + NSEvent* dragEvent = [NSEvent mouseEventWithType:NSLeftMouseDragged + location:position + modifierFlags:NSLeftMouseDraggedMask + timestamp:eventTime + windowNumber:[[view window] windowNumber] + context:nil + eventNumber:0 + clickCount:1 + pressure:1.0]; + + // Run the drag operation. + [[view window] dragImage:icon.ToNSImage() + at:position + offset:NSZeroSize + event:dragEvent + pasteboard:pasteboard + source:view + slideBack:YES]; +} + +} // namespace atom diff --git a/atom/browser/ui/drag_util_views.cc b/atom/browser/ui/drag_util_views.cc new file mode 100644 index 0000000000..1db7e54394 --- /dev/null +++ b/atom/browser/ui/drag_util_views.cc @@ -0,0 +1,11 @@ +// Copyright (c) 2016 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#include "atom/browser/ui/drag_util.h" + +namespace atom { + + + +} // namespace atom diff --git a/filenames.gypi b/filenames.gypi index 6b086e1f8b..a86c53ba4f 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -245,6 +245,9 @@ 'atom/browser/ui/atom_menu_model.h', 'atom/browser/ui/cocoa/atom_menu_controller.h', 'atom/browser/ui/cocoa/atom_menu_controller.mm', + 'atom/browser/ui/drag_util_mac.mm', + 'atom/browser/ui/drag_util_views.cc', + 'atom/browser/ui/drag_util.h', 'atom/browser/ui/file_dialog.h', 'atom/browser/ui/file_dialog_gtk.cc', 'atom/browser/ui/file_dialog_mac.mm', From fa468a529be9e210170f251aff21ba7e97aca73b Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 3 Jul 2016 13:58:31 +0900 Subject: [PATCH 183/516] Support dragging multiple files --- atom/browser/api/atom_api_web_contents.cc | 29 ++++++++++++++++++++--- atom/browser/api/atom_api_web_contents.h | 4 +--- atom/browser/ui/drag_util.h | 8 ++++--- atom/browser/ui/drag_util_mac.mm | 16 +++++++------ 4 files changed, 41 insertions(+), 16 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 370cac33fc..7b710e5f85 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -1206,11 +1206,34 @@ void WebContents::EndFrameSubscription() { view->EndFrameSubscription(); } -void WebContents::StartDrag(const base::FilePath& file, - mate::Handle image) { +void WebContents::StartDrag(const mate::Dictionary& item, + mate::Arguments* args) { base::MessageLoop::ScopedNestableTaskAllower allow( base::MessageLoop::current()); - DragItem(file, image->image(), web_contents()->GetNativeView()); + + base::FilePath file; + std::vector files; + if (!item.Get("files", &files) && item.Get("file", &file)) { + files.push_back(file); + } + + mate::Handle icon; + if (!item.Get("icon", &icon) && !file.empty()) { + // TODO(zcbenz): Set default icon from file. + } + + // Error checking. + if (icon.IsEmpty()) { + args->ThrowError("icon must be set"); + return; + } + + // Start dragging. + if (!files.empty()) { + DragFileItems(files, icon->image(), web_contents()->GetNativeView()); + } else { + args->ThrowError("There is nothing to drag"); + } } void WebContents::OnCursorChange(const content::WebCursor& cursor) { diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 88eec80d33..2917aa860a 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -39,8 +39,6 @@ class WebViewGuestDelegate; namespace api { -class NativeImage; - class WebContents : public mate::TrackableObject, public CommonWebContentsDelegate, public content::WebContentsObserver { @@ -145,7 +143,7 @@ class WebContents : public mate::TrackableObject, void EndFrameSubscription(); // Dragging native items. - void StartDrag(const base::FilePath& file, mate::Handle image); + void StartDrag(const mate::Dictionary& item, mate::Arguments* args); // Methods for creating . void SetSize(const SetSizeParams& params); diff --git a/atom/browser/ui/drag_util.h b/atom/browser/ui/drag_util.h index 50f87c4d63..df5303c65e 100644 --- a/atom/browser/ui/drag_util.h +++ b/atom/browser/ui/drag_util.h @@ -5,6 +5,8 @@ #ifndef ATOM_BROWSER_UI_DRAG_UTIL_H_ #define ATOM_BROWSER_UI_DRAG_UTIL_H_ +#include + #include "ui/gfx/image/image.h" namespace base { @@ -13,9 +15,9 @@ class FilePath; namespace atom { -void DragItem(const base::FilePath& path, - const gfx::Image& icon, - gfx::NativeView view); +void DragFileItems(const std::vector& files, + const gfx::Image& icon, + gfx::NativeView view); } // namespace atom diff --git a/atom/browser/ui/drag_util_mac.mm b/atom/browser/ui/drag_util_mac.mm index fe4254b43c..7197e79af6 100644 --- a/atom/browser/ui/drag_util_mac.mm +++ b/atom/browser/ui/drag_util_mac.mm @@ -13,9 +13,11 @@ namespace atom { namespace { // Write information about the file being dragged to the pasteboard. -void AddFileToPasteboard(NSPasteboard* pasteboard, const base::FilePath& path) { - NSString* file = base::SysUTF8ToNSString(path.value()); - NSArray* fileList = [NSArray arrayWithObject:file]; +void AddFilesToPasteboard(NSPasteboard* pasteboard, + const std::vector& files) { + NSMutableArray* fileList = [NSMutableArray array]; + for (const base::FilePath& file : files) + [fileList addObject:base::SysUTF8ToNSString(file.value())]; [pasteboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:nil]; [pasteboard setPropertyList:fileList forType:NSFilenamesPboardType]; @@ -23,11 +25,11 @@ void AddFileToPasteboard(NSPasteboard* pasteboard, const base::FilePath& path) { } // namespace -void DragItem(const base::FilePath& path, - const gfx::Image& icon, - gfx::NativeView view) { +void DragFileItems(const std::vector& files, + const gfx::Image& icon, + gfx::NativeView view) { NSPasteboard* pasteboard = [NSPasteboard pasteboardWithName:NSDragPboard]; - AddFileToPasteboard(pasteboard, path); + AddFilesToPasteboard(pasteboard, files); // Synthesize a drag event, since we don't have access to the actual event // that initiated a drag (possibly consumed by the Web UI, for example). From 63a8961ed1eaf86377ece40f26f8bb7c843b742d Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 3 Jul 2016 14:34:35 +0900 Subject: [PATCH 184/516] views: Implement webContents.startDrag --- atom/browser/ui/drag_util_views.cc | 119 +++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/atom/browser/ui/drag_util_views.cc b/atom/browser/ui/drag_util_views.cc index 1db7e54394..54bbfd1eb8 100644 --- a/atom/browser/ui/drag_util_views.cc +++ b/atom/browser/ui/drag_util_views.cc @@ -4,8 +4,127 @@ #include "atom/browser/ui/drag_util.h" +#if defined(OS_WIN) +#include +#include +#include +#include +#endif + +#include "ui/aura/window.h" +#include "ui/base/dragdrop/drag_drop_types.h" +#include "ui/base/dragdrop/drag_utils.h" +#include "ui/base/dragdrop/file_info.h" +#include "ui/base/dragdrop/os_exchange_data.h" +#include "ui/gfx/geometry/point.h" +#include "ui/gfx/screen.h" +#include "ui/views/widget/widget.h" +#include "ui/wm/public/drag_drop_client.h" + +#if defined(OS_WIN) +#include "base/win/scoped_comptr.h" +#include "base/win/scoped_hdc.h" +#include "ui/base/dragdrop/os_exchange_data_provider_win.h" +#include "ui/gfx/canvas.h" +#include "ui/gfx/gdi_util.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gfx/image/image_skia.h" +#include "ui/gfx/skbitmap_operations.h" +#endif + namespace atom { +namespace { +#if defined(OS_WIN) +void SetDragImageOnDataObject(HBITMAP hbitmap, + const gfx::Size& size_in_pixels, + const gfx::Vector2d& cursor_offset, + IDataObject* data_object) { + base::win::ScopedComPtr helper; + HRESULT rv = CoCreateInstance(CLSID_DragDropHelper, 0, CLSCTX_INPROC_SERVER, + IID_IDragSourceHelper, helper.ReceiveVoid()); + if (SUCCEEDED(rv)) { + SHDRAGIMAGE sdi; + sdi.sizeDragImage = size_in_pixels.ToSIZE(); + sdi.crColorKey = 0xFFFFFFFF; + sdi.hbmpDragImage = hbitmap; + sdi.ptOffset = gfx::PointAtOffsetFromOrigin(cursor_offset).ToPOINT(); + helper->InitializeFromBitmap(&sdi, data_object); + } +} + +// Blit the contents of the canvas to a new HBITMAP. It is the caller's +// responsibility to release the |bits| buffer. +HBITMAP CreateHBITMAPFromSkBitmap(const SkBitmap& sk_bitmap) { + base::win::ScopedGetDC screen_dc(NULL); + BITMAPINFOHEADER header; + gfx::CreateBitmapHeader(sk_bitmap.width(), sk_bitmap.height(), &header); + void* bits; + HBITMAP bitmap = + CreateDIBSection(screen_dc, reinterpret_cast(&header), + DIB_RGB_COLORS, &bits, NULL, 0); + if (!bitmap || !bits) + return NULL; + DCHECK_EQ(sk_bitmap.rowBytes(), static_cast(sk_bitmap.width() * 4)); + SkAutoLockPixels lock(sk_bitmap); + memcpy( + bits, sk_bitmap.getPixels(), sk_bitmap.height() * sk_bitmap.rowBytes()); + return bitmap; +} + +void SetDragImageOnDataObject(const gfx::ImageSkia& image_skia, + const gfx::Vector2d& cursor_offset, + ui::OSExchangeData* data_object) { + DCHECK(data_object && !image_skia.size().IsEmpty()); + // InitializeFromBitmap() doesn't expect an alpha channel and is confused + // by premultiplied colors, so unpremultiply the bitmap. + // SetDragImageOnDataObject(HBITMAP) takes ownership of the bitmap. + HBITMAP bitmap = CreateHBITMAPFromSkBitmap( + SkBitmapOperations::UnPreMultiply(*image_skia.bitmap())); + if (bitmap) { + // Attach 'bitmap' to the data_object. + SetDragImageOnDataObject( + bitmap, + gfx::Size(image_skia.bitmap()->width(), image_skia.bitmap()->height()), + cursor_offset, + ui::OSExchangeDataProviderWin::GetIDataObject(*data_object)); + } +} +#endif + +} // namespace + +void DragFileItems(const std::vector& files, + const gfx::Image& icon, + gfx::NativeView view) { + // Set up our OLE machinery + ui::OSExchangeData data; + +#if defined(OS_WIN) + SetDragImageOnDataObject(icon.AsImageSkia(), gfx::Vector2d(), &data); +#endif + data.provider().SetDragImage(icon.AsImageSkia(), gfx::Vector2d()); + + std::vector file_infos; + for (const base::FilePath& file : files) { + file_infos.push_back(ui::FileInfo(file, base::FilePath())); + } + data.SetFilenames(file_infos); + + aura::Window* root_window = view->GetRootWindow(); + if (!root_window || !aura::client::GetDragDropClient(root_window)) + return; + + gfx::Point location = gfx::Screen::GetScreen()->GetCursorScreenPoint(); + // TODO(varunjain): Properly determine and send DRAG_EVENT_SOURCE below. + aura::client::GetDragDropClient(root_window)->StartDragAndDrop( + data, + root_window, + view, + location, + ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_LINK, + ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE); +} } // namespace atom From 7916f0ea18c2e18241b0d9fa03ef0f827aa77c4f Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 3 Jul 2016 14:44:47 +0900 Subject: [PATCH 185/516] win: Use drag_utils::CreateDragImageForFile --- atom/browser/ui/drag_util_views.cc | 84 +----------------------------- 1 file changed, 1 insertion(+), 83 deletions(-) diff --git a/atom/browser/ui/drag_util_views.cc b/atom/browser/ui/drag_util_views.cc index 54bbfd1eb8..c69e34326c 100644 --- a/atom/browser/ui/drag_util_views.cc +++ b/atom/browser/ui/drag_util_views.cc @@ -4,13 +4,6 @@ #include "atom/browser/ui/drag_util.h" -#if defined(OS_WIN) -#include -#include -#include -#include -#endif - #include "ui/aura/window.h" #include "ui/base/dragdrop/drag_drop_types.h" #include "ui/base/dragdrop/drag_utils.h" @@ -21,90 +14,15 @@ #include "ui/views/widget/widget.h" #include "ui/wm/public/drag_drop_client.h" -#if defined(OS_WIN) -#include "base/win/scoped_comptr.h" -#include "base/win/scoped_hdc.h" -#include "ui/base/dragdrop/os_exchange_data_provider_win.h" -#include "ui/gfx/canvas.h" -#include "ui/gfx/gdi_util.h" -#include "ui/gfx/geometry/size.h" -#include "ui/gfx/image/image_skia.h" -#include "ui/gfx/skbitmap_operations.h" -#endif - namespace atom { -namespace { - -#if defined(OS_WIN) -void SetDragImageOnDataObject(HBITMAP hbitmap, - const gfx::Size& size_in_pixels, - const gfx::Vector2d& cursor_offset, - IDataObject* data_object) { - base::win::ScopedComPtr helper; - HRESULT rv = CoCreateInstance(CLSID_DragDropHelper, 0, CLSCTX_INPROC_SERVER, - IID_IDragSourceHelper, helper.ReceiveVoid()); - if (SUCCEEDED(rv)) { - SHDRAGIMAGE sdi; - sdi.sizeDragImage = size_in_pixels.ToSIZE(); - sdi.crColorKey = 0xFFFFFFFF; - sdi.hbmpDragImage = hbitmap; - sdi.ptOffset = gfx::PointAtOffsetFromOrigin(cursor_offset).ToPOINT(); - helper->InitializeFromBitmap(&sdi, data_object); - } -} - -// Blit the contents of the canvas to a new HBITMAP. It is the caller's -// responsibility to release the |bits| buffer. -HBITMAP CreateHBITMAPFromSkBitmap(const SkBitmap& sk_bitmap) { - base::win::ScopedGetDC screen_dc(NULL); - BITMAPINFOHEADER header; - gfx::CreateBitmapHeader(sk_bitmap.width(), sk_bitmap.height(), &header); - void* bits; - HBITMAP bitmap = - CreateDIBSection(screen_dc, reinterpret_cast(&header), - DIB_RGB_COLORS, &bits, NULL, 0); - if (!bitmap || !bits) - return NULL; - DCHECK_EQ(sk_bitmap.rowBytes(), static_cast(sk_bitmap.width() * 4)); - SkAutoLockPixels lock(sk_bitmap); - memcpy( - bits, sk_bitmap.getPixels(), sk_bitmap.height() * sk_bitmap.rowBytes()); - return bitmap; -} - -void SetDragImageOnDataObject(const gfx::ImageSkia& image_skia, - const gfx::Vector2d& cursor_offset, - ui::OSExchangeData* data_object) { - DCHECK(data_object && !image_skia.size().IsEmpty()); - // InitializeFromBitmap() doesn't expect an alpha channel and is confused - // by premultiplied colors, so unpremultiply the bitmap. - // SetDragImageOnDataObject(HBITMAP) takes ownership of the bitmap. - HBITMAP bitmap = CreateHBITMAPFromSkBitmap( - SkBitmapOperations::UnPreMultiply(*image_skia.bitmap())); - if (bitmap) { - // Attach 'bitmap' to the data_object. - SetDragImageOnDataObject( - bitmap, - gfx::Size(image_skia.bitmap()->width(), image_skia.bitmap()->height()), - cursor_offset, - ui::OSExchangeDataProviderWin::GetIDataObject(*data_object)); - } -} -#endif - -} // namespace - void DragFileItems(const std::vector& files, const gfx::Image& icon, gfx::NativeView view) { // Set up our OLE machinery ui::OSExchangeData data; -#if defined(OS_WIN) - SetDragImageOnDataObject(icon.AsImageSkia(), gfx::Vector2d(), &data); -#endif - data.provider().SetDragImage(icon.AsImageSkia(), gfx::Vector2d()); + drag_utils::CreateDragImageForFile(files[0], icon.AsImageSkia(), &data); std::vector file_infos; for (const base::FilePath& file : files) { From f072d9dd3a1cb7dd62c91d202b00f78ea82aedda Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 3 Jul 2016 15:10:59 +0900 Subject: [PATCH 186/516] docs: webContents.startDrag(item) --- docs/api/web-contents.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index 913504cd37..c3d175125b 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -943,6 +943,16 @@ defaults to `false`. End subscribing for frame presentation events. +### `webContents.startDrag(item)` + +* `item` object + * `file` String + * `icon` [NativeImage](native-image.md) + +Sets the `item` as dragging item for current drag-drop operation, `file` is the +absolute path of the file to be dragged, and `icon` is the image showing under +the cursor when dragging. + ### `webContents.savePage(fullPath, saveType, callback)` * `fullPath` String - The full file path. From b7459d50f947a080418a0c83e110b1b8c85d2dec Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 3 Jul 2016 15:26:22 +0900 Subject: [PATCH 187/516] docs: Dragging files out of the window --- .../desktop-environment-integration.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/tutorial/desktop-environment-integration.md b/docs/tutorial/desktop-environment-integration.md index adb08ad5dc..e430cb4235 100644 --- a/docs/tutorial/desktop-environment-integration.md +++ b/docs/tutorial/desktop-environment-integration.md @@ -321,6 +321,32 @@ win.setRepresentedFilename('/etc/passwd'); win.setDocumentEdited(true); ``` +## Dragging files out of the window + +For certain kinds of apps that manipulate on files, it is important to be able +to drag files from Electron to other apps. To implement this feature in your +app, you need to call `webContents.startDrag(item)` API on `ondragstart` event. + +In web page: + +```javascript +document.getElementById('targetItem').ondragstart = (event) => { + event.preventDefault() + ipcRenderer.send('ondragstart', '/path/to/item') +} +``` + +In the main process: + +```javascript +ipcMain.on('ondragstart', (event, filePath) => { + event.sender.startDrag({ + file: filePath, + icon: '/path/to/icon.png' + }) +}) +``` + [addrecentdocument]: ../api/app.md#appaddrecentdocumentpath-os-x-windows [clearrecentdocuments]: ../api/app.md#appclearrecentdocuments-os-x-windows [setusertaskstasks]: ../api/app.md#appsetusertaskstasks-windows From ba1fe322e9532d1b2a866401056d9355e6b88c7c Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 3 Jul 2016 15:27:26 +0900 Subject: [PATCH 188/516] docs: Use as example --- docs/tutorial/desktop-environment-integration.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/tutorial/desktop-environment-integration.md b/docs/tutorial/desktop-environment-integration.md index e430cb4235..ab84681609 100644 --- a/docs/tutorial/desktop-environment-integration.md +++ b/docs/tutorial/desktop-environment-integration.md @@ -329,11 +329,14 @@ app, you need to call `webContents.startDrag(item)` API on `ondragstart` event. In web page: -```javascript -document.getElementById('targetItem').ondragstart = (event) => { - event.preventDefault() - ipcRenderer.send('ondragstart', '/path/to/item') -} +```html +item + ``` In the main process: From 23582cc9d3e224638e7493cbf36bb8b00509becc Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 3 Jul 2016 15:30:27 +0900 Subject: [PATCH 189/516] Reduce the scope of ScopedNestableTaskAllower --- atom/browser/api/atom_api_web_contents.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 7b710e5f85..99cb2e0074 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -1208,9 +1208,6 @@ void WebContents::EndFrameSubscription() { void WebContents::StartDrag(const mate::Dictionary& item, mate::Arguments* args) { - base::MessageLoop::ScopedNestableTaskAllower allow( - base::MessageLoop::current()); - base::FilePath file; std::vector files; if (!item.Get("files", &files) && item.Get("file", &file)) { @@ -1230,6 +1227,8 @@ void WebContents::StartDrag(const mate::Dictionary& item, // Start dragging. if (!files.empty()) { + base::MessageLoop::ScopedNestableTaskAllower allow( + base::MessageLoop::current()); DragFileItems(files, icon->image(), web_contents()->GetNativeView()); } else { args->ThrowError("There is nothing to drag"); From eb378bef3aaa275f37599611531e1bbbd67e8b71 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 4 Jul 2016 15:08:49 +0900 Subject: [PATCH 190/516] Upgrade to Chrome 52 --- atom/common/chrome_version.h | 2 +- script/lib/config.py | 2 +- vendor/brightray | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/atom/common/chrome_version.h b/atom/common/chrome_version.h index 66870f4d6c..29660931ef 100644 --- a/atom/common/chrome_version.h +++ b/atom/common/chrome_version.h @@ -8,7 +8,7 @@ #ifndef ATOM_COMMON_CHROME_VERSION_H_ #define ATOM_COMMON_CHROME_VERSION_H_ -#define CHROME_VERSION_STRING "51.0.2704.106" +#define CHROME_VERSION_STRING "52.0.2743.60" #define CHROME_VERSION "v" CHROME_VERSION_STRING #endif // ATOM_COMMON_CHROME_VERSION_H_ diff --git a/script/lib/config.py b/script/lib/config.py index 08297c58a2..c64302d882 100644 --- a/script/lib/config.py +++ b/script/lib/config.py @@ -8,7 +8,7 @@ import sys BASE_URL = os.getenv('LIBCHROMIUMCONTENT_MIRROR') or \ 'https://s3.amazonaws.com/github-janky-artifacts/libchromiumcontent' -LIBCHROMIUMCONTENT_COMMIT = '31144d583c19b70d8d9de7d4ef15f0f720779860' +LIBCHROMIUMCONTENT_COMMIT = '1dd3cbf7c4d3cc6511fa1a2a145b0e9cd86752b6' PLATFORM = { 'cygwin': 'win32', diff --git a/vendor/brightray b/vendor/brightray index 0e8ffb4d65..9a4ffcf129 160000 --- a/vendor/brightray +++ b/vendor/brightray @@ -1 +1 @@ -Subproject commit 0e8ffb4d653f9e85722bc98df7ddde9a0e6d0650 +Subproject commit 9a4ffcf1297a2095c614b39bc71e51edbc9847c4 From 1ba3907038b124c085565e7395ddf2930f11031d Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 4 Jul 2016 15:08:55 +0900 Subject: [PATCH 191/516] Update to API changes of Chrome 52 --- atom/app/node_main.cc | 2 +- atom/browser/api/atom_api_cookies.cc | 7 +- atom/browser/api/atom_api_cookies.h | 10 +- atom/browser/api/atom_api_menu.h | 2 +- atom/browser/api/atom_api_menu_views.cc | 4 +- atom/browser/api/atom_api_menu_views.h | 2 +- .../browser/api/atom_api_power_save_blocker.h | 2 +- atom/browser/api/atom_api_protocol.cc | 3 +- atom/browser/api/atom_api_screen.cc | 30 ++-- atom/browser/api/atom_api_screen.h | 25 +-- atom/browser/api/atom_api_session.cc | 16 +- atom/browser/api/atom_api_tray.h | 2 +- atom/browser/api/trackable_object.h | 1 - atom/browser/atom_access_token_store.cc | 2 +- atom/browser/atom_browser_client.cc | 2 +- atom/browser/atom_browser_context.cc | 16 +- atom/browser/atom_browser_main_parts.cc | 2 +- .../atom_security_state_model_client.cc | 10 +- ...tom_speech_recognition_manager_delegate.cc | 5 - ...atom_speech_recognition_manager_delegate.h | 2 - atom/browser/browser_win.cc | 1 - atom/browser/mac/dict_util.h | 4 +- atom/browser/native_window.cc | 6 +- atom/browser/native_window.h | 2 +- atom/browser/native_window_mac.mm | 5 - atom/browser/net/asar/url_request_asar_job.cc | 4 +- atom/browser/net/asar/url_request_asar_job.h | 2 +- atom/browser/net/url_request_fetch_job.cc | 3 +- atom/browser/node_debugger.h | 2 +- atom/browser/ui/drag_util_views.cc | 4 +- atom/browser/ui/tray_icon_cocoa.mm | 2 +- atom/browser/ui/views/menu_delegate.h | 3 +- atom/browser/ui/win/notify_icon.cc | 4 +- atom/browser/ui/win/notify_icon.h | 1 - atom/common/api/atom_api_native_image.cc | 2 +- atom/common/api/event_emitter_caller.cc | 1 - atom/common/asar/archive.h | 2 +- .../crash_reporter/crash_reporter_linux.h | 2 +- .../crash_reporter/crash_reporter_mac.h | 1 - .../crash_reporter/crash_reporter_win.h | 1 - .../native_mate_converters/gfx_converter.cc | 15 +- .../native_mate_converters/gfx_converter.h | 11 +- .../v8_value_converter.cc | 2 +- atom/renderer/api/atom_api_web_frame.h | 2 +- atom/renderer/atom_renderer_client.cc | 10 +- atom/renderer/atom_renderer_client.h | 4 +- atom/renderer/preferences_manager.h | 4 +- chromium_src/chrome/browser/browser_process.h | 2 +- .../browser/certificate_manager_model.h | 2 +- .../extensions/global_shortcut_listener_win.h | 3 +- .../media/native_desktop_media_list.cc | 6 - .../browser/media/native_desktop_media_list.h | 1 - .../browser/printing/pdf_to_emf_converter.h | 3 +- .../chrome/browser/printing/print_job.h | 3 +- .../browser/printing/print_job_manager.h | 2 +- .../browser/printing/print_job_worker.h | 3 +- .../printing/print_view_manager_base.cc | 3 +- .../chrome/browser/printing/printer_query.h | 3 +- .../chrome/browser/process_singleton_posix.cc | 2 +- .../chrome/browser/speech/tts_controller.h | 4 +- .../browser/speech/tts_controller_impl.h | 2 +- .../chrome/browser/speech/tts_linux.cc | 2 +- .../chrome/common/chrome_paths_linux.cc | 3 +- .../renderer/media/chrome_key_systems.cc | 156 ++++++++++++++++-- .../renderer/media/chrome_key_systems.h | 10 +- .../pepper_shared_memory_message_filter.cc | 3 +- .../renderer/printing/print_web_view_helper.h | 2 +- .../printing/print_web_view_helper_linux.cc | 3 +- .../printing/print_web_view_helper_pdf_win.cc | 3 +- .../spellchecker/spellcheck_worditerator.h | 2 +- chromium_src/chrome/renderer/tts_dispatcher.h | 4 +- .../stream_listen_socket.cc | 3 +- .../stream_listen_socket.h | 3 +- vendor/native_mate | 2 +- 74 files changed, 304 insertions(+), 176 deletions(-) diff --git a/atom/app/node_main.cc b/atom/app/node_main.cc index 6f71d39f57..3eaeed3394 100644 --- a/atom/app/node_main.cc +++ b/atom/app/node_main.cc @@ -10,7 +10,7 @@ #include "atom/common/node_includes.h" #include "base/command_line.h" #include "base/feature_list.h" -#include "base/thread_task_runner_handle.h" +#include "base/threading/thread_task_runner_handle.h" #include "gin/array_buffer.h" #include "gin/public/isolate_holder.h" #include "gin/v8_initializer.h" diff --git a/atom/browser/api/atom_api_cookies.cc b/atom/browser/api/atom_api_cookies.cc index 919a4bff6f..4ee2190219 100644 --- a/atom/browser/api/atom_api_cookies.cc +++ b/atom/browser/api/atom_api_cookies.cc @@ -4,6 +4,7 @@ #include "atom/browser/api/atom_api_cookies.h" +#include "atom/browser/atom_browser_context.h" #include "atom/common/native_mate_converters/callback.h" #include "atom/common/native_mate_converters/gurl_converter.h" #include "atom/common/native_mate_converters/value_converter.h" @@ -204,8 +205,8 @@ void SetCookieOnIO(scoped_refptr getter, } // namespace Cookies::Cookies(v8::Isolate* isolate, - content::BrowserContext* browser_context) - : request_context_getter_(browser_context->GetRequestContext()) { + AtomBrowserContext* browser_context) + : request_context_getter_(browser_context->url_request_context_getter()) { Init(isolate); } @@ -241,7 +242,7 @@ void Cookies::Set(const base::DictionaryValue& details, // static mate::Handle Cookies::Create( v8::Isolate* isolate, - content::BrowserContext* browser_context) { + AtomBrowserContext* browser_context) { return mate::CreateHandle(isolate, new Cookies(isolate, browser_context)); } diff --git a/atom/browser/api/atom_api_cookies.h b/atom/browser/api/atom_api_cookies.h index 33fee56960..ce20c77597 100644 --- a/atom/browser/api/atom_api_cookies.h +++ b/atom/browser/api/atom_api_cookies.h @@ -16,16 +16,14 @@ namespace base { class DictionaryValue; } -namespace content { -class BrowserContext; -} - namespace net { class URLRequestContextGetter; } namespace atom { +class AtomBrowserContext; + namespace api { class Cookies : public mate::TrackableObject { @@ -39,14 +37,14 @@ class Cookies : public mate::TrackableObject { using SetCallback = base::Callback; static mate::Handle Create(v8::Isolate* isolate, - content::BrowserContext* browser_context); + AtomBrowserContext* browser_context); // mate::TrackableObject: static void BuildPrototype(v8::Isolate* isolate, v8::Local prototype); protected: - Cookies(v8::Isolate* isolate, content::BrowserContext* browser_context); + Cookies(v8::Isolate* isolate, AtomBrowserContext* browser_context); ~Cookies() override; void Get(const base::DictionaryValue& filter, const GetCallback& callback); diff --git a/atom/browser/api/atom_api_menu.h b/atom/browser/api/atom_api_menu.h index 53c6bdaf4e..df1f97a50b 100644 --- a/atom/browser/api/atom_api_menu.h +++ b/atom/browser/api/atom_api_menu.h @@ -5,13 +5,13 @@ #ifndef ATOM_BROWSER_API_ATOM_API_MENU_H_ #define ATOM_BROWSER_API_ATOM_API_MENU_H_ +#include #include #include "atom/browser/api/atom_api_window.h" #include "atom/browser/api/trackable_object.h" #include "atom/browser/ui/atom_menu_model.h" #include "base/callback.h" -#include "base/memory/scoped_ptr.h" namespace atom { diff --git a/atom/browser/api/atom_api_menu_views.cc b/atom/browser/api/atom_api_menu_views.cc index 9340bc7673..c4040e39d7 100644 --- a/atom/browser/api/atom_api_menu_views.cc +++ b/atom/browser/api/atom_api_menu_views.cc @@ -6,7 +6,7 @@ #include "atom/browser/native_window_views.h" #include "content/public/browser/render_widget_host_view.h" -#include "ui/gfx/screen.h" +#include "ui/display/screen.h" #include "ui/views/controls/menu/menu_runner.h" namespace atom { @@ -30,7 +30,7 @@ void MenuViews::PopupAt(Window* window, int x, int y, int positioning_item) { // (-1, -1) means showing on mouse location. gfx::Point location; if (x == -1 || y == -1) { - location = gfx::Screen::GetScreen()->GetCursorScreenPoint(); + location = display::Screen::GetScreen()->GetCursorScreenPoint(); } else { gfx::Point origin = view->GetViewBounds().origin(); location = gfx::Point(origin.x() + x, origin.y() + y); diff --git a/atom/browser/api/atom_api_menu_views.h b/atom/browser/api/atom_api_menu_views.h index 9a7a740182..9b4ddf77f2 100644 --- a/atom/browser/api/atom_api_menu_views.h +++ b/atom/browser/api/atom_api_menu_views.h @@ -6,7 +6,7 @@ #define ATOM_BROWSER_API_ATOM_API_MENU_VIEWS_H_ #include "atom/browser/api/atom_api_menu.h" -#include "ui/gfx/screen.h" +#include "ui/display/screen.h" namespace atom { diff --git a/atom/browser/api/atom_api_power_save_blocker.h b/atom/browser/api/atom_api_power_save_blocker.h index a20b493e75..ee1e0e3213 100644 --- a/atom/browser/api/atom_api_power_save_blocker.h +++ b/atom/browser/api/atom_api_power_save_blocker.h @@ -6,9 +6,9 @@ #define ATOM_BROWSER_API_ATOM_API_POWER_SAVE_BLOCKER_H_ #include +#include #include "atom/browser/api/trackable_object.h" -#include "base/memory/scoped_ptr.h" #include "content/public/browser/power_save_blocker.h" #include "native_mate/handle.h" diff --git a/atom/browser/api/atom_api_protocol.cc b/atom/browser/api/atom_api_protocol.cc index c762559ab6..8b0097c259 100644 --- a/atom/browser/api/atom_api_protocol.cc +++ b/atom/browser/api/atom_api_protocol.cc @@ -27,8 +27,7 @@ namespace atom { namespace api { Protocol::Protocol(v8::Isolate* isolate, AtomBrowserContext* browser_context) - : request_context_getter_(static_cast( - browser_context->GetRequestContext())), + : request_context_getter_(browser_context->url_request_context_getter()), weak_factory_(this) { Init(isolate); } diff --git a/atom/browser/api/atom_api_screen.cc b/atom/browser/api/atom_api_screen.cc index 425d906e28..68f4baeaf2 100644 --- a/atom/browser/api/atom_api_screen.cc +++ b/atom/browser/api/atom_api_screen.cc @@ -12,7 +12,9 @@ #include "base/bind.h" #include "native_mate/dictionary.h" #include "native_mate/object_template_builder.h" -#include "ui/gfx/screen.h" +#include "ui/display/display.h" +#include "ui/display/screen.h" +#include "ui/gfx/geometry/point.h" #include "atom/common/node_includes.h" @@ -34,20 +36,20 @@ typename T::iterator FindById(T* container, int id) { // Convert the changed_metrics bitmask to string array. std::vector MetricsToArray(uint32_t metrics) { std::vector array; - if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_BOUNDS) + if (metrics & display::DisplayObserver::DISPLAY_METRIC_BOUNDS) array.push_back("bounds"); - if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_WORK_AREA) + if (metrics & display::DisplayObserver::DISPLAY_METRIC_WORK_AREA) array.push_back("workArea"); - if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR) + if (metrics & display::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR) array.push_back("scaleFactor"); - if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_ROTATION) + if (metrics & display::DisplayObserver::DISPLAY_METRIC_ROTATION) array.push_back("rotation"); return array; } } // namespace -Screen::Screen(v8::Isolate* isolate, gfx::Screen* screen) +Screen::Screen(v8::Isolate* isolate, display::Screen* screen) : screen_(screen) { screen_->AddObserver(this); Init(isolate); @@ -61,31 +63,31 @@ gfx::Point Screen::GetCursorScreenPoint() { return screen_->GetCursorScreenPoint(); } -gfx::Display Screen::GetPrimaryDisplay() { +display::Display Screen::GetPrimaryDisplay() { return screen_->GetPrimaryDisplay(); } -std::vector Screen::GetAllDisplays() { +std::vector Screen::GetAllDisplays() { return screen_->GetAllDisplays(); } -gfx::Display Screen::GetDisplayNearestPoint(const gfx::Point& point) { +display::Display Screen::GetDisplayNearestPoint(const gfx::Point& point) { return screen_->GetDisplayNearestPoint(point); } -gfx::Display Screen::GetDisplayMatching(const gfx::Rect& match_rect) { +display::Display Screen::GetDisplayMatching(const gfx::Rect& match_rect) { return screen_->GetDisplayMatching(match_rect); } -void Screen::OnDisplayAdded(const gfx::Display& new_display) { +void Screen::OnDisplayAdded(const display::Display& new_display) { Emit("display-added", new_display); } -void Screen::OnDisplayRemoved(const gfx::Display& old_display) { +void Screen::OnDisplayRemoved(const display::Display& old_display) { Emit("display-removed", old_display); } -void Screen::OnDisplayMetricsChanged(const gfx::Display& display, +void Screen::OnDisplayMetricsChanged(const display::Display& display, uint32_t changed_metrics) { Emit("display-metrics-changed", display, MetricsToArray(changed_metrics)); } @@ -99,7 +101,7 @@ v8::Local Screen::Create(v8::Isolate* isolate) { return v8::Null(isolate); } - gfx::Screen* screen = gfx::Screen::GetScreen(); + display::Screen* screen = display::Screen::GetScreen(); if (!screen) { isolate->ThrowException(v8::Exception::Error(mate::StringToV8( isolate, "Failed to get screen information"))); diff --git a/atom/browser/api/atom_api_screen.h b/atom/browser/api/atom_api_screen.h index c17b612885..feff6ddfff 100644 --- a/atom/browser/api/atom_api_screen.h +++ b/atom/browser/api/atom_api_screen.h @@ -9,7 +9,8 @@ #include "atom/browser/api/event_emitter.h" #include "native_mate/handle.h" -#include "ui/gfx/display_observer.h" +#include "ui/display/display_observer.h" +#include "ui/display/screen.h" namespace gfx { class Point; @@ -22,7 +23,7 @@ namespace atom { namespace api { class Screen : public mate::EventEmitter, - public gfx::DisplayObserver { + public display::DisplayObserver { public: static v8::Local Create(v8::Isolate* isolate); @@ -30,23 +31,23 @@ class Screen : public mate::EventEmitter, v8::Local prototype); protected: - Screen(v8::Isolate* isolate, gfx::Screen* screen); + Screen(v8::Isolate* isolate, display::Screen* screen); ~Screen() override; gfx::Point GetCursorScreenPoint(); - gfx::Display GetPrimaryDisplay(); - std::vector GetAllDisplays(); - gfx::Display GetDisplayNearestPoint(const gfx::Point& point); - gfx::Display GetDisplayMatching(const gfx::Rect& match_rect); + display::Display GetPrimaryDisplay(); + std::vector GetAllDisplays(); + display::Display GetDisplayNearestPoint(const gfx::Point& point); + display::Display GetDisplayMatching(const gfx::Rect& match_rect); - // gfx::DisplayObserver: - void OnDisplayAdded(const gfx::Display& new_display) override; - void OnDisplayRemoved(const gfx::Display& old_display) override; - void OnDisplayMetricsChanged(const gfx::Display& display, + // display::DisplayObserver: + void OnDisplayAdded(const display::Display& new_display) override; + void OnDisplayRemoved(const display::Display& old_display) override; + void OnDisplayMetricsChanged(const display::Display& display, uint32_t changed_metrics) override; private: - gfx::Screen* screen_; + display::Screen* screen_; DISALLOW_COPY_AND_ASSIGN(Screen); }; diff --git a/atom/browser/api/atom_api_session.cc b/atom/browser/api/atom_api_session.cc index 4a4ffba0c8..6f9f1609db 100644 --- a/atom/browser/api/atom_api_session.cc +++ b/atom/browser/api/atom_api_session.cc @@ -26,7 +26,7 @@ #include "components/prefs/pref_service.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" -#include "base/thread_task_runner_handle.h" +#include "base/threading/thread_task_runner_handle.h" #include "brightray/browser/net/devtools_network_conditions.h" #include "brightray/browser/net/devtools_network_controller_handle.h" #include "chrome/common/pref_names.h" @@ -175,7 +175,7 @@ class ResolveProxyHelper { : callback_(callback), original_thread_(base::ThreadTaskRunnerHandle::Get()) { scoped_refptr context_getter = - browser_context->GetRequestContext(); + browser_context->url_request_context_getter(); context_getter->GetNetworkTaskRunner()->PostTask( FROM_HERE, base::Bind(&ResolveProxyHelper::ResolveProxy, @@ -278,7 +278,7 @@ void SetProxyInIO(net::URLRequestContextGetter* getter, const net::ProxyConfig& config, const base::Closure& callback) { auto proxy_service = getter->GetURLRequestContext()->proxy_service(); - proxy_service->ResetConfigService(make_scoped_ptr( + proxy_service->ResetConfigService(base::WrapUnique( new net::ProxyConfigServiceFixed(config))); // Refetches and applies the new pac script if provided. proxy_service->ForceReloadProxyConfig(); @@ -354,7 +354,7 @@ template void Session::DoCacheAction(const net::CompletionCallback& callback) { BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(&DoCacheActionInIO, - make_scoped_refptr(browser_context_->GetRequestContext()), + make_scoped_refptr(browser_context_->url_request_context_getter()), action, callback)); } @@ -385,7 +385,7 @@ void Session::FlushStorageData() { void Session::SetProxy(const net::ProxyConfig& config, const base::Closure& callback) { - auto getter = browser_context_->GetRequestContext(); + auto getter = browser_context_->url_request_context_getter(); BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(&SetProxyInIO, base::Unretained(getter), config, callback)); } @@ -455,14 +455,14 @@ void Session::ClearHostResolverCache(mate::Arguments* args) { BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(&ClearHostResolverCacheInIO, - make_scoped_refptr(browser_context_->GetRequestContext()), + make_scoped_refptr(browser_context_->url_request_context_getter()), callback)); } void Session::AllowNTLMCredentialsForDomains(const std::string& domains) { BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(&AllowNTLMCredentialsForDomainsInIO, - make_scoped_refptr(browser_context_->GetRequestContext()), + make_scoped_refptr(browser_context_->url_request_context_getter()), domains)); } @@ -473,7 +473,7 @@ void Session::SetUserAgent(const std::string& user_agent, std::string accept_lang = l10n_util::GetApplicationLocale(""); args->GetNext(&accept_lang); - auto getter = browser_context_->GetRequestContext(); + auto getter = browser_context_->url_request_context_getter(); getter->GetNetworkTaskRunner()->PostTask( FROM_HERE, base::Bind(&SetUserAgentInIO, getter, accept_lang, user_agent)); diff --git a/atom/browser/api/atom_api_tray.h b/atom/browser/api/atom_api_tray.h index 4dd79c467f..95cca87db5 100644 --- a/atom/browser/api/atom_api_tray.h +++ b/atom/browser/api/atom_api_tray.h @@ -5,12 +5,12 @@ #ifndef ATOM_BROWSER_API_ATOM_API_TRAY_H_ #define ATOM_BROWSER_API_ATOM_API_TRAY_H_ +#include #include #include #include "atom/browser/api/trackable_object.h" #include "atom/browser/ui/tray_icon_observer.h" -#include "base/memory/scoped_ptr.h" #include "native_mate/handle.h" namespace gfx { diff --git a/atom/browser/api/trackable_object.h b/atom/browser/api/trackable_object.h index bbed547540..2cb9428a00 100644 --- a/atom/browser/api/trackable_object.h +++ b/atom/browser/api/trackable_object.h @@ -10,7 +10,6 @@ #include "atom/browser/api/event_emitter.h" #include "atom/common/key_weak_map.h" #include "base/bind.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "native_mate/object_template_builder.h" diff --git a/atom/browser/atom_access_token_store.cc b/atom/browser/atom_access_token_store.cc index 9f57148120..42b04c5db6 100644 --- a/atom/browser/atom_access_token_store.cc +++ b/atom/browser/atom_access_token_store.cc @@ -48,7 +48,7 @@ void AtomAccessTokenStore::SaveAccessToken(const GURL& server_url, void AtomAccessTokenStore::GetRequestContextOnUIThread() { auto browser_context = brightray::BrowserContext::From("", false); - request_context_getter_ = browser_context->GetRequestContext(); + request_context_getter_ = browser_context->url_request_context_getter(); } void AtomAccessTokenStore::RespondOnOriginatingThread( diff --git a/atom/browser/atom_browser_client.cc b/atom/browser/atom_browser_client.cc index add3154642..323acdd9b3 100644 --- a/atom/browser/atom_browser_client.cc +++ b/atom/browser/atom_browser_client.cc @@ -202,7 +202,7 @@ void AtomBrowserClient::AppendExtraCommandLineSwitches( void AtomBrowserClient::DidCreatePpapiPlugin( content::BrowserPpapiHost* host) { host->GetPpapiHost()->AddHostFactoryFilter( - make_scoped_ptr(new chrome::ChromeBrowserPepperHostFactory(host))); + base::WrapUnique(new chrome::ChromeBrowserPepperHostFactory(host))); } content::QuotaPermissionContext* diff --git a/atom/browser/atom_browser_context.cc b/atom/browser/atom_browser_context.cc index 7b682543a0..30617166a1 100644 --- a/atom/browser/atom_browser_context.cc +++ b/atom/browser/atom_browser_context.cc @@ -113,29 +113,29 @@ AtomBrowserContext::CreateURLRequestJobFactory( protocol_handlers->clear(); job_factory->SetProtocolHandler( - url::kDataScheme, make_scoped_ptr(new net::DataProtocolHandler)); + url::kDataScheme, base::WrapUnique(new net::DataProtocolHandler)); job_factory->SetProtocolHandler( - url::kFileScheme, make_scoped_ptr(new asar::AsarProtocolHandler( + url::kFileScheme, base::WrapUnique(new asar::AsarProtocolHandler( BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior( base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)))); job_factory->SetProtocolHandler( url::kHttpScheme, - make_scoped_ptr(new HttpProtocolHandler(url::kHttpScheme))); + base::WrapUnique(new HttpProtocolHandler(url::kHttpScheme))); job_factory->SetProtocolHandler( url::kHttpsScheme, - make_scoped_ptr(new HttpProtocolHandler(url::kHttpsScheme))); + base::WrapUnique(new HttpProtocolHandler(url::kHttpsScheme))); job_factory->SetProtocolHandler( url::kWsScheme, - make_scoped_ptr(new HttpProtocolHandler(url::kWsScheme))); + base::WrapUnique(new HttpProtocolHandler(url::kWsScheme))); job_factory->SetProtocolHandler( url::kWssScheme, - make_scoped_ptr(new HttpProtocolHandler(url::kWssScheme))); + base::WrapUnique(new HttpProtocolHandler(url::kWssScheme))); auto host_resolver = url_request_context_getter()->GetURLRequestContext()->host_resolver(); job_factory->SetProtocolHandler( url::kFtpScheme, - make_scoped_ptr(new net::FtpProtocolHandler( + base::WrapUnique(new net::FtpProtocolHandler( new net::FtpNetworkLayer(host_resolver)))); return std::move(job_factory); @@ -174,7 +174,7 @@ content::PermissionManager* AtomBrowserContext::GetPermissionManager() { } std::unique_ptr AtomBrowserContext::CreateCertVerifier() { - return make_scoped_ptr(cert_verifier_); + return base::WrapUnique(cert_verifier_); } net::SSLConfigService* AtomBrowserContext::CreateSSLConfigService() { diff --git a/atom/browser/atom_browser_main_parts.cc b/atom/browser/atom_browser_main_parts.cc index b933d1073b..73e4e5e735 100644 --- a/atom/browser/atom_browser_main_parts.cc +++ b/atom/browser/atom_browser_main_parts.cc @@ -15,7 +15,7 @@ #include "atom/common/node_bindings.h" #include "atom/common/node_includes.h" #include "base/command_line.h" -#include "base/thread_task_runner_handle.h" +#include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/browser_process.h" #include "v8/include/v8-debug.h" diff --git a/atom/browser/atom_security_state_model_client.cc b/atom/browser/atom_security_state_model_client.cc index 911849c5c2..77a91bdec9 100644 --- a/atom/browser/atom_security_state_model_client.cc +++ b/atom/browser/atom_security_state_model_client.cc @@ -91,8 +91,14 @@ void AtomSecurityStateModelClient::GetVisibleSecurityState( state->connection_status = ssl.connection_status; state->security_bits = ssl.security_bits; state->sct_verify_statuses.clear(); - for (const auto& sct : ssl.signed_certificate_timestamp_ids) - state->sct_verify_statuses.push_back(sct.status); + state->sct_verify_statuses.insert(state->sct_verify_statuses.end(), + ssl.num_unknown_scts, + net::ct::SCT_STATUS_LOG_UNKNOWN); + state->sct_verify_statuses.insert(state->sct_verify_statuses.end(), + ssl.num_invalid_scts, + net::ct::SCT_STATUS_INVALID); + state->sct_verify_statuses.insert(state->sct_verify_statuses.end(), + ssl.num_valid_scts, net::ct::SCT_STATUS_OK); state->displayed_mixed_content = (ssl.content_status & content::SSLStatus::DISPLAYED_INSECURE_CONTENT) ? true diff --git a/atom/browser/atom_speech_recognition_manager_delegate.cc b/atom/browser/atom_speech_recognition_manager_delegate.cc index 06727332f0..d2e7135c9a 100644 --- a/atom/browser/atom_speech_recognition_manager_delegate.cc +++ b/atom/browser/atom_speech_recognition_manager_delegate.cc @@ -50,11 +50,6 @@ void AtomSpeechRecognitionManagerDelegate::OnAudioLevelsChange( int session_id, float volume, float noise_volume) { } -void AtomSpeechRecognitionManagerDelegate::GetDiagnosticInformation( - bool* can_report_metrics, std::string* hardware_info) { - *can_report_metrics = false; -} - void AtomSpeechRecognitionManagerDelegate::CheckRecognitionIsAllowed( int session_id, base::Callback callback) { diff --git a/atom/browser/atom_speech_recognition_manager_delegate.h b/atom/browser/atom_speech_recognition_manager_delegate.h index 4c78e0eead..a6b2f059f7 100644 --- a/atom/browser/atom_speech_recognition_manager_delegate.h +++ b/atom/browser/atom_speech_recognition_manager_delegate.h @@ -36,8 +36,6 @@ class AtomSpeechRecognitionManagerDelegate float noise_volume) override; // content::SpeechRecognitionManagerDelegate: - void GetDiagnosticInformation(bool* can_report_metrics, - std::string* hardware_info) override; void CheckRecognitionIsAllowed( int session_id, base::Callback callback) override; diff --git a/atom/browser/browser_win.cc b/atom/browser/browser_win.cc index 5eb9275dcf..56820789dd 100644 --- a/atom/browser/browser_win.cc +++ b/atom/browser/browser_win.cc @@ -13,7 +13,6 @@ #include "base/base_paths.h" #include "base/file_version_info.h" #include "base/files/file_path.h" -#include "base/memory/scoped_ptr.h" #include "base/path_service.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" diff --git a/atom/browser/mac/dict_util.h b/atom/browser/mac/dict_util.h index 3ffd8ba510..74a2b7234c 100644 --- a/atom/browser/mac/dict_util.h +++ b/atom/browser/mac/dict_util.h @@ -5,9 +5,9 @@ #ifndef ATOM_BROWSER_MAC_DICT_UTIL_H_ #define ATOM_BROWSER_MAC_DICT_UTIL_H_ -#import +#include -#include "base/memory/scoped_ptr.h" +#import namespace base { class ListValue; diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 4eb72dfe08..131beebd79 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -37,7 +37,7 @@ #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size_conversions.h" -#include "ui/gfx/screen.h" +#include "ui/display/screen.h" #include "ui/gl/gpu_switching_manager.h" DEFINE_WEB_CONTENTS_USER_DATA_KEY(atom::NativeWindowRelay); @@ -334,7 +334,7 @@ void NativeWindow::CapturePage(const gfx::Rect& rect, gfx::Size bitmap_size = view_size; const gfx::NativeView native_view = view->GetNativeView(); const float scale = - gfx::Screen::GetScreen()->GetDisplayNearestWindow(native_view) + display::Screen::GetScreen()->GetDisplayNearestWindow(native_view) .device_scale_factor(); if (scale > 1.0f) bitmap_size = gfx::ScaleToCeiledSize(view_size, scale); @@ -394,7 +394,7 @@ void NativeWindow::RequestToClosePage() { ScheduleUnresponsiveEvent(5000); if (web_contents()->NeedToFireBeforeUnload()) - web_contents()->DispatchBeforeUnload(false); + web_contents()->DispatchBeforeUnload(); else web_contents()->Close(); } diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index 8656c02ca9..6c7ac826b6 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -6,13 +6,13 @@ #define ATOM_BROWSER_NATIVE_WINDOW_H_ #include +#include #include #include #include "atom/browser/native_window_observer.h" #include "atom/browser/ui/accelerator_util.h" #include "base/cancelable_callback.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/supports_user_data.h" diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 1ef003ab2a..adf7f41e43 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -724,11 +724,6 @@ void NativeWindowMac::SetFullScreen(bool fullscreen) { if (fullscreen == IsFullscreen()) return; - if (!base::mac::IsOSLionOrLater()) { - LOG(ERROR) << "Fullscreen mode is only supported above Lion"; - return; - } - [window_ toggleFullScreen:nil]; } diff --git a/atom/browser/net/asar/url_request_asar_job.cc b/atom/browser/net/asar/url_request_asar_job.cc index 39e55a35cb..95a1bd1751 100644 --- a/atom/browser/net/asar/url_request_asar_job.cc +++ b/atom/browser/net/asar/url_request_asar_job.cc @@ -180,10 +180,10 @@ bool URLRequestAsarJob::IsRedirectResponse(GURL* location, #endif } -net::Filter* URLRequestAsarJob::SetupFilter() const { +std::unique_ptr URLRequestAsarJob::SetupFilter() const { // Bug 9936 - .svgz files needs to be decompressed. return base::LowerCaseEqualsASCII(file_path_.Extension(), ".svgz") - ? net::Filter::GZipFactory() : NULL; + ? net::Filter::GZipFactory() : nullptr; } bool URLRequestAsarJob::GetMimeType(std::string* mime_type) const { diff --git a/atom/browser/net/asar/url_request_asar_job.h b/atom/browser/net/asar/url_request_asar_job.h index 56c519823c..8c32932fa5 100644 --- a/atom/browser/net/asar/url_request_asar_job.h +++ b/atom/browser/net/asar/url_request_asar_job.h @@ -56,7 +56,7 @@ class URLRequestAsarJob : public net::URLRequestJob { void Kill() override; int ReadRawData(net::IOBuffer* buf, int buf_size) override; bool IsRedirectResponse(GURL* location, int* http_status_code) override; - net::Filter* SetupFilter() const override; + std::unique_ptr SetupFilter() const override; bool GetMimeType(std::string* mime_type) const override; void SetExtraRequestHeaders(const net::HttpRequestHeaders& headers) override; int GetResponseCode() const override; diff --git a/atom/browser/net/url_request_fetch_job.cc b/atom/browser/net/url_request_fetch_job.cc index 8279d09d5d..5f11c67476 100644 --- a/atom/browser/net/url_request_fetch_job.cc +++ b/atom/browser/net/url_request_fetch_job.cc @@ -7,6 +7,7 @@ #include #include +#include "base/memory/ptr_util.h" #include "base/strings/string_util.h" #include "native_mate/dictionary.h" #include "net/base/io_buffer.h" @@ -132,7 +133,7 @@ void URLRequestFetchJob::StartAsync(std::unique_ptr options) { request_type = GetRequestType(method); fetcher_ = net::URLFetcher::Create(formated_url, request_type, this); - fetcher_->SaveResponseWithWriter(make_scoped_ptr(new ResponsePiper(this))); + fetcher_->SaveResponseWithWriter(base::WrapUnique(new ResponsePiper(this))); // A request context getter is passed by the user. if (url_request_context_getter_) diff --git a/atom/browser/node_debugger.h b/atom/browser/node_debugger.h index f708de6329..118812a139 100644 --- a/atom/browser/node_debugger.h +++ b/atom/browser/node_debugger.h @@ -5,9 +5,9 @@ #ifndef ATOM_BROWSER_NODE_DEBUGGER_H_ #define ATOM_BROWSER_NODE_DEBUGGER_H_ +#include #include -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread.h" #include "net/test/embedded_test_server/stream_listen_socket.h" diff --git a/atom/browser/ui/drag_util_views.cc b/atom/browser/ui/drag_util_views.cc index c69e34326c..9a035bf082 100644 --- a/atom/browser/ui/drag_util_views.cc +++ b/atom/browser/ui/drag_util_views.cc @@ -10,7 +10,7 @@ #include "ui/base/dragdrop/file_info.h" #include "ui/base/dragdrop/os_exchange_data.h" #include "ui/gfx/geometry/point.h" -#include "ui/gfx/screen.h" +#include "ui/display/screen.h" #include "ui/views/widget/widget.h" #include "ui/wm/public/drag_drop_client.h" @@ -34,7 +34,7 @@ void DragFileItems(const std::vector& files, if (!root_window || !aura::client::GetDragDropClient(root_window)) return; - gfx::Point location = gfx::Screen::GetScreen()->GetCursorScreenPoint(); + gfx::Point location = display::Screen::GetScreen()->GetCursorScreenPoint(); // TODO(varunjain): Properly determine and send DRAG_EVENT_SOURCE below. aura::client::GetDragDropClient(root_window)->StartDragAndDrop( data, diff --git a/atom/browser/ui/tray_icon_cocoa.mm b/atom/browser/ui/tray_icon_cocoa.mm index 2510d3160c..ccf5b5cd7e 100644 --- a/atom/browser/ui/tray_icon_cocoa.mm +++ b/atom/browser/ui/tray_icon_cocoa.mm @@ -9,7 +9,7 @@ #include "ui/events/cocoa/cocoa_event_utils.h" #include "ui/gfx/image/image.h" #include "ui/gfx/mac/coordinate_conversion.h" -#include "ui/gfx/screen.h" +#include "ui/display/screen.h" namespace { diff --git a/atom/browser/ui/views/menu_delegate.h b/atom/browser/ui/views/menu_delegate.h index ad7093b48f..bdc22fb4a7 100644 --- a/atom/browser/ui/views/menu_delegate.h +++ b/atom/browser/ui/views/menu_delegate.h @@ -5,7 +5,8 @@ #ifndef ATOM_BROWSER_UI_VIEWS_MENU_DELEGATE_H_ #define ATOM_BROWSER_UI_VIEWS_MENU_DELEGATE_H_ -#include "base/memory/scoped_ptr.h" +#include + #include "ui/views/controls/menu/menu_delegate.h" namespace views { diff --git a/atom/browser/ui/win/notify_icon.cc b/atom/browser/ui/win/notify_icon.cc index a82ac36c7a..09751a0c81 100644 --- a/atom/browser/ui/win/notify_icon.cc +++ b/atom/browser/ui/win/notify_icon.cc @@ -12,7 +12,7 @@ #include "ui/gfx/image/image.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" -#include "ui/gfx/screen.h" +#include "ui/display/screen.h" #include "ui/gfx/win/dpi.h" #include "ui/views/controls/menu/menu_runner.h" @@ -145,7 +145,7 @@ void NotifyIcon::PopUpContextMenu(const gfx::Point& pos, // Show menu at mouse's position by default. gfx::Rect rect(pos, gfx::Size()); if (pos.IsOrigin()) - rect.set_origin(gfx::Screen::GetScreen()->GetCursorScreenPoint()); + rect.set_origin(display::Screen::GetScreen()->GetCursorScreenPoint()); views::MenuRunner menu_runner( menu_model != nullptr ? menu_model : menu_model_, diff --git a/atom/browser/ui/win/notify_icon.h b/atom/browser/ui/win/notify_icon.h index 1284ebadcf..2225667cd3 100644 --- a/atom/browser/ui/win/notify_icon.h +++ b/atom/browser/ui/win/notify_icon.h @@ -13,7 +13,6 @@ #include "atom/browser/ui/tray_icon.h" #include "base/macros.h" #include "base/compiler_specific.h" -#include "base/memory/scoped_ptr.h" #include "base/win/scoped_gdi_object.h" namespace gfx { diff --git a/atom/common/api/atom_api_native_image.cc b/atom/common/api/atom_api_native_image.cc index 14500496eb..3cd3dcc7f2 100644 --- a/atom/common/api/atom_api_native_image.cc +++ b/atom/common/api/atom_api_native_image.cc @@ -81,7 +81,7 @@ bool AddImageSkiaRep(gfx::ImageSkia* image, // Try PNG first. if (!gfx::PNGCodec::Decode(data, size, decoded.get())) // Try JPEG. - decoded.reset(gfx::JPEGCodec::Decode(data, size)); + decoded = gfx::JPEGCodec::Decode(data, size); if (!decoded) return false; diff --git a/atom/common/api/event_emitter_caller.cc b/atom/common/api/event_emitter_caller.cc index ac6c9c213f..40448cad10 100644 --- a/atom/common/api/event_emitter_caller.cc +++ b/atom/common/api/event_emitter_caller.cc @@ -6,7 +6,6 @@ #include "atom/common/api/locker.h" #include "atom/common/node_includes.h" -#include "base/memory/scoped_ptr.h" namespace mate { diff --git a/atom/common/asar/archive.h b/atom/common/asar/archive.h index 5438776885..9e3abc3434 100644 --- a/atom/common/asar/archive.h +++ b/atom/common/asar/archive.h @@ -5,12 +5,12 @@ #ifndef ATOM_COMMON_ASAR_ARCHIVE_H_ #define ATOM_COMMON_ASAR_ARCHIVE_H_ +#include #include #include "base/containers/scoped_ptr_hash_map.h" #include "base/files/file.h" #include "base/files/file_path.h" -#include "base/memory/scoped_ptr.h" namespace base { class DictionaryValue; diff --git a/atom/common/crash_reporter/crash_reporter_linux.h b/atom/common/crash_reporter/crash_reporter_linux.h index b74103ccbf..de5a50e719 100644 --- a/atom/common/crash_reporter/crash_reporter_linux.h +++ b/atom/common/crash_reporter/crash_reporter_linux.h @@ -5,12 +5,12 @@ #ifndef ATOM_COMMON_CRASH_REPORTER_CRASH_REPORTER_LINUX_H_ #define ATOM_COMMON_CRASH_REPORTER_CRASH_REPORTER_LINUX_H_ +#include #include #include "atom/common/crash_reporter/crash_reporter.h" #include "atom/common/crash_reporter/linux/crash_dump_handler.h" #include "base/compiler_specific.h" -#include "base/memory/scoped_ptr.h" namespace base { template struct DefaultSingletonTraits; diff --git a/atom/common/crash_reporter/crash_reporter_mac.h b/atom/common/crash_reporter/crash_reporter_mac.h index 5556263cd3..8acf50285d 100644 --- a/atom/common/crash_reporter/crash_reporter_mac.h +++ b/atom/common/crash_reporter/crash_reporter_mac.h @@ -10,7 +10,6 @@ #include "atom/common/crash_reporter/crash_reporter.h" #include "base/compiler_specific.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/string_piece.h" #include "vendor/crashpad/client/simple_string_dictionary.h" diff --git a/atom/common/crash_reporter/crash_reporter_win.h b/atom/common/crash_reporter/crash_reporter_win.h index 0ab8f4bcfb..5ad41573d8 100644 --- a/atom/common/crash_reporter/crash_reporter_win.h +++ b/atom/common/crash_reporter/crash_reporter_win.h @@ -10,7 +10,6 @@ #include "atom/common/crash_reporter/crash_reporter.h" #include "base/compiler_specific.h" -#include "base/memory/scoped_ptr.h" #include "vendor/breakpad/src/client/windows/handler/exception_handler.h" namespace base { diff --git a/atom/common/native_mate_converters/gfx_converter.cc b/atom/common/native_mate_converters/gfx_converter.cc index 37e7aeb3a4..7e0a149300 100644 --- a/atom/common/native_mate_converters/gfx_converter.cc +++ b/atom/common/native_mate_converters/gfx_converter.cc @@ -7,8 +7,9 @@ #include "native_mate/dictionary.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" -#include "ui/gfx/screen.h" #include "ui/gfx/geometry/size.h" +#include "ui/display/display.h" +#include "ui/display/screen.h" namespace mate { @@ -82,13 +83,13 @@ bool Converter::FromV8(v8::Isolate* isolate, } template<> -struct Converter { +struct Converter { static v8::Local ToV8(v8::Isolate* isolate, - const gfx::Display::TouchSupport& val) { + const display::Display::TouchSupport& val) { switch (val) { - case gfx::Display::TOUCH_SUPPORT_AVAILABLE: + case display::Display::TOUCH_SUPPORT_AVAILABLE: return StringToV8(isolate, "available"); - case gfx::Display::TOUCH_SUPPORT_UNAVAILABLE: + case display::Display::TOUCH_SUPPORT_UNAVAILABLE: return StringToV8(isolate, "unavailable"); default: return StringToV8(isolate, "unknown"); @@ -96,8 +97,8 @@ struct Converter { } }; -v8::Local Converter::ToV8(v8::Isolate* isolate, - const gfx::Display& val) { +v8::Local Converter::ToV8(v8::Isolate* isolate, + const display::Display& val) { mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate); dict.SetHidden("simple", true); dict.Set("id", val.id()); diff --git a/atom/common/native_mate_converters/gfx_converter.h b/atom/common/native_mate_converters/gfx_converter.h index c6da76a2d0..1797710962 100644 --- a/atom/common/native_mate_converters/gfx_converter.h +++ b/atom/common/native_mate_converters/gfx_converter.h @@ -7,11 +7,14 @@ #include "native_mate/converter.h" +namespace display { +class Display; +} + namespace gfx { class Point; class Size; class Rect; -class Display; } namespace mate { @@ -44,12 +47,12 @@ struct Converter { }; template<> -struct Converter { +struct Converter { static v8::Local ToV8(v8::Isolate* isolate, - const gfx::Display& val); + const display::Display& val); static bool FromV8(v8::Isolate* isolate, v8::Local val, - gfx::Display* out); + display::Display* out); }; } // namespace mate diff --git a/atom/common/native_mate_converters/v8_value_converter.cc b/atom/common/native_mate_converters/v8_value_converter.cc index ff96b727e0..af2cbaecc2 100644 --- a/atom/common/native_mate_converters/v8_value_converter.cc +++ b/atom/common/native_mate_converters/v8_value_converter.cc @@ -5,11 +5,11 @@ #include "atom/common/native_mate_converters/v8_value_converter.h" #include +#include #include #include #include "base/logging.h" -#include "base/memory/scoped_ptr.h" #include "base/values.h" #include "native_mate/dictionary.h" #include "vendor/node/src/node_buffer.h" diff --git a/atom/renderer/api/atom_api_web_frame.h b/atom/renderer/api/atom_api_web_frame.h index df0392a933..852191fc76 100644 --- a/atom/renderer/api/atom_api_web_frame.h +++ b/atom/renderer/api/atom_api_web_frame.h @@ -5,10 +5,10 @@ #ifndef ATOM_RENDERER_API_ATOM_API_WEB_FRAME_H_ #define ATOM_RENDERER_API_ATOM_API_WEB_FRAME_H_ +#include #include #include "atom/renderer/guest_view_container.h" -#include "base/memory/scoped_ptr.h" #include "native_mate/handle.h" #include "native_mate/wrappable.h" #include "third_party/WebKit/public/web/WebCache.h" diff --git a/atom/renderer/atom_renderer_client.cc b/atom/renderer/atom_renderer_client.cc index 63a9a3eb26..7861f9d1e6 100644 --- a/atom/renderer/atom_renderer_client.cc +++ b/atom/renderer/atom_renderer_client.cc @@ -317,11 +317,6 @@ content::BrowserPluginDelegate* AtomRendererClient::CreateBrowserPluginDelegate( } } -void AtomRendererClient::AddKeySystems( - std::vector* key_systems) { - AddChromeKeySystems(key_systems); -} - void AtomRendererClient::GetNavigationErrorStrings( content::RenderFrame* render_frame, const blink::WebURLRequest& failed_request, @@ -334,4 +329,9 @@ void AtomRendererClient::GetNavigationErrorStrings( *error_description = base::UTF8ToUTF16(net::ErrorToShortString(error.reason)); } +void AtomRendererClient::AddSupportedKeySystems( + std::vector>* key_systems) { + AddChromeKeySystems(key_systems); +} + } // namespace atom diff --git a/atom/renderer/atom_renderer_client.h b/atom/renderer/atom_renderer_client.h index f4a548908e..3b6f8a52d2 100644 --- a/atom/renderer/atom_renderer_client.h +++ b/atom/renderer/atom_renderer_client.h @@ -57,12 +57,14 @@ class AtomRendererClient : public content::ContentRendererClient { content::RenderFrame* render_frame, const std::string& mime_type, const GURL& original_url) override; - void AddKeySystems(std::vector* key_systems) override; void GetNavigationErrorStrings(content::RenderFrame* render_frame, const blink::WebURLRequest& failed_request, const blink::WebURLError& error, std::string* error_html, base::string16* error_description) override; + void AddSupportedKeySystems( + std::vector>* key_systems) + override; std::unique_ptr node_bindings_; std::unique_ptr atom_bindings_; diff --git a/atom/renderer/preferences_manager.h b/atom/renderer/preferences_manager.h index 451928085d..c531fe879a 100644 --- a/atom/renderer/preferences_manager.h +++ b/atom/renderer/preferences_manager.h @@ -8,11 +8,11 @@ #include #include "base/values.h" -#include "content/public/renderer/render_process_observer.h" +#include "content/public/renderer/render_thread_observer.h" namespace atom { -class PreferencesManager : public content::RenderProcessObserver { +class PreferencesManager : public content::RenderThreadObserver { public: PreferencesManager(); ~PreferencesManager() override; diff --git a/chromium_src/chrome/browser/browser_process.h b/chromium_src/chrome/browser/browser_process.h index 53ec0ba75f..1459ca31a6 100644 --- a/chromium_src/chrome/browser/browser_process.h +++ b/chromium_src/chrome/browser/browser_process.h @@ -10,10 +10,10 @@ #ifndef CHROME_BROWSER_BROWSER_PROCESS_H_ #define CHROME_BROWSER_BROWSER_PROCESS_H_ +#include #include #include "base/macros.h" -#include "base/memory/scoped_ptr.h" namespace printing { class PrintJobManager; diff --git a/chromium_src/chrome/browser/certificate_manager_model.h b/chromium_src/chrome/browser/certificate_manager_model.h index 81c3b6c8a8..7646da5b9b 100644 --- a/chromium_src/chrome/browser/certificate_manager_model.h +++ b/chromium_src/chrome/browser/certificate_manager_model.h @@ -6,12 +6,12 @@ #define CHROME_BROWSER_CERTIFICATE_MANAGER_MODEL_H_ #include +#include #include #include "base/callback.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" #include "net/cert/nss_cert_database.h" diff --git a/chromium_src/chrome/browser/extensions/global_shortcut_listener_win.h b/chromium_src/chrome/browser/extensions/global_shortcut_listener_win.h index 1999e0e774..83e9fdff28 100644 --- a/chromium_src/chrome/browser/extensions/global_shortcut_listener_win.h +++ b/chromium_src/chrome/browser/extensions/global_shortcut_listener_win.h @@ -5,9 +5,10 @@ #ifndef CHROME_BROWSER_EXTENSIONS_GLOBAL_SHORTCUT_LISTENER_WIN_H_ #define CHROME_BROWSER_EXTENSIONS_GLOBAL_SHORTCUT_LISTENER_WIN_H_ +#include + #include -#include "base/memory/scoped_ptr.h" #include "chrome/browser/extensions/global_shortcut_listener.h" #include "ui/gfx/win/singleton_hwnd.h" #include "ui/gfx/win/singleton_hwnd_observer.h" diff --git a/chromium_src/chrome/browser/media/native_desktop_media_list.cc b/chromium_src/chrome/browser/media/native_desktop_media_list.cc index a524dfcf38..76170a473d 100644 --- a/chromium_src/chrome/browser/media/native_desktop_media_list.cc +++ b/chromium_src/chrome/browser/media/native_desktop_media_list.cc @@ -97,7 +97,6 @@ class NativeDesktopMediaList::Worker typedef std::map ImageHashesMap; // webrtc::DesktopCapturer::Callback interface. - webrtc::SharedMemory* CreateSharedMemory(size_t size) override; void OnCaptureCompleted(webrtc::DesktopFrame* frame) override; base::WeakPtr media_list_; @@ -218,11 +217,6 @@ void NativeDesktopMediaList::Worker::Refresh( base::Bind(&NativeDesktopMediaList::OnRefreshFinished, media_list_)); } -webrtc::SharedMemory* NativeDesktopMediaList::Worker::CreateSharedMemory( - size_t size) { - return NULL; -} - void NativeDesktopMediaList::Worker::OnCaptureCompleted( webrtc::DesktopFrame* frame) { current_frame_.reset(frame); diff --git a/chromium_src/chrome/browser/media/native_desktop_media_list.h b/chromium_src/chrome/browser/media/native_desktop_media_list.h index 8032439798..9814849a29 100644 --- a/chromium_src/chrome/browser/media/native_desktop_media_list.h +++ b/chromium_src/chrome/browser/media/native_desktop_media_list.h @@ -5,7 +5,6 @@ #ifndef CHROME_BROWSER_MEDIA_NATIVE_DESKTOP_MEDIA_LIST_H_ #define CHROME_BROWSER_MEDIA_NATIVE_DESKTOP_MEDIA_LIST_H_ -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/sequenced_task_runner.h" #include "chrome/browser/media/desktop_media_list.h" diff --git a/chromium_src/chrome/browser/printing/pdf_to_emf_converter.h b/chromium_src/chrome/browser/printing/pdf_to_emf_converter.h index 859d422931..bd292dd476 100644 --- a/chromium_src/chrome/browser/printing/pdf_to_emf_converter.h +++ b/chromium_src/chrome/browser/printing/pdf_to_emf_converter.h @@ -5,9 +5,10 @@ #ifndef CHROME_BROWSER_PRINTING_PDF_TO_EMF_CONVERTER_H_ #define CHROME_BROWSER_PRINTING_PDF_TO_EMF_CONVERTER_H_ +#include + #include "base/callback.h" #include "base/memory/ref_counted_memory.h" -#include "base/memory/scoped_ptr.h" namespace base { class FilePath; diff --git a/chromium_src/chrome/browser/printing/print_job.h b/chromium_src/chrome/browser/printing/print_job.h index 5569f87679..420622a7e9 100644 --- a/chromium_src/chrome/browser/printing/print_job.h +++ b/chromium_src/chrome/browser/printing/print_job.h @@ -5,7 +5,8 @@ #ifndef CHROME_BROWSER_PRINTING_PRINT_JOB_H_ #define CHROME_BROWSER_PRINTING_PRINT_JOB_H_ -#include "base/memory/scoped_ptr.h" +#include + #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" #include "chrome/browser/printing/print_job_worker_owner.h" diff --git a/chromium_src/chrome/browser/printing/print_job_manager.h b/chromium_src/chrome/browser/printing/print_job_manager.h index 32d5b301b2..ddb4e97b42 100644 --- a/chromium_src/chrome/browser/printing/print_job_manager.h +++ b/chromium_src/chrome/browser/printing/print_job_manager.h @@ -5,12 +5,12 @@ #ifndef CHROME_BROWSER_PRINTING_PRINT_JOB_MANAGER_H_ #define CHROME_BROWSER_PRINTING_PRINT_JOB_MANAGER_H_ +#include #include #include #include "base/logging.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/synchronization/lock.h" #include "base/threading/non_thread_safe.h" #include "content/public/browser/notification_observer.h" diff --git a/chromium_src/chrome/browser/printing/print_job_worker.h b/chromium_src/chrome/browser/printing/print_job_worker.h index 6b15097b7a..343c0fa15f 100644 --- a/chromium_src/chrome/browser/printing/print_job_worker.h +++ b/chromium_src/chrome/browser/printing/print_job_worker.h @@ -5,8 +5,9 @@ #ifndef CHROME_BROWSER_PRINTING_PRINT_JOB_WORKER_H_ #define CHROME_BROWSER_PRINTING_PRINT_JOB_WORKER_H_ +#include + #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread.h" #include "content/public/browser/browser_thread.h" diff --git a/chromium_src/chrome/browser/printing/print_view_manager_base.cc b/chromium_src/chrome/browser/printing/print_view_manager_base.cc index 2bbafdd8e5..f771f6963d 100644 --- a/chromium_src/chrome/browser/printing/print_view_manager_base.cc +++ b/chromium_src/chrome/browser/printing/print_view_manager_base.cc @@ -4,8 +4,9 @@ #include "chrome/browser/printing/print_view_manager_base.h" +#include + #include "base/bind.h" -#include "base/memory/scoped_ptr.h" #include "components/prefs/pref_service.h" #include "base/strings/utf_string_conversions.h" #include "base/timer/timer.h" diff --git a/chromium_src/chrome/browser/printing/printer_query.h b/chromium_src/chrome/browser/printing/printer_query.h index 934c185926..d2f017d189 100644 --- a/chromium_src/chrome/browser/printing/printer_query.h +++ b/chromium_src/chrome/browser/printing/printer_query.h @@ -5,9 +5,10 @@ #ifndef CHROME_BROWSER_PRINTING_PRINTER_QUERY_H_ #define CHROME_BROWSER_PRINTING_PRINTER_QUERY_H_ +#include + #include "base/callback.h" #include "base/compiler_specific.h" -#include "base/memory/scoped_ptr.h" #include "chrome/browser/printing/print_job_worker_owner.h" #include "printing/print_job_constants.h" diff --git a/chromium_src/chrome/browser/process_singleton_posix.cc b/chromium_src/chrome/browser/process_singleton_posix.cc index 5742b35852..bb999fb500 100644 --- a/chromium_src/chrome/browser/process_singleton_posix.cc +++ b/chromium_src/chrome/browser/process_singleton_posix.cc @@ -74,8 +74,8 @@ #include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" -#include "base/thread_task_runner_handle.h" #include "base/threading/platform_thread.h" +#include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "base/timer/timer.h" #include "content/public/browser/browser_thread.h" diff --git a/chromium_src/chrome/browser/speech/tts_controller.h b/chromium_src/chrome/browser/speech/tts_controller.h index f4dcd77470..0587a1b8cb 100644 --- a/chromium_src/chrome/browser/speech/tts_controller.h +++ b/chromium_src/chrome/browser/speech/tts_controller.h @@ -5,12 +5,12 @@ #ifndef CHROME_BROWSER_SPEECH_TTS_CONTROLLER_H_ #define CHROME_BROWSER_SPEECH_TTS_CONTROLLER_H_ +#include #include #include #include #include -#include "base/memory/scoped_ptr.h" #include "base/memory/singleton.h" #include "base/memory/weak_ptr.h" #include "url/gurl.h" @@ -340,4 +340,4 @@ class TtsController { virtual ~TtsController() {} }; -#endif // CHROME_BROWSER_SPEECH_TTS_CONTROLLER_H_ \ No newline at end of file +#endif // CHROME_BROWSER_SPEECH_TTS_CONTROLLER_H_ diff --git a/chromium_src/chrome/browser/speech/tts_controller_impl.h b/chromium_src/chrome/browser/speech/tts_controller_impl.h index 6c8aa5747d..749c60ad6d 100644 --- a/chromium_src/chrome/browser/speech/tts_controller_impl.h +++ b/chromium_src/chrome/browser/speech/tts_controller_impl.h @@ -5,12 +5,12 @@ #ifndef CHROME_BROWSER_SPEECH_TTS_CONTROLLER_IMPL_H_ #define CHROME_BROWSER_SPEECH_TTS_CONTROLLER_IMPL_H_ +#include #include #include #include #include -#include "base/memory/scoped_ptr.h" #include "base/memory/singleton.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/speech/tts_controller.h" diff --git a/chromium_src/chrome/browser/speech/tts_linux.cc b/chromium_src/chrome/browser/speech/tts_linux.cc index b1e8bc4043..d0e0e2ee82 100644 --- a/chromium_src/chrome/browser/speech/tts_linux.cc +++ b/chromium_src/chrome/browser/speech/tts_linux.cc @@ -5,10 +5,10 @@ #include #include +#include #include "base/command_line.h" #include "base/debug/leak_annotations.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/singleton.h" #include "base/synchronization/lock.h" #include "chrome/browser/speech/tts_platform.h" diff --git a/chromium_src/chrome/common/chrome_paths_linux.cc b/chromium_src/chrome/common/chrome_paths_linux.cc index e89ae822d9..745bc03adb 100644 --- a/chromium_src/chrome/common/chrome_paths_linux.cc +++ b/chromium_src/chrome/common/chrome_paths_linux.cc @@ -4,10 +4,11 @@ #include "chrome/common/chrome_paths_internal.h" +#include + #include "base/base_paths.h" #include "base/environment.h" #include "base/files/file_util.h" -#include "base/memory/scoped_ptr.h" #include "base/nix/xdg_util.h" #include "base/path_service.h" #include "chrome/common/chrome_paths.h" diff --git a/chromium_src/chrome/renderer/media/chrome_key_systems.cc b/chromium_src/chrome/renderer/media/chrome_key_systems.cc index 417a61fcda..79e1333a74 100644 --- a/chromium_src/chrome/renderer/media/chrome_key_systems.cc +++ b/chromium_src/chrome/renderer/media/chrome_key_systems.cc @@ -4,6 +4,8 @@ #include "chrome/renderer/media/chrome_key_systems.h" +#include + #include #include @@ -12,13 +14,10 @@ #include "base/strings/string_split.h" #include "base/strings/utf_string_conversions.h" #include "chrome/common/widevine_cdm_messages.h" -#include "components/cdm/renderer/widevine_key_systems.h" +#include "components/cdm/renderer/widevine_key_system_properties.h" #include "content/public/renderer/render_thread.h" #include "media/base/eme_constants.h" - -#if defined(OS_ANDROID) -#include "components/cdm/renderer/android_key_systems.h" -#endif +#include "media/base/key_system_properties.h" // #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. #include "third_party/widevine/cdm/stub/widevine_cdm_version.h" @@ -30,10 +29,13 @@ #include "base/version.h" #endif -using media::KeySystemInfo; +using media::KeySystemProperties; using media::SupportedCodecs; #if defined(ENABLE_PEPPER_CDMS) +static const char kExternalClearKeyPepperType[] = + "application/x-ppapi-clearkey-cdm"; + static bool IsPepperCdmAvailable( const std::string& pepper_type, std::vector* additional_param_names, @@ -49,6 +51,120 @@ static bool IsPepperCdmAvailable( return is_available; } +// KeySystemProperties implementation for external Clear Key systems. +class ExternalClearKeyProperties : public KeySystemProperties { + public: + explicit ExternalClearKeyProperties(const std::string& key_system_name) + : key_system_name_(key_system_name) {} + + std::string GetKeySystemName() const override { return key_system_name_; } + bool IsSupportedInitDataType( + media::EmeInitDataType init_data_type) const override { + switch (init_data_type) { + case media::EmeInitDataType::WEBM: + case media::EmeInitDataType::KEYIDS: + return true; + + case media::EmeInitDataType::CENC: +#if defined(USE_PROPRIETARY_CODECS) + return true; +#else + return false; +#endif // defined(USE_PROPRIETARY_CODECS) + + case media::EmeInitDataType::UNKNOWN: + return false; + } + NOTREACHED(); + return false; + } + + SupportedCodecs GetSupportedCodecs() const override { +#if defined(USE_PROPRIETARY_CODECS) + return media::EME_CODEC_MP4_ALL | media::EME_CODEC_WEBM_ALL; +#else + return media::EME_CODEC_WEBM_ALL; +#endif + } + + media::EmeConfigRule GetRobustnessConfigRule( + media::EmeMediaType media_type, + const std::string& requested_robustness) const override { + return requested_robustness.empty() ? media::EmeConfigRule::SUPPORTED + : media::EmeConfigRule::NOT_SUPPORTED; + } + + // Persistent license sessions are faked. + media::EmeSessionTypeSupport GetPersistentLicenseSessionSupport() + const override { + return media::EmeSessionTypeSupport::SUPPORTED; + } + + media::EmeSessionTypeSupport GetPersistentReleaseMessageSessionSupport() + const override { + return media::EmeSessionTypeSupport::NOT_SUPPORTED; + } + + media::EmeFeatureSupport GetPersistentStateSupport() const override { + return media::EmeFeatureSupport::REQUESTABLE; + } + + media::EmeFeatureSupport GetDistinctiveIdentifierSupport() const override { + return media::EmeFeatureSupport::NOT_SUPPORTED; + } + + std::string GetPepperType() const override { + return kExternalClearKeyPepperType; + } + + private: + const std::string key_system_name_; +}; + +// External Clear Key (used for testing). +static void AddExternalClearKey( + std::vector>* concrete_key_systems) { + static const char kExternalClearKeyKeySystem[] = + "org.chromium.externalclearkey"; + static const char kExternalClearKeyDecryptOnlyKeySystem[] = + "org.chromium.externalclearkey.decryptonly"; + static const char kExternalClearKeyFileIOTestKeySystem[] = + "org.chromium.externalclearkey.fileiotest"; + static const char kExternalClearKeyInitializeFailKeySystem[] = + "org.chromium.externalclearkey.initializefail"; + static const char kExternalClearKeyCrashKeySystem[] = + "org.chromium.externalclearkey.crash"; + + std::vector additional_param_names; + std::vector additional_param_values; + if (!IsPepperCdmAvailable(kExternalClearKeyPepperType, + &additional_param_names, + &additional_param_values)) { + return; + } + + concrete_key_systems->emplace_back( + new ExternalClearKeyProperties(kExternalClearKeyKeySystem)); + + // Add support of decrypt-only mode in ClearKeyCdm. + concrete_key_systems->emplace_back( + new ExternalClearKeyProperties(kExternalClearKeyDecryptOnlyKeySystem)); + + // A key system that triggers FileIO test in ClearKeyCdm. + concrete_key_systems->emplace_back( + new ExternalClearKeyProperties(kExternalClearKeyFileIOTestKeySystem)); + + // A key system that Chrome thinks is supported by ClearKeyCdm, but actually + // will be refused by ClearKeyCdm. This is to test the CDM initialization + // failure case. + concrete_key_systems->emplace_back( + new ExternalClearKeyProperties(kExternalClearKeyInitializeFailKeySystem)); + + // A key system that triggers a crash in ClearKeyCdm. + concrete_key_systems->emplace_back( + new ExternalClearKeyProperties(kExternalClearKeyCrashKeySystem)); +} + #if defined(WIDEVINE_CDM_AVAILABLE) // This function finds "codecs" and parses the value into the vector |codecs|. // Converts the codec strings to UTF-8 since we only expect ASCII strings and @@ -79,11 +195,11 @@ void GetSupportedCodecsForPepperCdm( } static void AddPepperBasedWidevine( - std::vector* concrete_key_systems) { + std::vector>* concrete_key_systems) { #if defined(WIDEVINE_CDM_MIN_GLIBC_VERSION) Version glibc_version(gnu_get_libc_version()); DCHECK(glibc_version.IsValid()); - if (glibc_version.IsOlderThan(WIDEVINE_CDM_MIN_GLIBC_VERSION)) + if (glibc_version < base::Version(WIDEVINE_CDM_MIN_GLIBC_VERSION)) return; #endif // defined(WIDEVINE_CDM_MIN_GLIBC_VERSION) @@ -120,10 +236,12 @@ static void AddPepperBasedWidevine( #if defined(USE_PROPRIETARY_CODECS) if (codecs[i] == kCdmSupportedCodecAvc1) supported_codecs |= media::EME_CODEC_MP4_AVC1; + if (codecs[i] == kCdmSupportedCodecVp9) + supported_codecs |= media::EME_CODEC_MP4_VP9; #endif // defined(USE_PROPRIETARY_CODECS) } - cdm::AddWidevineWithCodecs( + concrete_key_systems->emplace_back(new cdm::WidevineKeySystemProperties( supported_codecs, #if defined(OS_CHROMEOS) media::EmeRobustness::HW_SECURE_ALL, // Maximum audio robustness. @@ -131,27 +249,29 @@ static void AddPepperBasedWidevine( media::EmeSessionTypeSupport:: SUPPORTED_WITH_IDENTIFIER, // Persistent-license. media::EmeSessionTypeSupport:: - NOT_SUPPORTED, // Persistent-release-message. - media::EmeFeatureSupport::REQUESTABLE, // Persistent state. - media::EmeFeatureSupport::REQUESTABLE, // Distinctive identifier. + NOT_SUPPORTED, // Persistent-release-message. + media::EmeFeatureSupport::REQUESTABLE, // Persistent state. + media::EmeFeatureSupport::REQUESTABLE)); // Distinctive identifier. #else // (Desktop) media::EmeRobustness::SW_SECURE_CRYPTO, // Maximum audio robustness. media::EmeRobustness::SW_SECURE_DECODE, // Maximum video robustness. media::EmeSessionTypeSupport::NOT_SUPPORTED, // persistent-license. media::EmeSessionTypeSupport:: - NOT_SUPPORTED, // persistent-release-message. - media::EmeFeatureSupport::REQUESTABLE, // Persistent state. - media::EmeFeatureSupport::NOT_SUPPORTED, // Distinctive identifier. + NOT_SUPPORTED, // persistent-release-message. + media::EmeFeatureSupport::REQUESTABLE, // Persistent state. + media::EmeFeatureSupport::NOT_SUPPORTED)); // Distinctive identifier. #endif // defined(OS_CHROMEOS) - concrete_key_systems); } #endif // defined(WIDEVINE_CDM_AVAILABLE) #endif // defined(ENABLE_PEPPER_CDMS) -void AddChromeKeySystems(std::vector* key_systems_info) { +void AddChromeKeySystems( + std::vector>* key_systems_properties) { #if defined(ENABLE_PEPPER_CDMS) + AddExternalClearKey(key_systems_properties); + #if defined(WIDEVINE_CDM_AVAILABLE) - AddPepperBasedWidevine(key_systems_info); + AddPepperBasedWidevine(key_systems_properties); #endif // defined(WIDEVINE_CDM_AVAILABLE) #endif // defined(ENABLE_PEPPER_CDMS) } diff --git a/chromium_src/chrome/renderer/media/chrome_key_systems.h b/chromium_src/chrome/renderer/media/chrome_key_systems.h index dfec84f3b3..3e82ee70e2 100644 --- a/chromium_src/chrome/renderer/media/chrome_key_systems.h +++ b/chromium_src/chrome/renderer/media/chrome_key_systems.h @@ -5,10 +5,16 @@ #ifndef CHROME_RENDERER_MEDIA_CHROME_KEY_SYSTEMS_H_ #define CHROME_RENDERER_MEDIA_CHROME_KEY_SYSTEMS_H_ +#include #include -#include "media/base/key_system_info.h" +namespace media { +class KeySystemProperties; +} -void AddChromeKeySystems(std::vector* key_systems_info); +// Register the key systems supported by populating |key_systems_properties|. +void AddChromeKeySystems( + std::vector>* + key_systems_properties); #endif // CHROME_RENDERER_MEDIA_CHROME_KEY_SYSTEMS_H_ diff --git a/chromium_src/chrome/renderer/pepper/pepper_shared_memory_message_filter.cc b/chromium_src/chrome/renderer/pepper/pepper_shared_memory_message_filter.cc index 7c219f60b8..9919fb47b0 100644 --- a/chromium_src/chrome/renderer/pepper/pepper_shared_memory_message_filter.cc +++ b/chromium_src/chrome/renderer/pepper/pepper_shared_memory_message_filter.cc @@ -4,7 +4,8 @@ #include "chrome/renderer/pepper/pepper_shared_memory_message_filter.h" -#include "base/memory/scoped_ptr.h" +#include + #include "base/memory/shared_memory.h" #include "base/process/process_handle.h" #include "content/public/common/content_client.h" diff --git a/chromium_src/chrome/renderer/printing/print_web_view_helper.h b/chromium_src/chrome/renderer/printing/print_web_view_helper.h index e3e6448809..0a00f2ebb1 100644 --- a/chromium_src/chrome/renderer/printing/print_web_view_helper.h +++ b/chromium_src/chrome/renderer/printing/print_web_view_helper.h @@ -5,11 +5,11 @@ #ifndef CHROME_RENDERER_PRINTING_PRINT_WEB_VIEW_HELPER_H_ #define CHROME_RENDERER_PRINTING_PRINT_WEB_VIEW_HELPER_H_ +#include #include #include "base/callback.h" #include "base/gtest_prod_util.h" -#include "base/memory/scoped_ptr.h" #include "base/memory/shared_memory.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" diff --git a/chromium_src/chrome/renderer/printing/print_web_view_helper_linux.cc b/chromium_src/chrome/renderer/printing/print_web_view_helper_linux.cc index 608f406e62..216d8236a8 100644 --- a/chromium_src/chrome/renderer/printing/print_web_view_helper_linux.cc +++ b/chromium_src/chrome/renderer/printing/print_web_view_helper_linux.cc @@ -4,8 +4,9 @@ #include "chrome/renderer/printing/print_web_view_helper.h" +#include + #include "base/logging.h" -#include "base/memory/scoped_ptr.h" #include "chrome/common/print_messages.h" #include "content/public/renderer/render_thread.h" #include "printing/metafile_skia_wrapper.h" diff --git a/chromium_src/chrome/renderer/printing/print_web_view_helper_pdf_win.cc b/chromium_src/chrome/renderer/printing/print_web_view_helper_pdf_win.cc index 7ff17a388b..96a128652a 100644 --- a/chromium_src/chrome/renderer/printing/print_web_view_helper_pdf_win.cc +++ b/chromium_src/chrome/renderer/printing/print_web_view_helper_pdf_win.cc @@ -4,8 +4,9 @@ #include "chrome/renderer/printing/print_web_view_helper.h" +#include + #include "base/logging.h" -#include "base/memory/scoped_ptr.h" #include "base/process/process_handle.h" #include "chrome/common/print_messages.h" #include "content/public/renderer/render_thread.h" diff --git a/chromium_src/chrome/renderer/spellchecker/spellcheck_worditerator.h b/chromium_src/chrome/renderer/spellchecker/spellcheck_worditerator.h index 4490c7a90e..7e07d29273 100644 --- a/chromium_src/chrome/renderer/spellchecker/spellcheck_worditerator.h +++ b/chromium_src/chrome/renderer/spellchecker/spellcheck_worditerator.h @@ -9,10 +9,10 @@ #ifndef CHROME_RENDERER_SPELLCHECKER_SPELLCHECK_WORDITERATOR_H_ #define CHROME_RENDERER_SPELLCHECKER_SPELLCHECK_WORDITERATOR_H_ +#include #include #include "base/macros.h" -#include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" #include "third_party/icu/source/common/unicode/uscript.h" diff --git a/chromium_src/chrome/renderer/tts_dispatcher.h b/chromium_src/chrome/renderer/tts_dispatcher.h index 0a770d7218..45db9751c8 100644 --- a/chromium_src/chrome/renderer/tts_dispatcher.h +++ b/chromium_src/chrome/renderer/tts_dispatcher.h @@ -8,7 +8,7 @@ #include #include "base/containers/hash_tables.h" -#include "content/public/renderer/render_process_observer.h" +#include "content/public/renderer/render_thread_observer.h" #include "third_party/WebKit/public/platform/WebSpeechSynthesizer.h" #include "third_party/WebKit/public/platform/WebSpeechSynthesizerClient.h" @@ -27,7 +27,7 @@ struct TtsVoice; // the utterance id (which is globally unique) matches. class TtsDispatcher : public blink::WebSpeechSynthesizer, - public content::RenderProcessObserver { + public content::RenderThreadObserver { public: explicit TtsDispatcher(blink::WebSpeechSynthesizerClient* client); diff --git a/chromium_src/net/test/embedded_test_server/stream_listen_socket.cc b/chromium_src/net/test/embedded_test_server/stream_listen_socket.cc index 2514c636cb..0b16c1395e 100644 --- a/chromium_src/net/test/embedded_test_server/stream_listen_socket.cc +++ b/chromium_src/net/test/embedded_test_server/stream_listen_socket.cc @@ -4,6 +4,8 @@ #include "net/test/embedded_test_server/stream_listen_socket.h" +#include + #if defined(OS_WIN) // winsock2.h must be included first in order to ensure it is included before // windows.h. @@ -20,7 +22,6 @@ #include "base/files/file_util.h" #include "base/logging.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/posix/eintr_wrapper.h" #include "base/sys_byteorder.h" #include "base/threading/platform_thread.h" diff --git a/chromium_src/net/test/embedded_test_server/stream_listen_socket.h b/chromium_src/net/test/embedded_test_server/stream_listen_socket.h index 7ad25437ec..00d4b58dcf 100644 --- a/chromium_src/net/test/embedded_test_server/stream_listen_socket.h +++ b/chromium_src/net/test/embedded_test_server/stream_listen_socket.h @@ -16,6 +16,8 @@ #ifndef NET_TEST_EMBEDDED_TEST_SERVER_STREAM_LISTEN_SOCKET_H_ #define NET_TEST_EMBEDDED_TEST_SERVER_STREAM_LISTEN_SOCKET_H_ +#include + #include "build/build_config.h" #if defined(OS_WIN) @@ -30,7 +32,6 @@ #include "base/macros.h" #include "base/compiler_specific.h" -#include "base/memory/scoped_ptr.h" #include "net/base/net_export.h" #include "net/socket/socket_descriptor.h" diff --git a/vendor/native_mate b/vendor/native_mate index a1efa28520..8a31e2d9c0 160000 --- a/vendor/native_mate +++ b/vendor/native_mate @@ -1 +1 @@ -Subproject commit a1efa285204cb2fbbed450c317fb535a38ea8480 +Subproject commit 8a31e2d9c07fef117f2a5ad85dc67acb382b4d64 From 48f819f3371ea2a79a429b6548ff64288ae506d6 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 4 Jul 2016 15:15:24 +0900 Subject: [PATCH 192/516] Do not use home cooked SkUserConfig.h --- chromium_src/SkUserConfig.h | 158 ------------------------------------ 1 file changed, 158 deletions(-) delete mode 100644 chromium_src/SkUserConfig.h diff --git a/chromium_src/SkUserConfig.h b/chromium_src/SkUserConfig.h deleted file mode 100644 index 755b050de6..0000000000 --- a/chromium_src/SkUserConfig.h +++ /dev/null @@ -1,158 +0,0 @@ - -/* - * Copyright 2006 The Android Open Source Project - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - - -#ifndef SkUserConfig_DEFINED -#define SkUserConfig_DEFINED - -/* SkTypes.h, the root of the public header files, does the following trick: - - #include "SkPreConfig.h" - #include "SkUserConfig.h" - #include "SkPostConfig.h" - - SkPreConfig.h runs first, and it is responsible for initializing certain - skia defines. - - SkPostConfig.h runs last, and its job is to just check that the final - defines are consistent (i.e. that we don't have mutually conflicting - defines). - - SkUserConfig.h (this file) runs in the middle. It gets to change or augment - the list of flags initially set in preconfig, and then postconfig checks - that everything still makes sense. - - Below are optional defines that add, subtract, or change default behavior - in Skia. Your port can locally edit this file to enable/disable flags as - you choose, or these can be delared on your command line (i.e. -Dfoo). - - By default, this include file will always default to having all of the flags - commented out, so including it will have no effect. -*/ - -/////////////////////////////////////////////////////////////////////////////// - -/* Skia has lots of debug-only code. Often this is just null checks or other - parameter checking, but sometimes it can be quite intrusive (e.g. check that - each 32bit pixel is in premultiplied form). This code can be very useful - during development, but will slow things down in a shipping product. - - By default, these mutually exclusive flags are defined in SkPreConfig.h, - based on the presence or absence of NDEBUG, but that decision can be changed - here. - */ -//#define SK_DEBUG -//#define SK_RELEASE - -/* Skia has certain debug-only code that is extremely intensive even for debug - builds. This code is useful for diagnosing specific issues, but is not - generally applicable, therefore it must be explicitly enabled to avoid - the performance impact. By default these flags are undefined, but can be - enabled by uncommenting them below. - */ -//#define SK_DEBUG_GLYPH_CACHE -//#define SK_DEBUG_PATH - -/* If, in debugging mode, Skia needs to stop (presumably to invoke a debugger) - it will call SK_CRASH(). If this is not defined it, it is defined in - SkPostConfig.h to write to an illegal address - */ -//#define SK_CRASH() *(int *)(uintptr_t)0 = 0 - - -/* preconfig will have attempted to determine the endianness of the system, - but you can change these mutually exclusive flags here. - */ -//#define SK_CPU_BENDIAN -//#define SK_CPU_LENDIAN - -/* Most compilers use the same bit endianness for bit flags in a byte as the - system byte endianness, and this is the default. If for some reason this - needs to be overridden, specify which of the mutually exclusive flags to - use. For example, some atom processors in certain configurations have big - endian byte order but little endian bit orders. -*/ -//#define SK_UINT8_BITFIELD_BENDIAN -//#define SK_UINT8_BITFIELD_LENDIAN - - -/* To write debug messages to a console, skia will call SkDebugf(...) following - printf conventions (e.g. const char* format, ...). If you want to redirect - this to something other than printf, define yours here - */ -// Log the file and line number for assertions. -#define SkDebugf(...) - -/* - * To specify a different default font cache limit, define this. If this is - * undefined, skia will use a built-in value. - */ -//#define SK_DEFAULT_FONT_CACHE_LIMIT (1024 * 1024) - -/* - * To specify the default size of the image cache, undefine this and set it to - * the desired value (in bytes). SkGraphics.h as a runtime API to set this - * value as well. If this is undefined, a built-in value will be used. - */ -//#define SK_DEFAULT_IMAGE_CACHE_LIMIT (1024 * 1024) - -/* Define this to allow PDF scalars above 32k. The PDF/A spec doesn't allow - them, but modern PDF interpreters should handle them just fine. - */ -//#define SK_ALLOW_LARGE_PDF_SCALARS - -/* Define this to provide font subsetter in PDF generation. - */ -//#define SK_SFNTLY_SUBSETTER "sfntly/subsetter/font_subsetter.h" - -/* Define this to set the upper limit for text to support LCD. Values that - are very large increase the cost in the font cache and draw slower, without - improving readability. If this is undefined, Skia will use its default - value (e.g. 48) - */ -//#define SK_MAX_SIZE_FOR_LCDTEXT 48 - -/* If SK_DEBUG is defined, then you can optionally define SK_SUPPORT_UNITTEST - which will run additional self-tests at startup. These can take a long time, - so this flag is optional. - */ -#ifdef SK_DEBUG -//#define SK_SUPPORT_UNITTEST -#endif - -/* Change the ordering to work in X windows. - */ -#ifdef SK_SAMPLES_FOR_X - #define SK_R32_SHIFT 16 - #define SK_G32_SHIFT 8 - #define SK_B32_SHIFT 0 - #define SK_A32_SHIFT 24 -#endif - - -/* Determines whether to build code that supports the GPU backend. Some classes - that are not GPU-specific, such as SkShader subclasses, have optional code - that is used allows them to interact with the GPU backend. If you'd like to - omit this code set SK_SUPPORT_GPU to 0. This also allows you to omit the gpu - directories from your include search path when you're not building the GPU - backend. Defaults to 1 (build the GPU code). - */ -//#define SK_SUPPORT_GPU 1 - - -/* The PDF generation code uses Path Ops to handle complex clipping paths, - * but at this time, Path Ops is not release ready yet. So, the code is - * hidden behind this #define guard. If you are feeling adventurous and - * want the latest and greatest PDF generation code, uncomment the #define. - * When Path Ops is release ready, the define guards and this user config - * define should be removed entirely. - */ -//#define SK_PDF_USE_PATHOPS_CLIPPING - -#endif - From 0a6bb9c36a61540189b3edd665b7e8c8b5129889 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 4 Jul 2016 15:32:02 +0900 Subject: [PATCH 193/516] Fix crash when creating protocol module --- atom/browser/api/atom_api_protocol.cc | 2 +- vendor/brightray | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/atom/browser/api/atom_api_protocol.cc b/atom/browser/api/atom_api_protocol.cc index 8b0097c259..2b20dae28b 100644 --- a/atom/browser/api/atom_api_protocol.cc +++ b/atom/browser/api/atom_api_protocol.cc @@ -27,7 +27,7 @@ namespace atom { namespace api { Protocol::Protocol(v8::Isolate* isolate, AtomBrowserContext* browser_context) - : request_context_getter_(browser_context->url_request_context_getter()), + : request_context_getter_(browser_context->GetRequestContext()), weak_factory_(this) { Init(isolate); } diff --git a/vendor/brightray b/vendor/brightray index 9a4ffcf129..7e64fc4f41 160000 --- a/vendor/brightray +++ b/vendor/brightray @@ -1 +1 @@ -Subproject commit 9a4ffcf1297a2095c614b39bc71e51edbc9847c4 +Subproject commit 7e64fc4f41d8dca161072063c1272fff6bac540f From ea5c5d26802b5eaa51d96ff64bd39c5070376e9c Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 4 Jul 2016 16:41:18 +0900 Subject: [PATCH 194/516] Fix building on Linux --- vendor/brightray | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/brightray b/vendor/brightray index 7e64fc4f41..ae9ee0c7bc 160000 --- a/vendor/brightray +++ b/vendor/brightray @@ -1 +1 @@ -Subproject commit 7e64fc4f41d8dca161072063c1272fff6bac540f +Subproject commit ae9ee0c7bc7b38904f438ac63d3d18577e459ff4 From 6c2825c0c4c17855e7baa688157917725bfa2514 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 4 Jul 2016 18:08:41 +0900 Subject: [PATCH 195/516] spec: Ignore cache when testing protocol module --- spec/api-protocol-spec.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/spec/api-protocol-spec.js b/spec/api-protocol-spec.js index f665210c0f..597f061c6d 100644 --- a/spec/api-protocol-spec.js +++ b/spec/api-protocol-spec.js @@ -51,6 +51,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function (data) { assert.equal(data, text) done() @@ -69,6 +70,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function () { return done('request succeeded but it should not') }, @@ -92,6 +94,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function (data) { assert.equal(data, text) done() @@ -124,6 +127,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function (data) { assert.equal(data, text) done() @@ -145,6 +149,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function (data, status, request) { assert.equal(data, text) assert.equal(request.getResponseHeader('Access-Control-Allow-Origin'), '*') @@ -170,6 +175,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function (data) { assert.equal(data, text) done() @@ -191,6 +197,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function () { done('request succeeded but it should not') }, @@ -216,6 +223,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function (data) { assert.equal(data, text) done() @@ -238,6 +246,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function (data, status, request) { assert.equal(data, text) assert.equal(request.getResponseHeader('Access-Control-Allow-Origin'), '*') @@ -263,6 +272,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function (data) { assert.equal(data, text) done() @@ -284,6 +294,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function () { done('request succeeded but it should not') }, @@ -312,6 +323,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function (data) { assert.equal(data, String(fileContent)) return done() @@ -333,6 +345,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function (data, status, request) { assert.equal(data, String(fileContent)) assert.equal(request.getResponseHeader('Access-Control-Allow-Origin'), '*') @@ -357,6 +370,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function (data) { assert.equal(data, String(fileContent)) done() @@ -379,6 +393,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function (data) { assert.equal(data, String(normalContent)) done() @@ -401,6 +416,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function () { done('request succeeded but it should not') }, @@ -422,6 +438,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function () { done('request succeeded but it should not') }, @@ -455,6 +472,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function (data) { assert.equal(data, text) done() @@ -479,6 +497,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function () { done('request succeeded but it should not') }, @@ -500,6 +519,7 @@ describe('protocol module', function () { } $.ajax({ url: protocolName + '://fake-host', + cache: false, success: function () { done('request succeeded but it should not') }, @@ -634,6 +654,7 @@ describe('protocol module', function () { } $.ajax({ url: 'http://fake-host', + cache: false, success: function (data) { assert.equal(data, text) done() @@ -655,6 +676,7 @@ describe('protocol module', function () { } $.ajax({ url: 'http://fake-host', + cache: false, success: function () { done('request succeeded but it should not') }, @@ -678,6 +700,7 @@ describe('protocol module', function () { } $.ajax({ url: 'http://fake-host', + cache: false, success: function (data) { assert.equal(data, text) done() @@ -702,6 +725,7 @@ describe('protocol module', function () { } $.ajax({ url: 'http://fake-host', + cache: false, success: function (data) { assert.equal(typeof data, 'object') assert.equal(data.value, 1) @@ -727,6 +751,7 @@ describe('protocol module', function () { } $.ajax({ url: 'http://fake-host', + cache: false, type: 'POST', data: postData, success: function (data) { @@ -752,6 +777,7 @@ describe('protocol module', function () { } $.ajax({ url: 'http://fake-host', + cache: false, success: function (data) { assert.equal(data, text) done() @@ -774,6 +800,7 @@ describe('protocol module', function () { } $.ajax({ url: 'http://fake-host', + cache: false, type: 'POST', data: postData, success: function (data) { @@ -821,6 +848,7 @@ describe('protocol module', function () { } $.ajax({ url: 'http://fake-host', + cache: false, type: 'POST', data: postData, success: function (data) { From d0719e9b4be1881d8d18a51073279fbf6f1b8c5e Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 4 Jul 2016 19:19:20 +0900 Subject: [PATCH 196/516] Fix cpplint warnings --- atom/browser/api/atom_api_session.cc | 10 +++++----- atom/common/native_mate_converters/gfx_converter.cc | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/atom/browser/api/atom_api_session.cc b/atom/browser/api/atom_api_session.cc index 6f9f1609db..8073affc1e 100644 --- a/atom/browser/api/atom_api_session.cc +++ b/atom/browser/api/atom_api_session.cc @@ -354,7 +354,7 @@ template void Session::DoCacheAction(const net::CompletionCallback& callback) { BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(&DoCacheActionInIO, - make_scoped_refptr(browser_context_->url_request_context_getter()), + make_scoped_refptr(browser_context_->GetRequestContext()), action, callback)); } @@ -385,7 +385,7 @@ void Session::FlushStorageData() { void Session::SetProxy(const net::ProxyConfig& config, const base::Closure& callback) { - auto getter = browser_context_->url_request_context_getter(); + auto getter = browser_context_->GetRequestContext(); BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(&SetProxyInIO, base::Unretained(getter), config, callback)); } @@ -455,14 +455,14 @@ void Session::ClearHostResolverCache(mate::Arguments* args) { BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(&ClearHostResolverCacheInIO, - make_scoped_refptr(browser_context_->url_request_context_getter()), + make_scoped_refptr(browser_context_->GetRequestContext()), callback)); } void Session::AllowNTLMCredentialsForDomains(const std::string& domains) { BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(&AllowNTLMCredentialsForDomainsInIO, - make_scoped_refptr(browser_context_->url_request_context_getter()), + make_scoped_refptr(browser_context_->GetRequestContext()), domains)); } @@ -473,7 +473,7 @@ void Session::SetUserAgent(const std::string& user_agent, std::string accept_lang = l10n_util::GetApplicationLocale(""); args->GetNext(&accept_lang); - auto getter = browser_context_->url_request_context_getter(); + auto getter = browser_context_->GetRequestContext(); getter->GetNetworkTaskRunner()->PostTask( FROM_HERE, base::Bind(&SetUserAgentInIO, getter, accept_lang, user_agent)); diff --git a/atom/common/native_mate_converters/gfx_converter.cc b/atom/common/native_mate_converters/gfx_converter.cc index 7e0a149300..db6a181cc9 100644 --- a/atom/common/native_mate_converters/gfx_converter.cc +++ b/atom/common/native_mate_converters/gfx_converter.cc @@ -36,7 +36,7 @@ bool Converter::FromV8(v8::Isolate* isolate, } v8::Local Converter::ToV8(v8::Isolate* isolate, - const gfx::Size& val) { + const gfx::Size& val) { mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate); dict.SetHidden("simple", true); dict.Set("width", val.width()); @@ -97,8 +97,8 @@ struct Converter { } }; -v8::Local Converter::ToV8(v8::Isolate* isolate, - const display::Display& val) { +v8::Local Converter::ToV8( + v8::Isolate* isolate, const display::Display& val) { mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate); dict.SetHidden("simple", true); dict.Set("id", val.id()); From 8d3e09747a778b54317c9446f9da6db2fa27c1bd Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 5 Jul 2016 09:20:57 +0900 Subject: [PATCH 197/516] directWrite option is removed --- atom/browser/web_contents_preferences.cc | 6 ------ atom/common/options_switches.cc | 3 --- atom/common/options_switches.h | 1 - docs/api/browser-window.md | 2 -- 4 files changed, 12 deletions(-) diff --git a/atom/browser/web_contents_preferences.cc b/atom/browser/web_contents_preferences.cc index 8a7eee0920..978ca22e86 100644 --- a/atom/browser/web_contents_preferences.cc +++ b/atom/browser/web_contents_preferences.cc @@ -79,12 +79,6 @@ void WebContentsPreferences::AppendExtraCommandLineSwitches( base::DictionaryValue& web_preferences = self->web_preferences_; bool b; -#if defined(OS_WIN) - // Check if DirectWrite is disabled. - if (web_preferences.GetBoolean(options::kDirectWrite, &b) && !b) - command_line->AppendSwitch(::switches::kDisableDirectWrite); -#endif - // Check if plugins are enabled. if (web_preferences.GetBoolean("plugins", &b) && b) command_line->AppendSwitch(switches::kEnablePlugins); diff --git a/atom/common/options_switches.cc b/atom/common/options_switches.cc index 36ec19edb8..6b514599f0 100644 --- a/atom/common/options_switches.cc +++ b/atom/common/options_switches.cc @@ -96,9 +96,6 @@ const char kNodeIntegration[] = "nodeIntegration"; // Instancd ID of guest WebContents. const char kGuestInstanceID[] = "guestInstanceId"; -// Enable DirectWrite on Windows. -const char kDirectWrite[] = "directWrite"; - // Web runtime features. const char kExperimentalFeatures[] = "experimentalFeatures"; const char kExperimentalCanvasFeatures[] = "experimentalCanvasFeatures"; diff --git a/atom/common/options_switches.h b/atom/common/options_switches.h index 29fbc0e40f..54c6387728 100644 --- a/atom/common/options_switches.h +++ b/atom/common/options_switches.h @@ -48,7 +48,6 @@ extern const char kFocusable[]; extern const char kWebPreferences[]; // WebPreferences. -extern const char kDirectWrite[]; extern const char kZoomFactor[]; extern const char kPreloadScript[]; extern const char kPreloadURL[]; diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index 1f3d9d49bf..da0718ae00 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -249,8 +249,6 @@ The `webPreferences` option is an object that can have following properties: Default is `false`. * `experimentalCanvasFeatures` Boolean - Enables Chromium's experimental canvas features. Default is `false`. -* `directWrite` Boolean - Enables DirectWrite font rendering system on - Windows. Default is `true`. * `scrollBounce` Boolean - Enables scroll bounce (rubber banding) effect on macOS. Default is `false`. * `blinkFeatures` String - A list of feature strings separated by `,`, like From 381689d3ed4e198966e481ee543556fa16451ad5 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 5 Jul 2016 09:31:29 +0900 Subject: [PATCH 198/516] Fix building on Windows --- atom/app/atom_main.cc | 1 - atom/browser/native_window_views.cc | 16 +++++++++------- atom/browser/ui/win/notify_icon.cc | 4 ++-- atom/common/crash_reporter/crash_reporter_win.h | 1 + .../browser/printing/pdf_to_emf_converter.cc | 4 ++-- script/lib/config.py | 2 +- 6 files changed, 15 insertions(+), 13 deletions(-) diff --git a/atom/app/atom_main.cc b/atom/app/atom_main.cc index a3e7027002..387b5167f3 100644 --- a/atom/app/atom_main.cc +++ b/atom/app/atom_main.cc @@ -19,7 +19,6 @@ #include "base/win/windows_version.h" #include "content/public/app/sandbox_helper_win.h" #include "sandbox/win/src/sandbox_types.h" -#include "ui/gfx/win/dpi.h" #elif defined(OS_LINUX) // defined(OS_WIN) #include "atom/app/atom_main_delegate.h" // NOLINT #include "content/public/app/content_main.h" diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index e9ff695281..d92d1f0d66 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -51,7 +51,7 @@ #include "atom/browser/ui/win/atom_desktop_window_tree_host_win.h" #include "skia/ext/skia_utils_win.h" #include "ui/base/win/shell.h" -#include "ui/gfx/win/dpi.h" +#include "ui/display/win/screen_win.h" #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" #endif @@ -1093,9 +1093,11 @@ gfx::Size NativeWindowViews::ContentSizeToWindowSize(const gfx::Size& size) { gfx::Size window_size(size); #if defined(OS_WIN) - gfx::Rect dpi_bounds = - gfx::Rect(gfx::Point(), gfx::win::DIPToScreenSize(size)); - gfx::Rect window_bounds = gfx::win::ScreenToDIPRect( + HWND hwnd = GetAcceleratedWidget(); + gfx::Rect dpi_bounds = gfx::Rect( + gfx::Point(), display::win::ScreenWin::DIPToScreenSize(hwnd, size)); + gfx::Rect window_bounds = display::win::ScreenWin::ScreenToDIPRect( + hwnd, window_->non_client_view()->GetWindowBoundsForClientBounds(dpi_bounds)); window_size = window_bounds.size(); #endif @@ -1111,16 +1113,16 @@ gfx::Size NativeWindowViews::WindowSizeToContentSize(const gfx::Size& size) { gfx::Size content_size(size); #if defined(OS_WIN) - content_size = gfx::win::DIPToScreenSize(content_size); + HWND hwnd = GetAcceleratedWidget(); + content_size = display::win::ScreenWin::DIPToScreenSize(hwnd, content_size); RECT rect; SetRectEmpty(&rect); - HWND hwnd = GetAcceleratedWidget(); DWORD style = ::GetWindowLong(hwnd, GWL_STYLE); DWORD ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE); AdjustWindowRectEx(&rect, style, FALSE, ex_style); content_size.set_width(content_size.width() - (rect.right - rect.left)); content_size.set_height(content_size.height() - (rect.bottom - rect.top)); - content_size = gfx::win::ScreenToDIPSize(content_size); + content_size = display::win::ScreenWin::ScreenToDIPSize(hwnd, content_size); #endif if (menu_bar_ && menu_bar_visible_) diff --git a/atom/browser/ui/win/notify_icon.cc b/atom/browser/ui/win/notify_icon.cc index 09751a0c81..ae689eb1c5 100644 --- a/atom/browser/ui/win/notify_icon.cc +++ b/atom/browser/ui/win/notify_icon.cc @@ -13,7 +13,7 @@ #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" #include "ui/display/screen.h" -#include "ui/gfx/win/dpi.h" +#include "ui/display/win/screen_win.h" #include "ui/views/controls/menu/menu_runner.h" namespace atom { @@ -167,7 +167,7 @@ gfx::Rect NotifyIcon::GetBounds() { RECT rect = { 0 }; Shell_NotifyIconGetRect(&icon_id, &rect); - return gfx::win::ScreenToDIPRect(gfx::Rect(rect)); + return display::win::ScreenWin::ScreenToDIPRect(window_, gfx::Rect(rect)); } void NotifyIcon::InitIconData(NOTIFYICONDATA* icon_data) { diff --git a/atom/common/crash_reporter/crash_reporter_win.h b/atom/common/crash_reporter/crash_reporter_win.h index 5ad41573d8..93be8af32c 100644 --- a/atom/common/crash_reporter/crash_reporter_win.h +++ b/atom/common/crash_reporter/crash_reporter_win.h @@ -5,6 +5,7 @@ #ifndef ATOM_COMMON_CRASH_REPORTER_CRASH_REPORTER_WIN_H_ #define ATOM_COMMON_CRASH_REPORTER_CRASH_REPORTER_WIN_H_ +#include #include #include diff --git a/chromium_src/chrome/browser/printing/pdf_to_emf_converter.cc b/chromium_src/chrome/browser/printing/pdf_to_emf_converter.cc index e13effd64d..0d23a7c6d5 100644 --- a/chromium_src/chrome/browser/printing/pdf_to_emf_converter.cc +++ b/chromium_src/chrome/browser/printing/pdf_to_emf_converter.cc @@ -104,7 +104,7 @@ class PdfToEmfUtilityProcessHostClient // UtilityProcessHostClient implementation. virtual void OnProcessCrashed(int exit_code) override; - virtual void OnProcessLaunchFailed() override; + virtual void OnProcessLaunchFailed(int exit_code) override; virtual bool OnMessageReceived(const IPC::Message& message) override; private: @@ -423,7 +423,7 @@ void PdfToEmfUtilityProcessHostClient::OnProcessCrashed(int exit_code) { OnFailed(); } -void PdfToEmfUtilityProcessHostClient::OnProcessLaunchFailed() { +void PdfToEmfUtilityProcessHostClient::OnProcessLaunchFailed(int exit_code) { OnFailed(); } diff --git a/script/lib/config.py b/script/lib/config.py index c64302d882..670ed3b338 100644 --- a/script/lib/config.py +++ b/script/lib/config.py @@ -8,7 +8,7 @@ import sys BASE_URL = os.getenv('LIBCHROMIUMCONTENT_MIRROR') or \ 'https://s3.amazonaws.com/github-janky-artifacts/libchromiumcontent' -LIBCHROMIUMCONTENT_COMMIT = '1dd3cbf7c4d3cc6511fa1a2a145b0e9cd86752b6' +LIBCHROMIUMCONTENT_COMMIT = 'e078493ea80ebf66f4b2c6dd4cadd1b529228da6' PLATFORM = { 'cygwin': 'win32', From de502d80122c9800d845add6b423656e368c97df Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 5 Jul 2016 09:41:23 +0900 Subject: [PATCH 199/516] Initialize MaterialDesignController --- vendor/brightray | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/brightray b/vendor/brightray index ae9ee0c7bc..df6f56413f 160000 --- a/vendor/brightray +++ b/vendor/brightray @@ -1 +1 @@ -Subproject commit ae9ee0c7bc7b38904f438ac63d3d18577e459ff4 +Subproject commit df6f56413fe226095d68435320d0986f92a412ef From 41b8dda07167b56a654fb9f17f5ddc796a5a45d6 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 5 Jul 2016 10:34:52 +0900 Subject: [PATCH 200/516] For hidden window focus() should do nothing --- atom/browser/native_window_views.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index d92d1f0d66..fe80a52bb5 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -335,6 +335,10 @@ void NativeWindowViews::CloseImmediately() { } void NativeWindowViews::Focus(bool focus) { + // For hidden window focus() should do nothing. + if (!IsVisible()) + return; + if (focus) { #if defined(OS_WIN) window_->Activate(); From 437164deecbfa5c957d737db50a79119d93a6f22 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 5 Jul 2016 12:17:41 +0900 Subject: [PATCH 201/516] Force linking with MeasureFormat of icu --- common.gypi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common.gypi b/common.gypi index 3389e18690..e0224525c8 100644 --- a/common.gypi +++ b/common.gypi @@ -158,6 +158,7 @@ '_uspoof_open_56', '_usearch_setPattern_56', '?createInstance@Transliterator@icu_56@@SAPAV12@ABVUnicodeString@2@W4UTransDirection@@AAW4UErrorCode@@@Z', + '??0MeasureFormat@icu_56@@QAE@ABVLocale@1@W4UMeasureFormatWidth@@AAW4UErrorCode@@@Z', ], }, { 'reference_symbols': [ @@ -171,6 +172,7 @@ 'uspoof_open_56', 'usearch_setPattern_56', '?createInstance@Transliterator@icu_56@@SAPEAV12@AEBVUnicodeString@2@W4UTransDirection@@AEAW4UErrorCode@@@Z', + '??0MeasureFormat@icu_56@@QEAA@AEBVLocale@1@W4UMeasureFormatWidth@@AEAW4UErrorCode@@@Z', ], }], ], From b8e51801322e6e45685df4e3e20be397c598b462 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 5 Jul 2016 15:50:12 -0700 Subject: [PATCH 202/516] Use require to load package.json instead of fs/JSON --- lib/browser/init.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/browser/init.js b/lib/browser/init.js index 6326b8e80e..68a555ad58 100644 --- a/lib/browser/init.js +++ b/lib/browser/init.js @@ -119,7 +119,7 @@ for (i = 0, len = searchPaths.length; i < len; i++) { packagePath = searchPaths[i] try { packagePath = path.join(process.resourcesPath, packagePath) - packageJson = JSON.parse(fs.readFileSync(path.join(packagePath, 'package.json'))) + packageJson = require(path.join(packagePath, 'package.json')) break } catch (error) { continue From 7baf7372af2377495233b975028f654e95ebe510 Mon Sep 17 00:00:00 2001 From: Jonathan Sampson Date: Tue, 5 Jul 2016 19:34:33 -0700 Subject: [PATCH 203/516] modern.ie is no longer in use The URL exists for historical reasons, but is no longer the primary URL for developer resources. --- docs/development/build-instructions-windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/development/build-instructions-windows.md b/docs/development/build-instructions-windows.md index b3c2c45734..7a7e1ee6c6 100644 --- a/docs/development/build-instructions-windows.md +++ b/docs/development/build-instructions-windows.md @@ -12,7 +12,7 @@ Follow the guidelines below for building Electron on Windows. * [Git](http://git-scm.com) If you don't currently have a Windows installation, -[modern.ie](https://www.modern.ie/en-us/virtualization-tools#downloads) +[dev.microsoftedge.com](https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/) has timebombed versions of Windows that you can use to build Electron. Building Electron is done entirely with command-line scripts and cannot be done From 92b97d3576368acc5e78220094fe28e20002866e Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 6 Jul 2016 13:20:36 +0900 Subject: [PATCH 204/516] Bump v1.2.6 --- atom/browser/resources/mac/Info.plist | 4 ++-- atom/browser/resources/win/atom.rc | 8 ++++---- atom/common/atom_version.h | 2 +- electron.gyp | 2 +- package.json | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/atom/browser/resources/mac/Info.plist b/atom/browser/resources/mac/Info.plist index 33cfc66b27..2f346b6855 100644 --- a/atom/browser/resources/mac/Info.plist +++ b/atom/browser/resources/mac/Info.plist @@ -17,9 +17,9 @@ CFBundleIconFile electron.icns CFBundleVersion - 1.2.5 + 1.2.6 CFBundleShortVersionString - 1.2.5 + 1.2.6 LSApplicationCategoryType public.app-category.developer-tools LSMinimumSystemVersion diff --git a/atom/browser/resources/win/atom.rc b/atom/browser/resources/win/atom.rc index 91101128fe..50ed8a37d6 100644 --- a/atom/browser/resources/win/atom.rc +++ b/atom/browser/resources/win/atom.rc @@ -56,8 +56,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,2,5,0 - PRODUCTVERSION 1,2,5,0 + FILEVERSION 1,2,6,0 + PRODUCTVERSION 1,2,6,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -74,12 +74,12 @@ BEGIN BEGIN VALUE "CompanyName", "GitHub, Inc." VALUE "FileDescription", "Electron" - VALUE "FileVersion", "1.2.5" + VALUE "FileVersion", "1.2.6" VALUE "InternalName", "electron.exe" VALUE "LegalCopyright", "Copyright (C) 2015 GitHub, Inc. All rights reserved." VALUE "OriginalFilename", "electron.exe" VALUE "ProductName", "Electron" - VALUE "ProductVersion", "1.2.5" + VALUE "ProductVersion", "1.2.6" VALUE "SquirrelAwareVersion", "1" END END diff --git a/atom/common/atom_version.h b/atom/common/atom_version.h index 7a61d6bc72..ff139fe984 100644 --- a/atom/common/atom_version.h +++ b/atom/common/atom_version.h @@ -7,7 +7,7 @@ #define ATOM_MAJOR_VERSION 1 #define ATOM_MINOR_VERSION 2 -#define ATOM_PATCH_VERSION 5 +#define ATOM_PATCH_VERSION 6 #define ATOM_VERSION_IS_RELEASE 1 diff --git a/electron.gyp b/electron.gyp index a4c412fc98..cfa96eae22 100644 --- a/electron.gyp +++ b/electron.gyp @@ -4,7 +4,7 @@ 'product_name%': 'Electron', 'company_name%': 'GitHub, Inc', 'company_abbr%': 'github', - 'version%': '1.2.5', + 'version%': '1.2.6', }, 'includes': [ 'filenames.gypi', diff --git a/package.json b/package.json index 738ffbb732..d8e71d36b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "electron", - "version": "1.2.5", + "version": "1.2.6", "devDependencies": { "asar": "^0.11.0", "request": "*", From 6bd343b112132daf56b31409f87f4c03fb2b51ba Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Thu, 7 Jul 2016 00:13:14 +1200 Subject: [PATCH 205/516] Bound the target width and height of window when calling SetSize --- atom/browser/native_window_mac.h | 1 + atom/browser/native_window_mac.mm | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/atom/browser/native_window_mac.h b/atom/browser/native_window_mac.h index d07d586a84..f357663fd1 100644 --- a/atom/browser/native_window_mac.h +++ b/atom/browser/native_window_mac.h @@ -46,6 +46,7 @@ class NativeWindowMac : public NativeWindow { bool IsFullscreen() const override; void SetBounds(const gfx::Rect& bounds, bool animate = false) override; gfx::Rect GetBounds() override; + void SetSize(const gfx::Size& size, bool animate = false) override; void SetContentSizeConstraints( const extensions::SizeConstraints& size_constraints) override; void SetResizable(bool resizable) override; diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 1ef003ab2a..58836c4ea4 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -756,6 +756,17 @@ gfx::Rect NativeWindowMac::GetBounds() { return bounds; } +void NativeWindowMac::SetSize(const gfx::Size& size, bool animate) { + gfx::Size minSize = GetMinimumSize(); + gfx::Size maxSize = GetMaximumSize(); + // Bound the supplied width and height values with max and min sizes + int bWidth = fmax(minSize.width(), size.width()); + bWidth = maxSize.width() == 0 ? bWidth : fmin(maxSize.width(), bWidth); + int bHeight = fmax(minSize.height(), size.height()); + bHeight = maxSize.height() == 0 ? bHeight : fmin(maxSize.height(), bHeight); + SetBounds(gfx::Rect(GetPosition(), gfx::Size(bWidth, bHeight)), animate); +} + void NativeWindowMac::SetContentSizeConstraints( const extensions::SizeConstraints& size_constraints) { auto convertSize = [this](const gfx::Size& size) { From c2bf6c2460c87cc844482b1fdd034af3d9594edb Mon Sep 17 00:00:00 2001 From: vsemozhetbyt Date: Wed, 6 Jul 2016 18:58:50 +0300 Subject: [PATCH 206/516] Fix disordered definitions in webContents doc :memo: Swap `clearSelection` and `keepSelection` definitions for `webContents.stopFindInPage(action)` that seems to be in wrong order. [ci skip] --- docs/api/web-contents.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index c3d175125b..e33d3d0cac 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -649,8 +649,8 @@ the request can be obtained by subscribing to * `action` String - Specifies the action to take place when ending [`webContents.findInPage`](web-contents.md#webcontentfindinpage) request. - * `clearSelection` - Translate the selection into a normal selection. - * `keepSelection` - Clear the selection. + * `clearSelection` - Clear the selection. + * `keepSelection` - Translate the selection into a normal selection. * `activateSelection` - Focus and click the selection node. Stops any `findInPage` request for the `webContents` with the provided `action`. From b444b35215928006686444ffa392a06a1186bb98 Mon Sep 17 00:00:00 2001 From: Maksim Date: Wed, 6 Jul 2016 17:02:56 +0800 Subject: [PATCH 207/516] Update remote.js --- lib/renderer/api/remote.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/renderer/api/remote.js b/lib/renderer/api/remote.js index b5c9fe3a0e..a85cb6262a 100644 --- a/lib/renderer/api/remote.js +++ b/lib/renderer/api/remote.js @@ -60,7 +60,7 @@ var wrapArgs = function (args, visited) { ret = { type: 'object', - name: value.constructor.name, + name: (value.constructor && value.constructor.name) ? value.constructor.name : 'Object', members: [] } for (prop in value) { From a1209b69b3c67964952f37a5f9eda0d2d8463939 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 09:11:01 -0700 Subject: [PATCH 208/516] Add spec for constructor-less param --- spec/api-ipc-spec.js | 1 + spec/fixtures/module/no-prototype.js | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/spec/api-ipc-spec.js b/spec/api-ipc-spec.js index 2bf5213cae..595cae9590 100644 --- a/spec/api-ipc-spec.js +++ b/spec/api-ipc-spec.js @@ -34,6 +34,7 @@ describe('ipc module', function () { assert.equal(a.foo.bar, 'baz') assert.equal(a.foo.baz, false) assert.equal(a.bar, 1234) + assert.equal(a.baz(Object.create(null)), 'hello') }) it('should search module from the user app', function () { diff --git a/spec/fixtures/module/no-prototype.js b/spec/fixtures/module/no-prototype.js index f298925b80..9fea1b31d3 100644 --- a/spec/fixtures/module/no-prototype.js +++ b/spec/fixtures/module/no-prototype.js @@ -1,4 +1,10 @@ const foo = Object.create(null) foo.bar = 'baz' foo.baz = false -module.exports = {foo: foo, bar: 1234} +module.exports = { + foo: foo, + bar: 1234, + baz: function () { + return 'hello' + } +} From d67dfd09fdd6c7b134778bbb9a01f91f71c0562d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 09:18:12 -0700 Subject: [PATCH 209/516] Pass through empty constructor names --- lib/renderer/api/remote.js | 2 +- spec/api-ipc-spec.js | 3 ++- spec/fixtures/module/no-prototype.js | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/renderer/api/remote.js b/lib/renderer/api/remote.js index a85cb6262a..b120bed0fe 100644 --- a/lib/renderer/api/remote.js +++ b/lib/renderer/api/remote.js @@ -60,7 +60,7 @@ var wrapArgs = function (args, visited) { ret = { type: 'object', - name: (value.constructor && value.constructor.name) ? value.constructor.name : 'Object', + name: value.constructor != null ? value.constructor.name : 'Object', members: [] } for (prop in value) { diff --git a/spec/api-ipc-spec.js b/spec/api-ipc-spec.js index 595cae9590..6b0222d62e 100644 --- a/spec/api-ipc-spec.js +++ b/spec/api-ipc-spec.js @@ -34,7 +34,8 @@ describe('ipc module', function () { assert.equal(a.foo.bar, 'baz') assert.equal(a.foo.baz, false) assert.equal(a.bar, 1234) - assert.equal(a.baz(Object.create(null)), 'hello') + assert.equal(a.getConstructorName(Object.create(null)), 'Object') + assert.equal(a.getConstructorName(new (class {})), '') }) it('should search module from the user app', function () { diff --git a/spec/fixtures/module/no-prototype.js b/spec/fixtures/module/no-prototype.js index 9fea1b31d3..3dce313774 100644 --- a/spec/fixtures/module/no-prototype.js +++ b/spec/fixtures/module/no-prototype.js @@ -4,7 +4,7 @@ foo.baz = false module.exports = { foo: foo, bar: 1234, - baz: function () { - return 'hello' + getConstructorName: function (value) { + return value.constructor.name } } From f7b72f09482ee1c645e69de40fd125f725d5ca9e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 5 Jul 2016 15:43:57 -0700 Subject: [PATCH 210/516] Move capturePage to WebContents --- atom/browser/api/atom_api_web_contents.cc | 51 +++++++++++++++++++++++ atom/browser/api/atom_api_web_contents.h | 11 +++++ atom/browser/api/atom_api_window.cc | 25 ----------- atom/browser/api/atom_api_window.h | 1 - atom/browser/native_window.cc | 40 ------------------ atom/browser/native_window.h | 12 ------ lib/browser/api/browser-window.js | 3 ++ lib/renderer/web-view/web-view.js | 3 +- 8 files changed, 67 insertions(+), 79 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 99cb2e0074..0d1c7910b0 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -65,6 +65,7 @@ #include "net/url_request/url_request_context.h" #include "third_party/WebKit/public/web/WebInputEvent.h" #include "third_party/WebKit/public/web/WebFindOptions.h" +#include "ui/gfx/screen.h" #include "atom/common/node_includes.h" @@ -1235,6 +1236,55 @@ void WebContents::StartDrag(const mate::Dictionary& item, } } +void WebContents::CapturePage(mate::Arguments* args) { + gfx::Rect rect; + base::Callback callback; + + if (!(args->Length() == 1 && args->GetNext(&callback)) && + !(args->Length() == 2 && args->GetNext(&rect) + && args->GetNext(&callback))) { + args->ThrowError(); + return; + } + + const auto view = web_contents()->GetRenderWidgetHostView(); + const auto host = view ? view->GetRenderWidgetHost() : nullptr; + if (!view || !host) { + callback.Run(gfx::Image()); + return; + } + + // Capture full page if user doesn't specify a |rect|. + const gfx::Size view_size = rect.IsEmpty() ? view->GetViewBounds().size() : + rect.size(); + + // By default, the requested bitmap size is the view size in screen + // coordinates. However, if there's more pixel detail available on the + // current system, increase the requested bitmap size to capture it all. + gfx::Size bitmap_size = view_size; + const gfx::NativeView native_view = view->GetNativeView(); + const float scale = + gfx::Screen::GetScreen()->GetDisplayNearestWindow(native_view) + .device_scale_factor(); + if (scale > 1.0f) + bitmap_size = gfx::ScaleToCeiledSize(view_size, scale); + + host->CopyFromBackingStore( + gfx::Rect(rect.origin(), view_size), + bitmap_size, + base::Bind(&WebContents::OnCapturePageDone, base::Unretained(this), callback), + kBGRA_8888_SkColorType); +} + +void WebContents::OnCapturePageDone( + base::Callback callback, + const SkBitmap& bitmap, + content::ReadbackResponse response) { + v8::Locker locker(isolate()); + v8::HandleScope handle_scope(isolate()); + callback.Run(gfx::Image::CreateFrom1xBitmap(bitmap)); +} + void WebContents::OnCursorChange(const content::WebCursor& cursor) { content::WebCursor::CursorInfo info; cursor.GetCursorInfo(&info); @@ -1370,6 +1420,7 @@ void WebContents::BuildPrototype(v8::Isolate* isolate, .SetMethod("removeWorkSpace", &WebContents::RemoveWorkSpace) .SetMethod("showDefinitionForSelection", &WebContents::ShowDefinitionForSelection) + .SetMethod("capturePage", &WebContents::CapturePage) .SetProperty("id", &WebContents::ID) .SetProperty("session", &WebContents::Session) .SetProperty("hostWebContents", &WebContents::HostWebContents) diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 2917aa860a..597720cba3 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -54,6 +54,8 @@ class WebContents : public mate::TrackableObject, using PrintToPDFCallback = base::Callback, v8::Local)>; + using CapturePageCallback = base::Callback; + // Create from an existing WebContents. static mate::Handle CreateFrom( v8::Isolate* isolate, content::WebContents* web_contents); @@ -145,6 +147,10 @@ class WebContents : public mate::TrackableObject, // Dragging native items. void StartDrag(const mate::Dictionary& item, mate::Arguments* args); + // Captures the page with |rect|, |callback| would be called when capturing is + // done. + void CapturePage(mate::Arguments* args); + // Methods for creating . void SetSize(const SetSizeParams& params); bool IsGuest() const; @@ -159,6 +165,11 @@ class WebContents : public mate::TrackableObject, const std::string& frame_name, WindowOpenDisposition disposition); + // Called when CapturePage is done. + void OnCapturePageDone(base::Callback, + const SkBitmap& bitmap, + content::ReadbackResponse response); + // Returns the web preferences of current WebContents. v8::Local GetWebPreferences(v8::Isolate* isolate); diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index ac5fb87c75..afa04c31a4 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -55,15 +55,6 @@ namespace api { namespace { -void OnCapturePageDone( - v8::Isolate* isolate, - const base::Callback& callback, - const SkBitmap& bitmap) { - v8::Locker locker(isolate); - v8::HandleScope handle_scope(isolate); - callback.Run(gfx::Image::CreateFrom1xBitmap(bitmap)); -} - // Converts binary data to Buffer. v8::Local ToBuffer(v8::Isolate* isolate, void* val, int size) { auto buffer = node::Buffer::Copy(isolate, static_cast(val), size); @@ -581,21 +572,6 @@ void Window::SetFocusable(bool focusable) { return window_->SetFocusable(focusable); } -void Window::CapturePage(mate::Arguments* args) { - gfx::Rect rect; - base::Callback callback; - - if (!(args->Length() == 1 && args->GetNext(&callback)) && - !(args->Length() == 2 && args->GetNext(&rect) - && args->GetNext(&callback))) { - args->ThrowError(); - return; - } - - window_->CapturePage( - rect, base::Bind(&OnCapturePageDone, args->isolate(), callback)); -} - void Window::SetProgressBar(double progress) { window_->SetProgressBar(progress); } @@ -843,7 +819,6 @@ void Window::BuildPrototype(v8::Isolate* isolate, .SetMethod("focusOnWebView", &Window::FocusOnWebView) .SetMethod("blurWebView", &Window::BlurWebView) .SetMethod("isWebViewFocused", &Window::IsWebViewFocused) - .SetMethod("capturePage", &Window::CapturePage) .SetMethod("setProgressBar", &Window::SetProgressBar) .SetMethod("setOverlayIcon", &Window::SetOverlayIcon) .SetMethod("setThumbarButtons", &Window::SetThumbarButtons) diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index a204b70e29..f4b481a5ce 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -155,7 +155,6 @@ class Window : public mate::TrackableObject, void SetIgnoreMouseEvents(bool ignore); void SetContentProtection(bool enable); void SetFocusable(bool focusable); - void CapturePage(mate::Arguments* args); void SetProgressBar(double progress); void SetOverlayIcon(const gfx::Image& overlay, const std::string& description); diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 4eb72dfe08..0a1fb474a6 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -37,7 +37,6 @@ #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size_conversions.h" -#include "ui/gfx/screen.h" #include "ui/gl/gpu_switching_manager.h" DEFINE_WEB_CONTENTS_USER_DATA_KEY(atom::NativeWindowRelay); @@ -315,39 +314,6 @@ bool NativeWindow::IsWebViewFocused() { return host_view && host_view->HasFocus(); } -void NativeWindow::CapturePage(const gfx::Rect& rect, - const CapturePageCallback& callback) { - const auto view = web_contents()->GetRenderWidgetHostView(); - const auto host = view ? view->GetRenderWidgetHost() : nullptr; - if (!view || !host) { - callback.Run(SkBitmap()); - return; - } - - // Capture full page if user doesn't specify a |rect|. - const gfx::Size view_size = rect.IsEmpty() ? view->GetViewBounds().size() : - rect.size(); - - // By default, the requested bitmap size is the view size in screen - // coordinates. However, if there's more pixel detail available on the - // current system, increase the requested bitmap size to capture it all. - gfx::Size bitmap_size = view_size; - const gfx::NativeView native_view = view->GetNativeView(); - const float scale = - gfx::Screen::GetScreen()->GetDisplayNearestWindow(native_view) - .device_scale_factor(); - if (scale > 1.0f) - bitmap_size = gfx::ScaleToCeiledSize(view_size, scale); - - host->CopyFromBackingStore( - gfx::Rect(rect.origin(), view_size), - bitmap_size, - base::Bind(&NativeWindow::OnCapturePageDone, - weak_factory_.GetWeakPtr(), - callback), - kBGRA_8888_SkColorType); -} - void NativeWindow::SetAutoHideMenuBar(bool auto_hide) { } @@ -634,10 +600,4 @@ void NativeWindow::NotifyReadyToShow() { FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnReadyToShow()); } -void NativeWindow::OnCapturePageDone(const CapturePageCallback& callback, - const SkBitmap& bitmap, - content::ReadbackResponse response) { - callback.Run(bitmap); -} - } // namespace atom diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index 8656c02ca9..bb20151283 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -54,8 +54,6 @@ struct DraggableRegion; class NativeWindow : public base::SupportsUserData, public content::WebContentsObserver { public: - using CapturePageCallback = base::Callback; - class DialogScope { public: explicit DialogScope(NativeWindow* window) @@ -179,11 +177,6 @@ class NativeWindow : public base::SupportsUserData, virtual void BlurWebView(); virtual bool IsWebViewFocused(); - // Captures the page with |rect|, |callback| would be called when capturing is - // done. - virtual void CapturePage(const gfx::Rect& rect, - const CapturePageCallback& callback); - // Toggle the menu bar. virtual void SetAutoHideMenuBar(bool auto_hide); virtual bool IsMenuBarAutoHide(); @@ -296,11 +289,6 @@ class NativeWindow : public base::SupportsUserData, // Dispatch ReadyToShow event to observers. void NotifyReadyToShow(); - // Called when CapturePage has done. - void OnCapturePageDone(const CapturePageCallback& callback, - const SkBitmap& bitmap, - content::ReadbackResponse response); - // Whether window has standard frame. bool has_frame_; diff --git a/lib/browser/api/browser-window.js b/lib/browser/api/browser-window.js index 388e396844..ecfdda05f8 100644 --- a/lib/browser/api/browser-window.js +++ b/lib/browser/api/browser-window.js @@ -153,6 +153,9 @@ Object.assign(BrowserWindow.prototype, { }, showDefinitionForSelection () { return this.webContents.showDefinitionForSelection() + }, + capturePage (...args) { + return this.webContents.capturePage.apply(this.webContents, args) } }) diff --git a/lib/renderer/web-view/web-view.js b/lib/renderer/web-view/web-view.js index 98ca22d949..6e5e817985 100644 --- a/lib/renderer/web-view/web-view.js +++ b/lib/renderer/web-view/web-view.js @@ -386,7 +386,8 @@ var registerWebViewElement = function () { 'inspectServiceWorker', 'print', 'printToPDF', - 'showDefinitionForSelection' + 'showDefinitionForSelection', + 'capturePage' ] nonblockMethods = [ 'insertCSS', From 12dddae2ca392f8f4d7e2147fd53a1418767e550 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 5 Jul 2016 17:23:26 -0700 Subject: [PATCH 211/516] Remove unused callback --- atom/browser/api/atom_api_web_contents.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 597720cba3..e399b9477d 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -54,8 +54,6 @@ class WebContents : public mate::TrackableObject, using PrintToPDFCallback = base::Callback, v8::Local)>; - using CapturePageCallback = base::Callback; - // Create from an existing WebContents. static mate::Handle CreateFrom( v8::Isolate* isolate, content::WebContents* web_contents); From ce4ef1ccb8bc2cb116db256d9a8754e42c2a0c04 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 5 Jul 2016 17:26:05 -0700 Subject: [PATCH 212/516] Update capturePage documentation for new location --- docs/api/browser-window.md | 12 +----------- docs/api/web-contents.md | 14 ++++++++++++++ docs/api/web-view-tag.md | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index 1f3d9d49bf..ba07e0bf16 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -892,17 +892,7 @@ Whether the window's document has been edited. ### `win.capturePage([rect, ]callback)` -* `rect` Object (optional) - The area of page to be captured - * `x` Integer - * `y` Integer - * `width` Integer - * `height` Integer -* `callback` Function - -Captures a snapshot of the page within `rect`. Upon completion `callback` will -be called with `callback(image)`. The `image` is an instance of -[NativeImage](native-image.md) that stores data of the snapshot. Omitting -`rect` will capture the whole visible page. +Same as `webContents.capturePage([rect, ]callback)`. ### `win.loadURL(url[, options])` diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index e33d3d0cac..47e395740b 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -664,6 +664,20 @@ webContents.on('found-in-page', (event, result) => { const requestId = webContents.findInPage('api'); ``` +### `webContents.capturePage([rect, ]callback)` + +* `rect` Object (optional) - The area of the page to be captured + * `x` Integer + * `y` Integer + * `width` Integer + * `height` Integer +* `callback` Function + +Captures a snapshot of the page within `rect`. Upon completion `callback` will +be called with `callback(image)`. The `image` is an instance of +[NativeImage](native-image.md) that stores data of the snapshot. Omitting +`rect` will capture the whole visible page. + ### `webContents.hasServiceWorker(callback)` * `callback` Function diff --git a/docs/api/web-view-tag.md b/docs/api/web-view-tag.md index 25725cecea..ecb8485503 100644 --- a/docs/api/web-view-tag.md +++ b/docs/api/web-view-tag.md @@ -469,6 +469,20 @@ Prints `webview`'s web page. Same with `webContents.print([options])`. Prints `webview`'s web page as PDF, Same with `webContents.printToPDF(options, callback)` +### `.capturePage([rect, ]callback)` + +* `rect` Object (optional) - The area of the page to be captured + * `x` Integer + * `y` Integer + * `width` Integer + * `height` Integer +* `callback` Function + +Captures a snapshot of the page within `rect`. Upon completion `callback` will +be called with `callback(image)`. The `image` is an instance of +[NativeImage](native-image.md) that stores data of the snapshot. Omitting +`rect` will capture the whole visible page. + ### `.send(channel[, arg1][, arg2][, ...])` * `channel` String From 4a4a8528ea0287df9f8aa7e9b19356986d6e4ba1 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 5 Jul 2016 17:30:48 -0700 Subject: [PATCH 213/516] Fix linter warnings --- atom/browser/api/atom_api_web_contents.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 0d1c7910b0..960504f93d 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -1272,7 +1272,9 @@ void WebContents::CapturePage(mate::Arguments* args) { host->CopyFromBackingStore( gfx::Rect(rect.origin(), view_size), bitmap_size, - base::Bind(&WebContents::OnCapturePageDone, base::Unretained(this), callback), + base::Bind(&WebContents::OnCapturePageDone, + base::Unretained(this), + callback), kBGRA_8888_SkColorType); } From c2ecc49be29d5271230ba06633a6918ac4b1fd12 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 5 Jul 2016 17:35:15 -0700 Subject: [PATCH 214/516] Defer to webContents docs --- docs/api/web-view-tag.md | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/docs/api/web-view-tag.md b/docs/api/web-view-tag.md index ecb8485503..3dea0f95c7 100644 --- a/docs/api/web-view-tag.md +++ b/docs/api/web-view-tag.md @@ -463,25 +463,15 @@ Stops any `findInPage` request for the `webview` with the provided `action`. ### `.print([options])` -Prints `webview`'s web page. Same with `webContents.print([options])`. +Prints `webview`'s web page. Same as `webContents.print([options])`. ### `.printToPDF(options, callback)` -Prints `webview`'s web page as PDF, Same with `webContents.printToPDF(options, callback)` +Prints `webview`'s web page as PDF, Same as `webContents.printToPDF(options, callback)`. ### `.capturePage([rect, ]callback)` -* `rect` Object (optional) - The area of the page to be captured - * `x` Integer - * `y` Integer - * `width` Integer - * `height` Integer -* `callback` Function - -Captures a snapshot of the page within `rect`. Upon completion `callback` will -be called with `callback(image)`. The `image` is an instance of -[NativeImage](native-image.md) that stores data of the snapshot. Omitting -`rect` will capture the whole visible page. +Captures a snapshot of the `webview`'s page. Same as `webContents.capturePage([rect, ]callback)`. ### `.send(channel[, arg1][, arg2][, ...])` From b900ff93e45084a43b0a6c0b7b897134f2437f31 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 09:32:58 -0700 Subject: [PATCH 215/516] Make OnCapturePageDone static --- atom/browser/api/atom_api_web_contents.cc | 20 ++++++++------------ atom/browser/api/atom_api_web_contents.h | 5 ----- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 960504f93d..9bf93b6907 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -239,6 +239,13 @@ content::ServiceWorkerContext* GetServiceWorkerContext( return storage_partition->GetServiceWorkerContext(); } +// Called when CapturePage is done. +void OnCapturePageDone(base::Callback callback, + const SkBitmap& bitmap, + content::ReadbackResponse response) { + callback.Run(gfx::Image::CreateFrom1xBitmap(bitmap)); +} + } // namespace WebContents::WebContents(v8::Isolate* isolate, @@ -1272,21 +1279,10 @@ void WebContents::CapturePage(mate::Arguments* args) { host->CopyFromBackingStore( gfx::Rect(rect.origin(), view_size), bitmap_size, - base::Bind(&WebContents::OnCapturePageDone, - base::Unretained(this), - callback), + base::Bind(&OnCapturePageDone, callback), kBGRA_8888_SkColorType); } -void WebContents::OnCapturePageDone( - base::Callback callback, - const SkBitmap& bitmap, - content::ReadbackResponse response) { - v8::Locker locker(isolate()); - v8::HandleScope handle_scope(isolate()); - callback.Run(gfx::Image::CreateFrom1xBitmap(bitmap)); -} - void WebContents::OnCursorChange(const content::WebCursor& cursor) { content::WebCursor::CursorInfo info; cursor.GetCursorInfo(&info); diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index e399b9477d..389550390b 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -163,11 +163,6 @@ class WebContents : public mate::TrackableObject, const std::string& frame_name, WindowOpenDisposition disposition); - // Called when CapturePage is done. - void OnCapturePageDone(base::Callback, - const SkBitmap& bitmap, - content::ReadbackResponse response); - // Returns the web preferences of current WebContents. v8::Local GetWebPreferences(v8::Isolate* isolate); From 07ccb6af2bddab9a4468e3e49e8467a886ab9c01 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 09:42:43 -0700 Subject: [PATCH 216/516] :art: --- atom/browser/api/atom_api_web_contents.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 9bf93b6907..2b1d03dbd2 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -1276,11 +1276,10 @@ void WebContents::CapturePage(mate::Arguments* args) { if (scale > 1.0f) bitmap_size = gfx::ScaleToCeiledSize(view_size, scale); - host->CopyFromBackingStore( - gfx::Rect(rect.origin(), view_size), - bitmap_size, - base::Bind(&OnCapturePageDone, callback), - kBGRA_8888_SkColorType); + host->CopyFromBackingStore(gfx::Rect(rect.origin(), view_size), + bitmap_size, + base::Bind(&OnCapturePageDone, callback), + kBGRA_8888_SkColorType); } void WebContents::OnCursorChange(const content::WebCursor& cursor) { From bd33961964722b3ba092881289bd4b96ad9b8283 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 10:10:01 -0700 Subject: [PATCH 217/516] Give menu a chance to handle key event before window --- atom/browser/common_web_contents_delegate_mac.mm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/atom/browser/common_web_contents_delegate_mac.mm b/atom/browser/common_web_contents_delegate_mac.mm index aa67540830..34df15bb0c 100644 --- a/atom/browser/common_web_contents_delegate_mac.mm +++ b/atom/browser/common_web_contents_delegate_mac.mm @@ -27,6 +27,11 @@ void CommonWebContentsDelegate::HandleKeyboardEvent( if (event.windowsKeyCode == ui::VKEY_ESCAPE && is_html_fullscreen()) ExitFullscreenModeForTab(source); + // Send the event to the menu before sending it to the window + if (event.os_event.type == NSKeyDown && + [[NSApp mainMenu] performKeyEquivalent:event.os_event]) + return; + if (event.os_event.window) [event.os_event.window redispatchKeyEvent:event.os_event]; } From cf480f8e17a56fff24ae729aa2ef4c250e1cd02a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 11:47:21 -0700 Subject: [PATCH 218/516] Set default app window icon on Linux --- default_app/default_app.js | 12 +++++++++--- default_app/icon.png | Bin 0 -> 306273 bytes filenames.gypi | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 default_app/icon.png diff --git a/default_app/default_app.js b/default_app/default_app.js index a72675ea6f..bfb97a9ab0 100644 --- a/default_app/default_app.js +++ b/default_app/default_app.js @@ -1,6 +1,7 @@ const {app, BrowserWindow} = require('electron') +const path = require('path') -var mainWindow = null +let mainWindow = null // Quit when all windows are closed. app.on('window-all-closed', () => { @@ -9,13 +10,18 @@ app.on('window-all-closed', () => { exports.load = (appUrl) => { app.on('ready', () => { - mainWindow = new BrowserWindow({ + const options = { width: 800, height: 600, autoHideMenuBar: true, backgroundColor: '#FFFFFF', useContentSize: true - }) + } + if (process.platform === 'linux') { + options.icon = path.join(__dirname, 'icon.png') + } + + mainWindow = new BrowserWindow(options) mainWindow.loadURL(appUrl) mainWindow.focus() }) diff --git a/default_app/icon.png b/default_app/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a250ed6ecf1fb99a729d7c94de550139f81cff5b GIT binary patch literal 306273 zcmeFZXF!tw+cxeVX=$0G9B7s+ccr;4E3Hh-k(zs#xyr5J$jqbAvFN>lk~3@6uP+>%69R`pL&g zTmy>YZ#cM{%)hqf9G#x?Nw$v{VsVvrTPOG zBmH0X-C3TmK{PCuEqp`cx#PV~=vgcWatOp7|IfWXb0km1^nQO+_VaIqb~-EhJte@o z)HPVs0oG_$Dm_=28Xp`Y=>glcu=~$oM6Wx&S4r$5NpTiwZ`=I>j{GAx=wx*z#UZ5t&v zg9bP#jp}-nHv>iCzEj!GR;5FAmw$2|P9~anQjsHhET$)z@pjyi!?!wv4NGRW?^)91 zf-SuntV{8Y!~EU(m&{*P?Qfw|{hAofA74eip8II>#5~x2UsZJ4`h(I>{(f_U$f#-* zEa6AjevivdDVD$EDiL7n_TjzzaZ6R;a9d)I$9Fm*wA>?OfAm0HRN0%11T*^F$}fM< z*|Yo+aSE06L8{Sxzoq32`HY5g!m3N%8QZ>wZ_>*cs>*$V3m*Ty)K?_ZPkVFAl@h#5eg1RAS;Z@L95&O*a_e)QQ%TdHHtvieonW*0kR(lt%TW4&oH^#W!n??S--pVj(O<2+TLpYLwA^GTcF3YDF| zjIrTG^&$@}24g)Su|zc&6A^V^k%6lRoJYl$wRkkPjBLH9rjbYt-ya3WjV%R~eBKP3 zq_9u_?}<;g7sST0kLIiSgbTEID)`K{g%!RZ2kTM(ypk@4JQ@D^{x}UF7S`gKB)>>~6@n?$am%|B9>~T+hvCUQhK58A{oI7qy_$CvsuuU53g12O(=A zbqN&3dQZgcl++HFj~Tpk{U-u;lLE>Aj;QaiLfaco8N50o^=s;DgfjnXU|ZK%m*VL; z&S(6=ujgbV>gHryt!p5Z{hhQ=4({~G9-t~Jy$Ql6Ef@j2Nzch|PsaFnUc8lG=J7Y+bc*wq zMMTQfrS;p~lLk#c*M9Xotn~Ge1joiNu-?d2YIGZHzU zBT$W<7BqZ$<8So8!OAo*{?Ov0QOaM86>~+xbQfakhS&<;dhM5-*8e^98%2@2#Fmyo zeHVbx386mj6NR~4QnJS3A@9{yk+HOX;oZCrA zz-}aOO8&JQNv0SQhvzj5`>d0H1NbYBF^v_$sk%0K$9G)IBU;xp3PO&Yn(gUx1Mxw> z-^~3D-+*qQ7XOhk=uquqCV z582=cYs=Kbn(ug$Tkz$N(7s{(2kKLCG3@w!W;iU3ZENdc*N!~VMD+Xd&T-z!g#sX_~eLD&c0d=&k95|#`YnG6T5euD*VIL~iqcM;Z z+AyeVwB{PZO-Z@V{-BcDuYC6#J$3qwrb6x`mXV(v2lOl*iQvOme$_=zlZ;iZsP3S(1FIwB9>$y_GJe6m>15{7_TNy4?+r&NwfugQC4emE?ZmQ_ zOS3{2@F&Ng%*whMId}Zy**f$BVt?;i_vCf8mwz!uCx?ECyYeNbwMx0akVapRDJXSO z#Wp)@*`RRSX)_wj-rv#G|25F+z6Em_>oY1asMADqjFAr-*LFf zROuheizlggo8nha6XO98#p1>B20wMNoW7l#J>XT1$WlBirElls&&chtp`w$dEFD>Y zq|WZI0F0sD{*MUUrKdqsyH@N6!pyq;CU-4jeXgF`w%k$?{+9SM$MIc`-QO_tT$V}K zNch9JdBa~^A^udq&^2Tz+ud2Wr|*xVYho)o_xJ9!YQOGR_5RtySqy)5XwMZQl`265 z1{~}e6_tN&{sm2*z%smS^3k|S`#Jg9SWt;kw~mAL?h8}2$)d(-6p+YCpNO?x=;=PT zD0lR6()dD8(ncgAVz&OP+q^l`93_HDcS`Y%4f280vfAs)WKVlZ<87u`%-{oSkG#Ub ze;p0EX!y{v6<$4t?GRQ%+&K=ilURF0Mxg$I~{ud5ZVud7?>~c1 zueVo*wcMsZKa8JbdE5y8a(jAOB`fFBBxe+0!9Rj2<^=P7i#_}rNpSczCdh5mnJ$Q%ML3hTR#G|E|{Z$x}qU^p)&sdf>A8YE~ zh?GxTPI5~RII>u0683j=lO`ObIbSXQYL~dfS~i-uEZi=2s#bnTYvW{(reoH^F+DL1 zLW)va7(8u9R;6+6&PHr>V@3)ia&;D>O72X)O51+RV1hRhGQ8jR;vU+>57ZDP&J^2& zJZPM*KK85Lr6hqV^T|?RMu`nr#1=5eGrmAf;hO~s(4b(yIOc1u zb#>dnq2M@^?r-5Y3l{(4tZTryNML>&o3_By|Y9SrOJlBL+d&b&ybzaFVyDs zDhSjLvfJ=!9E)^7YUT3??W!&RYQIu!DUs(|$tX#nr{0W=d)n!Tf7+P>r{Mjfs2#iQ z8>#tz9bqZ`kFPKYGHBWD|@Bs@O_b)cl z>#2WVn+nEM^r3U@Wo{Fyl-|BR7P477?V|pt)RDLY7XC~?XY{ivGv8JOK$MYuRL_PKWAt!0CJRWZ%8X*rlgq$NI4@;|Ad zfp_zYqk{CQe*;tru!ut`z#8CNj-=}-Gw52oxR$(pp! zbim;d`1^IdSp8zEme_^I3tutZZ&KnEA@M~UP6C>#C*r2j$VHS${#e-e+VtmxM0B0| z;0As*x(7BBj9RE4(ZrfW1UbddrzJ6#kb)Vc(7KE~55MK#9F8mMe|rI2 z5&YQi=3iSc;f<+%%%;lW@L*o6S8`12AjwKEo3-CbY@`vvlp#;udc-3~04d?^sji!f@H^hO;S->TsFG_z(%*yd?3U#c zffcBt7NWsq<`sTRn9l!v53kmv=;l2Gpwv%kdQ{TF29SS{sOoU-2Pza7hB9#H6$7#B zeQt_84^JU9my-TxnvfHpW9~WfLG>@!5W~b$A#&SQ?e$RD2N~7OxHjz7Q|nvc1|HH* zB>s`37OCuQs^+X1UeEW-GtP*vrgfILRXPJg0~WBznMTk+zRV6xG+rNne1(q(*p&4Z=XBss+ovS>0z|&(I$P5U>!Kbo(U2*N|^qn zL=Nbv?D!Bd)WN?gNe=4*!2wj?Hlr)|PZ9$a&j3+pNRX!LYAC%~=QCSz4g2QOKbWw3 z_FqnggGo0!x$Nv;wukX5u(KKToei-`ey)n4NJg6DUr--9Qr4_^96vw!K~P)O8(Gsr zqs?#36taJMIUvPic`)^1lyF%WgHourramAM{H!27V7)RyFlT7O3*&=$BW!Q^zx|s z^A&Qz8%|xG-_3E5m}tBWf+|Zk!8RYX?A+cfT^s!S3fN}5?MocJY+=2{K0>SbWk{U*YE$CB^Rj~jrf261au-q1F;U{TF(mCppLw5}3OXqkSI+xbd$ zA^VQ5^dDxLDDT-zPT7BYF`-9 zvwhlegX!84rC#+c489w{3M~Xl;zwM6G-y(tIdbzkfIWlB9-Z|bv0O|gy2sgfdL{)l z09*^r_0-Ldm(SMrFqS@K%bbkQ%*76=Ood*$Pq$XUy9XY>@Hw;rqdcB%Qh^D7S{pmj7;zY@!ENScn^vwuR3`Ux?~*szC1*qSCH97PvJM; z_8TtdvP4uSq0&G%`-`sAx4660)P~8$= z$OqFFd6@TbtM)q_-`dy1Jl4y?q$@7UmtrY-xc$%c$6duyVY9MdG(m6EH(PBUc zieL^{fiKx?2SX|V@0I=$QOd%EdRG&Xt$wWV36d4Qs#AvI4L= z_7Byl!wh=gVpKsZ$FsMu*O?yckPjPD75+;by*U&NWhca_+PsGuv4)|5CQ4N)Ydmsz};S0S3T>;Y81f z3FMAvL@FX&F%9s#u+%M`83iT+X zdhPwXg3&ze3oe~fwh+~0Ye}^VZG$csGh+<5n!*%2s$BSXGcD-$tju(LlW~=!vZX?v zj?K$b^s`*WP|w1EdMEJp>~`o^5Z}Q=5UG=$2*KK-!xz59ae-@h_d|BC1mY)3#9O;p zV!cUPJg0BVk~4J$>QgI63E1A-^w2zgx*i{R&_XaH%0ese1i2Na0tMTE?)&P|iCmx3 zMPy12U}>&C6_VQ|RHF~M8{ig$d*}?nN9wX8b=f&-Uhlk6$C){H6;nr3JDId)gHxer zcl!efLHzkmrSA^6Y+d319-$y>8 zr0>!^anh{th$;6R`|$N<40U8Jv6N|Ix^7sYc#gcJovmKKay{nzu_tG9mYXNq1`P&u zUz;2vb*F1*=9rPkZNe=7JF=ztd}*U6;7;;Wujsy3%7vocHq3AbX(7q+VF(!v+dbgf zzM_@(V%by$!uE$ojw526c)Nbl{8e zDhvHDi-%v$7uu*xS51S+bQ@AUCdC6W^jZ>V!=QZq3IIxeq~VbgJN%!Pa1oErT6*=!8IVCV2@hJK!|yE}^jaI_aF!g%26VhcQAPD2wqml?8I= z=%4YAxao2e|Mb_;oVb$^`Hd$B&(PcvLs1|yCtMx>dDNuTMywA1igZjIEwM5Xgen@u z26v$F<-%|jewjokF(axRVcRpl;2F}4uTo#NE!-D~;w=T}&98i5I}g2cq#d5f&Dh(O z^4iC1x&(@G@h2@4mhHuUs*1H(U-hP!HqSc$(eGq$m3&iI@ec4R*VBMgef%!f+baKV z4$9a$61za5t~L%eExo)gAR2W*h|+j8QOPIXr++#@`qzw@6EdaPvd+!&Fdktl0)a6u zLP`fW0^5SIga4m!vSJMB-KeuYbOC7>fp4G%?5~!h-NWoSI>DS>=gvffr<2N1 zv1gj?i;}88PJY!n$4@V)xQ{al&B+}W49_nBdD;B+o#gnTWr?6>^ErmdrwSM3hY#r7 z$CC&+t@7dMhjyWXmh$!JCV)HuILBa$mOUsnX8>kP3#K$j7N+(QGyw7uzaP?~3#2(e z7!|)CK+zOU1M=X^*7Oblh%YwsBx3*j~`+JVIeo}z{YVu`09J^jd;SY#%eDa zbuhb)-3wiMFMFYPkCS-eWs{uR4;DUeMp3^j1@Xr^GWyc6c@N&3sF80<<$4EaBqPdC zncnh2XBK^FaKrA0po-4t$|=3agcej|(LUssosYJlG`Ra%TPkASWKusNt$KLR`yK4v5E-m*2{w?wvxtM~z?j4o^+~)!R&jEanCvVVT?a7CB z552{q3y5D+v*)1QRjupc&+jaS{PWr@ME^cg_nt>yC5q6DYgry|z-*cA`SxM9K4!+atfmPxX`(%^tG+DsFVfnQKwV@)3f(R`|f?9 zWX>%L@Bs0Row*j-BXANM@eXTXbBf1aKCCU*MD@^<($A!8!j3(3x1cvu4?XGa-#r)F zP%RxDid=zHvGDcX59;l!3fmZjUO!uMlhAkLa;<%SwvypeCf>}&+Nkg-|q)|pnHB=cLkHuFoujz}yS^nZWs|3K316e%=m%p45GU>#}uRzUM6 z1nmd-rL|uYcr))+MR^h-T_P?b{2OL^0>BUVlx`jxyy!LY$X=Wi#DY`f$mg|m0UQTU8zMi&d03%VQF8B=3_=!w;2mnLZYW-BT@xV zX4Tq7HCBJbkjg`68ZleVZ54Q1Kfb*NwPwfsJ2;=lIX((5wc~ovGd@(4(?b7pDya?D z@S{53oJ@GvdC~4{%`UHpkY2aq5o2{tQ9+Ix7<>5|F<$h}S;N`{twd1C3AG8Cyp0d{aEYJo7+vZq3P4ZNi zS%cWy${D3#4Rmz3xbIKF_PR!;0ws1|wQw4iZz8Jj=pJ(N<()r1ms7PvP04=eNJ|NR^OPlL9j>{z}j9*LfQ!Ej)_D1pJhOdQ-lnM%inV!+gZN5FhWLNtLo$*#DD zN-uisvlZ*O7-_ALy{&PNq*A7X*q9dH&N*2nAOn3yTN`uHR#wIQ?%lwrBgEUSt6Koc6@)=i){524!+IndS9(5o&S(|+*f zsS6Pcq#~Q(hyK~3=RBt37{70pGp-j0J$5EDLVHz3ig$1b00zs6VKvbBt;@PO#a@oL ziUBMDG`&H46oAip&j;2f44k{24Y=y#qv=Xaq?_H#{+?p0XJPKT<~Q!WhF(*6akyUr z9A6D}3zMpi4zUSu%$SPwSl_=Uo0y=tPC_)Vyn5si(#gnvF!PL)FL;sB(~F^hzeXi? z-h4S=C=+@MjSm&k%i8dO5@soKt+BMvch;>?o`m9lseR~_LVI?2Q0UXC6UD3s_F_4R zy+d-d55Ek#3EeD9cjWHui4ny~^Q=t%U_nbhP!Fo7z4a|$w5&MDjJyZ~2{Nq%@R)Xa z{uy6~CzwUs$ESyn(I8AhUyyMc@3aN5izO$RL@yUw${F4OW{~W|V%GP{6tpN25SAQr zN=Ax$VP&LH3nfL3dICreiXVj>>;{swbUK$q9a2YqdA>Ct1P^Y9TfMi_B{$fDQa1<_ z?tGMvqVZs>sH~assOjgcBxT1wvwoK2?x8yRFPe(-YTPW5@G9udALABYdTMfNfvGu! z(cYb%q1sZGt@qMzNgS{J@`Y-um{ZQJt9zrXiUy5)T*($ii?uqic>2cS*Ra{_5oFG; z_>B(oI$}C5`XkVC1z@ZJB_%r4bG}ywu*Ya#pj#j$fBrDVx5VkM33Z1f`X0zIgKRxa zinPO4z)}07e8+VDd=KzmfIGGxy?s<4+v}$e&_4$Dj*5QDJAGixr<&IN^FBY}1Ha{3 zTM>>^;5#BsVnO&Ry*#jSNe1=O(L>uCUR&bxe5LQ1@$g$q`r$iwvj`TQA`!Qos&vjN zBNf?(E{K87$=`}yr8!pyQ@X7!NhUc+UjRmY{5<7@yV^;i6R((59pdC8HJ|BcrHnOB zPaHmXjt7nO$+#KSDBPBX=2ahdZ(^>p+%hqb(=|JU;$|H0QWYw9AprZeSAxDN-)3`j=*v=lhwNKCJ^G zPS>RUe=d)YthkMCwC%fn{-GokpB;KJ2Aox#Y$$x@p<_Mdh@ZYqO8c;>W;M~%H0U%< zS*$}s8PTDj9P-9qNI7!-9bpR0-{}4J2-A9wvxZ7Yqi24m9tt@eu!qmKQm69*?B>P8 z`RX*{hkW1tN{Y)6SYh@;U#pE>19q-$0^3&*$uC32d= z)K?n46$heAKm1_T`=BvJ0qtm!q3Bu@(dR8~7BkOVbP>}Y&?noCMWuCG2Rg(T9UYDE z&SEcDt3P;?rdG3Z3GNEwuA>_x4&aj8GA^QuxN|+hoO7HpqA5hRR9}O3`1|m$rby4S z!AGSO;zvd}wMQwEu+b+P@(ZDGEbG*6Az z3F9ktiyH;@L;CgXp6U_%AF4Bf^#E)JwfzBl(2)^-ej7>3cR^ean~vsUT~c@d6xX$q z!M-Y98BoXzP=eCuchh-ek{=XiyS{Lq8d%JfgWE>{rEbN+bohCFJg5T&(lfY>R%F3F z0CNt(tk^%y%Uy}fT-)Wpn*1PR{(EFAuYYU1NAPQkSEmxUF@V%Z1aQ9YN#z%yr;Y~w z_i(4LmT0JXolh(P2p^$AV7QX6i^34`Cm}ynhXd=Y>B-fBkZ9EgT^lQpPjjC$yoy3j zv(Rql|6V+%xBjPkWBX2F8FV4_$rr8i70ydqo7ZA@eDqwEG;G(RR)ucEbjBvFw z@BN1QZXfbuLk#X|w2lOW=Gz6r#Ydo(J4AVJX`R!uLb1-KfwwT z-uH*?#pJ;D#fuxqLVl+zgTLD@jIt&RKp#G`%~HVE2RCs~jKrRKJ>x~2{6)RYI|4h; z5P8L^v0YW!&ipp~edO>?6~M@M%fbPoq$kHAd=*1o@uRNzeiV$<^?$1ndHL(Qu&wd0 zOf8VvrqN!EI3~>ggRAZGAst9@m35Y&N7AxreXpfcYlUe)OxcQZZc3r%54I8LT|n2e zL33Ui%9FMz%Qt?`!5Hxd?%Dk5Rmh&tKlv?^1D3AjF&6DhcOU$)jS=FHFbwE;@NQ`5 zVS*uFUQ0N=vzZKQgzp&J4atQrOW^#>@rj*R$?h?Q_&1$Qf7kyw6Hq5MuZ(8v0>v0@ zwjz#;G2f@_wRB@{lWd6Y4TDo8YdOuf9`AENd%%fXvShSZXqM#F!dn)jzh-@WEpHcM z)YT^t!QAMX4W0DsvV!lA!>0ii6yg`qK6ERVFXIo+r`V)=t$&=AL$nglmeQioaF$ z2)y1ccHFuM0{r0lItM%?SM#PeQ{yv z_bcoaJ+6>AX;wyUQKxrr%ikB@huR68{|4w86#5c!&5zo^76UBTvSC0&Ryt}M zXjGvF9f)-wC#vj|ijUd3a&^ksnpR@z4)#uDtRU@^`F?I1ol{R{WYL6p2{Hduo^aI( zC!VgU3nU4H0qw0?_r!k8G&|M7TkqqaSy}TBA}6m7G55AG*JSEoyX(3F_UObey&MPv z%A>+9LJ!r@yN;Ht@UbxkJLM4@oC&&J-h}HWR)QNc@EQoJHe zy)kE2SJo8`js_{TF&a}ch4 z5Q=5&<$0)9gXU6jhsk8X-ug-=YM2P>SvU8{p-Mke2xLXHOjRa z2$RK&^-z1AK1^t(;Q?W>&(FFga5aanmaYB;*&YVx-YMK*CMoueB|T}z7~KEBg{QY* zln0J)1|VeoKD?3!2p*=Gv0CvlAQZ2>NK?2V1uoJ?&2C2xzqy_?d&&9Bv%-(uxxd(a z{KZbnUUC{te#(zxuaFsBzMgXH84yAUK#6Z2UOmm$3VX&0_%f-y!$Jg*^T8fK~|dIlF_ z72M#*HYdpT+x`O1(F>&I~N`PXUVY<@XEqdZ?UL^=W0l zJPL!Q+A1t$e?~AUNbDr1@R0()uZ_}^ClRig_YJvslGbgTA_5G&-w{_4@PX(M={vUM1V_QU_a6}!?{wH;trukR3 zg({jQ1tr77;jfN*;e>yMeYai+wb|?ZmR$Spz*WV-Mxgrm`DCA?4_}3eiu;$3nr0J@ z!iNm;e)v+hmwp$Vez!I1g@Ye$bzms6*bvDQS~UzAD+Yu8jPmSDD^2!o(D8gF+Ao~~ z1{MFf=MbIj$~c=AG`x7Lrnm7zUqJ7otT%cLzd8q-4aZ7dXm}ginBR3&Ry%O{WsE9POJR!>YG9j_1T?gj z*?7N?=&`BQy^>)$!;y(6zaF8ZMs2032r4_E%52+!V6^1|4&3LJ{6@1hwk7E-0Xzl)iSKwM94G6)Nce{?yrYptPZz;KQ5 zq%Jyvw9b|Ib-8rG-J~m#!fe_5Vc{I*Q;{!l2qpH+cuF-97VpUxUbBEdUZ&c(PJBo} z68(r_PR)zYbji_kq#}D9^HX!2OY{bNvaMY4G*1g2(5UU)T-9)pbCj6fj~5I74L8wT zeOEn=V6UnPE!@}DkDN=isxcPaO$WM#F~?IFQn81gCCV~D44ViO`<%?PvES`mp%6fa z4vY9yS}Q)*uywD*Q(3uHNyhBS9GH36BCk9YS6l(Ug&>&i)rAiF)WN^bVxz{^`3W4U zDAqqti^4y{c5kmX7rF1a*e)IR@cWnR9qi2X z9A;N+K{g9d)w_q{DcH<-N;W=)uJ2T2`#fjd=Qwd8wH)G8P<~)RS2T=EzXy-^?GT~S zhB)RJTKJzIhK`R^54`8tY-?IcC#Wvb3He(9n=6f8)&~7lwSOS(K%Z-Bv;(8iys+uG zAQS)b&ZeWc?;Z*AwY{OTy2~0oN2rh79?_#6#CDKpHmE2-S4X)g%ss4X^YBYFC+Eeb z+l4J<+}OFGBM)a7T`MZ=#BlZk+dX{;>*z6Lz~J+aBKBlmSJ0oNlxf~>>?=Y_lP}j; z7x_l;?2cU{lJnxCkIU+q&$dDyW>PmPO|x0$$M;z#&-*zNi?!G>D?9>r+~4gW##QQ( z6Bd$%&+rlSp{bx~$Vrt4OtM52`pi$?(vibLzr(1R;)tEKKpguVcf%q2sygS>!vi(Y%5~caqtq99zT0RV@6v^oVJ=T%h8i_q7 z^;lbxVe#Rk4?Y{(ElAdrvjuASKKL$J+8(I|q`qYRFY9S{u%E^E)* zBo>Ba5w)y6%_0E6{fB$c4h2^n-LXxeLwlez>RS45XEer)#f%(Mc9>YwSotC`^{rG# z(icI2!pFU*K(AEY2V&k|I?d$n&9Gc&O`vx{5m!I-f-QrVHGK4zdj-Gx#>YBrbUEbNEo9s=h=qrsvEZUMG$5t9{cuISc5W;f3VQ5 z@|)Qjqf&KW&R5~9sgBOHK6d8a&q<6CQ`H>CeR(eb@PPzLmwU#`fuhSG59Y{48m1Sk zSIA}Sh4&N{Stf5g4Rc1~o-$O#8`OeU@>;|`%QS;uI6MLJzzuOG-Fw0@mR4CndXTwN z;*CCb$p2jDdLDd%N0&6mil$L_X~BRtUSn`;>iqR`Mys2JhVLpynT?Vg#Tqziv1)`} zo_$6kZ;sy(0}XWf51X0bcWW6x-`;V)1xNs#E4wzmqV_V>lOK9Ty!$f)bgj(8d}t$n zv_jn0rf#r=lVGcOG*$Vu`Ap=fBHO*$2}2O{58QFL1qq#}cT#>X%uB}9_UoA(oqzg< z64-TdEC#bgl(#zc&&19LI#OxhhhKYf#WWr_!jA$xNcvNZwiH>Bz0hUw*ZHcZg>QT& zm*)=>_@vjJ!``bMx32$G?U~R%-#jKoBgyK)rzV=N%$^VxW_qiNwjLoHrR*p$8l`Xf z{XmI2!zW`+fvEa;4_ADO^?XZLB~jQZ^(KRP#+~`W{SU5;-Kcnq?VoAtur80$I4!A| z@ zkCCx~jR&tyGx*v$I=3sy$tap&_;bR{K2BeQ$(OaZ zeN<|3VkvRgFTkl3?-<$jj4X&Tr=;LD&{a`0p^^7T7BQ}S50RrTOWdLOv zbw$id?<)o*786nPo_gdd&UjEHNpH$9Ay`E2+x_**sc%Sk%eA@25~G7}QhjBB`C4v; z!a$B&QIi7XD#s#IostiP>xk?qn=O24Rh|Y7+`UQe?@VjQxhs)hWC@e|^#kMIuv*3)>zCcmQ?-r@ zjx8E;2+KL4L~{AHW9%|+MAsrQ**92DjmuhP3(1Yx|o4bM?}vOWoVDd_qI21J(0%y+s@)hRkX71 zKk*ZLXCfLqJsUTfW2nsv#6GrQn@6jZmN#3IXxC;PY%}*?X<~D)7rYU^Py03t)Dz1q znCTFJ5in%dNqN2qhcWs*5j&ZH0Ou)NzsK45RXy5h#uR}?AAdcb;|m-z$XZ6C%!s!b zjx|IIdCpqcJZb+QHB&P0Z@qzIZ*P^$0YydT8Pi7e^S^bo^_Nx}ko3Ti1wQsk#8GGs z47S_zzTuS1IiB25hRmNlmO&~DU%({F?0QdSEy|wZl;k-y!-!x?(b_Z&Rppywr5&az}R!aSAYQ1zAfP{wx`TrIB->%01Ta* zkHz1Z-o$oV5;tu`&?j+Zc6h2{T=>Ul~(knX955 zBq_H1{yu7=g*V8Mx)ZL*CRJ#pJvX0=KNfu%=t2fzyNN}PkMtHpitp@$8nviR<4k`b zx7dX-NjHoN8~qYIGkE&gb{>lXASF`Qrd&H_@XJLjh2{KS_d9Q+AKN?R8$p?DYh-~! zcN+a`1CE0R@MH8PitW>?wM&lCA!jzGrr3ExuEBmP75|FnJD`rnQr>ofOz4mQdAq|j$$m*|) z8yNKvI49CZ=oO}gBXo8Tw1iEa+QyBwJ0Hl&scJhp!~UNVRA(03=Sm$^+tph^sMTtB z_8Il7r*G?q-&%E5i8q_@1rBV>QcN2!-MiOH7Zv}h)jayXa%P`y60f}Jc&C|iobCwE52P=l+I66rlhe#Ye3M6tw|bYTI(r-Mufqk^T5GNN55FEZ|v{CP;ahQ0VF zrQanS#(Xqv@=R?qHp6zO+Id55{n3?hv06@=5AixJLVen*l5q1;#-)wZZwhX3u#4E_ zxXZ!wS3=%=gU`=`PY}ggYuczrcdHtsT6b=eU>2&*j;&M+eIHsdHe<7NZD&`3Byl&Y z+@7X=E5IJ5cbDeY_AIL2W#lX_V>zsV={^cRvw!x$wj!?v5CF=R{QVg7omUi4-+hR! zd$WCL4~)rkYL_YfU{d5~`fjNFwyV|y`L0=?NkQUkZfzxcg}%JpHS6vyKY1pr-(~;1 z?$W1Z0&tjFW8qf-0-8YBJpkfJA1ed(Jwx;=*O!QaD&B1|!O=YgU<-~d2(LcD13B)hl1ayL7dt`Ot(r@!34X>Ejm zTYDG0*nmX@-Ra@lY0}v$(OIEI2uD|K!=yBvF7O;MgfJT}4tAK$20l_==S;k)d|y$x z#)P}fb|J4FrjX={no?6#3oUAB$l;9HE*bx+pEhQ-uiEETc?Q zQ(SG|Q=cljC+$Z)zZWn-^79Vw%q z5WCMSgHi%Gl#(GpcLrcIBB2iiM*({1on4e@jNUvW__mKx`swJ;A4?ZrWt{wa{nmKS zAfQA7_Y4kv=3m#Gc{Iq@rju}uZ)jzy*@@|u7AyAavr8b`*TX5bd`9WZTlQIRPj;0D zL(BCCp6q$S8JC1yFVMBN(^QHOW3fP6S@+#+{5XxACKO%2+|)}7Zld{YP@-NH&JbZd zZ0kPN>?Mkk9Sj2Q<*cQuuA_v#I0|Y!fKVPP8!-{TS6UpoAMY1Fny(uUgnV6>t?@=D zrNw?dw|SQ-kJ&KOvy=SqRqbD-Edi+`kTd4#i<>#O%&mcWn*o6|gC0m7c~N1dx~qnf zFBP^Go0neZ6of7$2pZ=qI}2X+Utna%hIMxDw}dGw@dN#Lt(~ramYt0c@Kv;MVF3vq z@fQV3r^h=-d{oK3B`5KNCysuz#SMRRZ|)}AN7(DXX!G%kN@cIM-TX=PGbvK79HaS2 z*R``>w)R?8ijluCIr6b(=TR-_4K+=g=~zt?L&W5iqG6+$KP1w5V{9)0Z~pInD-J%{ z!gRyOEv?!&{)~cY@23_pOzNno-J02xJqJCUT2HO=qVNAND;bQzq`85Xtxh{&6Y zav=%j55N`+9@1ovpGmCItHkX{E&C|SjwdRfI@{udY9t65iN9wP$-A4v&tp1y$x`eu zUHQ19f(G&y`Xd|xkMjAE-ow68Vs!C!f83>s^3aBzdukOcI&mL_c;mf#HKvLzpk5bs zF5Kz)_^Fhwg2D_`wpKLIFqy_pR_lxbs-zG*;xV)F#i%*6q-7HB*OP*C%!h0spm1}g zF7~CNi2!*WMF85q)T^5TF~7xXxfs&pxd!yb{%`1N5Ere>blJk_qlkoQvVK6KfC^{O zNNl!3?jQ0?=K}QI|6K@bzUCS8P*PqD6&NBC+z$5Q?<5o-TbI9EbPK&Yf zn}gm9QKNJcBgJ>?re|#c{6mbr+T-VA&?^e=K`LTn>d~XmuiQ|L`g(?Dysnz|qr|2_ zKYQxU$*&KC`JW-=x1VSWJdk(q_~3uvgSil;@t))bclOJDK>kQ0JN&+gYJk8Qd#;iZ z40)>;&}>KdhK^BPAv72}EIiw%OSP&LIr6;T|3>mzT-rPVBsEnl=c0Aun!_&ca>h>V z7V+Y=-iQM`gn*hQHogUD-Hm48jQSTI7Bx+CXKejC^1A>5Co)}oc#85l10(*K0YhCP z{Y+{mKDH_e=s1dX3!6Ho7rP7|0LKgWGOs5Iv?E9l8w0g3vGERH$>8~*|M4B5q{zJ6 zvvQYQLG!}_-~TXI6n}0^%t_7mu9`SPWa$5J_2=5$}-wW_H|?%vW$I{WiS}~z7B>l+xMEDulMKnyZ!#@cGESu zF4yC69_QT8{eC|Oxz8Z58!-mv#+T1zG|3nkA0$Sa0AhuNQPRHX#y+LAID4Ug$tsSD zlD???XZ`zh)Nj6IF}m)}@lUaiuGiL|#V#&hEcAU$II}a47RvM?*Z^eD!c#KOnH*_Q z{Wwrgh3{Pp(P!KR!S;&Gj7R1T4y=VA@<|Ie;V_pV*Q;Q9M?(bE)jNCi-1mDIYWx4XP5pt=BW&V>yb#N&=GeXQVK{=4)0 zI_((PTh*MXmn)0N&)kYr1fhVGCWi?u9iIwx~Uf`^7GVdY-oKEE50|u!>whp9bo%1701^ z0U)ux0N`1nw5Q*j1-r@Kqv>Zrs+qq*g`N@{Es>{61*Ru}Tc6|N(x!NW?}Z=wx4u08 ztuJWmrVgwDx)v$SOe<+WQBXF;O2+qBeD8I~ z>}M;ffTGP__f1maE9CGLBSS+c$<0nBA1m>QQ(WdFm9L&OZZ-qDDK&(zlUg?2u!h?E z;igpBzPrTqVawuHzXdjvBt0kSMkgR1^MkG|Y|<2BwRg5|6C>M8gn6iXyK`UJOu$lr zQ6da*loI;m%h0WfYtHC6qo<$oq4zF(F4vWjgx;U#^o{Tb=DI%?Pj21SmpdzY;N%eb z(l4Nq0I>|3i2d9?9E)O1@}+rpT@=5Wu1iC^h2pti_U;L-q>lWg|7>nV{W4|vqdWI( zy!8FC{3|FQG81&WiDX_Z1n@Y-dN^?{Sd-ULVQ<@UDG^h%QyjS>1U z0&)cjm^}od;9KU-0$tyd3nLRyQ~u}fv|mBr=7rv@I~{DQg-brHKeXRFICaCh}{s5 zA55t2Uca#YoElLQ_!I2cMoV)r!7CZA5YEQi4Xx|iXoOJa=>WXj1)w>EQ60o+b&u_v zd%oznz?k$hEGkEEE*L>pW#yT$N>W(5pegXP8w3%c)+VsBDT_m%x>Udc1fU+e=~7KU z*bo7B9qK3Y6tW6vWG=Q(6U#W8bbS!|9WY9uXSEf$03A+PU+w!^Kr{z*mH+n>c3d%k zu~M;2v;V#UU{Pk^4MB9%m3jYsy#r{`)oV9`S=?8iZ*yJET~>OKTLFMMfrERt$td=V zo`RA+;o%AFI3xZ!xF;8N6JtBGaBtpY{ z(F+P0_3u6kxNP_?q2|9QvG9QNQLLaq{ay$F^N%Q8(06*cI(_I5P@?3x#A?8vz~;Bx z1$P9U=(k{Nb$1=mQNQil-#g?I^mdUdvF`-rY5dK!tDC_mc*@jT(lg|2${6?jyG>Ix zmT4Ry@ST)~YsDl$rh9}aS~m;1Hs^88g5c79QzZA2RFobhS$*)lRnIk!=6~xzch`N0 znm>QYY5qgYmY;_?B{y&MUYyzEQqln%8fpswGq2P23B$d6NlV6NRjlvzCavp(GGT|X zc1I}yg#Ltnn_W8MTOk11A;n8jg#%QihMFdl!J)IzLZc|&&LwUMiistJKLPa`>bdU$ zr^2QMd@nw0t#jL0g&I??z5rmI7wAG`6Tyu;7ke|Vy(}-sttu_B{rRphp?=*dyfuiO z>m=$ph(!e0zpkOOXP|;}`yu36FlHmeLY^W0yqhK(7$8(cEK+&27SbU$7Clv64rJNe#K(`Sp9KxZ zPZlBXBEU!~ha%@lC(U$xKb3%$MhK6lr#dn$fGr8l#-eLuiU;yYsDf62O>#<4&nyU| zp##M=b(x--JdLNg2}Ix1gwj1FII2g}rjis9OBB#yLhg=*39}#@O;^w{i z`U_o)vbfcoX45%=j8&Di9&ivASi}@QlZFkQDS2Kw!P_YDM3-8)a1wEBLynBWA ziTkopY)tr{y-tY-*N6L!)KyqASq2HzSCo^FT{Nam58tDo(;`$!)E)QR{c!e@d|f zJ6{E!hU{@FiDOyEfg?7BfB!^CriStRDv={;{OVU}f0};@^@<#h;Gd7pZ%b(~5|oXKn9*Ast(BoKGAY&~;ku7;gSs8=W{X}M*$7-YCwo^g?E zx{(ppv!;gG&*t5Nj~^N@p{k#x*m*ELB=?#9WY(R;%Qdt=cq>QY26fbVS!8x%B`(M8 zq0)RBeM-JNL>y}2vfQz)Z*y*z<>is+0}2}>R0}<1b^F#IWc6yO{AZG%_|mG8VECyr zHuu+EI!@2Ef8%9ZpiI#!_sx=$&Hbs_F5hx*lFnwx#ctSsIJ8?=yFyE7=bsEQdLc3`riRcSKbh` z&o=|Kg1DSM5Sons3r!K9FSkr8vV0ipKLeO26Bjyg=ww{}I;?2;N_@-mrZ9+$?>qi&4qF)NmL(hdIP4~GJ z5mI*_$|%LUt)KI|;0Q_HveeKzgWmsWGMg!6!Fw2dc~Fdj1UNvmdZpiC33WxhSLD6V z?C(Ft;OZ;P+^|Wo`DtQ}98s zu0p84wQS@)+9|zoL!UI}`9FMbbyg}M60r}tD!0r+=Hfa1nf(XBshn;DLOM%c?JC%6BtQX$V`rVu%`>Qd%L zm~FrJ0@Y{*0fYtPc|avRki(80WyLlDOjBZLt|cs9JO` z(1nRjzItVC-9Wzs_C92GkHLt-1CWF!-_ zqnw+W9gI6Z4eHZ2Slt3Xr)EowTX*;nYA5eT8D{!gWG*9e@PNt#f$izASte3d=WGN$ z5_*>rqoxKmWS!1k>{j6F#>qzi?whOUPpZ@t7tz%~FwZ4?ub1?AC#k;iko}NN2)t6v ze#sPMoDP&B~Dt@#FeqZVTT>x1#lFC&>JA#H>G-d})K z@?JLMXcmuj_Dg**5Q1YCpBy@GeRe#uLlxA)X*QtdIK~vFCIHNn6iP8}8s94!5nN1t zbwY<&=E$z3X;14t-R5^AbtehtKWeM58(AGPoDX`+l_m&~ApX#!xB<>oy~76{8B%*Y zXLsaCz>a7+JlM--UE7m7M8Qm~FcJQTeLeBoB&1jyf&hExmZJH0h(rkwxH? zR?8PSwbAl){S|H_!K8e$Q7>6*0zH}bAL)nKRfY^W|@M5>!hWj^k0;h2P z5BTo3pda0c!L(M-FRYuBSI~nw{ckYIYo!BUP0H0jMJfp0yk}QNEQ<*MfAnP#z5Eo=e|DiK-SV?sTa`8N(`OHx85Gx`%Y@hl+ z5&`~@|E$5gN1IQp*|AtE%=ZPRM(j4r1zfa&X-DS(3n^P*_v0Ut{GYu9*Yp}duMVZg zCsj|89$W|#2bpreV9MY~8KAs0s06Sq)pGT*C5WR5(33ZZ+FmEY#M z`|#O@-EiN}tpyv9PL{66jjE z71OCIq<&K2>Bm|FwVJ$PKHx1pZG9Rh59Cj=#qfjg1;@@^y!_(1tA(y=kMm6QhZ8M@ zr8}BK3)2p}5gp9`K7UG?JD}Wj;SON7wHynL-P4*~ zesw7ro-Rizp%)$VUyFzexuG2cHH!$Vm1tJTCP&IF}%Nu>#V3F z``jmmTd5Ue9GYhi&_Q!2ULZa$8M3WYynK!oMt69>i9wb z3V+CFq3T({HpL8TpHZ<^-g6%i5-tJgKKuG)*5G*s(Us_7XHm9;##u_e{KcVgVju#$JK6%wi4hc+~k(| zzNWUISs*#U3xxCtAfy+&?^R^QnHD?L=K(aw-FiL<0~%=W)d3CPh|`;mHDYOM-Xehb zl%14+<_w5b5U1jJq;YP@UUnIqc#$=p08%YP za4%i>^#gClcQo9BckwohH@V#!uK`u|NxXoqIcbKv@HN4Nb)sP)@wI;lyh$ zp5~QziXemBe_bg7B8TpcoLJSRm}Qz`YI_P$%te%Wh5Pu&d(ZI2P=4^0=Mu?2x!>yd zJaSpRJX!?sK@$AtabbJ^fPC)U1Ma&Bcu|2{1!mOT)$JuA{POr+0Cf2ebkIqgrMfc! z*5R%X0A6HmJO{wr)rO+lY3b)_cy%{+#82G1XI*ASfRG7QkB70=RXMt9f33mwQ2B;dZOqvQ(c`Y|n=*LkHkknI z9!_AbsD3UEXkinbXDfOtsF!~Nci;?Fe_au_?%o=xIdcACef&IF}5yc9DKwju<8=Cg}jj(JEd)YCU4ff_q*rP#`$x4#Qsd?jY^M*8MKBwCd(w zTCTe#?blKDL@gOoWWZXrtb+YDssLCA2e?xp!}>wJMbI-s~2wG;QpePMd?`wSjM& zGFhihnx5+6n_36q<_{BXT!@Q^Vhi@dSU$>W^&HUDFaYf|+k(a}aYr{&vjcu1j_sns z55))%ta&M2n(YGicWV0j7D31dtMR*z8uihn1d3yzs+4*nK*ogc3wn+q*C{R(0F+F! zmc|#}!J_~HuUCs5|)xNkPWXAY)qhs?LqJS}VQ7NgWSV5R9GmlwexB4GRN! zCGQ4`9m0v&!o*Sq<$}z|4@HK$7rCkl%k14XKOK+f2<^V^3;9yC_~ZFE$zweGL{2WS z&&1wo30mI^ql^{V!!~>Yoqw%2@DD4n-BHmEHZQlT3pDuaECAYOP9-(O<-G||Z8l_3 zV{qvt4cA5g-dlZsUcKZhVK`8SHhq-f-@<(6yAi+MN`5;1Bg+F~E_wP%d_1@u+Xvfy zp9?Xm^Q*$X$Hl z;#J?>=XyQ#cADzm+uXiCnO>}|#Kq}d1NL$8@K-5R0W5b*E&H66ObzjcNC0Cu{us~B7rXzsIlh`Pr?peiXB1TVj{yliJ zT|ZPIVhP#{_(5O_t=KR1z9rQx#`YAQK)+PW2_sI-hP5__$BEHpBZ~6Yxh!r9TO?PX z2?qQrE?KUnl|Q5})|`L$8}@ybO3jtBApu0f*bxizpLK#zak=>74#tU9+yLsUowEc{)SPSzjbms{XjjEC z*tY<&>NVK)t8E2HE~Zq=K*W9B}}m?4N(>_@-&uCM#M4$m3K1AL3qN?E}i7U zy$N)H^t$lzuOqi{6N7-h0+wP2xUq^{2$Wa}uhkF~!h@%}+n!yxuz zDo{f`0c@EXn&?gu-F1hzjhYMg*m(M4l;iOa*o3ib5Oj5s zg~RAQ-3h7^Is196x|tb8e{@jOCxg?dnHmj9Rp6#>Q*$k`E6rx6dRux_kGjatJ-|_@ z!@lLA?JINV9dKR%qMNWv$cM+H_%0!K~jVz&v>#{R#_`` zs>pd`nmgDr@YJri8CP+c1|`Wq5GI)G?QbXAPX% ze#>@Msh(|hFY+uh8_*(md-}hXb1Jt#@^I=hC8ghLq$6vs8qo)44Y)1MWu57>*M6``!Gm)UlW3N~YbrZLy!SlX zi{aw)emsC-;|$BDC)YfQwAovy1WxUqtwDqty=W`X&v^=YeaGklHdrPQ7!gs$reWAL zNS;N>%!9zT7iq2Q0^qkGvx;B)b>nB#X8wjOo*&USo_<-!Z=^2{y1K)AZ%gUeZ68}- ztAA`_ddtQYv_D`(JU-6RAc`+%x%h00=JlK|GforH6LV^L_)70c$~~m+OqdUzowP__ zQcg8}i4*}xH+mEoo#0iJ0r?!sXk6Ohj}eSRLcatN8F=(;8ZxZXZ~y1+tXv)ulj z)S;jUWZoE>u#=5g@EAG(Jv#A|83TP6GFYj{JN994iZoQMOeD-+gab<=gr4G?qtFz* zOxJzcrTJEKh|L}3#b}Q`du(ba79;TZ31s-AZt!E_V3mvn=Q@ug^tcm%hxeksVQowL z^xFDU3jk!|peUn7co{mNH5MQB-s*b@gBL9gHaw%;2z}COI&R|K{8EGa0`nqvJ}C+a zh9Y3^%{vu$`o4+rMDO|oc~hy=cq@vkhN7Aeh5K-&j4PgoeFSPRMXf0dVGEsXH-^u$ zrrTos=$4I}uiS67+ztO6OF~`lEZD!;df>E7<3LcnTLRkEb1Nsh&D1V+Hwq(ebqJSl zy{y@IwlKF6<3!)~eX)gFW=EhQCGM`qM^Ro3C8N3`<=rTkedNmBTSwXALz-Y~`vRWL zp(fC`-W_@W^b^T<0oRP|il2jJRJ9NU7PGhdkMx>ah~Fj|!uE|eIcRw^wbkIAt?2*N z<&ARP<1UfM@|i!^=8R-vO6BEh?*XQh<<4Hvl=$O-`S192ufNyDC1H6Nf@Y6v)ys!O z1kK*~Av5m*sLX6JV-{&?PnH?xXG08Q%(&lWsy?xYyEeL{#+HPHuXp-5J}-f%CaNhv zj!+o5d_L(H*uH#fZEHjD!sFlXKM01vsTTg@yT{bzp8Y~s4=s_3Wz#p-z}giYLvS+sa=I@wuzr*;3En^!H` z%CpP%s*fp>RJl_No&J0w+xQGRm?jTdUv^bUU1#Q!4;>U;Fodcr#YbvPgx5t~(LWm0 z=%#(Ynv3fSQ|I4vyWa>OK6U2P@@5!>F?JttZdZcZC8V|{lJoZ}UctD2mhTGlIc-;q z!s@whgMw#OQ*x&>GI;n3zds(J9sgw~K9seP7>#HBFgil^zx{0}AiYjuDB-7S5{CHG zFD)9ME)B@1$uo67HK0SRL9`U}tnmW-JHDis)y7oiEBoI^=qNT+IQRLa8rL=(x%?Hx zXENUo6&V;t{QCOlOLYuVgE^%LySRFxz`rv#*P=qi*5+7S1ekRQZMGy-oqRGOME-)1 zm%oC!cq_MP5kNYYLqGizFLES?|IpU*?G;@o*Y)eLAF4X4KoR5333RaMiUV_^>W1g! zAZ>yXRZOhL$}ab}nL!azZp)FBPjB16_c6-fp7!p&!)^+WAv zq<4$FkM%TTC`Eo^ROUinnSdZiN*ggMPLEc2f8#s;|$_13q_pR7(%= zFMs1NCw?JJb9>}CvGMgQ|JBjBohKBvS096)SI0IE<4q}FUajx)+*3!N{MsQK)~((h zqtdM}Y!i!M<}BcVSu(4Da+7?~W?M6NA-@KgIa2n#@8|uT=c}Hz$l{WuH}-sEjm5%u zPY4b1oigmdzDx23aCt@-N7-}YK#jq9x809LR&+zqxllzcx=g>vVu<2DsB$(%xqFKE zNhsA}LUJetHM~^tK4xabG1a4awN>sZ1YQv6E1CY@l!4Q{cu*#%L92Rigc!BXK{Gff zdm6h{j+8>V1pZ0XTpv5pB^5xb{foJnvAct0jj&&5I1^u6;qn&S&kj%@)Y=ssQd&kb zXU_>YQ+6H(JBE5^MB_Rqc48aa=0yXGzg{hJ>0};vL2UzGChPQB42pH({3BhSI!*Ad zKR;+vHuspCbEY0?)2wc`kYRB1j2LTO-E3g7TP)vffOdEXrPs#l z5Za+g+U43Wp08{BZ}q>mnl3|zeTM5ogE6S-krj3=Ya?an$m^Rg*LD;wLkC`xWedS6 z-so%1)}H5B5G7QG-|pqoz0I1$o-jZNWyG0QF>9ad$1jUerbL1~kzL3jGi=>(EWa5x z2Ahfm?%VO-eP0^g`MO`){~o1{V?UL|>Ai$?AN#)O4%#`dPRUyHlKx=!mDTuvgfRH|%K9hJO@8Vdr=L z;<)Zuy}?Zv)e&*$?}og{crz031{)?9{FXu@b>6wY9Z3&HVmHg&97vHh(zSVWCzNvsZ ztvHk0@uQaANGHsC4NG}vBts*|YE49KZ!gstIS>VNBY!v-44ou&AVw+`6NK3$vvzR) zvTgS>allwM4B-~#%6?#NiOc~9G4v2)dB{9H9YSQ0rr4R`_X3qUx;Yp)Vk_@`43x^- z+=g9-qY}yeRqXbglQSYdNmCoEtkp#vZYNR|oT`F4=pMze9~-@;@pe#4^XM)o9Yb(@ zg-xSfgG6ns?3uG5cPSLV?A0}OoJ!&L*Lp@dHa0i_*gyDx`{!jfjp%;!?@x}=I<5v7 zgRuRg=cgG4SRr9w1kCFjzE@5gT0{2}Y23n@X2`I*jHm=?SV^_~#+xsx3#g7jb;#fdb0k227u zS&{-ux8T%*4$P+EqvXUynyjkq!3i1q<&S>3TRV>1=LUYff3yUj)!hET%XTV3Ik2AX zFbv5M2r1zx%$lWer#0e2xJDIru)d$@bw_@Xak{YM)$E9rRP`W?O-ss8Uzs&@WVX7_$v5XuJOwG_prnvTYKWQw3WByszjZoc&-` zGV&WPHFN7?#c&z?xTPY7l_369LFmX`5?JZQG_gEJ$5Hy=c_&ofGLqpQJtL*87Mn*^ zXM~CIEf9an&A1Rvk!+Qwh&EXZ3wJ}WKs7lCq_YC=1$Pg_&Ksw*r#@;j#VDB=%`Ig!kG~cQu3t(;1Ka#ytERlmz znh~3G2vK17d5tNHD)wr!8x9V zQ@7GoET{*|4HE*&)N+dkUWE0YCY0ij+xbpU9U%A)Cvqn<8?)q1hs?4n*9(P2vb{%R zSXA@?@S%b^CGEJxL!q9{VNSBi0*jy%MR4V^*sS|DJy!X~3k1AsdfP=bb5E9Vy;mdH zP##fi<52tZRcYNS%cdBi{-v^fu!o3RNoae1acH67qT{7EHAp65cngP1^$ETt!=-$9 zK!X6^>K7bpgHw3(u*~*O_Ctd9Vs0#8kXN$!%`L^A=W(hZLk@kUzK2l;B7|-bxuBH6 z=OGH@|NaJ3f-u?jCW`M!GJJc+@xg91y0D{i9eNHI1ge#b4#3K_E1aGR2?JddB@_32VW zQ@+zi+d#cX5u}KQJZzz-_TTWxu~$C)-_As-)R~_{sf-=N!~pBj@_zw#ZDR)FUc?CM zct^BBF%=Vm@g&x&Uk3zRC_{p-3KUo=@_3*K>M-8)z&ZX2^o8v6X9f)eYqoy!_ijD_Z7chcCjSG zw@%mWfz4&v7Hwc5;W{;gN@nT|>5&XK&>QJ7uXKXB|Btf~xAH2^`RcPL)0W%Sp zR4MXKGg}!p+Yt#00*#S*exzK>>hu?A5q|0SLZIWcz*^?$>Ad;sKYYR-`lD+u(xu-y z_WVVh5gn{2fScoN#+`z1nzCcpUP>yO7{)|K{LITU9Q>Opk70t`lJw|RloJ(-Q+SWk zC9UYtOwvuMbXUdbjL9}`{yBU@ME?b%;=@NLB?%G%#~wW!P1W9V(@uRv-4peO`|#(@ zvB_|2x$>(U$!ZslJyJ+{*FXF`>Ow8+>p4BvVGk6fkqudvY_*Q7 zzEr!nn;>XFs%^Y*k55HV$kw?s*CSuoxW^$T0psrF<<&`G4inO7X@E|!pEIqmqgwE@a*SmqNsbvL6SwVis59<)Sc#gJK61-Ru(=R4_v7ko9{Zn7v2~- zp~2z@UK)HV(~kOfYP1@;YcD&z!wVicv!v5veDodf^+rRaq<}MWYics~S?E!%*}Z?? zz6^QiDfnaE-j%||J3I@+8lJzSc)K`@jw(C~59RXEkJ*OXJBuHbbvSOWWJ<4YHjAt@ zsT*OBu*WU^)^x(}QL?~9wh~2Rr-$;nZXfNVKJ6Vks762UF6@gcLB6I-sWNRkQunX= zsPU*Q<53d8BhL%wFrm7b+hq1pT6osOZ(UFx{-uiK#=|DXD%d|3tKBMRpDK?DgPwKV ztB_X_n^PPMjSOl8`)?E=7$K_lifoSBj~(#j$pn4?H~LK&tozIvi*~gafPIL1H)p7siuiv&mmz?a;y|}7hO$L?1}`vCTLB*`8wso#=K8qGZIky`bGG--9mTc z^wX`?*X9CZN{~{yE{2cNf_mqJfW{s>m=?&^)6#0fpKn2*!1{-4LdcxaWPhjr3lyzL#icc(9KXqfu9LYkm z%2aRuNxON|hb`P*c*Y?c?5>Yr$VyW<w&(F05|@7#iRUu>T|AD z#gb}I$eA7T4*F*CvFC1c?po%J+qB`E(d$V(-DEGA-?%w=`zq?QC~|$B&ZuI~{uv_T z@GzkK3S{eCt34L9GND{8j){pCEMb3q#Gy%70`u}dRh+9Z&Y>nf=BFvE+YxbN8bCZ2&rHg2}pJs>J~YXUf%CWA?7PBP?ap zT&X_TQH*6qAD4G+wsRvGo?k^vvI&u}Vgkclm=M5bzD36}aJ9a!bHB(d&F^aCro6$& zF*_(DYicBho^$+1yP^E)SH$%PlG_H?_#)gBq^Dln{@rzgE-OP>Pr4cyE#Vpx5$hL; z&Q?o{QZsFFS`YM(1C!)YyO%ek>ho9F#hG_IgcsW<*^dX=&Gu-Y*B0jh%& z^O9V|Un?_^f|84m-B>8gS{7TThnRXQKOt#*SWc5YQ1;CJx3XQz)Y1W>LhB1GQW+M5TJo&x;#4- z>dl(qHPH|=fBtUuuO^$P<`-gyxxyZ05LCDJ55-`81vcT}QJEp$Z!Y|gXDd@sjK58G z!Z5~KLFfAvRInN7_M}gpvWrYiiOiZE?e7qrIzxW6@69(b!g%U?c)jT(OHyTk8wxF1 zFnN?Wrt;Q(wgHKBZtk4RFhwv&_XjJi96QVf}lCLbJu|BTP|XxGf8Wb6tL zjlMOEwU|sqm`@vQL4+d@y#GHhfYO?yzyz&k6>?!)*aFNcP)A7bS&U_^-3PutR5#T} zI-o-m8`N-G_$SUeR%e_vb-`cDWq9Q+9xk?VG5QFD>RO5{^cxr#{*p zNIw^{sNBTxy4)U;X(np5p|v75;3DQ8IqZ^2eY;zzp8$)`mvc{(NS4S2AE{B6OH({rdf#{0 z15bbiE)|W>KulvJ*Lf`3yR~9|I7>PrrF!A&T|VEI2Wk|nmkKZ`sM0dtUiG%oED^;+ z$Ms|QCdR}es8Ts`{u`yOWBo@%dGux_A)!uDW9CSPgXR9#>af>;JoDGhs#xmoS?7#N|m%S>1VH5z?2`QsUz~!6m zLmI1e6A7Y0GMWctGo4en;J2}Vv`8W4_o*W&l6JfvHbK#$e?_kaOW=N9Z6oL<6{A_U zs%>iWBH{{B+ojruRvFWrGDP2b-H=&+C7~uWC4ctjBw#~Ja;na*0TyA(PF703cfTKw zxu7A5cwT_dT~}buXS$?a7)9XzeedEqm+Duj%K1l*G25g9x3BA&RA7N3CNOT5{TBcK zKZ-S+uQ$Fww1l5_!n{Mx4-se4sxx$>~XafCj&JNm7JZkwQQ zJNxWU<^lg-5(8ALMK~&~jZ_+Vyy{9V71vq4EF8(tD%aROE@YlmNg=i-UoXv{oNt3A zG(XBRCa!x;7c6=z{Hc7KrNq7|>5_KF3g7bqmrwY3c~Lt(pP}ZQ>s{$})bt^%66$y` zZ_%%kLikqHKmXTT*NV2d%LBi3%WC%RYOB!WLj(zGkUdE-faUB$?#JX|9rAFSW%On# z1Y^V)5Xl<BUpZXO{yTYpS0b?(603Dcdbl(|kPz>Yg=Jg8df0P0J+c`8| zF;UXOWm0QY8BxbMplmzIj+CS<1z!Ic+Cw-Vpt%<98 zJ`1{=2~kg6bYltAmK2H49%{uUFiNBd+;q*~Fo1}<37H59$Pqj282$vmZ*cpvkH9OVrs zf3N|9d$^2rPOQx{(k#pz?c>fySR&wCP1-s5%JS8=0%CQu09=b$%R(|;Y@%fT&Hxv~ zF?~<1NS47)Z`Ag6oz`}?Ay&+MyfwVA_ozO1ua=XE|MtqrQ^23q5*nhGITsLRpK9>Y zgMaFyx(xs8lGE+K55}t`tNH%u4I6 zl&BZHdhF7)B-fh0nmqPfMggPGhS{ge?nf~DeZP+g#HZBm1!)UI(H)@?joOLeMW@P9 z4{Y6Sm2M*WnsAwsxCU9}Hnz%1(mnANcmK#vSS@GfE-L{>c^4aWLnD+s((ZB1XD4Z? z>sDOC2W=k)mmljb)~An7U87borfwlap>sM5d$uz6_4QU}APZvRQlN4>@P$5^>YBx` zG11xZNo)=A0}{xdfmA2{_r%)P>N;T(M*UFnaEJ9U=&#`G%^}RMRne;gi3K%7mNY`U zadbIw=sZxlneh4YpxWCrE~zE~e_GUTMzORW#Dpn0F9B0Ps@Ec6jByh{qC2Z_YVxau zjN5JUd*xV_uU1F%uBZ2maB*AK9d)x6twaj}n1<$Gu*%!wTAHIo=?O|EdvXd<0#(!2 z4$#%ymm?hJzi;e&ir3mu0LdD`<;@7|C$TO;Ui>l~-Nd;$4!_YaVWKrs63VKM+E_AO zWpum{QZ|+~u_zzQ40teU!Et+TgiV^k=8ew&zyE5OBeocW3GqqXZO_EJRJ#Y?=D?-H z(gj>ma7r%Jo59KDrr<#J#y2I-C3Bdi5>GP$>7E$NV!zB-zaG`}{bziOWwv{$rERj< zSZDuP2VlUPe%hW-K`~x}A!?c-S4kYgaVS4c!Obw`h)C>`s&pcc_5gfrcR|Eb0 zMa-m-z7wrTi?e{QPR^!YPN6fzp_a3%aMrziRr_CT{MIZ0H`%=TwZ>P4X*|*!l-ImU z30Sm-c&{^KH8ANrxJR{n+`A6a+`t+spX`|#i@N<$%I_jnFcb~MXiz)gdqQ1YBo^2x z9i8apW9sr`98gxCSKiZaS(!A#WmuxGJ1=aKD)2&}_fbYG;Tln-qRS7I0pSASV>_i; zz|11XC@}kU_ZF|c{_(01o(U1vFe))eFL-qI!7mzFR+H@`T|Ocbc~9x53)_n3qI18| zuHEbl{ZbW``~he3%C6mIkv;M1J1AU0X*s_ zXq?{eAz%*V?ngMe`ykNVc%x^(1&pfRFfIt_%L(rEiFiR2{H%ns!hGt#FGKTf?M4iK za)1p>OhV_;%x~o}y=^6o^4dJY%JR80Z^G%4>sqxdls3sB>hzEgZf!jYcBh0|;^4CC zL#F|Spl4@8N)&xJ@ISj-kiV3J1y=&3Bvp-T83;^9xdooH6Z8V6?d1t?} z#xJU4^%Vt@zYk>Rsa5S60#JXO|0@N$A6NtaN2`9oFjRUZJk9hWGehcXnl3XAse>DrG3XVEniM!7qknq6n>V1ZeeqH6gWdeTnUr&NO z37I%y=wi6DxuZ%K-cGJ$evfG`AIAKozk6q^*tm`ReLW`o_Dd___*g_&f-l#b^(eCj z&7SN1s%P_4+$!gfaR`S=m$$d#x41#03{m;y`8VUupojY1UQcQ=FRq9k8Q?1MlMvGN z5kJcWN?=tJ?$P&)G9YPrTtfih!nTo)OU%&GU@okt$tawtMp;_#V4cNphL{(a^x}jD zqAD)-l|4Bs8$XT6!Ja4Wz-!<(Z$8jdVsVAn`yRm$>0lDcU6H^=$h~ynO5ZGOsF{gd zd-W4rdM6iV$Ax~u7TqThsY8^GYgi3g!^u|~E zsD}1knkRbfWXVSH8c@~$x<>uB3bZn;;{Zc{u=nrr@a)q4*KXe4DEj%fSv%4#

la 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 z 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 z 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 W?x&{_|7i~JPhZ#YQr<=D;Qs|{dN$Dj literal 0 HcmV?d00001 diff --git a/filenames.gypi b/filenames.gypi index a86c53ba4f..942fcf64ba 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -75,6 +75,7 @@ ], 'default_app_sources': [ 'default_app/default_app.js', + 'default_app/icon.png', 'default_app/index.html', 'default_app/main.js', 'default_app/package.json', From 98a97a52ea7d5194145f868ced55025a1cffac6c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 11:43:44 -0700 Subject: [PATCH 219/516] Add getLoginItemLaunchStatus API --- atom/browser/api/atom_api_app.cc | 4 ++-- atom/browser/browser.h | 2 ++ atom/browser/browser_mac.mm | 10 ++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index a39f9809eb..0e4421316e 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -527,8 +527,8 @@ void App::BuildPrototype( .SetMethod("show", base::Bind(&Browser::Show, browser)) .SetMethod("setUserActivity", base::Bind(&Browser::SetUserActivity, browser)) - .SetMethod("getCurrentActivityType", - base::Bind(&Browser::GetCurrentActivityType, browser)) + .SetMethod("getLoginItemLaunchStatus", + base::Bind(&Browser::GetLoginItemLaunchStatus, browser)) #endif #if defined(OS_WIN) .SetMethod("setUserTasks", base::Bind(&Browser::SetUserTasks, browser)) diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 37d2e11e67..e3d7db92e3 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -134,6 +134,8 @@ class Browser : public WindowListObserver { // Set docks' icon. void DockSetIcon(const gfx::Image& image); + + v8::Local GetLoginItemLaunchStatus(mate::Arguments* args); #endif // defined(OS_MACOSX) #if defined(OS_WIN) diff --git a/atom/browser/browser_mac.mm b/atom/browser/browser_mac.mm index bb789365ff..8472ef7579 100644 --- a/atom/browser/browser_mac.mm +++ b/atom/browser/browser_mac.mm @@ -11,9 +11,11 @@ #include "atom/browser/window_list.h" #include "base/mac/bundle_locations.h" #include "base/mac/foundation_util.h" +#include "base/mac/mac_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/sys_string_conversions.h" #include "brightray/common/application_info.h" +#include "native_mate/dictionary.h" #include "net/base/mac/url_conversions.h" #include "url/gurl.h" @@ -148,6 +150,14 @@ bool Browser::ContinueUserActivity(const std::string& type, return prevent_default; } +v8::Local Browser::GetLoginItemLaunchStatus(mate::Arguments* args) { + mate::Dictionary dict = mate::Dictionary::CreateEmpty(args->isolate()); + dict.Set("loginItem", base::mac::WasLaunchedAsLoginOrResumeItem()); + dict.Set("hidden", base::mac::WasLaunchedAsHiddenLoginItem()); + dict.Set("restoreState", base::mac::WasLaunchedAsLoginItemRestoreState()); + return dict.GetHandle(); +} + std::string Browser::GetExecutableFileVersion() const { return brightray::GetApplicationVersion(); } From 79c00d8938abe5b983e372f6fc86128011f60b9c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 12:51:16 -0700 Subject: [PATCH 220/516] Shrink icon using pngcrush --- default_app/icon.png | Bin 306273 -> 122330 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/default_app/icon.png b/default_app/icon.png index a250ed6ecf1fb99a729d7c94de550139f81cff5b..ac3a6547d9eccda3c17de4c0d3516b867b86d51b 100644 GIT binary patch literal 122330 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

la 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 z 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 z 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 W?x&{_|7i~JPhZ#YQr<=D;Qs|{dN$Dj From a9b43a0fc9b9ae00fc02eb08e2f012040b8f303a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 13:06:48 -0700 Subject: [PATCH 221/516] Use empty string constructor name when missing --- lib/renderer/api/remote.js | 2 +- spec/api-ipc-spec.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/renderer/api/remote.js b/lib/renderer/api/remote.js index b120bed0fe..79fe41ed56 100644 --- a/lib/renderer/api/remote.js +++ b/lib/renderer/api/remote.js @@ -60,7 +60,7 @@ var wrapArgs = function (args, visited) { ret = { type: 'object', - name: value.constructor != null ? value.constructor.name : 'Object', + name: value.constructor != null ? value.constructor.name : '', members: [] } for (prop in value) { diff --git a/spec/api-ipc-spec.js b/spec/api-ipc-spec.js index 6b0222d62e..2d439af039 100644 --- a/spec/api-ipc-spec.js +++ b/spec/api-ipc-spec.js @@ -31,10 +31,11 @@ describe('ipc module', function () { it('should work when object has no prototype', function () { var a = remote.require(path.join(fixtures, 'module', 'no-prototype.js')) + assert.equal(a.foo.constructor.name, '') assert.equal(a.foo.bar, 'baz') assert.equal(a.foo.baz, false) assert.equal(a.bar, 1234) - assert.equal(a.getConstructorName(Object.create(null)), 'Object') + assert.equal(a.getConstructorName(Object.create(null)), '') assert.equal(a.getConstructorName(new (class {})), '') }) From 56739e10e3f6b30cacd752618fa60e8438072526 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 13:11:25 -0700 Subject: [PATCH 222/516] Add anonymous class to exports and assert it --- spec/api-ipc-spec.js | 3 ++- spec/fixtures/module/no-prototype.js | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/spec/api-ipc-spec.js b/spec/api-ipc-spec.js index 2d439af039..e98db97107 100644 --- a/spec/api-ipc-spec.js +++ b/spec/api-ipc-spec.js @@ -35,8 +35,9 @@ describe('ipc module', function () { assert.equal(a.foo.bar, 'baz') assert.equal(a.foo.baz, false) assert.equal(a.bar, 1234) + assert.equal(a.anonymous.constructor.name, '') assert.equal(a.getConstructorName(Object.create(null)), '') - assert.equal(a.getConstructorName(new (class {})), '') + assert.equal(a.getConstructorName(new class {}), '') }) it('should search module from the user app', function () { diff --git a/spec/fixtures/module/no-prototype.js b/spec/fixtures/module/no-prototype.js index 3dce313774..4d32681998 100644 --- a/spec/fixtures/module/no-prototype.js +++ b/spec/fixtures/module/no-prototype.js @@ -4,6 +4,7 @@ foo.baz = false module.exports = { foo: foo, bar: 1234, + anonymous: new class {}, getConstructorName: function (value) { return value.constructor.name } From b55f55cfc4ac397116d9f5a397a50b1f781b6d53 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 13:17:39 -0700 Subject: [PATCH 223/516] Add app.getLoginItemStatus API --- atom/browser/api/atom_api_app.cc | 2 ++ atom/browser/browser.h | 4 ++++ atom/browser/browser_mac.mm | 8 ++++++++ 3 files changed, 14 insertions(+) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index 0e4421316e..f032e7043d 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -529,6 +529,8 @@ void App::BuildPrototype( base::Bind(&Browser::SetUserActivity, browser)) .SetMethod("getLoginItemLaunchStatus", base::Bind(&Browser::GetLoginItemLaunchStatus, browser)) + .SetMethod("getLoginItemStatus", + base::Bind(&Browser::GetLoginItemStatus, browser)) #endif #if defined(OS_WIN) .SetMethod("setUserTasks", base::Bind(&Browser::SetUserTasks, browser)) diff --git a/atom/browser/browser.h b/atom/browser/browser.h index e3d7db92e3..32fa67b307 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -135,7 +135,11 @@ class Browser : public WindowListObserver { // Set docks' icon. void DockSetIcon(const gfx::Image& image); + // Get login item status of current app launch v8::Local GetLoginItemLaunchStatus(mate::Arguments* args); + + // Get login item status of app + v8::Local GetLoginItemStatus(mate::Arguments* args); #endif // defined(OS_MACOSX) #if defined(OS_WIN) diff --git a/atom/browser/browser_mac.mm b/atom/browser/browser_mac.mm index 8472ef7579..0da56347ef 100644 --- a/atom/browser/browser_mac.mm +++ b/atom/browser/browser_mac.mm @@ -158,6 +158,14 @@ v8::Local Browser::GetLoginItemLaunchStatus(mate::Arguments* args) { return dict.GetHandle(); } +v8::Local Browser::GetLoginItemStatus(mate::Arguments* args) { + bool hidden = false; + mate::Dictionary dict = mate::Dictionary::CreateEmpty(args->isolate()); + dict.Set("loginItem", base::mac::CheckLoginItemStatus(&hidden)); + dict.Set("hidden", hidden); + return dict.GetHandle(); +} + std::string Browser::GetExecutableFileVersion() const { return brightray::GetApplicationVersion(); } From c5610b218621db770d04eeb05d5b4014eaec3a01 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 13:26:16 -0700 Subject: [PATCH 224/516] Add API to add/remove app as login item --- atom/browser/api/atom_api_app.cc | 4 ++++ atom/browser/browser.h | 6 ++++++ atom/browser/browser_mac.mm | 10 ++++++++++ 3 files changed, 20 insertions(+) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index f032e7043d..979c7b45fe 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -531,6 +531,10 @@ void App::BuildPrototype( base::Bind(&Browser::GetLoginItemLaunchStatus, browser)) .SetMethod("getLoginItemStatus", base::Bind(&Browser::GetLoginItemStatus, browser)) + .SetMethod("setAsLoginItem", + base::Bind(&Browser::SetAsLoginItem, browser)) + .SetMethod("removeAsLoginItem", + base::Bind(&Browser::RemoveAsLoginItem, browser)) #endif #if defined(OS_WIN) .SetMethod("setUserTasks", base::Bind(&Browser::SetUserTasks, browser)) diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 32fa67b307..6921e946d4 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -140,6 +140,12 @@ class Browser : public WindowListObserver { // Get login item status of app v8::Local GetLoginItemStatus(mate::Arguments* args); + + // Set app as a login item + void SetAsLoginItem(mate::Arguments* args); + + // Remove app as a login item + void RemoveAsLoginItem(); #endif // defined(OS_MACOSX) #if defined(OS_WIN) diff --git a/atom/browser/browser_mac.mm b/atom/browser/browser_mac.mm index 0da56347ef..0bc2187a9c 100644 --- a/atom/browser/browser_mac.mm +++ b/atom/browser/browser_mac.mm @@ -166,6 +166,16 @@ v8::Local Browser::GetLoginItemStatus(mate::Arguments* args) { return dict.GetHandle(); } +void Browser::SetAsLoginItem(mate::Arguments* args) { + bool hidden = false; + args->GetNext(&hidden); + base::mac::AddToLoginItems(hidden); +} + +void Browser::RemoveAsLoginItem() { + base::mac::RemoveFromLoginItems(); +} + std::string Browser::GetExecutableFileVersion() const { return brightray::GetApplicationVersion(); } From 2406c82ef53b9cbd807519a4fbb37a9c2c35b24f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 13:34:14 -0700 Subject: [PATCH 225/516] Add specs for login item APIs --- spec/api-app-spec.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index 111d387d34..fdb7154840 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -298,4 +298,33 @@ describe('app module', function () { assert.equal(app.getBadgeCount(), shouldFail ? 0 : 42) }) }) + + describe('app.getLoginItemStatus API', function () { + if (process.platform !== 'darwin') return + + afterEach(function () { + app.removeAsLoginItem() + assert.equal(app.getLoginItemStatus().loginItem, false) + }) + + it('returns the login item status of the app', function () { + app.setAsLoginItem(true) + assert.equal(app.getLoginItemStatus().loginItem, true) + assert.equal(app.getLoginItemStatus().hidden, true) + + app.setAsLoginItem(false) + assert.equal(app.getLoginItemStatus().loginItem, true) + assert.equal(app.getLoginItemStatus().hidden, false) + }) + }) + + describe('app.getLoginItemLaunchStatus API', function () { + if (process.platform !== 'darwin') return + + it('returns the login item status launch of the app', function () { + assert.equal(app.getLoginItemLaunchStatus().loginItem, false) + assert.equal(app.getLoginItemLaunchStatus().hidden, false) + assert.equal(app.getLoginItemLaunchStatus().restoreState, false) + }) + }) }) From 60ab71a70698ba16c5c8496d6a559e85965d0ff8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 13:57:20 -0700 Subject: [PATCH 226/516] Combine launch and current status login item APIs --- atom/browser/api/atom_api_app.cc | 2 -- atom/browser/browser.h | 3 --- atom/browser/browser_mac.mm | 16 ++++++---------- spec/api-app-spec.js | 26 +++++++++++--------------- 4 files changed, 17 insertions(+), 30 deletions(-) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index 979c7b45fe..4eb026549a 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -527,8 +527,6 @@ void App::BuildPrototype( .SetMethod("show", base::Bind(&Browser::Show, browser)) .SetMethod("setUserActivity", base::Bind(&Browser::SetUserActivity, browser)) - .SetMethod("getLoginItemLaunchStatus", - base::Bind(&Browser::GetLoginItemLaunchStatus, browser)) .SetMethod("getLoginItemStatus", base::Bind(&Browser::GetLoginItemStatus, browser)) .SetMethod("setAsLoginItem", diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 6921e946d4..6aeb6ed092 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -135,9 +135,6 @@ class Browser : public WindowListObserver { // Set docks' icon. void DockSetIcon(const gfx::Image& image); - // Get login item status of current app launch - v8::Local GetLoginItemLaunchStatus(mate::Arguments* args); - // Get login item status of app v8::Local GetLoginItemStatus(mate::Arguments* args); diff --git a/atom/browser/browser_mac.mm b/atom/browser/browser_mac.mm index 0bc2187a9c..6207a221e6 100644 --- a/atom/browser/browser_mac.mm +++ b/atom/browser/browser_mac.mm @@ -150,19 +150,15 @@ bool Browser::ContinueUserActivity(const std::string& type, return prevent_default; } -v8::Local Browser::GetLoginItemLaunchStatus(mate::Arguments* args) { - mate::Dictionary dict = mate::Dictionary::CreateEmpty(args->isolate()); - dict.Set("loginItem", base::mac::WasLaunchedAsLoginOrResumeItem()); - dict.Set("hidden", base::mac::WasLaunchedAsHiddenLoginItem()); - dict.Set("restoreState", base::mac::WasLaunchedAsLoginItemRestoreState()); - return dict.GetHandle(); -} - v8::Local Browser::GetLoginItemStatus(mate::Arguments* args) { bool hidden = false; mate::Dictionary dict = mate::Dictionary::CreateEmpty(args->isolate()); - dict.Set("loginItem", base::mac::CheckLoginItemStatus(&hidden)); - dict.Set("hidden", hidden); + dict.Set("openAtLogin", base::mac::CheckLoginItemStatus(&hidden)); + dict.Set("openAsHidden", hidden); + dict.Set("restoreState", base::mac::WasLaunchedAsLoginItemRestoreState()); + dict.Set("openedAtLogin", base::mac::WasLaunchedAsLoginOrResumeItem()); + dict.Set("openedAsHidden", base::mac::WasLaunchedAsHiddenLoginItem()); + return dict.GetHandle(); } diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index fdb7154840..af6a7c7e68 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -302,29 +302,25 @@ describe('app module', function () { describe('app.getLoginItemStatus API', function () { if (process.platform !== 'darwin') return + beforeEach(function () { + assert.equal(app.getLoginItemStatus().openedAtLogin, false) + assert.equal(app.getLoginItemStatus().openedAsHidden, false) + assert.equal(app.getLoginItemStatus().restoreState, false) + }) + afterEach(function () { app.removeAsLoginItem() - assert.equal(app.getLoginItemStatus().loginItem, false) + assert.equal(app.getLoginItemStatus().openAtLogin, false) }) it('returns the login item status of the app', function () { app.setAsLoginItem(true) - assert.equal(app.getLoginItemStatus().loginItem, true) - assert.equal(app.getLoginItemStatus().hidden, true) + assert.equal(app.getLoginItemStatus().openAtLogin, true) + assert.equal(app.getLoginItemStatus().openAsHidden, true) app.setAsLoginItem(false) - assert.equal(app.getLoginItemStatus().loginItem, true) - assert.equal(app.getLoginItemStatus().hidden, false) - }) - }) - - describe('app.getLoginItemLaunchStatus API', function () { - if (process.platform !== 'darwin') return - - it('returns the login item status launch of the app', function () { - assert.equal(app.getLoginItemLaunchStatus().loginItem, false) - assert.equal(app.getLoginItemLaunchStatus().hidden, false) - assert.equal(app.getLoginItemLaunchStatus().restoreState, false) + assert.equal(app.getLoginItemStatus().openAtLogin, true) + assert.equal(app.getLoginItemStatus().openAsHidden, false) }) }) }) From 667b6d63709c1fb03ee19d433bd10699a415a557 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 14:06:38 -0700 Subject: [PATCH 227/516] Doc login item APIs --- docs/api/app.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/api/app.md b/docs/api/app.md index cfda6b574b..71e47c8a7a 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -598,6 +598,33 @@ Returns the current value displayed in the counter badge. Returns whether current desktop environment is Unity launcher. +### `app.getLoginItemStatus()` _macOS_ + +Return an Object with the login item status the app. + +* `openAtLogin` Boolean - `true` if the app is set to open at login. +* `openAsHidden` Boolean - `true` if the app is set to open as hidden at login. +* `openedAtLogin` Boolean - `true` if the app was opened at login automatically. +* `openedAsHidden` Boolean - `true` if the app was opened as a hidden login + item. This indicates that the app should not open any windows at startup. +* `restoreState` Boolean - `true` if the app was opened as a login item that + should restore the state from the previous session. This indicates that the + app should restore the windows that were open the last time the app was + closed. + +### `app.setAsLoginItem([openAsHidden])` _macOS_ + +Set the app as a login item. This will cause the app to be opened automatically +on login. + +* `openAsHidden` Boolean - `true` to hide the app when opened. Defaults to + `false`. + +### `app.removeAsLoginItem()` _macOS_ + +Removes the app as a login item. The app will no longer be opened automatically +on login. + ### `app.commandLine.appendSwitch(switch[, value])` Append a switch (with optional `value`) to Chromium's command line. From 49b32b8380a9aae4f98a4d40baa09295ea69a151 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 14:17:19 -0700 Subject: [PATCH 228/516] Mention open as hidden is manually configurable --- docs/api/app.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/api/app.md b/docs/api/app.md index 71e47c8a7a..7816f7fe98 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -600,7 +600,7 @@ Returns whether current desktop environment is Unity launcher. ### `app.getLoginItemStatus()` _macOS_ -Return an Object with the login item status the app. +Return an Object with the login item status of the app. * `openAtLogin` Boolean - `true` if the app is set to open at login. * `openAsHidden` Boolean - `true` if the app is set to open as hidden at login. @@ -615,15 +615,17 @@ Return an Object with the login item status the app. ### `app.setAsLoginItem([openAsHidden])` _macOS_ Set the app as a login item. This will cause the app to be opened automatically -on login. +at login. -* `openAsHidden` Boolean - `true` to hide the app when opened. Defaults to - `false`. +* `openAsHidden` Boolean - `true` to open the app as hidden. Defaults to + `false`. The user can edit this setting from the System Preferences so + `app.getLoginItemStatus().openedAsHidden` should be checked when the app + is opened to know the current value. ### `app.removeAsLoginItem()` _macOS_ Removes the app as a login item. The app will no longer be opened automatically -on login. +at login. ### `app.commandLine.appendSwitch(switch[, value])` From 88fe667f668a0d6da2bc672c4da0465109d20e56 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 14:19:47 -0700 Subject: [PATCH 229/516] Use require to load package json --- default_app/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default_app/main.js b/default_app/main.js index dd887e0def..181f2f00a9 100644 --- a/default_app/main.js +++ b/default_app/main.js @@ -229,7 +229,7 @@ function loadApplicationPackage (packagePath) { if (fs.existsSync(packageJsonPath)) { let packageJson try { - packageJson = JSON.parse(fs.readFileSync(packageJsonPath)) + packageJson = require(packageJsonPath) } catch (e) { showErrorMessage(`Unable to parse ${packageJsonPath}\n\n${e.message}`) return From 2e029942777d8d5312fe511960a3674da287b7fa Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 15:45:35 -0700 Subject: [PATCH 230/516] Add parens about constructor --- spec/api-ipc-spec.js | 2 +- spec/fixtures/module/no-prototype.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/api-ipc-spec.js b/spec/api-ipc-spec.js index e98db97107..0d9ba0ddee 100644 --- a/spec/api-ipc-spec.js +++ b/spec/api-ipc-spec.js @@ -37,7 +37,7 @@ describe('ipc module', function () { assert.equal(a.bar, 1234) assert.equal(a.anonymous.constructor.name, '') assert.equal(a.getConstructorName(Object.create(null)), '') - assert.equal(a.getConstructorName(new class {}), '') + assert.equal(a.getConstructorName(new (class {})), '') }) it('should search module from the user app', function () { diff --git a/spec/fixtures/module/no-prototype.js b/spec/fixtures/module/no-prototype.js index 4d32681998..46cc4fe838 100644 --- a/spec/fixtures/module/no-prototype.js +++ b/spec/fixtures/module/no-prototype.js @@ -4,7 +4,7 @@ foo.baz = false module.exports = { foo: foo, bar: 1234, - anonymous: new class {}, + anonymous: new (class {}), getConstructorName: function (value) { return value.constructor.name } From c70635dafffde3f9ca51b12dbd47bcd996591eb0 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 7 Jul 2016 10:17:49 +0900 Subject: [PATCH 231/516] docs: Some dlls are not there anymore --- docs/api/web-contents.md | 4 ---- docs/development/setting-up-symbol-server.md | 2 +- docs/tutorial/windows-store-guide.md | 4 ---- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index 47e395740b..0601a2a8c4 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -706,10 +706,6 @@ up system's default printer and default settings for printing. Calling `window.print()` in web page is equivalent to calling `webContents.print({silent: false, printBackground: false})`. -**Note:** On Windows, the print API relies on `pdf.dll`. If your application -doesn't need the print feature, you can safely remove `pdf.dll` to reduce binary -size. - ### `webContents.printToPDF(options, callback)` * `options` Object diff --git a/docs/development/setting-up-symbol-server.md b/docs/development/setting-up-symbol-server.md index 073c752cbf..d31b2c8e69 100644 --- a/docs/development/setting-up-symbol-server.md +++ b/docs/development/setting-up-symbol-server.md @@ -52,5 +52,5 @@ Type the following commands in Windbg to print why symbols are not loading: ``` > !sym noisy -> .reload /f chromiumcontent.dll +> .reload /f electron.exe ``` diff --git a/docs/tutorial/windows-store-guide.md b/docs/tutorial/windows-store-guide.md index 7a5108d66b..ff6b06afee 100644 --- a/docs/tutorial/windows-store-guide.md +++ b/docs/tutorial/windows-store-guide.md @@ -63,18 +63,14 @@ The output should look roughly like this: │   ├── am.pak │   ├── ar.pak │   ├── [...] -├── msvcp120.dll -├── msvcr120.dll ├── natives_blob.bin ├── node.dll -├── pdf.dll ├── resources │   ├── app │   └── atom.asar ├── snapshot_blob.bin ├── squirrel.exe ├── ui_resources_200_percent.pak -├── vccorlib120.dll └── xinput1_3.dll ``` From ceb2864881db905bacb82d5e1210f01196dbd78f Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Thu, 7 Jul 2016 20:55:10 +1200 Subject: [PATCH 232/516] Move size bounding logic to SetBounds --- atom/browser/native_window_mac.h | 1 - atom/browser/native_window_mac.mm | 25 +++++++++++-------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/atom/browser/native_window_mac.h b/atom/browser/native_window_mac.h index f357663fd1..d07d586a84 100644 --- a/atom/browser/native_window_mac.h +++ b/atom/browser/native_window_mac.h @@ -46,7 +46,6 @@ class NativeWindowMac : public NativeWindow { bool IsFullscreen() const override; void SetBounds(const gfx::Rect& bounds, bool animate = false) override; gfx::Rect GetBounds() override; - void SetSize(const gfx::Size& size, bool animate = false) override; void SetContentSizeConstraints( const extensions::SizeConstraints& size_constraints) override; void SetResizable(bool resizable) override; diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 58836c4ea4..b398e04ac0 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -737,13 +737,21 @@ bool NativeWindowMac::IsFullscreen() const { } void NativeWindowMac::SetBounds(const gfx::Rect& bounds, bool animate) { + gfx::Size bSize = gfx::Size(bounds.width(), bounds.height()); + bSize.SetToMax(GetMinimumSize()); + + gfx::Size maxSize = GetMaximumSize(); + maxSize = gfx::Size(maxSize.width() == 0 ? bSize.width() : maxSize.width(), + maxSize.height() == 0 ? bSize.height() : maxSize.height()); + bSize.SetToMin(maxSize); + NSRect cocoa_bounds = NSMakeRect(bounds.x(), 0, - bounds.width(), - bounds.height()); + bSize.width(), + bSize.height()); // Flip coordinates based on the primary screen. NSScreen* screen = [[NSScreen screens] objectAtIndex:0]; cocoa_bounds.origin.y = - NSHeight([screen frame]) - bounds.height() - bounds.y(); + NSHeight([screen frame]) - bSize.height() - bounds.y(); [window_ setFrame:cocoa_bounds display:YES animate:animate]; } @@ -756,17 +764,6 @@ gfx::Rect NativeWindowMac::GetBounds() { return bounds; } -void NativeWindowMac::SetSize(const gfx::Size& size, bool animate) { - gfx::Size minSize = GetMinimumSize(); - gfx::Size maxSize = GetMaximumSize(); - // Bound the supplied width and height values with max and min sizes - int bWidth = fmax(minSize.width(), size.width()); - bWidth = maxSize.width() == 0 ? bWidth : fmin(maxSize.width(), bWidth); - int bHeight = fmax(minSize.height(), size.height()); - bHeight = maxSize.height() == 0 ? bHeight : fmin(maxSize.height(), bHeight); - SetBounds(gfx::Rect(GetPosition(), gfx::Size(bWidth, bHeight)), animate); -} - void NativeWindowMac::SetContentSizeConstraints( const extensions::SizeConstraints& size_constraints) { auto convertSize = [this](const gfx::Size& size) { From 72e811fea48b1f8721f8ea103fb4902c4eaa82f8 Mon Sep 17 00:00:00 2001 From: Gabriel Augendre Date: Thu, 7 Jul 2016 12:22:12 +0200 Subject: [PATCH 233/516] Highlight the whole eval() override I updated the link to hightlight not only the first line but the whole `window.eval()` override. --- docs/tutorial/security.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial/security.md b/docs/tutorial/security.md index ca8bd3a4b7..f16d8cf49b 100644 --- a/docs/tutorial/security.md +++ b/docs/tutorial/security.md @@ -57,7 +57,7 @@ This is not bulletproof, but at the least, you should attempt the following: * Do not disable `webSecurity`. Disabling it will disable the same-origin policy. * Define a [`Content-Security-Policy`](http://www.html5rocks.com/en/tutorials/security/content-security-policy/) , and use restrictive rules (i.e. `script-src 'self'`) -* [Override and disable `eval`](https://github.com/nylas/N1/blob/0abc5d5defcdb057120d726b271933425b75b415/static/index.js#L6) +* [Override and disable `eval`](https://github.com/nylas/N1/blob/0abc5d5defcdb057120d726b271933425b75b415/static/index.js#L6-L8) , which allows strings to be executed as code. * Do not set `allowDisplayingInsecureContent` to true. * Do not set `allowRunningInsecureContent` to true. From d23c1bf9173631a4425c5973f572149b45504182 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 7 Jul 2016 20:02:18 +0900 Subject: [PATCH 234/516] Cleanup the code of SetBounds --- atom/browser/native_window_mac.mm | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index b398e04ac0..3a8284e1be 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -737,21 +737,18 @@ bool NativeWindowMac::IsFullscreen() const { } void NativeWindowMac::SetBounds(const gfx::Rect& bounds, bool animate) { - gfx::Size bSize = gfx::Size(bounds.width(), bounds.height()); - bSize.SetToMax(GetMinimumSize()); + // Check size constraints since setFrame does not check it. + gfx::Size size = bounds.size(); + size.SetToMax(GetMinimumSize()); + gfx::Size max_size = GetMaximumSize(); + if (!max_size.IsEmpty()) + size.SetToMin(max_size); - gfx::Size maxSize = GetMaximumSize(); - maxSize = gfx::Size(maxSize.width() == 0 ? bSize.width() : maxSize.width(), - maxSize.height() == 0 ? bSize.height() : maxSize.height()); - bSize.SetToMin(maxSize); - - NSRect cocoa_bounds = NSMakeRect(bounds.x(), 0, - bSize.width(), - bSize.height()); + NSRect cocoa_bounds = NSMakeRect(bounds.x(), 0, size.width(), size.height()); // Flip coordinates based on the primary screen. NSScreen* screen = [[NSScreen screens] objectAtIndex:0]; cocoa_bounds.origin.y = - NSHeight([screen frame]) - bSize.height() - bounds.y(); + NSHeight([screen frame]) - size.height() - bounds.y(); [window_ setFrame:cocoa_bounds display:YES animate:animate]; } From 34ed2c4da4a25c01e5776950c34b8bed3669166e Mon Sep 17 00:00:00 2001 From: vsemozhetbyt Date: Thu, 7 Jul 2016 18:52:49 +0300 Subject: [PATCH 235/516] Fix a hash of a link href in the remote.md :memo: web-contents.md#webcontentsexecutejavascriptcode-usergesture -> web-contents.md#webcontentsexecutejavascriptcode-usergesture-callback --- docs/api/remote.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/remote.md b/docs/api/remote.md index 998aa6c472..e3ed3ebb4b 100644 --- a/docs/api/remote.md +++ b/docs/api/remote.md @@ -21,7 +21,7 @@ win.loadURL('https://github.com'); ``` **Note:** for the reverse (access the renderer process from the main process), -you can use [webContents.executeJavascript](web-contents.md#webcontentsexecutejavascriptcode-usergesture). +you can use [webContents.executeJavascript](web-contents.md#webcontentsexecutejavascriptcode-usergesture-callback). ## Remote Objects From 583122ee3efd37fb457d0aa5cbf6d639aa3d8626 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Jul 2016 09:15:36 -0700 Subject: [PATCH 236/516] Add quit menu item on Linux --- default_app/main.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/default_app/main.js b/default_app/main.js index 181f2f00a9..ceb7d1677c 100644 --- a/default_app/main.js +++ b/default_app/main.js @@ -197,9 +197,7 @@ app.once('ready', () => { role: 'front' } ] - } - - if (process.platform === 'win32') { + } else { template.unshift({ label: 'File', submenu: [ From 1e0e5b0effec6708efc962b861f1ad32e21b3d78 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Jul 2016 09:19:20 -0700 Subject: [PATCH 237/516] Use CommandOrControl+Q for quit role on Linux --- lib/browser/api/menu-item-roles.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/browser/api/menu-item-roles.js b/lib/browser/api/menu-item-roles.js index 082099818f..32d0d07f4b 100644 --- a/lib/browser/api/menu-item-roles.js +++ b/lib/browser/api/menu-item-roles.js @@ -64,7 +64,7 @@ const roles = { default: return 'Quit' } }, - accelerator: process.platform === 'win32' ? null : 'Command+Q', + accelerator: process.platform === 'win32' ? null : 'CommandOrControl+Q', appMethod: 'quit' }, redo: { From 00fab4688beb9ec8a9a76f2fe6ab685dbdbf6826 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Thu, 7 Jul 2016 10:13:19 -0700 Subject: [PATCH 238/516] Move and rename FAQ --- docs/{faq/electron-faq.md => faq.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{faq/electron-faq.md => faq.md} (100%) diff --git a/docs/faq/electron-faq.md b/docs/faq.md similarity index 100% rename from docs/faq/electron-faq.md rename to docs/faq.md From 6381f44f26d6ca05c6d58aaec19d40fd58092298 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sat, 2 Jul 2016 11:47:40 +0900 Subject: [PATCH 239/516] mac: Pass useDefaultAccelerator to getAcceleratorForCommandId --- atom/browser/api/atom_api_menu.cc | 9 +++-- atom/browser/api/atom_api_menu.h | 8 ++-- atom/browser/api/atom_api_menu_mac.mm | 6 ++- atom/browser/browser.h | 7 +--- atom/browser/browser_mac.mm | 2 +- atom/browser/mac/atom_application_delegate.h | 4 +- atom/browser/mac/atom_application_delegate.mm | 16 ++++---- atom/browser/ui/atom_menu_model.cc | 11 +++++ atom/browser/ui/atom_menu_model.h | 16 ++++++++ atom/browser/ui/cocoa/atom_menu_controller.h | 18 ++++----- atom/browser/ui/cocoa/atom_menu_controller.mm | 40 +++++++++---------- atom/browser/ui/tray_icon.cc | 2 +- atom/browser/ui/tray_icon.h | 6 +-- atom/browser/ui/tray_icon_cocoa.h | 5 +-- atom/browser/ui/tray_icon_cocoa.mm | 14 ++++--- lib/browser/api/menu-item.js | 6 ++- lib/browser/api/menu.js | 8 ++-- 17 files changed, 102 insertions(+), 76 deletions(-) diff --git a/atom/browser/api/atom_api_menu.cc b/atom/browser/api/atom_api_menu.cc index c9cd37522b..5e66850c75 100644 --- a/atom/browser/api/atom_api_menu.cc +++ b/atom/browser/api/atom_api_menu.cc @@ -53,11 +53,14 @@ bool Menu::IsCommandIdVisible(int command_id) const { return is_visible_.Run(command_id); } -bool Menu::GetAcceleratorForCommandId(int command_id, - ui::Accelerator* accelerator) { +bool Menu::GetAcceleratorForCommandIdWithParams( + int command_id, + bool use_default_accelerator, + ui::Accelerator* accelerator) const { v8::Locker locker(isolate()); v8::HandleScope handle_scope(isolate()); - v8::Local val = get_accelerator_.Run(command_id); + v8::Local val = get_accelerator_.Run( + command_id, use_default_accelerator); return mate::ConvertFromV8(isolate(), val, accelerator); } diff --git a/atom/browser/api/atom_api_menu.h b/atom/browser/api/atom_api_menu.h index 53c6bdaf4e..9f24f75848 100644 --- a/atom/browser/api/atom_api_menu.h +++ b/atom/browser/api/atom_api_menu.h @@ -46,8 +46,10 @@ class Menu : public mate::TrackableObject

, bool IsCommandIdChecked(int command_id) const override; bool IsCommandIdEnabled(int command_id) const override; bool IsCommandIdVisible(int command_id) const override; - bool GetAcceleratorForCommandId(int command_id, - ui::Accelerator* accelerator) override; + bool GetAcceleratorForCommandIdWithParams( + int command_id, + bool use_default_accelerator, + ui::Accelerator* accelerator) const override; void ExecuteCommand(int command_id, int event_flags) override; void MenuWillShow(ui::SimpleMenuModel* source) override; @@ -89,7 +91,7 @@ class Menu : public mate::TrackableObject, base::Callback is_checked_; base::Callback is_enabled_; base::Callback is_visible_; - base::Callback(int)> get_accelerator_; + base::Callback(int, bool)> get_accelerator_; base::Callback, int)> execute_command_; base::Callback menu_will_show_; diff --git a/atom/browser/api/atom_api_menu_mac.mm b/atom/browser/api/atom_api_menu_mac.mm index 3b91dac62a..22a624988b 100644 --- a/atom/browser/api/atom_api_menu_mac.mm +++ b/atom/browser/api/atom_api_menu_mac.mm @@ -30,7 +30,8 @@ void MenuMac::PopupAt(Window* window, int x, int y, int positioning_item) { return; base::scoped_nsobject menu_controller( - [[AtomMenuController alloc] initWithModel:model_.get()]); + [[AtomMenuController alloc] initWithModel:model_.get() + useDefaultAccelerator:NO]); NSMenu* menu = [menu_controller menu]; NSView* view = web_contents->GetView()->GetNativeView(); @@ -74,7 +75,8 @@ void MenuMac::PopupAt(Window* window, int x, int y, int positioning_item) { void Menu::SetApplicationMenu(Menu* base_menu) { MenuMac* menu = static_cast(base_menu); base::scoped_nsobject menu_controller( - [[AtomMenuController alloc] initWithModel:menu->model_.get()]); + [[AtomMenuController alloc] initWithModel:menu->model_.get() + useDefaultAccelerator:YES]); [NSApp setMainMenu:[menu_controller menu]]; // Ensure the menu_controller_ is destroyed after main menu is set. diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 37d2e11e67..f91d8b5f5c 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -25,16 +25,13 @@ class DictionaryValue; class FilePath; } -namespace ui { -class MenuModel; -} - namespace gfx { class Image; } namespace atom { +class AtomMenuModel; class LoginHandler; // This class is used for control application-wide operations. @@ -130,7 +127,7 @@ class Browser : public WindowListObserver { void DockShow(); // Set docks' menu. - void DockSetMenu(ui::MenuModel* model); + void DockSetMenu(AtomMenuModel* model); // Set docks' icon. void DockSetIcon(const gfx::Image& image); diff --git a/atom/browser/browser_mac.mm b/atom/browser/browser_mac.mm index bb789365ff..c3cd15a651 100644 --- a/atom/browser/browser_mac.mm +++ b/atom/browser/browser_mac.mm @@ -216,7 +216,7 @@ void Browser::DockShow() { } } -void Browser::DockSetMenu(ui::MenuModel* model) { +void Browser::DockSetMenu(AtomMenuModel* model) { AtomApplicationDelegate* delegate = (AtomApplicationDelegate*)[NSApp delegate]; [delegate setApplicationDockMenu:model]; } diff --git a/atom/browser/mac/atom_application_delegate.h b/atom/browser/mac/atom_application_delegate.h index 3e5c59c3ff..777475213e 100644 --- a/atom/browser/mac/atom_application_delegate.h +++ b/atom/browser/mac/atom_application_delegate.h @@ -11,9 +11,7 @@ base::scoped_nsobject menu_controller_; } -- (id)init; - // Sets the menu that will be returned in "applicationDockMenu:". -- (void)setApplicationDockMenu:(ui::MenuModel*)model; +- (void)setApplicationDockMenu:(atom::AtomMenuModel*)model; @end diff --git a/atom/browser/mac/atom_application_delegate.mm b/atom/browser/mac/atom_application_delegate.mm index 84caae9d5e..e77bd12520 100644 --- a/atom/browser/mac/atom_application_delegate.mm +++ b/atom/browser/mac/atom_application_delegate.mm @@ -12,14 +12,9 @@ @implementation AtomApplicationDelegate -- (id)init { - self = [super init]; - menu_controller_.reset([[AtomMenuController alloc] init]); - return self; -} - -- (void)setApplicationDockMenu:(ui::MenuModel*)model { - [menu_controller_ populateWithModel:model]; +- (void)setApplicationDockMenu:(atom::AtomMenuModel*)model { + menu_controller_.reset([[AtomMenuController alloc] initWithModel:model + useDefaultAccelerator:NO]); } - (void)applicationWillFinishLaunching:(NSNotification*)notify { @@ -34,7 +29,10 @@ } - (NSMenu*)applicationDockMenu:(NSApplication*)sender { - return [menu_controller_ menu]; + if (menu_controller_) + return [menu_controller_ menu]; + else + return nil; } - (BOOL)application:(NSApplication*)sender diff --git a/atom/browser/ui/atom_menu_model.cc b/atom/browser/ui/atom_menu_model.cc index 369684dd3f..ad5384f07b 100644 --- a/atom/browser/ui/atom_menu_model.cc +++ b/atom/browser/ui/atom_menu_model.cc @@ -29,6 +29,17 @@ base::string16 AtomMenuModel::GetRoleAt(int index) { return base::string16(); } +bool AtomMenuModel::GetAcceleratorAtWithParams( + int index, + bool use_default_accelerator, + ui::Accelerator* accelerator) const { + if (delegate_) { + return delegate_->GetAcceleratorForCommandIdWithParams( + GetCommandIdAt(index), use_default_accelerator, accelerator); + } + return false; +} + void AtomMenuModel::MenuClosed() { ui::SimpleMenuModel::MenuClosed(); FOR_EACH_OBSERVER(Observer, observers_, MenuClosed()); diff --git a/atom/browser/ui/atom_menu_model.h b/atom/browser/ui/atom_menu_model.h index 1112949e7e..99246d74d6 100644 --- a/atom/browser/ui/atom_menu_model.h +++ b/atom/browser/ui/atom_menu_model.h @@ -17,6 +17,19 @@ class AtomMenuModel : public ui::SimpleMenuModel { class Delegate : public ui::SimpleMenuModel::Delegate { public: virtual ~Delegate() {} + + virtual bool GetAcceleratorForCommandIdWithParams( + int command_id, + bool use_default_accelerator, + ui::Accelerator* accelerator) const = 0; + + private: + // ui::SimpleMenuModel::Delegate: + bool GetAcceleratorForCommandId(int command_id, + ui::Accelerator* accelerator) { + return GetAcceleratorForCommandIdWithParams( + command_id, true, accelerator); + } }; class Observer { @@ -35,6 +48,9 @@ class AtomMenuModel : public ui::SimpleMenuModel { void SetRole(int index, const base::string16& role); base::string16 GetRoleAt(int index); + bool GetAcceleratorAtWithParams(int index, + bool use_default_accelerator, + ui::Accelerator* accelerator) const; // ui::SimpleMenuModel: void MenuClosed() override; diff --git a/atom/browser/ui/cocoa/atom_menu_controller.h b/atom/browser/ui/cocoa/atom_menu_controller.h index f8c48aa5dc..af0b276961 100644 --- a/atom/browser/ui/cocoa/atom_menu_controller.h +++ b/atom/browser/ui/cocoa/atom_menu_controller.h @@ -11,8 +11,8 @@ #include "base/mac/scoped_nsobject.h" #include "base/strings/string16.h" -namespace ui { -class MenuModel; +namespace atom { +class AtomMenuModel; } // A controller for the cross-platform menu model. The menu that's created @@ -23,24 +23,20 @@ class MenuModel; // as it only maintains weak references. @interface AtomMenuController : NSObject { @protected - ui::MenuModel* model_; // weak + atom::AtomMenuModel* model_; // weak base::scoped_nsobject menu_; BOOL isMenuOpen_; + BOOL useDefaultAccelerator_; } -@property(nonatomic, assign) ui::MenuModel* model; - -// NIB-based initializer. This does not create a menu. Clients can set the -// properties of the object and the menu will be created upon the first call to -// |-menu|. Note that the menu will be immutable after creation. -- (id)init; +@property(nonatomic, assign) atom::AtomMenuModel* model; // Builds a NSMenu from the pre-built model (must not be nil). Changes made // to the contents of the model after calling this will not be noticed. -- (id)initWithModel:(ui::MenuModel*)model; +- (id)initWithModel:(atom::AtomMenuModel*)model useDefaultAccelerator:(BOOL)use; // Populate current NSMenu with |model|. -- (void)populateWithModel:(ui::MenuModel*)model; +- (void)populateWithModel:(atom::AtomMenuModel*)model; // Programmatically close the constructed menu. - (void)cancel; diff --git a/atom/browser/ui/cocoa/atom_menu_controller.mm b/atom/browser/ui/cocoa/atom_menu_controller.mm index 536f487605..3efd161151 100644 --- a/atom/browser/ui/cocoa/atom_menu_controller.mm +++ b/atom/browser/ui/cocoa/atom_menu_controller.mm @@ -48,15 +48,11 @@ Role kRolesMap[] = { @synthesize model = model_; -- (id)init { - if ((self = [super init])) - [self menu]; - return self; -} - -- (id)initWithModel:(ui::MenuModel*)model { +- (id)initWithModel:(atom::AtomMenuModel*)model useDefaultAccelerator:(BOOL)use { if ((self = [super init])) { model_ = model; + isMenuOpen_ = NO; + useDefaultAccelerator_ = use; [self menu]; } return self; @@ -73,7 +69,7 @@ Role kRolesMap[] = { [super dealloc]; } -- (void)populateWithModel:(ui::MenuModel*)model { +- (void)populateWithModel:(atom::AtomMenuModel*)model { if (!menu_) return; @@ -82,7 +78,7 @@ Role kRolesMap[] = { const int count = model->GetItemCount(); for (int index = 0; index < count; index++) { - if (model->GetTypeAt(index) == ui::MenuModel::TYPE_SEPARATOR) + if (model->GetTypeAt(index) == atom::AtomMenuModel::TYPE_SEPARATOR) [self addSeparatorToMenu:menu_ atIndex:index]; else [self addItemToMenu:menu_ atIndex:index fromModel:model]; @@ -99,12 +95,12 @@ Role kRolesMap[] = { // Creates a NSMenu from the given model. If the model has submenus, this can // be invoked recursively. -- (NSMenu*)menuFromModel:(ui::MenuModel*)model { +- (NSMenu*)menuFromModel:(atom::AtomMenuModel*)model { NSMenu* menu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; const int count = model->GetItemCount(); for (int index = 0; index < count; index++) { - if (model->GetTypeAt(index) == ui::MenuModel::TYPE_SEPARATOR) + if (model->GetTypeAt(index) == atom::AtomMenuModel::TYPE_SEPARATOR) [self addSeparatorToMenu:menu atIndex:index]; else [self addItemToMenu:menu atIndex:index fromModel:model]; @@ -126,9 +122,7 @@ Role kRolesMap[] = { // associated with the entry in the model identified by |modelIndex|. - (void)addItemToMenu:(NSMenu*)menu atIndex:(NSInteger)index - fromModel:(ui::MenuModel*)ui_model { - atom::AtomMenuModel* model = static_cast(ui_model); - + fromModel:(atom::AtomMenuModel*)model { base::string16 label16 = model->GetLabelAt(index); NSString* label = l10n_util::FixUpWindowsStyleLabel(label16); base::scoped_nsobject item( @@ -141,12 +135,13 @@ Role kRolesMap[] = { if (model->GetIconAt(index, &icon) && !icon.IsEmpty()) [item setImage:icon.ToNSImage()]; - ui::MenuModel::ItemType type = model->GetTypeAt(index); - if (type == ui::MenuModel::TYPE_SUBMENU) { + atom::AtomMenuModel::ItemType type = model->GetTypeAt(index); + if (type == atom::AtomMenuModel::TYPE_SUBMENU) { // Recursively build a submenu from the sub-model at this index. [item setTarget:nil]; [item setAction:nil]; - ui::MenuModel* submenuModel = model->GetSubmenuModelAt(index); + atom::AtomMenuModel* submenuModel = static_cast( + model->GetSubmenuModelAt(index)); NSMenu* submenu = [self menuFromModel:submenuModel]; [submenu setTitle:[item title]]; [item setSubmenu:submenu]; @@ -170,7 +165,8 @@ Role kRolesMap[] = { NSValue* modelObject = [NSValue valueWithPointer:model]; [item setRepresentedObject:modelObject]; // Retains |modelObject|. ui::Accelerator accelerator; - if (model->GetAcceleratorAt(index, &accelerator)) { + if (model->GetAcceleratorAtWithParams( + index, useDefaultAccelerator_, &accelerator)) { const ui::PlatformAcceleratorCocoa* platformAccelerator = static_cast( accelerator.platform_accelerator()); @@ -206,8 +202,8 @@ Role kRolesMap[] = { return NO; NSInteger modelIndex = [item tag]; - ui::MenuModel* model = - static_cast( + atom::AtomMenuModel* model = + static_cast( [[(id)item representedObject] pointerValue]); DCHECK(model); if (model) { @@ -234,8 +230,8 @@ Role kRolesMap[] = { // item chosen. - (void)itemSelected:(id)sender { NSInteger modelIndex = [sender tag]; - ui::MenuModel* model = - static_cast( + atom::AtomMenuModel* model = + static_cast( [[sender representedObject] pointerValue]); DCHECK(model); if (model) { diff --git a/atom/browser/ui/tray_icon.cc b/atom/browser/ui/tray_icon.cc index fda68b09cd..88c2f9139a 100644 --- a/atom/browser/ui/tray_icon.cc +++ b/atom/browser/ui/tray_icon.cc @@ -27,7 +27,7 @@ void TrayIcon::DisplayBalloon(ImageType icon, } void TrayIcon::PopUpContextMenu(const gfx::Point& pos, - ui::SimpleMenuModel* menu_model) { + AtomMenuModel* menu_model) { } gfx::Rect TrayIcon::GetBounds() { diff --git a/atom/browser/ui/tray_icon.h b/atom/browser/ui/tray_icon.h index 2763e50941..617755dc36 100644 --- a/atom/browser/ui/tray_icon.h +++ b/atom/browser/ui/tray_icon.h @@ -8,9 +8,9 @@ #include #include +#include "atom/browser/ui/atom_menu_model.h" #include "atom/browser/ui/tray_icon_observer.h" #include "base/observer_list.h" -#include "ui/base/models/simple_menu_model.h" #include "ui/gfx/geometry/rect.h" namespace atom { @@ -55,10 +55,10 @@ class TrayIcon { // Popups the menu. virtual void PopUpContextMenu(const gfx::Point& pos, - ui::SimpleMenuModel* menu_model); + AtomMenuModel* menu_model); // Set the context menu for this icon. - virtual void SetContextMenu(ui::SimpleMenuModel* menu_model) = 0; + virtual void SetContextMenu(AtomMenuModel* menu_model) = 0; // Returns the bounds of tray icon. virtual gfx::Rect GetBounds(); diff --git a/atom/browser/ui/tray_icon_cocoa.h b/atom/browser/ui/tray_icon_cocoa.h index cb972d54a9..e9abaa5590 100644 --- a/atom/browser/ui/tray_icon_cocoa.h +++ b/atom/browser/ui/tray_icon_cocoa.h @@ -9,7 +9,6 @@ #include -#include "atom/browser/ui/atom_menu_model.h" #include "atom/browser/ui/tray_icon.h" #include "base/mac/scoped_nsobject.h" @@ -30,8 +29,8 @@ class TrayIconCocoa : public TrayIcon, void SetTitle(const std::string& title) override; void SetHighlightMode(bool highlight) override; void PopUpContextMenu(const gfx::Point& pos, - ui::SimpleMenuModel* menu_model) override; - void SetContextMenu(ui::SimpleMenuModel* menu_model) override; + AtomMenuModel* menu_model) override; + void SetContextMenu(AtomMenuModel* menu_model) override; gfx::Rect GetBounds() override; protected: diff --git a/atom/browser/ui/tray_icon_cocoa.mm b/atom/browser/ui/tray_icon_cocoa.mm index 2510d3160c..7c2f12f050 100644 --- a/atom/browser/ui/tray_icon_cocoa.mm +++ b/atom/browser/ui/tray_icon_cocoa.mm @@ -249,11 +249,12 @@ const CGFloat kVerticalTitleMargin = 2; [self setNeedsDisplay:YES]; } -- (void)popUpContextMenu:(ui::SimpleMenuModel*)menu_model { +- (void)popUpContextMenu:(atom::AtomMenuModel*)menu_model { // Show a custom menu. if (menu_model) { base::scoped_nsobject menuController( - [[AtomMenuController alloc] initWithModel:menu_model]); + [[AtomMenuController alloc] initWithModel:menu_model + useDefaultAccelerator:NO]); forceHighlight_ = YES; // Should highlight when showing menu. [self setNeedsDisplay:YES]; [statusItem_ popUpStatusItemMenu:[menuController menu]]; @@ -365,18 +366,19 @@ void TrayIconCocoa::SetHighlightMode(bool highlight) { } void TrayIconCocoa::PopUpContextMenu(const gfx::Point& pos, - ui::SimpleMenuModel* menu_model) { + AtomMenuModel* menu_model) { [status_item_view_ popUpContextMenu:menu_model]; } -void TrayIconCocoa::SetContextMenu(ui::SimpleMenuModel* menu_model) { +void TrayIconCocoa::SetContextMenu(AtomMenuModel* menu_model) { // Substribe to MenuClosed event. if (menu_model_) menu_model_->RemoveObserver(this); - static_cast(menu_model)->AddObserver(this); + menu_model->AddObserver(this); // Create native menu. - menu_.reset([[AtomMenuController alloc] initWithModel:menu_model]); + menu_.reset([[AtomMenuController alloc] initWithModel:menu_model + useDefaultAccelerator:NO]); [status_item_view_ setMenuController:menu_.get()]; } diff --git a/lib/browser/api/menu-item.js b/lib/browser/api/menu-item.js index 8fb1b51d1e..d34cf3e3d1 100644 --- a/lib/browser/api/menu-item.js +++ b/lib/browser/api/menu-item.js @@ -31,7 +31,7 @@ const MenuItem = function (options) { this.overrideReadOnlyProperty('type', 'normal') this.overrideReadOnlyProperty('role') - this.overrideReadOnlyProperty('accelerator', roles.getDefaultAccelerator(this.role)) + this.overrideReadOnlyProperty('accelerator') this.overrideReadOnlyProperty('icon') this.overrideReadOnlyProperty('submenu') @@ -66,6 +66,10 @@ const MenuItem = function (options) { MenuItem.types = ['normal', 'separator', 'submenu', 'checkbox', 'radio'] +MenuItem.prototype.getDefaultRoleAccelerator = function () { + return roles.getDefaultAccelerator(this.role) +} + MenuItem.prototype.overrideProperty = function (name, defaultValue) { if (defaultValue == null) { defaultValue = null diff --git a/lib/browser/api/menu.js b/lib/browser/api/menu.js index 3b10821936..467cca6d09 100644 --- a/lib/browser/api/menu.js +++ b/lib/browser/api/menu.js @@ -106,9 +106,11 @@ Menu.prototype._init = function () { var command = this.commandsMap[commandId] return command != null ? command.visible : undefined }, - getAcceleratorForCommandId: (commandId) => { - var command = this.commandsMap[commandId] - return command != null ? command.accelerator : undefined + getAcceleratorForCommandId: (commandId, useDefaultAccelerator) => { + const command = this.commandsMap[commandId] + if (command == null) return + if (command.accelerator != null) return command.accelerator + if (useDefaultAccelerator) return command.getDefaultRoleAccelerator() }, getIconForCommandId: (commandId) => { var command = this.commandsMap[commandId] From 2faf00dc19204c8704644e6e48cd0a0fab609270 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 Jul 2016 16:04:18 -0700 Subject: [PATCH 240/516] Only use default accelerator in Windows/Linux app menu --- atom/browser/native_window.cc | 2 +- atom/browser/native_window.h | 7 ++--- atom/browser/native_window_views.cc | 4 +-- atom/browser/native_window_views.h | 4 +-- atom/browser/ui/accelerator_util.cc | 12 ++++---- atom/browser/ui/accelerator_util.h | 10 +++---- atom/browser/ui/atom_menu_model.cc | 5 ++++ atom/browser/ui/atom_menu_model.h | 5 +++- atom/browser/ui/tray_icon_gtk.cc | 2 +- atom/browser/ui/tray_icon_gtk.h | 2 +- atom/browser/ui/views/global_menu_bar_x11.cc | 28 +++++++++---------- atom/browser/ui/views/global_menu_bar_x11.h | 6 ++-- atom/browser/ui/views/menu_bar.cc | 10 +++---- atom/browser/ui/views/menu_bar.h | 11 +++----- atom/browser/ui/views/menu_delegate.cc | 10 +++---- atom/browser/ui/views/menu_delegate.h | 7 ++--- atom/browser/ui/views/menu_model_adapter.cc | 28 +++++++++++++++++++ atom/browser/ui/views/menu_model_adapter.h | 29 ++++++++++++++++++++ atom/browser/ui/win/notify_icon.cc | 4 +-- atom/browser/ui/win/notify_icon.h | 6 ++-- filenames.gypi | 2 ++ 21 files changed, 125 insertions(+), 69 deletions(-) create mode 100644 atom/browser/ui/views/menu_model_adapter.cc create mode 100644 atom/browser/ui/views/menu_model_adapter.h diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 0a1fb474a6..0e536c113c 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -290,7 +290,7 @@ bool NativeWindow::IsDocumentEdited() { void NativeWindow::SetFocusable(bool focusable) { } -void NativeWindow::SetMenu(ui::MenuModel* menu) { +void NativeWindow::SetMenu(AtomMenuModel* menu) { } bool NativeWindow::HasModalDialog() { diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index bb20151283..1828c332b2 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -11,6 +11,7 @@ #include "atom/browser/native_window_observer.h" #include "atom/browser/ui/accelerator_util.h" +#include "atom/browser/ui/atom_menu_model.h" #include "base/cancelable_callback.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" @@ -43,10 +44,6 @@ namespace mate { class Dictionary; } -namespace ui { -class MenuModel; -} - namespace atom { struct DraggableRegion; @@ -157,7 +154,7 @@ class NativeWindow : public base::SupportsUserData, virtual void SetIgnoreMouseEvents(bool ignore) = 0; virtual void SetContentProtection(bool enable) = 0; virtual void SetFocusable(bool focusable); - virtual void SetMenu(ui::MenuModel* menu); + virtual void SetMenu(AtomMenuModel* menu); virtual bool HasModalDialog(); virtual void SetParentWindow(NativeWindow* parent); virtual gfx::NativeWindow GetNativeWindow() = 0; diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index e9ff695281..63ed8d9058 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -748,7 +748,7 @@ void NativeWindowViews::SetFocusable(bool focusable) { #endif } -void NativeWindowViews::SetMenu(ui::MenuModel* menu_model) { +void NativeWindowViews::SetMenu(AtomMenuModel* menu_model) { if (menu_model == nullptr) { // Remove accelerators accelerator_table_.clear(); @@ -1182,7 +1182,7 @@ bool NativeWindowViews::AcceleratorPressed(const ui::Accelerator& accelerator) { &accelerator_table_, accelerator); } -void NativeWindowViews::RegisterAccelerators(ui::MenuModel* menu_model) { +void NativeWindowViews::RegisterAccelerators(AtomMenuModel* menu_model) { // Clear previous accelerators. views::FocusManager* focus_manager = GetFocusManager(); accelerator_table_.clear(); diff --git a/atom/browser/native_window_views.h b/atom/browser/native_window_views.h index 71f3741f2f..a7614e178f 100644 --- a/atom/browser/native_window_views.h +++ b/atom/browser/native_window_views.h @@ -98,7 +98,7 @@ class NativeWindowViews : public NativeWindow, void SetIgnoreMouseEvents(bool ignore) override; void SetContentProtection(bool enable) override; void SetFocusable(bool focusable) override; - void SetMenu(ui::MenuModel* menu_model) override; + void SetMenu(AtomMenuModel* menu_model) override; void SetParentWindow(NativeWindow* parent) override; gfx::NativeWindow GetNativeWindow() override; void SetOverlayIcon(const gfx::Image& overlay, @@ -176,7 +176,7 @@ class NativeWindowViews : public NativeWindow, bool AcceleratorPressed(const ui::Accelerator& accelerator) override; // Register accelerators supported by the menu model. - void RegisterAccelerators(ui::MenuModel* menu_model); + void RegisterAccelerators(AtomMenuModel* menu_model); // Returns the restore state for the window. ui::WindowShowState GetRestoredState(); diff --git a/atom/browser/ui/accelerator_util.cc b/atom/browser/ui/accelerator_util.cc index f683c99c63..361cd88e05 100644 --- a/atom/browser/ui/accelerator_util.cc +++ b/atom/browser/ui/accelerator_util.cc @@ -14,7 +14,6 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" -#include "ui/base/models/simple_menu_model.h" namespace accelerator_util { @@ -69,16 +68,17 @@ bool StringToAccelerator(const std::string& shortcut, return true; } -void GenerateAcceleratorTable(AcceleratorTable* table, ui::MenuModel* model) { +void GenerateAcceleratorTable(AcceleratorTable* table, + atom::AtomMenuModel* model) { int count = model->GetItemCount(); for (int i = 0; i < count; ++i) { - ui::MenuModel::ItemType type = model->GetTypeAt(i); - if (type == ui::MenuModel::TYPE_SUBMENU) { - ui::MenuModel* submodel = model->GetSubmenuModelAt(i); + atom::AtomMenuModel::ItemType type = model->GetTypeAt(i); + if (type == atom::AtomMenuModel::TYPE_SUBMENU) { + auto submodel = model->GetSubmenuModelAt(i); GenerateAcceleratorTable(table, submodel); } else { ui::Accelerator accelerator; - if (model->GetAcceleratorAt(i, &accelerator)) { + if (model->GetAcceleratorAtWithParams(i, true, &accelerator)) { MenuItem item = { i, model }; (*table)[accelerator] = item; } diff --git a/atom/browser/ui/accelerator_util.h b/atom/browser/ui/accelerator_util.h index 584041980b..38f206f537 100644 --- a/atom/browser/ui/accelerator_util.h +++ b/atom/browser/ui/accelerator_util.h @@ -8,15 +8,12 @@ #include #include +#include "atom/browser/ui/atom_menu_model.h" #include "ui/base/accelerators/accelerator.h" -namespace ui { -class MenuModel; -} - namespace accelerator_util { -typedef struct { int position; ui::MenuModel* model; } MenuItem; +typedef struct { int position; atom::AtomMenuModel* model; } MenuItem; typedef std::map AcceleratorTable; // Parse a string as an accelerator. @@ -27,7 +24,8 @@ bool StringToAccelerator(const std::string& description, void SetPlatformAccelerator(ui::Accelerator* accelerator); // Generate a table that contains memu model's accelerators and command ids. -void GenerateAcceleratorTable(AcceleratorTable* table, ui::MenuModel* model); +void GenerateAcceleratorTable(AcceleratorTable* table, + atom::AtomMenuModel* model); // Trigger command from the accelerators table. bool TriggerAcceleratorTableCommand(AcceleratorTable* table, diff --git a/atom/browser/ui/atom_menu_model.cc b/atom/browser/ui/atom_menu_model.cc index ad5384f07b..b6f7526beb 100644 --- a/atom/browser/ui/atom_menu_model.cc +++ b/atom/browser/ui/atom_menu_model.cc @@ -45,4 +45,9 @@ void AtomMenuModel::MenuClosed() { FOR_EACH_OBSERVER(Observer, observers_, MenuClosed()); } +AtomMenuModel* AtomMenuModel::GetSubmenuModelAt(int index) { + return static_cast( + ui::SimpleMenuModel::GetSubmenuModelAt(index)); +} + } // namespace atom diff --git a/atom/browser/ui/atom_menu_model.h b/atom/browser/ui/atom_menu_model.h index 99246d74d6..887f6123bc 100644 --- a/atom/browser/ui/atom_menu_model.h +++ b/atom/browser/ui/atom_menu_model.h @@ -28,7 +28,7 @@ class AtomMenuModel : public ui::SimpleMenuModel { bool GetAcceleratorForCommandId(int command_id, ui::Accelerator* accelerator) { return GetAcceleratorForCommandIdWithParams( - command_id, true, accelerator); + command_id, false, accelerator); } }; @@ -55,6 +55,9 @@ class AtomMenuModel : public ui::SimpleMenuModel { // ui::SimpleMenuModel: void MenuClosed() override; + using SimpleMenuModel::GetSubmenuModelAt; + AtomMenuModel* GetSubmenuModelAt(int index); + private: Delegate* delegate_; // weak ref. diff --git a/atom/browser/ui/tray_icon_gtk.cc b/atom/browser/ui/tray_icon_gtk.cc index 3e53390609..3286a95a7c 100644 --- a/atom/browser/ui/tray_icon_gtk.cc +++ b/atom/browser/ui/tray_icon_gtk.cc @@ -50,7 +50,7 @@ void TrayIconGtk::SetToolTip(const std::string& tool_tip) { icon_->SetToolTip(base::UTF8ToUTF16(tool_tip)); } -void TrayIconGtk::SetContextMenu(ui::SimpleMenuModel* menu_model) { +void TrayIconGtk::SetContextMenu(AtomMenuModel* menu_model) { icon_->UpdatePlatformContextMenu(menu_model); } diff --git a/atom/browser/ui/tray_icon_gtk.h b/atom/browser/ui/tray_icon_gtk.h index cfeb8ab3d0..8cb00363f0 100644 --- a/atom/browser/ui/tray_icon_gtk.h +++ b/atom/browser/ui/tray_icon_gtk.h @@ -25,7 +25,7 @@ class TrayIconGtk : public TrayIcon, // TrayIcon: void SetImage(const gfx::Image& image) override; void SetToolTip(const std::string& tool_tip) override; - void SetContextMenu(ui::SimpleMenuModel* menu_model) override; + void SetContextMenu(AtomMenuModel* menu_model) override; private: // views::StatusIconLinux::Delegate: diff --git a/atom/browser/ui/views/global_menu_bar_x11.cc b/atom/browser/ui/views/global_menu_bar_x11.cc index b393e3f465..266d10b96d 100644 --- a/atom/browser/ui/views/global_menu_bar_x11.cc +++ b/atom/browser/ui/views/global_menu_bar_x11.cc @@ -16,6 +16,7 @@ #include #include "atom/browser/native_window_views.h" +#include "atom/browser/ui/atom_menu_model.h" #include "base/logging.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" @@ -23,7 +24,6 @@ #include "ui/aura/window.h" #include "ui/aura/window_tree_host.h" #include "ui/base/accelerators/menu_label_accelerator_util_linux.h" -#include "ui/base/models/menu_model.h" #include "ui/events/keycodes/keyboard_code_conversion_x.h" // libdbusmenu-glib types @@ -141,8 +141,8 @@ void EnsureMethodsLoaded() { dlsym(dbusmenu_lib, "dbusmenu_server_set_root")); } -ui::MenuModel* ModelForMenuItem(DbusmenuMenuitem* item) { - return reinterpret_cast( +AtomMenuModel* ModelForMenuItem(DbusmenuMenuitem* item) { + return reinterpret_cast( g_object_get_data(G_OBJECT(item), "model")); } @@ -188,7 +188,7 @@ std::string GlobalMenuBarX11::GetPathForWindow(gfx::AcceleratedWidget xid) { return base::StringPrintf("/com/canonical/menu/%lX", xid); } -void GlobalMenuBarX11::SetMenu(ui::MenuModel* menu_model) { +void GlobalMenuBarX11::SetMenu(AtomMenuModel* menu_model) { if (!IsServerStarted()) return; @@ -218,14 +218,14 @@ void GlobalMenuBarX11::OnWindowUnmapped() { GlobalMenuBarRegistrarX11::GetInstance()->OnWindowUnmapped(xid_); } -void GlobalMenuBarX11::BuildMenuFromModel(ui::MenuModel* model, +void GlobalMenuBarX11::BuildMenuFromModel(AtomMenuModel* model, DbusmenuMenuitem* parent) { for (int i = 0; i < model->GetItemCount(); ++i) { DbusmenuMenuitem* item = menuitem_new(); menuitem_property_set_bool(item, kPropertyVisible, model->IsVisibleAt(i)); - ui::MenuModel::ItemType type = model->GetTypeAt(i); - if (type == ui::MenuModel::TYPE_SEPARATOR) { + AtomMenuModel::ItemType type = model->GetTypeAt(i); + if (type == AtomMenuModel::TYPE_SEPARATOR) { menuitem_property_set(item, kPropertyType, kTypeSeparator); } else { std::string label = ui::ConvertAcceleratorsFromWindowsStyle( @@ -236,22 +236,22 @@ void GlobalMenuBarX11::BuildMenuFromModel(ui::MenuModel* model, g_object_set_data(G_OBJECT(item), "model", model); SetMenuItemID(item, i); - if (type == ui::MenuModel::TYPE_SUBMENU) { + if (type == AtomMenuModel::TYPE_SUBMENU) { menuitem_property_set(item, kPropertyChildrenDisplay, kDisplaySubmenu); g_signal_connect(item, "about-to-show", G_CALLBACK(OnSubMenuShowThunk), this); } else { ui::Accelerator accelerator; - if (model->GetAcceleratorAt(i, &accelerator)) + if (model->GetAcceleratorAtWithParams(i, true, &accelerator)) RegisterAccelerator(item, accelerator); g_signal_connect(item, "item-activated", G_CALLBACK(OnItemActivatedThunk), this); - if (type == ui::MenuModel::TYPE_CHECK || - type == ui::MenuModel::TYPE_RADIO) { + if (type == AtomMenuModel::TYPE_CHECK || + type == AtomMenuModel::TYPE_RADIO) { menuitem_property_set(item, kPropertyToggleType, - type == ui::MenuModel::TYPE_CHECK ? kToggleCheck : kToggleRadio); + type == AtomMenuModel::TYPE_CHECK ? kToggleCheck : kToggleRadio); menuitem_property_set_int(item, kPropertyToggleState, model->IsItemCheckedAt(i)); } @@ -296,14 +296,14 @@ void GlobalMenuBarX11::RegisterAccelerator(DbusmenuMenuitem* item, void GlobalMenuBarX11::OnItemActivated(DbusmenuMenuitem* item, unsigned int timestamp) { int id; - ui::MenuModel* model = ModelForMenuItem(item); + AtomMenuModel* model = ModelForMenuItem(item); if (model && GetMenuItemID(item, &id)) model->ActivatedAt(id, 0); } void GlobalMenuBarX11::OnSubMenuShow(DbusmenuMenuitem* item) { int id; - ui::MenuModel* model = ModelForMenuItem(item); + AtomMenuModel* model = ModelForMenuItem(item); if (!model || !GetMenuItemID(item, &id)) return; diff --git a/atom/browser/ui/views/global_menu_bar_x11.h b/atom/browser/ui/views/global_menu_bar_x11.h index 89b2680cab..9bb4dd3385 100644 --- a/atom/browser/ui/views/global_menu_bar_x11.h +++ b/atom/browser/ui/views/global_menu_bar_x11.h @@ -7,6 +7,7 @@ #include +#include "atom/browser/ui/atom_menu_model.h" #include "base/macros.h" #include "base/compiler_specific.h" #include "ui/base/glib/glib_signal.h" @@ -17,7 +18,6 @@ typedef struct _DbusmenuServer DbusmenuServer; namespace ui { class Accelerator; -class MenuModel; } namespace atom { @@ -43,7 +43,7 @@ class GlobalMenuBarX11 { // Creates the object path for DbusmenuServer which is attached to |xid|. static std::string GetPathForWindow(gfx::AcceleratedWidget xid); - void SetMenu(ui::MenuModel* menu_model); + void SetMenu(AtomMenuModel* menu_model); bool IsServerStarted() const; // Called by NativeWindow when it show/hides. @@ -55,7 +55,7 @@ class GlobalMenuBarX11 { void InitServer(gfx::AcceleratedWidget xid); // Create a menu from menu model. - void BuildMenuFromModel(ui::MenuModel* model, DbusmenuMenuitem* parent); + void BuildMenuFromModel(AtomMenuModel* model, DbusmenuMenuitem* parent); // Sets the accelerator for |item|. void RegisterAccelerator(DbusmenuMenuitem* item, diff --git a/atom/browser/ui/views/menu_bar.cc b/atom/browser/ui/views/menu_bar.cc index 0538421bfe..cb7af509cc 100644 --- a/atom/browser/ui/views/menu_bar.cc +++ b/atom/browser/ui/views/menu_bar.cc @@ -58,7 +58,7 @@ MenuBar::MenuBar() MenuBar::~MenuBar() { } -void MenuBar::SetMenu(ui::MenuModel* model) { +void MenuBar::SetMenu(AtomMenuModel* model) { menu_model_ = model; RemoveAllChildViews(true); @@ -105,7 +105,7 @@ int MenuBar::GetItemCount() const { } bool MenuBar::GetMenuButtonFromScreenPoint(const gfx::Point& point, - ui::MenuModel** menu_model, + AtomMenuModel** menu_model, views::MenuButton** button) { gfx::Point location(point); views::View::ConvertPointFromScreen(this, &location); @@ -117,7 +117,7 @@ bool MenuBar::GetMenuButtonFromScreenPoint(const gfx::Point& point, for (int i = 0; i < child_count(); ++i) { views::View* view = child_at(i); if (view->bounds().Contains(location) && - (menu_model_->GetTypeAt(i) == ui::MenuModel::TYPE_SUBMENU)) { + (menu_model_->GetTypeAt(i) == AtomMenuModel::TYPE_SUBMENU)) { *menu_model = menu_model_->GetSubmenuModelAt(i); *button = static_cast(view); return true; @@ -144,8 +144,8 @@ void MenuBar::OnMenuButtonClicked(views::MenuButton* source, return; int id = source->tag(); - ui::MenuModel::ItemType type = menu_model_->GetTypeAt(id); - if (type != ui::MenuModel::TYPE_SUBMENU) { + AtomMenuModel::ItemType type = menu_model_->GetTypeAt(id); + if (type != AtomMenuModel::TYPE_SUBMENU) { menu_model_->ActivatedAt(id, 0); return; } diff --git a/atom/browser/ui/views/menu_bar.h b/atom/browser/ui/views/menu_bar.h index eb62784e71..5b86e292c8 100644 --- a/atom/browser/ui/views/menu_bar.h +++ b/atom/browser/ui/views/menu_bar.h @@ -5,14 +5,11 @@ #ifndef ATOM_BROWSER_UI_VIEWS_MENU_BAR_H_ #define ATOM_BROWSER_UI_VIEWS_MENU_BAR_H_ +#include "atom/browser/ui/atom_menu_model.h" #include "ui/views/controls/button/button.h" #include "ui/views/controls/button/menu_button_listener.h" #include "ui/views/view.h" -namespace ui { -class MenuModel; -} - namespace views { class MenuButton; } @@ -29,7 +26,7 @@ class MenuBar : public views::View, virtual ~MenuBar(); // Replaces current menu with a new one. - void SetMenu(ui::MenuModel* menu_model); + void SetMenu(AtomMenuModel* menu_model); // Shows underline under accelerators. void SetAcceleratorVisibility(bool visible); @@ -46,7 +43,7 @@ class MenuBar : public views::View, // Get the menu under specified screen point. bool GetMenuButtonFromScreenPoint(const gfx::Point& point, - ui::MenuModel** menu_model, + AtomMenuModel** menu_model, views::MenuButton** button); protected: @@ -74,7 +71,7 @@ class MenuBar : public views::View, SkColor hover_color_; #endif - ui::MenuModel* menu_model_; + AtomMenuModel* menu_model_; DISALLOW_COPY_AND_ASSIGN(MenuBar); }; diff --git a/atom/browser/ui/views/menu_delegate.cc b/atom/browser/ui/views/menu_delegate.cc index a107a69625..8cb7e020f7 100644 --- a/atom/browser/ui/views/menu_delegate.cc +++ b/atom/browser/ui/views/menu_delegate.cc @@ -5,10 +5,10 @@ #include "atom/browser/ui/views/menu_delegate.h" #include "atom/browser/ui/views/menu_bar.h" +#include "atom/browser/ui/views/menu_model_adapter.h" #include "content/public/browser/browser_thread.h" #include "ui/views/controls/button/menu_button.h" #include "ui/views/controls/menu/menu_item_view.h" -#include "ui/views/controls/menu/menu_model_adapter.h" #include "ui/views/controls/menu/menu_runner.h" #include "ui/views/widget/widget.h" @@ -22,7 +22,7 @@ MenuDelegate::MenuDelegate(MenuBar* menu_bar) MenuDelegate::~MenuDelegate() { } -void MenuDelegate::RunMenu(ui::MenuModel* model, views::MenuButton* button) { +void MenuDelegate::RunMenu(AtomMenuModel* model, views::MenuButton* button) { gfx::Point screen_loc; views::View::ConvertPointToScreen(button, &screen_loc); // Subtract 1 from the height to make the popup flush with the button border. @@ -30,10 +30,10 @@ void MenuDelegate::RunMenu(ui::MenuModel* model, views::MenuButton* button) { button->height() - 1); id_ = button->tag(); - adapter_.reset(new views::MenuModelAdapter(model)); + adapter_.reset(new atom::MenuModelAdapter(model)); views::MenuItemView* item = new views::MenuItemView(this); - static_cast(adapter_.get())->BuildMenu(item); + static_cast(adapter_.get())->BuildMenu(item); menu_runner_.reset(new views::MenuRunner( item, @@ -102,7 +102,7 @@ views::MenuItemView* MenuDelegate::GetSiblingMenu( bool* has_mnemonics, views::MenuButton**) { views::MenuButton* button; - ui::MenuModel* model; + AtomMenuModel* model; if (menu_bar_->GetMenuButtonFromScreenPoint(screen_point, &model, &button) && button->tag() != id_) { DCHECK(menu_runner_->IsRunning()); diff --git a/atom/browser/ui/views/menu_delegate.h b/atom/browser/ui/views/menu_delegate.h index ad7093b48f..c28bb3bf50 100644 --- a/atom/browser/ui/views/menu_delegate.h +++ b/atom/browser/ui/views/menu_delegate.h @@ -5,6 +5,7 @@ #ifndef ATOM_BROWSER_UI_VIEWS_MENU_DELEGATE_H_ #define ATOM_BROWSER_UI_VIEWS_MENU_DELEGATE_H_ +#include "atom/browser/ui/atom_menu_model.h" #include "base/memory/scoped_ptr.h" #include "ui/views/controls/menu/menu_delegate.h" @@ -12,10 +13,6 @@ namespace views { class MenuRunner; } -namespace ui { -class MenuModel; -} - namespace atom { class MenuBar; @@ -25,7 +22,7 @@ class MenuDelegate : public views::MenuDelegate { explicit MenuDelegate(MenuBar* menu_bar); virtual ~MenuDelegate(); - void RunMenu(ui::MenuModel* model, views::MenuButton* button); + void RunMenu(AtomMenuModel* model, views::MenuButton* button); protected: // views::MenuDelegate: diff --git a/atom/browser/ui/views/menu_model_adapter.cc b/atom/browser/ui/views/menu_model_adapter.cc new file mode 100644 index 0000000000..303cdb9bab --- /dev/null +++ b/atom/browser/ui/views/menu_model_adapter.cc @@ -0,0 +1,28 @@ +// Copyright (c) 2016 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#include "atom/browser/ui/views/menu_model_adapter.h" + +namespace atom { + +MenuModelAdapter::MenuModelAdapter(AtomMenuModel* menu_model) + : views::MenuModelAdapter(menu_model), + menu_model_(menu_model) { +} + +MenuModelAdapter::~MenuModelAdapter() { +} + +bool MenuModelAdapter::GetAccelerator(int id, + ui::Accelerator* accelerator) const { + ui::MenuModel* model = menu_model_; + int index = 0; + if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index)) { + return static_cast(model)-> + GetAcceleratorAtWithParams(index, true, accelerator); + } + return false; +} + +} // namespace atom diff --git a/atom/browser/ui/views/menu_model_adapter.h b/atom/browser/ui/views/menu_model_adapter.h new file mode 100644 index 0000000000..4b87bc32fd --- /dev/null +++ b/atom/browser/ui/views/menu_model_adapter.h @@ -0,0 +1,29 @@ +// Copyright (c) 2016 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#ifndef ATOM_BROWSER_UI_VIEWS_MENU_MODEL_ADAPTER_H_ +#define ATOM_BROWSER_UI_VIEWS_MENU_MODEL_ADAPTER_H_ + +#include "atom/browser/ui/atom_menu_model.h" +#include "ui/views/controls/menu/menu_model_adapter.h" + +namespace atom { + +class MenuModelAdapter : public views::MenuModelAdapter { + public: + explicit MenuModelAdapter(AtomMenuModel* menu_model); + virtual ~MenuModelAdapter(); + + protected: + bool GetAccelerator(int id, ui::Accelerator* accelerator) const override; + + private: + AtomMenuModel* menu_model_; + + DISALLOW_COPY_AND_ASSIGN(MenuModelAdapter); +}; + +} // namespace atom + +#endif // ATOM_BROWSER_UI_VIEWS_MENU_MODEL_ADAPTER_H_ diff --git a/atom/browser/ui/win/notify_icon.cc b/atom/browser/ui/win/notify_icon.cc index a82ac36c7a..a009631622 100644 --- a/atom/browser/ui/win/notify_icon.cc +++ b/atom/browser/ui/win/notify_icon.cc @@ -132,7 +132,7 @@ void NotifyIcon::DisplayBalloon(HICON icon, } void NotifyIcon::PopUpContextMenu(const gfx::Point& pos, - ui::SimpleMenuModel* menu_model) { + AtomMenuModel* menu_model) { // Returns if context menu isn't set. if (menu_model == nullptr && menu_model_ == nullptr) return; @@ -154,7 +154,7 @@ void NotifyIcon::PopUpContextMenu(const gfx::Point& pos, NULL, NULL, rect, views::MENU_ANCHOR_TOPLEFT, ui::MENU_SOURCE_MOUSE)); } -void NotifyIcon::SetContextMenu(ui::SimpleMenuModel* menu_model) { +void NotifyIcon::SetContextMenu(AtomMenuModel* menu_model) { menu_model_ = menu_model; } diff --git a/atom/browser/ui/win/notify_icon.h b/atom/browser/ui/win/notify_icon.h index 1284ebadcf..32d969e2be 100644 --- a/atom/browser/ui/win/notify_icon.h +++ b/atom/browser/ui/win/notify_icon.h @@ -52,8 +52,8 @@ class NotifyIcon : public TrayIcon { const base::string16& title, const base::string16& contents) override; void PopUpContextMenu(const gfx::Point& pos, - ui::SimpleMenuModel* menu_model) override; - void SetContextMenu(ui::SimpleMenuModel* menu_model) override; + AtomMenuModel* menu_model) override; + void SetContextMenu(AtomMenuModel* menu_model) override; gfx::Rect GetBounds() override; private: @@ -75,7 +75,7 @@ class NotifyIcon : public TrayIcon { base::win::ScopedHICON icon_; // The context menu. - ui::SimpleMenuModel* menu_model_; + AtomMenuModel* menu_model_; DISALLOW_COPY_AND_ASSIGN(NotifyIcon); }; diff --git a/filenames.gypi b/filenames.gypi index 942fcf64ba..c132712203 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -275,6 +275,8 @@ 'atom/browser/ui/views/menu_delegate.h', 'atom/browser/ui/views/menu_layout.cc', 'atom/browser/ui/views/menu_layout.h', + 'atom/browser/ui/views/menu_model_adapter.cc', + 'atom/browser/ui/views/menu_model_adapter.h', 'atom/browser/ui/views/native_frame_view.cc', 'atom/browser/ui/views/native_frame_view.h', 'atom/browser/ui/views/submenu_button.cc', From 791cbc929a232d3deb2bbd25a16df2e7149b8d06 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Jul 2016 11:55:59 -0700 Subject: [PATCH 241/516] Update spec to request defualt accelerator from item --- spec/api-menu-spec.js | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/spec/api-menu-spec.js b/spec/api-menu-spec.js index a725d9fd69..b5c707bfb3 100644 --- a/spec/api-menu-spec.js +++ b/spec/api-menu-spec.js @@ -400,27 +400,23 @@ describe('menu module', function () { it('includes a default label and accelerator', function () { var item = new MenuItem({role: 'close'}) assert.equal(item.label, 'Close') - assert.equal(item.accelerator, 'CommandOrControl+W') + assert.equal(item.accelerator, undefined) + assert.equal(item.getDefaultRoleAccelerator(), 'CommandOrControl+W') - item = new MenuItem({role: 'close', label: 'Other'}) + item = new MenuItem({role: 'close', label: 'Other', accelerator: 'D'}) assert.equal(item.label, 'Other') - assert.equal(item.accelerator, 'CommandOrControl+W') - - item = new MenuItem({role: 'close', accelerator: 'D'}) - assert.equal(item.label, 'Close') - assert.equal(item.accelerator, 'D') - - item = new MenuItem({role: 'close', label: 'C', accelerator: 'D'}) - assert.equal(item.label, 'C') assert.equal(item.accelerator, 'D') + assert.equal(item.getDefaultRoleAccelerator(), 'CommandOrControl+W') item = new MenuItem({role: 'help'}) assert.equal(item.label, 'Help') assert.equal(item.accelerator, undefined) + assert.equal(item.getDefaultRoleAccelerator(), undefined) item = new MenuItem({role: 'hide'}) assert.equal(item.label, 'Hide Electron Test') - assert.equal(item.accelerator, 'Command+H') + assert.equal(item.accelerator, undefined) + assert.equal(item.getDefaultRoleAccelerator(), 'Command+H') }) }) }) From 10a24549219c4fc70a2f8f03c293911695928f75 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Jul 2016 14:25:09 -0700 Subject: [PATCH 242/516] Remove unneeded atom:: prefix --- atom/browser/ui/views/menu_delegate.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/atom/browser/ui/views/menu_delegate.cc b/atom/browser/ui/views/menu_delegate.cc index 8cb7e020f7..3a1a151b72 100644 --- a/atom/browser/ui/views/menu_delegate.cc +++ b/atom/browser/ui/views/menu_delegate.cc @@ -30,10 +30,10 @@ void MenuDelegate::RunMenu(AtomMenuModel* model, views::MenuButton* button) { button->height() - 1); id_ = button->tag(); - adapter_.reset(new atom::MenuModelAdapter(model)); + adapter_.reset(new MenuModelAdapter(model)); views::MenuItemView* item = new views::MenuItemView(this); - static_cast(adapter_.get())->BuildMenu(item); + static_cast(adapter_.get())->BuildMenu(item); menu_runner_.reset(new views::MenuRunner( item, From cb943cec77cab5c0e8a36c0d5993334a1605020b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Jul 2016 14:28:01 -0700 Subject: [PATCH 243/516] :art: --- atom/browser/ui/atom_menu_model.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atom/browser/ui/atom_menu_model.cc b/atom/browser/ui/atom_menu_model.cc index b6f7526beb..de3465e8ab 100644 --- a/atom/browser/ui/atom_menu_model.cc +++ b/atom/browser/ui/atom_menu_model.cc @@ -47,7 +47,7 @@ void AtomMenuModel::MenuClosed() { AtomMenuModel* AtomMenuModel::GetSubmenuModelAt(int index) { return static_cast( - ui::SimpleMenuModel::GetSubmenuModelAt(index)); + ui::SimpleMenuModel::GetSubmenuModelAt(index)); } } // namespace atom From e4906f2d8729836f1be3e4e07c878d71fffb05bc Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Jul 2016 14:29:43 -0700 Subject: [PATCH 244/516] Add back getCurrentActivityType --- atom/browser/api/atom_api_app.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index 4eb026549a..f8a7077a12 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -527,6 +527,8 @@ void App::BuildPrototype( .SetMethod("show", base::Bind(&Browser::Show, browser)) .SetMethod("setUserActivity", base::Bind(&Browser::SetUserActivity, browser)) + .SetMethod("getCurrentActivityType", + base::Bind(&Browser::GetCurrentActivityType, browser)) .SetMethod("getLoginItemStatus", base::Bind(&Browser::GetLoginItemStatus, browser)) .SetMethod("setAsLoginItem", From c1003007641bb5cb2438e47a5da5ef71f5b47357 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Jul 2016 16:29:09 -0700 Subject: [PATCH 245/516] Update API to get/setLoginItemSettings --- atom/browser/api/atom_api_app.cc | 37 ++++++++++++++++++++++++----- atom/browser/browser.h | 19 +++++++++------ atom/browser/browser_mac.mm | 33 +++++++++++--------------- spec/api-app-spec.js | 40 ++++++++++++++++++++++---------- 4 files changed, 85 insertions(+), 44 deletions(-) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index f8a7077a12..b0a842d4ca 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -71,6 +71,33 @@ struct Converter { }; #endif +#if defined(OS_MACOSX) +template<> +struct Converter { + static bool FromV8(v8::Isolate* isolate, v8::Local val, + Browser::LoginItemSettings* out) { + mate::Dictionary dict; + if (!ConvertFromV8(isolate, val, &dict)) + return false; + + dict.Get("openAtLogin", &(out->open_at_login)); + dict.Get("openAsHidden", &(out->open_as_hidden)); + return true; + } + + static v8::Local ToV8(v8::Isolate* isolate, + Browser::LoginItemSettings val) { + mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate); + dict.Set("openAtLogin", val.open_at_login); + dict.Set("openAsHidden", val.open_as_hidden); + dict.Set("restoreState", val.restore_state); + dict.Set("openedAtLogin", val.opened_at_login); + dict.Set("openedAsHidden", val.opened_as_hidden); + return dict.GetHandle(); + } +}; +#endif + } // namespace mate @@ -529,12 +556,10 @@ void App::BuildPrototype( base::Bind(&Browser::SetUserActivity, browser)) .SetMethod("getCurrentActivityType", base::Bind(&Browser::GetCurrentActivityType, browser)) - .SetMethod("getLoginItemStatus", - base::Bind(&Browser::GetLoginItemStatus, browser)) - .SetMethod("setAsLoginItem", - base::Bind(&Browser::SetAsLoginItem, browser)) - .SetMethod("removeAsLoginItem", - base::Bind(&Browser::RemoveAsLoginItem, browser)) + .SetMethod("getLoginItemSettings", + base::Bind(&Browser::GetLoginItemSettings, browser)) + .SetMethod("setLoginItemSettings", + base::Bind(&Browser::SetLoginItemSettings, browser)) #endif #if defined(OS_WIN) .SetMethod("setUserTasks", base::Bind(&Browser::SetUserTasks, browser)) diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 6aeb6ed092..be51d7ec00 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -92,6 +92,14 @@ class Browser : public WindowListObserver { int GetBadgeCount(); #if defined(OS_MACOSX) + struct LoginItemSettings { + bool open_at_login = false; + bool open_as_hidden = false; + bool restore_state = false; + bool opened_at_login = false; + bool opened_as_hidden = false; + }; + // Hide the application. void Hide(); @@ -135,14 +143,11 @@ class Browser : public WindowListObserver { // Set docks' icon. void DockSetIcon(const gfx::Image& image); - // Get login item status of app - v8::Local GetLoginItemStatus(mate::Arguments* args); + // Get login item settings of app + LoginItemSettings GetLoginItemSettings(); - // Set app as a login item - void SetAsLoginItem(mate::Arguments* args); - - // Remove app as a login item - void RemoveAsLoginItem(); + // Set login item settings of app + void SetLoginItemSettings(LoginItemSettings settings); #endif // defined(OS_MACOSX) #if defined(OS_WIN) diff --git a/atom/browser/browser_mac.mm b/atom/browser/browser_mac.mm index 6207a221e6..4dfa3aa963 100644 --- a/atom/browser/browser_mac.mm +++ b/atom/browser/browser_mac.mm @@ -15,7 +15,6 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/sys_string_conversions.h" #include "brightray/common/application_info.h" -#include "native_mate/dictionary.h" #include "net/base/mac/url_conversions.h" #include "url/gurl.h" @@ -150,26 +149,22 @@ bool Browser::ContinueUserActivity(const std::string& type, return prevent_default; } -v8::Local Browser::GetLoginItemStatus(mate::Arguments* args) { - bool hidden = false; - mate::Dictionary dict = mate::Dictionary::CreateEmpty(args->isolate()); - dict.Set("openAtLogin", base::mac::CheckLoginItemStatus(&hidden)); - dict.Set("openAsHidden", hidden); - dict.Set("restoreState", base::mac::WasLaunchedAsLoginItemRestoreState()); - dict.Set("openedAtLogin", base::mac::WasLaunchedAsLoginOrResumeItem()); - dict.Set("openedAsHidden", base::mac::WasLaunchedAsHiddenLoginItem()); - - return dict.GetHandle(); +Browser::LoginItemSettings Browser::GetLoginItemSettings() { + LoginItemSettings settings; + settings.open_at_login = base::mac::CheckLoginItemStatus( + &settings.open_as_hidden); + settings.restore_state = base::mac::WasLaunchedAsLoginItemRestoreState(); + settings.opened_at_login = base::mac::WasLaunchedAsLoginOrResumeItem(); + settings.opened_as_hidden = base::mac::WasLaunchedAsHiddenLoginItem(); + return settings; } -void Browser::SetAsLoginItem(mate::Arguments* args) { - bool hidden = false; - args->GetNext(&hidden); - base::mac::AddToLoginItems(hidden); -} - -void Browser::RemoveAsLoginItem() { - base::mac::RemoveFromLoginItems(); +void Browser::SetLoginItemSettings(LoginItemSettings settings) { + if (settings.open_at_login) { + base::mac::AddToLoginItems(settings.open_as_hidden); + } else { + base::mac::RemoveFromLoginItems(); + } } std::string Browser::GetExecutableFileVersion() const { diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index af6a7c7e68..de58235855 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -299,28 +299,44 @@ describe('app module', function () { }) }) - describe('app.getLoginItemStatus API', function () { + describe('app.get/setLoginItemSettings API', function () { if (process.platform !== 'darwin') return beforeEach(function () { - assert.equal(app.getLoginItemStatus().openedAtLogin, false) - assert.equal(app.getLoginItemStatus().openedAsHidden, false) - assert.equal(app.getLoginItemStatus().restoreState, false) + app.setLoginItemSettings({openAtLogin: false}) }) afterEach(function () { - app.removeAsLoginItem() - assert.equal(app.getLoginItemStatus().openAtLogin, false) + app.setLoginItemSettings({openAtLogin: false}) }) it('returns the login item status of the app', function () { - app.setAsLoginItem(true) - assert.equal(app.getLoginItemStatus().openAtLogin, true) - assert.equal(app.getLoginItemStatus().openAsHidden, true) + app.setLoginItemSettings({openAtLogin: true}) + assert.deepEqual(app.getLoginItemSettings(), { + openAtLogin: true, + openAsHidden: false, + openedAtLogin: false, + openedAsHidden: false, + restoreState: false + }) - app.setAsLoginItem(false) - assert.equal(app.getLoginItemStatus().openAtLogin, true) - assert.equal(app.getLoginItemStatus().openAsHidden, false) + app.setLoginItemSettings({openAtLogin: true, openAsHidden: true}) + assert.deepEqual(app.getLoginItemSettings(), { + openAtLogin: true, + openAsHidden: true, + openedAtLogin: false, + openedAsHidden: false, + restoreState: false + }) + + app.setLoginItemSettings({}) + assert.deepEqual(app.getLoginItemSettings(), { + openAtLogin: false, + openAsHidden: false, + openedAtLogin: false, + openedAsHidden: false, + restoreState: false + }) }) }) }) From 2633c2f735780bd9423328c4462600211c218af3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Jul 2016 16:29:58 -0700 Subject: [PATCH 246/516] Add was prefix to current launch settings --- atom/browser/api/atom_api_app.cc | 4 ++-- spec/api-app-spec.js | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index b0a842d4ca..9d799f1150 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -91,8 +91,8 @@ struct Converter { dict.Set("openAtLogin", val.open_at_login); dict.Set("openAsHidden", val.open_as_hidden); dict.Set("restoreState", val.restore_state); - dict.Set("openedAtLogin", val.opened_at_login); - dict.Set("openedAsHidden", val.opened_as_hidden); + dict.Set("wasOpenedAtLogin", val.opened_at_login); + dict.Set("wasOpenedAsHidden", val.opened_as_hidden); return dict.GetHandle(); } }; diff --git a/spec/api-app-spec.js b/spec/api-app-spec.js index de58235855..8ceb44f19d 100644 --- a/spec/api-app-spec.js +++ b/spec/api-app-spec.js @@ -315,8 +315,8 @@ describe('app module', function () { assert.deepEqual(app.getLoginItemSettings(), { openAtLogin: true, openAsHidden: false, - openedAtLogin: false, - openedAsHidden: false, + wasOpenedAtLogin: false, + wasOpenedAsHidden: false, restoreState: false }) @@ -324,8 +324,8 @@ describe('app module', function () { assert.deepEqual(app.getLoginItemSettings(), { openAtLogin: true, openAsHidden: true, - openedAtLogin: false, - openedAsHidden: false, + wasOpenedAtLogin: false, + wasOpenedAsHidden: false, restoreState: false }) @@ -333,8 +333,8 @@ describe('app module', function () { assert.deepEqual(app.getLoginItemSettings(), { openAtLogin: false, openAsHidden: false, - openedAtLogin: false, - openedAsHidden: false, + wasOpenedAtLogin: false, + wasOpenedAsHidden: false, restoreState: false }) }) From 10bb8df09a203fdf8ab54f662df6a3a3b1182119 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Jul 2016 16:33:26 -0700 Subject: [PATCH 247/516] Update login item API docs --- docs/api/app.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/docs/api/app.md b/docs/api/app.md index 7816f7fe98..e0b13ef5c7 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -598,29 +598,32 @@ Returns the current value displayed in the counter badge. Returns whether current desktop environment is Unity launcher. -### `app.getLoginItemStatus()` _macOS_ +### `app.getLoginItemSettings()` _macOS_ Return an Object with the login item status of the app. * `openAtLogin` Boolean - `true` if the app is set to open at login. * `openAsHidden` Boolean - `true` if the app is set to open as hidden at login. -* `openedAtLogin` Boolean - `true` if the app was opened at login automatically. -* `openedAsHidden` Boolean - `true` if the app was opened as a hidden login +* `wasOpenedAtLogin` Boolean - `true` if the app was opened at login + automatically. +* `wasOpenedAsHidden` Boolean - `true` if the app was opened as a hidden login item. This indicates that the app should not open any windows at startup. * `restoreState` Boolean - `true` if the app was opened as a login item that should restore the state from the previous session. This indicates that the app should restore the windows that were open the last time the app was closed. -### `app.setAsLoginItem([openAsHidden])` _macOS_ +### `app.setLoginItemSettings(settings)` _macOS_ -Set the app as a login item. This will cause the app to be opened automatically -at login. +* `settings` Object + * `openAtLogin` Boolean - `true` to open the app at login, `false` to remove + the app as a login item. Defaults to `false`. + * `openAsHidden` Boolean - `true` to open the app as hidden. Defaults to + `false`. The user can edit this setting from the System Preferences so + `app.getLoginItemStatus().wasOpenedAsHidden` should be checked when the app + is opened to know the current value. -* `openAsHidden` Boolean - `true` to open the app as hidden. Defaults to - `false`. The user can edit this setting from the System Preferences so - `app.getLoginItemStatus().openedAsHidden` should be checked when the app - is opened to know the current value. +Set the app's as a login item settings. ### `app.removeAsLoginItem()` _macOS_ From 7326d3d3d537dcb1d3d80e7228d8d62d82fc58b6 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Jul 2016 16:38:12 -0700 Subject: [PATCH 248/516] :art: --- atom/browser/browser_mac.mm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/atom/browser/browser_mac.mm b/atom/browser/browser_mac.mm index 4dfa3aa963..4328dcba48 100644 --- a/atom/browser/browser_mac.mm +++ b/atom/browser/browser_mac.mm @@ -160,11 +160,10 @@ Browser::LoginItemSettings Browser::GetLoginItemSettings() { } void Browser::SetLoginItemSettings(LoginItemSettings settings) { - if (settings.open_at_login) { + if (settings.open_at_login) base::mac::AddToLoginItems(settings.open_as_hidden); - } else { + else base::mac::RemoveFromLoginItems(); - } } std::string Browser::GetExecutableFileVersion() const { From cde594775d12c422921fced43948b067014e5add Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 Jul 2016 16:40:53 -0700 Subject: [PATCH 249/516] Remove API that is no longer available --- docs/api/app.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/docs/api/app.md b/docs/api/app.md index e0b13ef5c7..c7e0998b6c 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -600,7 +600,7 @@ Returns whether current desktop environment is Unity launcher. ### `app.getLoginItemSettings()` _macOS_ -Return an Object with the login item status of the app. +Return an Object with the login item settings of the app. * `openAtLogin` Boolean - `true` if the app is set to open at login. * `openAsHidden` Boolean - `true` if the app is set to open as hidden at login. @@ -623,12 +623,7 @@ Return an Object with the login item status of the app. `app.getLoginItemStatus().wasOpenedAsHidden` should be checked when the app is opened to know the current value. -Set the app's as a login item settings. - -### `app.removeAsLoginItem()` _macOS_ - -Removes the app as a login item. The app will no longer be opened automatically -at login. +Set the app's login item settings. ### `app.commandLine.appendSwitch(switch[, value])` From ae8b78aff80e76ec38050ee1b3f15fbc01335912 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Thu, 7 Jul 2016 17:33:06 -0700 Subject: [PATCH 250/516] New title and one-liner --- docs/api/app-locales.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/api/app-locales.md b/docs/api/app-locales.md index 52efba6282..60c174fb84 100644 --- a/docs/api/app-locales.md +++ b/docs/api/app-locales.md @@ -1,4 +1,6 @@ -# Possible Values of `app.getLocale()` +# Locales + +> The values for locale returned by `app.getLocale()`. Electron uses Chromium's `l10n_util` library to fetch the locale. Possible values are listed below: From 9c5d36f0c633de27d8559ecaa7c057ffa7eea477 Mon Sep 17 00:00:00 2001 From: vsemozhetbyt Date: Fri, 8 Jul 2016 03:33:22 +0300 Subject: [PATCH 251/516] One alphabetical reordering in the docs/README.md :memo: webContents, Tray -> Tray, webContents If I get it right, only API TOCs should be ordered alphabetically, so I've left other ones (Guides, Tutorials, Development) untouched. I'm not so sure about API TOC Intro (three links below the "Synopsis"), tell me if they should be sorted alphabetically too. [ci skip] --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 072e97cfc3..364c9506a4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -66,8 +66,8 @@ an issue: * [protocol](api/protocol.md) * [session](api/session.md) * [systemPreferences](api/system-preferences.md) -* [webContents](api/web-contents.md) * [Tray](api/tray.md) +* [webContents](api/web-contents.md) ### Modules for the Renderer Process (Web Page): From ea64db9e5c0d3ea7415bf7e20932f7dbdf0c91d1 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Thu, 7 Jul 2016 17:45:35 -0700 Subject: [PATCH 252/516] More concise wording --- docs/api/app-locales.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/app-locales.md b/docs/api/app-locales.md index 60c174fb84..16fb7b7100 100644 --- a/docs/api/app-locales.md +++ b/docs/api/app-locales.md @@ -1,6 +1,6 @@ # Locales -> The values for locale returned by `app.getLocale()`. +> Locale values returned by `app.getLocale()`. Electron uses Chromium's `l10n_util` library to fetch the locale. Possible values are listed below: From ba9baec27f7935ea7da24b16b60b0e099e0aae4e Mon Sep 17 00:00:00 2001 From: vsemozhetbyt Date: Fri, 8 Jul 2016 04:00:22 +0300 Subject: [PATCH 253/516] Fix typos in the remote.md :memo: Fixes #6387 [ci skip] --- docs/api/remote.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api/remote.md b/docs/api/remote.md index e3ed3ebb4b..aa1b8082bb 100644 --- a/docs/api/remote.md +++ b/docs/api/remote.md @@ -74,7 +74,7 @@ exports.withRendererCallback = (mapper) => { }; exports.withLocalCallback = () => { - return exports.mapNumbers(x => x + 1); + return [1,2,3].map(x => x + 1); }; ``` @@ -86,7 +86,7 @@ const withRendererCb = mapNumbers.withRendererCallback(x => x + 1); const withLocalCb = mapNumbers.withLocalCallback(); -console.log(withRendererCb, withLocalCb); // [true, true, true], [2, 3, 4] +console.log(withRendererCb, withLocalCb); // [undefined, undefined, undefined], [2, 3, 4] ``` As you can see, the renderer callback's synchronous return value was not as From 5fd77cbf2e25ff4af07d47c1a3de946f4c8456e6 Mon Sep 17 00:00:00 2001 From: devjin0617 Date: Sat, 9 Jul 2016 01:22:35 +0900 Subject: [PATCH 254/516] Update README-ko.md Add meetup community link of turkish --- README-ko.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README-ko.md b/README-ko.md index c3c0216c2a..79cc716587 100644 --- a/README-ko.md +++ b/README-ko.md @@ -75,6 +75,7 @@ npm install electron-prebuilt --save-dev - [`electron-br`](https://electron-br.slack.com) *(브라질)* 커뮤니티 - [`electron-kr`](http://www.meetup.com/electron-kr/) *(한국)* 커뮤니티 - [`electron-jp`](https://electron-jp-slackin.herokuapp.com/) *(일본)* 커뮤니티 +- [`electron-tr`](http://www.meetup.com/Electron-JS-Istanbul/) *(터키)* 커뮤니티 [awesome-electron](https://github.com/sindresorhus/awesome-electron) 프로젝트에 커뮤니티가 운영중인 유용한 예시 애플리케이션과 도구, 리소스가 있으니 참고하기 바랍니다. From e25001e2773814facad9a6fabd45d5c818dc4965 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Fri, 8 Jul 2016 09:43:48 -0700 Subject: [PATCH 255/516] Rename file --- docs/api/{app-locales.md => locales.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/api/{app-locales.md => locales.md} (100%) diff --git a/docs/api/app-locales.md b/docs/api/locales.md similarity index 100% rename from docs/api/app-locales.md rename to docs/api/locales.md From a4754212dcbc2c6c2060e7b637e2f54a6284558a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 8 Jul 2016 11:26:22 -0700 Subject: [PATCH 256/516] Add lang attribute to html element --- default_app/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default_app/index.html b/default_app/index.html index edfb3e6ddc..0907e6cde6 100644 --- a/default_app/index.html +++ b/default_app/index.html @@ -1,4 +1,4 @@ - + Electron