Commit 2e1e507d authored by Friedrich Horschig [CET]'s avatar Friedrich Horschig [CET] Committed by Commit Bot

Revert "RemoteMacViews: Fix hang at command-Q"

This reverts commit 464fae69.

Reason for revert: Causes heavy flakiness (14/17 on Mac 10.11) and attempted fix showed no effect: https://crrev.com/c/1369136

TBR=ccameron@chromium.org
Bug: 902583

Original change's description:
> RemoteMacViews: Fix hang at command-Q
> 
> When we call -[NSApp terminate] in the app shim process, this does
> not immediately terminate. Rather, it
>  0. Sends the message appShimController_->host()->QuitApp() and waits
>     for a reply before actually terminating.
>  1. In the browser, this call hits ExtensionAppShimHandler::
>     CloseBrowsersForApp
>  2. Which will end up calling NativeWidgetMac::Close
>  3. Which will then politely request that the app shim process close
>     the corresponding window via
>     views_bridge_mac::mojom::BridgedNativeWidget::CloseWindow
>  4. Which will send an ack back to the browser via
>     views_bridge_mac::mojom::BridgedNativeWidgetHost::OnWindowHasClosed
>  5. Whereupon the browser window will be registered as closed, and a
>     close message will be sent to the app shim, and the wait for
>     termination will break
> 
> This ends up not working at step 3. Our suspended terminate ends up
> running a nested message loop inside a mojo message handler, and so
> it will never execute the CloseWindow message, and therefore never
> close.
> 
> Change the logic at [0] to send the QuitApp message, and then
> immediately terminate the application.
> 
> Bug: 902583
> Change-Id: I60fd7b5fdf9f145369d06219e8ebef36cdcd0f44
> Reviewed-on: https://chromium-review.googlesource.com/c/1364220
> Reviewed-by: Robert Sesek <rsesek@chromium.org>
> Commit-Queue: ccameron <ccameron@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#614922}

TBR=ccameron@chromium.org,rsesek@chromium.org

# Not skipping CQ checks because original CL landed > 1 day ago.

Bug: 902583
Change-Id: I34a3300dc188cdd0de58692042ce131a8639117f
Reviewed-on: https://chromium-review.googlesource.com/c/1371475Reviewed-by: default avatarFriedrich Horschig [CET] <fhorschig@chromium.org>
Commit-Queue: Friedrich Horschig [CET] <fhorschig@chromium.org>
Cr-Commit-Position: refs/heads/master@{#615485}
parent 447dc435
...@@ -201,7 +201,7 @@ void AppShimController::SetUserAttention( ...@@ -201,7 +201,7 @@ void AppShimController::SetUserAttention(
} }
void AppShimController::Close() { void AppShimController::Close() {
[NSApp terminate:nil]; [delegate_ terminateNow];
} }
bool AppShimController::SendFocusApp(apps::AppShimFocusType focus_type, bool AppShimController::SendFocusApp(apps::AppShimFocusType focus_type,
......
...@@ -18,6 +18,8 @@ class AppShimController; ...@@ -18,6 +18,8 @@ class AppShimController;
: NSObject<NSApplicationDelegate, NSUserInterfaceValidations> { : NSObject<NSApplicationDelegate, NSUserInterfaceValidations> {
@private @private
AppShimController* appShimController_; // Weak, initially NULL. AppShimController* appShimController_; // Weak, initially NULL.
BOOL terminateNow_;
BOOL terminateRequested_;
std::vector<base::FilePath> filesToOpenAtStartup_; std::vector<base::FilePath> filesToOpenAtStartup_;
} }
...@@ -34,6 +36,10 @@ class AppShimController; ...@@ -34,6 +36,10 @@ class AppShimController;
// Takes an array of NSString*. // Takes an array of NSString*.
- (void)openFiles:(NSArray*)filename; - (void)openFiles:(NSArray*)filename;
// Terminate immediately. This is necessary as we override terminate: to send
// a QuitApp message.
- (void)terminateNow;
@end @end
#endif // CHROME_APP_SHIM_APP_SHIM_DELEGATE_H_ #endif // CHROME_APP_SHIM_APP_SHIM_DELEGATE_H_
...@@ -67,11 +67,13 @@ ...@@ -67,11 +67,13 @@
- (NSApplicationTerminateReply)applicationShouldTerminate: - (NSApplicationTerminateReply)applicationShouldTerminate:
(NSApplication*)sender { (NSApplication*)sender {
// Send a last message to the host indicating that the host should close all if (terminateNow_ || !appShimController_)
// associated browser windows. return NSTerminateNow;
if (appShimController_)
appShimController_->host()->QuitApp(); appShimController_->host()->QuitApp();
return NSTerminateNow; // Wait for the channel to close before terminating.
terminateRequested_ = YES;
return NSTerminateLater;
} }
- (void)applicationWillHide:(NSNotification*)notification { - (void)applicationWillHide:(NSNotification*)notification {
...@@ -84,6 +86,16 @@ ...@@ -84,6 +86,16 @@
appShimController_->host()->SetAppHidden(false); appShimController_->host()->SetAppHidden(false);
} }
- (void)terminateNow {
if (terminateRequested_) {
[NSApp replyToApplicationShouldTerminate:NSTerminateNow];
return;
}
terminateNow_ = YES;
[NSApp terminate:nil];
}
- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item { - (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item {
return NO; return NO;
} }
......
...@@ -1039,7 +1039,12 @@ bool BridgedNativeWidgetImpl::ShouldRunCustomAnimationFor( ...@@ -1039,7 +1039,12 @@ bool BridgedNativeWidgetImpl::ShouldRunCustomAnimationFor(
} }
bool BridgedNativeWidgetImpl::RedispatchKeyEvent(NSEvent* event) { bool BridgedNativeWidgetImpl::RedispatchKeyEvent(NSEvent* event) {
return [[window_ commandDispatcher] redispatchKeyEvent:event]; NSWindow* window = ns_window();
DCHECK([window.class conformsToProtocol:@protocol(CommandDispatchingWindow)]);
NSObject<CommandDispatchingWindow>* command_dispatching_window =
base::mac::ObjCCastStrict<NSObject<CommandDispatchingWindow>>(window);
return
[[command_dispatching_window commandDispatcher] redispatchKeyEvent:event];
} }
NSWindow* BridgedNativeWidgetImpl::ns_window() { NSWindow* BridgedNativeWidgetImpl::ns_window() {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment