From 1ad979f9bda5b7f1e7977ddf35319d58221b1fb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ionic=C4=83=20Biz=C4=83u?= Date: Tue, 20 Oct 2015 19:44:01 +0300 Subject: [PATCH 1/7] Add some missing words ("be" and "the") --- docs/api/app.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/api/app.md b/docs/api/app.md index bd49919ce79b..d59e0e40d053 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -169,7 +169,7 @@ The `app` object has the following methods: ### `app.quit()` -Try to close all windows. The `before-quit` event will emitted first. If all +Try to close all windows. The `before-quit` event will be emitted first. If all windows are successfully closed, the `will-quit` event will be emitted and by default the application will terminate. @@ -213,7 +213,7 @@ created by this method. On failure an `Error` is thrown. You can only override paths of a `name` defined in `app.getPath`. -By default, web pages's cookies and caches will be stored under the `userData` +By default, web pages' cookies and caches will be stored under the `userData` directory. If you want to change this location, you have to override the `userData` path before the `ready` event of the `app` module is emitted. @@ -264,7 +264,7 @@ Clears the recent documents list. Adds `tasks` to the [Tasks][tasks] category of the JumpList on Windows. -`tasks` is an array of `Task` objects in following format: +`tasks` is an array of `Task` objects in the following format: `Task` Object * `program` String - Path of the program to execute, usually you should From da7161d5a7fcc3c7804eb22f51a705444d114f22 Mon Sep 17 00:00:00 2001 From: Nate Goldman Date: Tue, 20 Oct 2015 10:44:02 -0700 Subject: [PATCH 2/7] use webContents.openDevTools https://github.com/atom/electron/issues/3125#issuecomment-148975593 --- 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 052da3d91be8..b023deccda52 100644 --- a/docs/tutorial/quick-start.md +++ b/docs/tutorial/quick-start.md @@ -107,7 +107,7 @@ app.on('ready', function() { mainWindow.loadUrl('file://' + __dirname + '/index.html'); // Open the DevTools. - mainWindow.openDevTools(); + mainWindow.webContents.openDevTools(); // Emitted when the window is closed. mainWindow.on('closed', function() { From 285a4789b30feaa905ac61a642e309a7408e3d2c Mon Sep 17 00:00:00 2001 From: Paul Betts Date: Tue, 20 Oct 2015 12:35:56 -0700 Subject: [PATCH 3/7] Update app.md --- docs/api/app.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/api/app.md b/docs/api/app.md index d59e0e40d053..41098d4279c9 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -285,7 +285,10 @@ Adds `tasks` to the [Tasks][tasks] category of the JumpList on Windows. * `allow` Boolean Dynamically sets whether to always send credentials for HTTP NTLM or Negotiate -authentication. +authentication - normally, Electron will only send NTLM/Kerberos credentials for +URLs that fall under "Local Intranet" sites (i.e. are in the same domain as you). +However, this detection often fails when corporate networks are badly configured, +so this lets you co-opt this behavior and enable it for all URLs. ### `app.commandLine.appendSwitch(switch[, value])` From fe25f3e747fa64475423acd2ff25cc1171162422 Mon Sep 17 00:00:00 2001 From: Juan Roa Date: Tue, 20 Oct 2015 18:10:08 -0500 Subject: [PATCH 4/7] grammatical corrections for spanish translations at api, styleguide and README --- docs-translations/es/README.md | 6 ++-- .../es/api/chrome-command-line-switches.md | 28 +++++++++---------- docs-translations/es/api/process.md | 8 +++--- docs-translations/es/api/synopsis.md | 14 +++++----- docs-translations/es/styleguide.md | 10 +++---- 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/docs-translations/es/README.md b/docs-translations/es/README.md index 6e2374cfd449..706261c417e1 100644 --- a/docs-translations/es/README.md +++ b/docs-translations/es/README.md @@ -1,8 +1,8 @@ ## Guías -* [Platfaformas Soportadas](tutorial/supported-platforms.md) -* [Distribución de la Aplicacion](tutorial/application-distribution.md) -* [Empaquetamiento de la Aplicacion](tutorial/application-packaging.md) +* [Plataformas Soportadas](tutorial/supported-platforms.md) +* [Distribución de la Aplicación](tutorial/application-distribution.md) +* [Empaquetamiento de la Aplicación](tutorial/application-packaging.md) * [Utilizando Módulos Node Nativos](tutorial/using-native-node-modules.md) * [Depurando el Proceso Principal](tutorial/debugging-main-process.md) * [Utilizando Selenium y WebDriver](tutorial/using-selenium-and-webdriver.md) diff --git a/docs-translations/es/api/chrome-command-line-switches.md b/docs-translations/es/api/chrome-command-line-switches.md index c063869adf95..56973ec06ad3 100644 --- a/docs-translations/es/api/chrome-command-line-switches.md +++ b/docs-translations/es/api/chrome-command-line-switches.md @@ -1,9 +1,9 @@ # Parámetros CLI soportados (Chrome) -Esta página lista las líneas de comandos usadas por el navegador Chrome que también son +Esta página lista las líneas de comandos usadas por el navegador Chrome que también son soportadas por Electron. Puedes usar [app.commandLine.appendSwitch][append-switch] para anexarlas en el script principal de tu aplicación antes de que el evento [ready][ready] del -modulo [app][app] sea emitido: +módulo [app][app] sea emitido: ```javascript var app = require('app'); @@ -25,7 +25,7 @@ Ignora el límite de conexiones para la lista de `domains` separados por `,`. ## --disable-http-cache -Deshabilita la cacheé del disco para las peticiones HTTP. +Deshabilita la caché del disco para las peticiones HTTP. ## --remote-debugging-port=`port` @@ -42,7 +42,7 @@ Utiliza el script PAC en la `url` especificada. ## --no-proxy-server -No usa un servidor proxy y siempre establece conexiones directas. Anula cualquier +No usa un servidor proxy y siempre establece conexiones directas. Anula cualquier otra bandera de servidor proxy bandera que se pase. ## --host-rules=`rules` @@ -55,12 +55,12 @@ Por ejemplo: * `MAP * 127.0.0.1` Obliga a todos los nombres de host a ser asignados a 127.0.0.1 * `MAP *.google.com proxy` Obliga todos los subdominios google.com a resolverse con "proxy". -* `MAP test.com [::1]:77` Obliga a resolver "test.com" con un bucle invertido de IPv6. +* `MAP test.com [::1]:77` Obliga a resolver "test.com" con un bucle invertido de IPv6. También obligará a que el puerto de la dirección respuesta sea 77. * `MAP * baz, EXCLUDE www.google.com` Reasigna todo a "baz", excepto a "www.google.com". Estas asignaciones especifican el host final en una petición de red (Anfitrión de la conexión TCP -y de resolución de conexión directa, y el `CONNECT` en una conexión proxy HTTP, y el host final de +y de resolución de conexión directa, y el `CONNECT` en una conexión proxy HTTP, y el host final de la conexión proxy `SOCKS`). ## --host-resolver-rules=`rules` @@ -89,30 +89,30 @@ Permite guardar y escribir eventos de registros de red en `path`. ## --ssl-version-fallback-min=`version` -Establece la versión mínima de SSL/TLS ("tls1", "tls1.1" o "tls1.2") que +Establece la versión mínima de SSL/TLS ("tls1", "tls1.1" o "tls1.2") que el repliegue de TLC aceptará. ## --enable-logging Imprime el registro de Chromium en consola. -Este cambio no puede ser usado en `app.commandLine.appendSwitch` ya que se analiza antes de que la -aplicación del usuario este cargada. +Este cambio no puede ser usado en `app.commandLine.appendSwitch` ya que se analiza antes de que la +aplicación del usuario esté cargada. ## --v=`log_level` -Da el maximo nivel activo de V-logging por defecto; 0 es el predeterminado. Valores positivos +Da el máximo nivel activo de V-logging por defecto; 0 es el predeterminado. Valores positivos son normalmente usados para los niveles de V-logging. Este modificador sólo funciona cuando también se pasa `--enable-logging`. ## --vmodule=`pattern` -Da los niveles máximos de V-logging por módulo para sobreescribir el valor dado por -`--v`. Ej. `my_module=2,foo*=3` cambiaria el nivel de registro para todo el código -el archivos de origen `my_module.*` y `foo*.*`. +Da los niveles máximos de V-logging por módulo para sobreescribir el valor dado por +`--v`. Ej. `my_module=2,foo*=3` cambiaría el nivel de registro para todo el código, +los archivos de origen `my_module.*` y `foo*.*`. -Cualquier patron que contiene un slash o un slash invertido será probado contra toda la ruta +Cualquier patrón que contiene un slash o un slash invertido será probado contra toda la ruta y no sólo con el módulo. Ej. `*/foo/bar/*=2` cambiaría el nivel de registro para todo el código en los archivos origen bajo un directorio `foo/bar`. diff --git a/docs-translations/es/api/process.md b/docs-translations/es/api/process.md index e03ef5fa1c36..9e95ba988541 100644 --- a/docs-translations/es/api/process.md +++ b/docs-translations/es/api/process.md @@ -1,7 +1,7 @@ # process -El objeto `process` en Electron tiene las siguientes diferencias con respecto -al node convencional: +El objeto `process` en Electron tiene las siguientes diferencias con respecto +al node convencional: * `process.type` String - El tipo del proceso puede ser `browser` (ej. proceso principal) o `renderer`. @@ -16,7 +16,7 @@ al node convencional: Se emite cuando Electron ha cargado su script de inicialización interna y está comenzando a cargar la página web o el script principal. -Puede ser usado por el script precargado para añadir de nuevo los símbolos globales +Puede ser usado por el script precargado para añadir de nuevo los símbolos globales de Node eliminados, al alcance global cuando la integración de Node está apagada: ```js @@ -43,5 +43,5 @@ Interrumpe el hilo principal del proceso actual. * `maxDescriptors` Integer Establece el límite dinámico del descriptor del archivo en `maxDescriptors` -o en el límite estricto del Sistema Operativo, el que sea menor para el +o en el límite estricto del Sistema Operativo, el que sea menor para el proceso actual. diff --git a/docs-translations/es/api/synopsis.md b/docs-translations/es/api/synopsis.md index 0da368dea459..eb4fcb39f636 100644 --- a/docs-translations/es/api/synopsis.md +++ b/docs-translations/es/api/synopsis.md @@ -4,14 +4,14 @@ Todos los [Módulos integrados de Node.js](http://nodejs.org/api/) se encuentran disponibles en Electron y módulos de terceros son támbien totalmente compatibles (incluyendo los [módulos nativos](../tutorial/using-native-node-modules.md)). -Electron también provee algunos módulos integrados adicionales para desarrollar +Electron también provee algunos módulos integrados adicionales para desarrollar aplicaciones nativas de escritorio. Algunos módulos sólo se encuentran disponibles -en el proceso principal, algunos sólo en el proceso renderer (pagina web), y +en el proceso principal, algunos sólo en el proceso renderer (página web), y algunos pueden ser usados en ambos procesos. -La regla básica es: Si un módulo es -[GUI](https://es.wikipedia.org/wiki/Interfaz_gráfica_de_usuario) o de bajo nivel, -entonces solo estará disponible en el proceso principal. Necesitas familiarizarte +La regla básica es: Si un módulo es +[GUI](https://es.wikipedia.org/wiki/Interfaz_gráfica_de_usuario) o de bajo nivel, +entonces solo estará disponible en el proceso principal. Necesitas familiarizarte con el concepto de [scripts para proceso principal vs scripts para proceso renderer] (../tutorial/quick-start.md#the-main-process) para ser capaz de usar esos módulos. @@ -29,7 +29,7 @@ app.on('ready', function() { }); ``` -El proceso renderer no es diferente de una página web normal, excepto por la +El proceso renderer no es diferente de una página web normal, excepto por la capacidad extra de utilizar módulos de node: ```html @@ -44,4 +44,4 @@ capacidad extra de utilizar módulos de node: ``` -Para ejecutar tu aplicación, lee [Ejecutar la aplicación](../tutorial/quick-start.md#run-your-app). \ No newline at end of file +Para ejecutar tu aplicación, lee [Ejecutar la aplicación](../tutorial/quick-start.md#run-your-app). diff --git a/docs-translations/es/styleguide.md b/docs-translations/es/styleguide.md index 2e8e7c6f4a9e..4948035ffffe 100644 --- a/docs-translations/es/styleguide.md +++ b/docs-translations/es/styleguide.md @@ -15,7 +15,7 @@ Estas son las maneras en las que construimos la documentación de Electron. - Archivos separados por guiones, mas sin embargo, es correcto. - No subtítulos seguidos por otros subtítulos, añadir por lo menos un enunciado de descripción. -- Métodos de cabecera son delimitados con apóstrofes: `codigo`. +- Métodos de cabecera son delimitados con apóstrofes: `código`. - Cabeceras de Eventos son delimitados con 'comillas' simples. - No generar listas de mas de dos niveles (debido al renderizador de Markdown desafortunadamente). @@ -25,7 +25,7 @@ Estas son las maneras en las que construimos la documentación de Electron. - Argumentos opcionales escritos como `function (required[, optional])`. - Argumentos opcionales son denotados cuando se llaman en listas. - Delimitador de línea de 80-columnas. -- Métodos específicos de Plataformas son denotados en italicas seguidas por la cabecera del método. +- Métodos específicos de Plataformas son denotados en itálicas seguidas por la cabecera del método. - ```### `method(foo, bar)` _OS X_``` - Preferir 'en el ___ proceso' en lugar de 'sobre el' @@ -47,7 +47,7 @@ Para agregar otro set (o un set parcial): ## Leyendo la Documentación de Electron -Estos son algunos consejos para entender la syntaxis de la documentación de +Estos son algunos consejos para entender la sintaxis de la documentación de Electron. ### Métodos @@ -67,7 +67,7 @@ El nombre del método es seguido por los argumentos que recibe. Argumentos opcionales son denotados por corchetes rodeados por el argumento opcional y la coma requerida si el argumento opcional fuera seguido por otro argumento. -Debajo del método se encuentra mas información detallada de cada uno de los +Debajo del método se encuentra más información detallada de cada uno de los argumentos. El tipo de argumento es denotado por los tipos comúnes: [`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), @@ -90,7 +90,7 @@ Returns: --- El evento es una cadena que es utilizada luego de un método observador `.on`. Si -regresa un valor, el y su tipo son denotados abajo. Si se estaba a la escucha y +regresa un valor, él y su tipo son denotados abajo. Si se estaba a la escucha y respondió a este evento se debería ver así: ```javascript From d092c6acc956fd5b2c4e1431f9a25dbac17e681b Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 21 Oct 2015 07:33:43 +0800 Subject: [PATCH 5/7] osx: Implement draggable region with mouseDownCanMoveWindow Previously we implemented draggable region by tracking mouse position, it is buggy and causing some problems. But it is interesting that until this didn't cause troubles until recently. --- atom/browser/native_window.cc | 34 +++---- atom/browser/native_window.h | 13 ++- atom/browser/native_window_mac.h | 25 ++--- atom/browser/native_window_mac.mm | 148 ++++++++++++++++-------------- 4 files changed, 116 insertions(+), 104 deletions(-) diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 7f30aa00389f..8f3af83885f1 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -43,26 +43,6 @@ DEFINE_WEB_CONTENTS_USER_DATA_KEY(atom::NativeWindowRelay); namespace atom { -namespace { - -// Convert draggable regions in raw format to SkRegion format. Caller is -// responsible for deleting the returned SkRegion instance. -scoped_ptr DraggableRegionsToSkRegion( - const std::vector& regions) { - scoped_ptr sk_region(new SkRegion); - for (const DraggableRegion& region : regions) { - sk_region->op( - region.bounds.x(), - region.bounds.y(), - region.bounds.right(), - region.bounds.bottom(), - region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op); - } - return sk_region.Pass(); -} - -} // namespace - NativeWindow::NativeWindow( brightray::InspectableWebContents* inspectable_web_contents, const mate::Dictionary& options) @@ -480,6 +460,20 @@ void NativeWindow::NotifyWindowExecuteWindowsCommand( OnExecuteWindowsCommand(command)); } +scoped_ptr NativeWindow::DraggableRegionsToSkRegion( + const std::vector& regions) { + scoped_ptr sk_region(new SkRegion); + for (const DraggableRegion& region : regions) { + sk_region->op( + region.bounds.x(), + region.bounds.y(), + region.bounds.right(), + region.bounds.bottom(), + region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op); + } + return sk_region.Pass(); +} + void NativeWindow::RenderViewCreated( content::RenderViewHost* render_view_host) { if (!transparent_) diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index 379c23837b19..67bac88f32d4 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -241,10 +241,19 @@ class NativeWindow : public base::SupportsUserData, NativeWindow(brightray::InspectableWebContents* inspectable_web_contents, const mate::Dictionary& options); + // Convert draggable regions in raw format to SkRegion format. Caller is + // responsible for deleting the returned SkRegion instance. + scoped_ptr DraggableRegionsToSkRegion( + const std::vector& regions); + // Converts between content size to window size. virtual gfx::Size ContentSizeToWindowSize(const gfx::Size& size) = 0; virtual gfx::Size WindowSizeToContentSize(const gfx::Size& size) = 0; + // Called when the window needs to update its draggable region. + virtual void UpdateDraggableRegions( + const std::vector& regions); + // content::WebContentsObserver: void RenderViewCreated(content::RenderViewHost* render_view_host) override; void BeforeUnloadDialogCancelled() override; @@ -252,10 +261,6 @@ class NativeWindow : public base::SupportsUserData, bool OnMessageReceived(const IPC::Message& message) override; private: - // Called when the window needs to update its draggable region. - void UpdateDraggableRegions( - const std::vector& regions); - // Schedule a notification unresponsive event. void ScheduleUnresponsiveEvent(int ms); diff --git a/atom/browser/native_window_mac.h b/atom/browser/native_window_mac.h index 60581a2d977b..7a97032d75ff 100644 --- a/atom/browser/native_window_mac.h +++ b/atom/browser/native_window_mac.h @@ -71,12 +71,10 @@ class NativeWindowMac : public NativeWindow { void SetVisibleOnAllWorkspaces(bool visible) override; bool IsVisibleOnAllWorkspaces() override; - // Returns true if |point| in local Cocoa coordinate system falls within - // the draggable region. - bool IsWithinDraggableRegion(NSPoint point) const; - - // Called to handle a mouse event. - void HandleMouseEvent(NSEvent* event); + // Refresh the DraggableRegion views. + void UpdateDraggableRegionViews() { + UpdateDraggableRegionViews(draggable_regions_); + } protected: // NativeWindow: @@ -84,17 +82,24 @@ class NativeWindowMac : public NativeWindow { content::WebContents*, const content::NativeWebKeyboardEvent&) override; + // Return a vector of non-draggable regions that fill a window of size + // |width| by |height|, but leave gaps where the window should be draggable. + std::vector CalculateNonDraggableRegions( + const std::vector& regions, int width, int height); + private: // NativeWindow: gfx::Size ContentSizeToWindowSize(const gfx::Size& size) override; gfx::Size WindowSizeToContentSize(const gfx::Size& size) override; + void UpdateDraggableRegions( + const std::vector& regions) override; void InstallView(); void UninstallView(); // Install the drag view, which will cover the whole window and decides // whehter we can drag. - void InstallDraggableRegionView(); + void UpdateDraggableRegionViews(const std::vector& regions); base::scoped_nsobject window_; base::scoped_nsobject window_delegate_; @@ -102,6 +107,8 @@ class NativeWindowMac : public NativeWindow { // The view that will fill the whole frameless window. base::scoped_nsobject content_view_; + std::vector draggable_regions_; + bool is_kiosk_; NSInteger attention_request_id_; // identifier from requestUserAttention @@ -109,10 +116,6 @@ class NativeWindowMac : public NativeWindow { // The presentation options before entering kiosk mode. NSApplicationPresentationOptions kiosk_options_; - // Mouse location since the last mouse event, in screen coordinates. This is - // used in custom drag to compute the window movement. - NSPoint last_mouse_offset_; - DISALLOW_COPY_AND_ASSIGN(NativeWindowMac); }; diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 6420345da9b6..9724930c4885 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -19,6 +19,7 @@ #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host_view.h" #include "native_mate/dictionary.h" +#include "ui/gfx/skia_util.h" namespace { @@ -146,6 +147,7 @@ bool ScopedDisableResize::disable_resize_ = false; } - (void)windowDidResize:(NSNotification*)notification { + shell_->UpdateDraggableRegionViews(); shell_->NotifyWindowResize(); } @@ -257,43 +259,23 @@ bool ScopedDisableResize::disable_resize_ = false; @end -@interface ControlRegionView : NSView { - @private - atom::NativeWindowMac* shellWindow_; // Weak; owns self. -} +@interface ControlRegionView : NSView @end @implementation ControlRegionView -- (id)initWithShellWindow:(atom::NativeWindowMac*)shellWindow { - if ((self = [super init])) - shellWindow_ = shellWindow; - return self; -} - - (BOOL)mouseDownCanMoveWindow { return NO; } - (NSView*)hitTest:(NSPoint)aPoint { - if (!shellWindow_->IsWithinDraggableRegion(aPoint)) { - return nil; - } - return self; + return nil; } -- (void)mouseDown:(NSEvent*)event { - shellWindow_->HandleMouseEvent(event); -} - -- (void)mouseDragged:(NSEvent*)event { - shellWindow_->HandleMouseEvent(event); -} - -- (BOOL)acceptsFirstMouse:(NSEvent*)event { - return YES; -} +@end +@interface NSView (WebContentsView) +- (void)setMouseDownCanMoveWindow:(BOOL)can_move; @end @interface AtomProgressBar : NSProgressIndicator @@ -439,11 +421,6 @@ NativeWindowMac::NativeWindowMac( [view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; InstallView(); - - // Install the DraggableRegionView if it is forced to use draggable regions - // for normal window. - if (has_frame() && force_using_draggable_region()) - InstallDraggableRegionView(); } NativeWindowMac::~NativeWindowMac() { @@ -746,36 +723,6 @@ bool NativeWindowMac::IsVisibleOnAllWorkspaces() { return collectionBehavior & NSWindowCollectionBehaviorCanJoinAllSpaces; } -bool NativeWindowMac::IsWithinDraggableRegion(NSPoint point) const { - if (!draggable_region()) - return false; - if (!web_contents()) - return false; - NSView* webView = web_contents()->GetNativeView(); - NSInteger webViewHeight = NSHeight([webView bounds]); - // |draggable_region_| is stored in local platform-indepdent coordiate system - // while |point| is in local Cocoa coordinate system. Do the conversion - // to match these two. - return draggable_region()->contains(point.x, webViewHeight - point.y); -} - -void NativeWindowMac::HandleMouseEvent(NSEvent* event) { - NSPoint eventLoc = [event locationInWindow]; - NSRect mouseRect = [window_ convertRectToScreen:NSMakeRect(eventLoc.x, eventLoc.y, 0, 0)]; - NSPoint current_mouse_location = mouseRect.origin; - - if ([event type] == NSLeftMouseDown) { - NSPoint frame_origin = [window_ frame].origin; - last_mouse_offset_ = NSMakePoint( - frame_origin.x - current_mouse_location.x, - frame_origin.y - current_mouse_location.y); - } else if ([event type] == NSLeftMouseDragged) { - [window_ setFrameOrigin:NSMakePoint( - current_mouse_location.x + last_mouse_offset_.x, - current_mouse_location.y + last_mouse_offset_.y)]; - } -} - void NativeWindowMac::HandleKeyboardEvent( content::WebContents*, const content::NativeWebKeyboardEvent& event) { @@ -800,6 +747,23 @@ void NativeWindowMac::HandleKeyboardEvent( } } +std::vector NativeWindowMac::CalculateNonDraggableRegions( + const std::vector& regions, int width, int height) { + std::vector result; + if (regions.empty()) { + result.push_back(gfx::Rect(0, 0, width, height)); + } else { + scoped_ptr draggable(DraggableRegionsToSkRegion(regions)); + scoped_ptr non_draggable(new SkRegion); + non_draggable->op(0, 0, width, height, SkRegion::kUnion_Op); + non_draggable->op(*draggable, SkRegion::kDifference_Op); + for (SkRegion::Iterator it(*non_draggable); !it.done(); it.next()) { + result.push_back(gfx::SkIRectToRect(it.rect())); + } + } + return result; +} + gfx::Size NativeWindowMac::ContentSizeToWindowSize(const gfx::Size& size) { if (!has_frame()) return size; @@ -818,6 +782,13 @@ gfx::Size NativeWindowMac::WindowSizeToContentSize(const gfx::Size& size) { return gfx::Size(content.size); } +void NativeWindowMac::UpdateDraggableRegions( + const std::vector& regions) { + NativeWindow::UpdateDraggableRegions(regions); + draggable_regions_ = regions; + UpdateDraggableRegionViews(regions); +} + void NativeWindowMac::InstallView() { // Make sure the bottom corner is rounded: http://crbug.com/396264. [[window_ contentView] setWantsLayer:YES]; @@ -840,8 +811,6 @@ void NativeWindowMac::InstallView() { [view setFrame:[content_view_ bounds]]; [content_view_ addSubview:view]; - InstallDraggableRegionView(); - [[window_ standardWindowButton:NSWindowZoomButton] setHidden:YES]; [[window_ standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES]; [[window_ standardWindowButton:NSWindowCloseButton] setHidden:YES]; @@ -858,14 +827,55 @@ void NativeWindowMac::UninstallView() { [view removeFromSuperview]; } -void NativeWindowMac::InstallDraggableRegionView() { +void NativeWindowMac::UpdateDraggableRegionViews( + const std::vector& regions) { + if (has_frame() && !force_using_draggable_region()) + return; + + // All ControlRegionViews should be added as children of the WebContentsView, + // because WebContentsView will be removed and re-added when entering and + // leaving fullscreen mode. NSView* webView = web_contents()->GetNativeView(); - base::scoped_nsobject controlRegion( - [[ControlRegionView alloc] initWithShellWindow:this]); - [controlRegion setFrame:NSMakeRect(0, 0, - NSWidth([webView bounds]), - NSHeight([webView bounds]))]; - [webView addSubview:controlRegion]; + NSInteger webViewWidth = NSWidth([webView bounds]); + NSInteger webViewHeight = NSHeight([webView bounds]); + + [webView setMouseDownCanMoveWindow:YES]; + + // Remove all ControlRegionViews that are added last time. + // Note that [webView subviews] returns the view's mutable internal array and + // it should be copied to avoid mutating the original array while enumerating + // it. + base::scoped_nsobject subviews([[webView subviews] copy]); + for (NSView* subview in subviews.get()) + if ([subview isKindOfClass:[ControlRegionView class]]) + [subview removeFromSuperview]; + + // Draggable regions is implemented by having the whole web view draggable + // (mouseDownCanMoveWindow) and overlaying regions that are not draggable. + std::vector system_drag_exclude_areas = + CalculateNonDraggableRegions(regions, webViewWidth, webViewHeight); + + // Create and add a ControlRegionView for each region that needs to be + // excluded from the dragging. + for (std::vector::const_iterator iter = + system_drag_exclude_areas.begin(); + iter != system_drag_exclude_areas.end(); + ++iter) { + base::scoped_nsobject controlRegion( + [[ControlRegionView alloc] initWithFrame:NSZeroRect]); + [controlRegion setFrame:NSMakeRect(iter->x(), + webViewHeight - iter->bottom(), + iter->width(), + iter->height())]; + [webView addSubview:controlRegion]; + } + + // AppKit will not update its cache of mouseDownCanMoveWindow unless something + // changes. Previously we tried adding an NSView and removing it, but for some + // reason it required reposting the mouse-down event, and didn't always work. + // Calling the below seems to be an effective solution. + [window_ setMovableByWindowBackground:NO]; + [window_ setMovableByWindowBackground:YES]; } // static From 2d410ede4890551240f7745a967c67213ca29b3e Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 21 Oct 2015 07:34:15 +0800 Subject: [PATCH 6/7] Initialize things in the same sequence with main process --- atom/app/atom_library_main.mm | 2 ++ atom/app/node_main.cc | 17 +++++++---------- atom/browser/javascript_environment.cc | 1 - vendor/brightray | 2 +- vendor/node | 2 +- 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/atom/app/atom_library_main.mm b/atom/app/atom_library_main.mm index 885500beb5d3..7ee752293468 100644 --- a/atom/app/atom_library_main.mm +++ b/atom/app/atom_library_main.mm @@ -10,6 +10,7 @@ #include "base/at_exit.h" #include "base/i18n/icu_util.h" #include "base/mac/bundle_locations.h" +#include "base/mac/scoped_nsautorelease_pool.h" #include "brightray/common/mac/main_application_bundle.h" #include "content/public/app/content_main.h" @@ -25,6 +26,7 @@ int AtomMain(int argc, const char* argv[]) { int AtomInitializeICUandStartNode(int argc, char *argv[]) { base::AtExitManager atexit_manager; + base::mac::ScopedNSAutoreleasePool pool; base::mac::SetOverrideFrameworkBundlePath( brightray::MainApplicationBundlePath() .Append("Contents") diff --git a/atom/app/node_main.cc b/atom/app/node_main.cc index 7efb1b40eece..b946ae28ff94 100644 --- a/atom/app/node_main.cc +++ b/atom/app/node_main.cc @@ -7,8 +7,8 @@ #include "atom/app/uv_task_runner.h" #include "atom/browser/javascript_environment.h" #include "atom/browser/node_debugger.h" -#include "atom/common/node_includes.h" #include "base/command_line.h" +#include "atom/common/node_includes.h" #include "base/thread_task_runner_handle.h" #include "gin/array_buffer.h" #include "gin/public/isolate_holder.h" @@ -19,25 +19,22 @@ namespace atom { int NodeMain(int argc, char *argv[]) { base::CommandLine::Init(argc, argv); - argv = uv_setup_args(argc, argv); - int exec_argc; - const char** exec_argv; - node::Init(&argc, const_cast(argv), &exec_argc, &exec_argv); - int exit_code = 1; { // Feed gin::PerIsolateData with a task runner. + argv = uv_setup_args(argc, argv); uv_loop_t* loop = uv_default_loop(); scoped_refptr uv_task_runner(new UvTaskRunner(loop)); base::ThreadTaskRunnerHandle handle(uv_task_runner); gin::V8Initializer::LoadV8Snapshot(); gin::V8Initializer::LoadV8Natives(); - gin::IsolateHolder::Initialize( - gin::IsolateHolder::kNonStrictMode, - gin::ArrayBufferAllocator::SharedInstance()); - JavascriptEnvironment gin_env; + + int exec_argc; + const char** exec_argv; + node::Init(&argc, const_cast(argv), &exec_argc, &exec_argv); + node::Environment* env = node::CreateEnvironment( gin_env.isolate(), loop, gin_env.context(), argc, argv, exec_argc, exec_argv); diff --git a/atom/browser/javascript_environment.cc b/atom/browser/javascript_environment.cc index 3788fcad8b68..4e825e38142d 100644 --- a/atom/browser/javascript_environment.cc +++ b/atom/browser/javascript_environment.cc @@ -20,7 +20,6 @@ JavascriptEnvironment::JavascriptEnvironment() } bool JavascriptEnvironment::Initialize() { - gin::V8Initializer::LoadV8Snapshot(); gin::IsolateHolder::Initialize(gin::IsolateHolder::kNonStrictMode, gin::ArrayBufferAllocator::SharedInstance()); return true; diff --git a/vendor/brightray b/vendor/brightray index f1cbfd1d457f..49a86c123f4c 160000 --- a/vendor/brightray +++ b/vendor/brightray @@ -1 +1 @@ -Subproject commit f1cbfd1d457f9b40bca23a2f30948a093d6048a9 +Subproject commit 49a86c123f4cc43f4dca886ded612104a8a1fec6 diff --git a/vendor/node b/vendor/node index f4243f5c84a3..edfbc29d0942 160000 --- a/vendor/node +++ b/vendor/node @@ -1 +1 @@ -Subproject commit f4243f5c84a371632d8d72a1a2210a0e994afdcc +Subproject commit edfbc29d09425f2f387c52d77f6351b6ce101659 From 444f461269f77c67d4ce1bb6009baba15d98b71e Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 21 Oct 2015 20:46:16 +0800 Subject: [PATCH 7/7] Fix memory corruption when cleaning timer --- atom/app/uv_task_runner.cc | 9 +++++++-- atom/app/uv_task_runner.h | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/atom/app/uv_task_runner.cc b/atom/app/uv_task_runner.cc index 23463e44e2ef..f49ba259bac8 100644 --- a/atom/app/uv_task_runner.cc +++ b/atom/app/uv_task_runner.cc @@ -48,8 +48,13 @@ void UvTaskRunner::OnTimeout(uv_timer_t* timer) { self->tasks_[timer].Run(); self->tasks_.erase(timer); - uv_unref(reinterpret_cast(timer)); - delete timer; + uv_timer_stop(timer); + uv_close(reinterpret_cast(timer), UvTaskRunner::OnClose); +} + +// static +void UvTaskRunner::OnClose(uv_handle_t* handle) { + delete reinterpret_cast(handle); } } // namespace atom diff --git a/atom/app/uv_task_runner.h b/atom/app/uv_task_runner.h index e4eac0155354..c7302766c2d1 100644 --- a/atom/app/uv_task_runner.h +++ b/atom/app/uv_task_runner.h @@ -31,6 +31,7 @@ class UvTaskRunner : public base::SingleThreadTaskRunner { private: static void OnTimeout(uv_timer_t* timer); + static void OnClose(uv_handle_t* handle); uv_loop_t* loop_;