diff --git a/brightray/browser/mac/bry_inspectable_web_contents_view.h b/brightray/browser/mac/bry_inspectable_web_contents_view.h index 99f70a57b91d..87abc98c3549 100644 --- a/brightray/browser/mac/bry_inspectable_web_contents_view.h +++ b/brightray/browser/mac/bry_inspectable_web_contents_view.h @@ -2,7 +2,7 @@ @class BRYInspectableWebContentsViewPrivate; -@interface BRYInspectableWebContentsView : NSView { +@interface BRYInspectableWebContentsView : NSView { @private BRYInspectableWebContentsViewPrivate *_private; } diff --git a/brightray/browser/mac/bry_inspectable_web_contents_view.mm b/brightray/browser/mac/bry_inspectable_web_contents_view.mm index 9bf5f4fdcd51..b6c377dcc4c7 100644 --- a/brightray/browser/mac/bry_inspectable_web_contents_view.mm +++ b/brightray/browser/mac/bry_inspectable_web_contents_view.mm @@ -12,9 +12,19 @@ using namespace brightray; @public InspectableWebContentsViewMac *inspectableWebContentsView; NSSplitView *splitView; + NSWindow *window; } @end +namespace { + +NSRect devtoolsWindowFrame(NSView *referenceView) { + auto screenFrame = [referenceView.window convertRectToScreen:[referenceView convertRect:referenceView.bounds toView:nil]]; + return NSInsetRect(screenFrame, NSWidth(screenFrame) / 6, NSHeight(screenFrame) / 6); +} + +} + @implementation BRYInspectableWebContentsView - (instancetype)initWithInspectableWebContentsViewMac:(InspectableWebContentsViewMac *)inspectableWebContentsView { @@ -35,6 +45,7 @@ using namespace brightray; } - (void)dealloc { + [_private->window release]; [_private->splitView release]; [_private release]; _private = nil; @@ -54,6 +65,15 @@ using namespace brightray; auto devToolsWebContents = _private->inspectableWebContentsView->inspectable_web_contents()->devtools_web_contents(); auto devToolsView = devToolsWebContents->GetView()->GetNativeView(); + if (_private->window && devToolsView.window == _private->window) { + if (visible) { + [_private->window makeKeyAndOrderFront:nil]; + } else { + [_private->window orderOut:nil]; + } + return; + } + if (visible) { auto inspectedView = _private->inspectableWebContentsView->inspectable_web_contents()->GetWebContents()->GetView()->GetNativeView(); CGRect frame = NSRectToCGRect(inspectedView.frame); @@ -75,16 +95,60 @@ using namespace brightray; - (BOOL)setDockSide:(const std::string&)side { if (side == "right") { _private->splitView.vertical = YES; + [self moveToSplitView]; } else if (side == "bottom") { _private->splitView.vertical = NO; + [self moveToSplitView]; + } else if (side == "undocked") { + [self moveToWindow]; } else { return NO; } - [_private->splitView adjustSubviews]; return YES; } +- (void)moveToWindow { + if (!_private->window) { + auto styleMask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask | NSTexturedBackgroundWindowMask | NSUnifiedTitleAndToolbarWindowMask; + auto contentRect = [NSWindow contentRectForFrameRect:devtoolsWindowFrame(_private->splitView) styleMask:styleMask]; + _private->window = [[NSWindow alloc] initWithContentRect:contentRect styleMask:styleMask backing:NSBackingStoreBuffered defer:YES]; + _private->window.delegate = self; + _private->window.releasedWhenClosed = NO; + _private->window.title = @"Developer Tools"; + [_private->window setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge]; + [_private->window setContentBorderThickness:24 forEdge:NSMaxYEdge]; + } + + auto devToolsWebContents = _private->inspectableWebContentsView->inspectable_web_contents()->devtools_web_contents(); + auto devToolsView = devToolsWebContents->GetView()->GetNativeView(); + + NSView *contentView = _private->window.contentView; + devToolsView.frame = contentView.bounds; + devToolsView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; + + [contentView addSubview:devToolsView]; + [_private->window makeKeyAndOrderFront:nil]; + [_private->splitView adjustSubviews]; +} + +- (void)moveToSplitView { + [_private->window orderOut:nil]; + + auto devToolsWebContents = _private->inspectableWebContentsView->inspectable_web_contents()->devtools_web_contents(); + auto devToolsView = devToolsWebContents->GetView()->GetNativeView(); + + [_private->splitView addSubview:devToolsView]; + [_private->splitView adjustSubviews]; +} + +#pragma mark - NSWindowDelegate + +- (BOOL)windowShouldClose:(id)sender { + [_private->window orderOut:nil]; + return NO; +} + @end @implementation BRYInspectableWebContentsViewPrivate