// Copyright (c) 2017 GitHub, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #include "atom/browser/native_browser_view_mac.h" #include "brightray/browser/inspectable_web_contents_view.h" #include "skia/ext/skia_utils_mac.h" #include "ui/gfx/geometry/rect.h" using base::scoped_nsobject; // Match view::Views behavior where the view sticks to the top-left origin. const NSAutoresizingMaskOptions kDefaultAutoResizingMask = NSViewMaxXMargin | NSViewMinYMargin; @interface DragRegionView : NSView @end @implementation DragRegionView - (BOOL)mouseDownCanMoveWindow { return NO; } - (void)mouseDown:(NSEvent *)event { [self.window performWindowDragWithEvent:event]; } // Debugging tips: // Uncomment the following four lines to color DragRegionViews bright red - (void)drawRect:(NSRect)aRect { [[NSColor redColor] set]; NSRectFill([self bounds]); } @end namespace atom { NativeBrowserViewMac::NativeBrowserViewMac( brightray::InspectableWebContentsView* web_contents_view) : NativeBrowserView(web_contents_view) { auto* view = GetInspectableWebContentsView()->GetNativeView(); view.autoresizingMask = kDefaultAutoResizingMask; } NativeBrowserViewMac::~NativeBrowserViewMac() {} void NativeBrowserViewMac::SetAutoResizeFlags(uint8_t flags) { NSAutoresizingMaskOptions autoresizing_mask = kDefaultAutoResizingMask; if (flags & kAutoResizeWidth) { autoresizing_mask |= NSViewWidthSizable; } if (flags & kAutoResizeHeight) { autoresizing_mask |= NSViewHeightSizable; } auto* view = GetInspectableWebContentsView()->GetNativeView(); view.autoresizingMask = autoresizing_mask; } void NativeBrowserViewMac::SetBounds(const gfx::Rect& bounds) { auto* view = GetInspectableWebContentsView()->GetNativeView(); auto* superview = view.superview; const auto superview_height = superview ? superview.frame.size.height : 0; view.frame = NSMakeRect(bounds.x(), superview_height - bounds.y() - bounds.height(), bounds.width(), bounds.height()); } void NativeBrowserViewMac::SetBackgroundColor(SkColor color) { auto* view = GetInspectableWebContentsView()->GetNativeView(); view.wantsLayer = YES; view.layer.backgroundColor = skia::CGColorCreateFromSkColor(color); } void NativeBrowserViewMac::UpdateDraggableRegions( const std::vector& regions) { NSView* webView = GetInspectableWebContentsView()->GetNativeView(); NSInteger webViewHeight = NSHeight([webView bounds]); // Remove all DraggableRegionViews 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:[DragRegionView class]]) [subview removeFromSuperview]; for (const DraggableRegion& region : regions) { base::scoped_nsobject dragRegion( [[DragRegionView alloc] initWithFrame:NSZeroRect]); [dragRegion setFrame:NSMakeRect(region.bounds.x(), webViewHeight - region.bounds.bottom(), region.bounds.width(), region.bounds.height())]; [webView addSubview:dragRegion]; } } // static NativeBrowserView* NativeBrowserView::Create( brightray::InspectableWebContentsView* web_contents_view) { return new NativeBrowserViewMac(web_contents_view); } } // namespace atom