Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1441)

Unified Diff: chrome/browser/ui/cocoa/dev_tools_controller.mm

Issue 63173016: DevTools: place DevTools WebContents underneath inspected WebContents. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/cocoa/dev_tools_controller.h ('k') | chrome/browser/ui/gtk/browser_window_gtk.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/cocoa/dev_tools_controller.mm
diff --git a/chrome/browser/ui/cocoa/dev_tools_controller.mm b/chrome/browser/ui/cocoa/dev_tools_controller.mm
index 6fb204d2f429373a7766476ec089c9d31985be52..381445deb46984e2df8c918d10dfd04d7b782c5f 100644
--- a/chrome/browser/ui/cocoa/dev_tools_controller.mm
+++ b/chrome/browser/ui/cocoa/dev_tools_controller.mm
@@ -5,6 +5,7 @@
#import "chrome/browser/ui/cocoa/dev_tools_controller.h"
#include <algorithm>
+#include <cmath>
#include <Cocoa/Cocoa.h>
@@ -16,39 +17,85 @@
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_view.h"
#include "ui/base/cocoa/focus_tracker.h"
+#include "ui/gfx/size_conversions.h"
using content::WebContents;
-@interface GraySplitView : NSSplitView {
- BOOL dividerHidden_;
-}
+@interface DevToolsContainerView : NSView {
+ gfx::Insets contentsInsets_;
-@property(assign, nonatomic) BOOL dividerHidden;
+ // Weak references. Ownership via -subviews.
+ NSView* devToolsView_;
+ NSView* contentsView_;
+}
-- (NSColor*)dividerColor;
-- (CGFloat)dividerThickness;
+- (void)setContentsInsets:(const gfx::Insets&)insets;
+- (void)adjustSubviews;
+- (void)showDevTools:(NSView*)devToolsView;
+- (void)hideDevTools;
@end
-@implementation GraySplitView
+@implementation DevToolsContainerView
+
+- (void)setContentsInsets:(const gfx::Insets&)insets {
+ contentsInsets_ = insets;
+}
-@synthesize dividerHidden = dividerHidden_;
+- (void)resizeSubviewsWithOldSize:(NSSize)oldBoundsSize {
+ [self adjustSubviews];
+}
-- (NSColor*)dividerColor {
- return [NSColor darkGrayColor];
+- (void)showDevTools:(NSView*)devToolsView {
+ NSArray* subviews = [self subviews];
+ DCHECK_EQ(1u, [subviews count]);
+ contentsView_ = [subviews objectAtIndex:0];
+ devToolsView_ = devToolsView;
+ // Place DevTools under contents.
+ [self addSubview:devToolsView positioned:NSWindowBelow relativeTo:nil];
}
-- (CGFloat)dividerThickness {
- return dividerHidden_ ? 0 : [super dividerThickness];
+- (void)hideDevTools {
+ DCHECK_EQ(2u, [[self subviews] count]);
+ [devToolsView_ removeFromSuperview];
+ contentsView_ = nil;
+ devToolsView_ = nil;
+}
+
+- (void)adjustSubviews {
+ if (![[self subviews] count])
+ return;
+
+ if (!devToolsView_) {
+ DCHECK_EQ(1u, [[self subviews] count]);
+ NSView* contents = [[self subviews] objectAtIndex:0];
+ [contents setFrame:[self bounds]];
+ return;
+ }
+
+ DCHECK_EQ(2u, [[self subviews] count]);
+ NSRect bounds = [self bounds];
+
+ [devToolsView_ setFrame:bounds];
+
+ CGFloat width = std::max(static_cast<CGFloat>(0),
+ NSWidth(bounds) - contentsInsets_.width());
+ CGFloat height = std::max(static_cast<CGFloat>(0),
+ NSHeight(bounds) - contentsInsets_.height());
+ CGFloat left = std::min(static_cast<CGFloat>(contentsInsets_.left()),
+ NSWidth(bounds));
+ // Flip top and bottom for NSView geometry.
+ CGFloat top = std::min(static_cast<CGFloat>(contentsInsets_.bottom()),
+ NSHeight(bounds));
+ [contentsView_ setFrame:NSMakeRect(left, top, width, height)];
}
@end
@interface DevToolsController (Private)
-- (void)showDevToolsContainer;
-- (void)hideDevToolsContainer;
-- (void)updateDevToolsSplitPosition;
+- (void)showDevToolsView;
+- (void)hideDevToolsView;
@end
@@ -56,29 +103,16 @@ using content::WebContents;
- (id)init {
if ((self = [super init])) {
- splitView_.reset([[GraySplitView alloc] initWithFrame:NSZeroRect]);
- [splitView_ setDividerStyle:NSSplitViewDividerStyleThin];
- [splitView_ setVertical:NO];
- [splitView_ setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
- [splitView_ setDelegate:self];
- [splitView_ setDividerHidden:NO];
-
- dockSide_ = DEVTOOLS_DOCK_SIDE_BOTTOM;
+ devToolsContainerView_.reset(
+ [[DevToolsContainerView alloc] initWithFrame:NSZeroRect]);
+ [devToolsContainerView_
+ setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
}
return self;
}
-- (void)dealloc {
- [splitView_ setDelegate:nil];
- [super dealloc];
-}
-
- (NSView*)view {
- return splitView_.get();
-}
-
-- (NSSplitView*)splitView {
- return splitView_.get();
+ return devToolsContainerView_.get();
}
- (void)updateDevToolsForWebContents:(WebContents*)contents
@@ -86,145 +120,50 @@ using content::WebContents;
DevToolsWindow* newDevToolsWindow = contents ?
DevToolsWindow::GetDockedInstanceForInspectedTab(contents) : NULL;
- // Fast return in case of the same window having same orientation.
- if (devToolsWindow_ == newDevToolsWindow) {
- if (!newDevToolsWindow ||
- (newDevToolsWindow->dock_side() == dockSide_)) {
- return;
- }
- }
+ bool shouldHide = devToolsWindow_ && devToolsWindow_ != newDevToolsWindow;
+ bool shouldShow = newDevToolsWindow && devToolsWindow_ != newDevToolsWindow;
- // Store last used position.
- if (devToolsWindow_) {
- NSArray* subviews = [splitView_ subviews];
- DCHECK_EQ([subviews count], 2u);
- NSView* devToolsView = [subviews objectAtIndex:1];
- if (dockSide_ == DEVTOOLS_DOCK_SIDE_RIGHT)
- devToolsWindow_->SetWidth(NSWidth([devToolsView frame]));
- else if (dockSide_ == DEVTOOLS_DOCK_SIDE_BOTTOM)
- devToolsWindow_->SetHeight(NSHeight([devToolsView frame]));
- }
-
- if (devToolsWindow_)
- [self hideDevToolsContainer];
+ if (shouldHide)
+ [self hideDevToolsView];
devToolsWindow_ = newDevToolsWindow;
-
if (devToolsWindow_) {
- dockSide_ = devToolsWindow_->dock_side();
- [self showDevToolsContainer];
+ gfx::Insets insets = devToolsWindow_->GetContentsInsets();
+ devToolsWindow_->web_contents()->GetView()->SetOverlayView(
+ contents->GetView(), gfx::Point(insets.left(), insets.top()));
+ [devToolsContainerView_ setContentsInsets:insets];
+ } else {
+ gfx::Insets zeroInsets;
+ [devToolsContainerView_ setContentsInsets:zeroInsets];
}
+
+ if (shouldShow)
+ [self showDevToolsView];
+
+ [devToolsContainerView_ adjustSubviews];
+ if (shouldHide || shouldShow)
+ [[devToolsContainerView_ window] disableScreenUpdatesUntilFlush];
}
-- (void)showDevToolsContainer {
- NSArray* subviews = [splitView_ subviews];
- DCHECK_EQ([subviews count], 1u);
- WebContents* devToolsContents = devToolsWindow_->web_contents();
+- (void)showDevToolsView {
focusTracker_.reset(
- [[FocusTracker alloc] initWithWindow:[splitView_ window]]);
+ [[FocusTracker alloc] initWithWindow:[devToolsContainerView_ window]]);
- // |devToolsView| is a TabContentsViewCocoa object, whose ViewID was
+ // |devToolsView| is a WebContentsViewCocoa object, whose ViewID was
// set to VIEW_ID_TAB_CONTAINER initially, so we need to change it to
// VIEW_ID_DEV_TOOLS_DOCKED here.
- NSView* devToolsView = devToolsContents->GetView()->GetNativeView();
+ NSView* devToolsView =
+ devToolsWindow_->web_contents()->GetView()->GetNativeView();
view_id_util::SetID(devToolsView, VIEW_ID_DEV_TOOLS_DOCKED);
- [splitView_ addSubview:devToolsView];
- BOOL isVertical = devToolsWindow_->dock_side() == DEVTOOLS_DOCK_SIDE_RIGHT;
- [splitView_ setVertical:isVertical];
- [self updateDevToolsSplitPosition];
+ [devToolsContainerView_ showDevTools:devToolsView];
}
-- (void)hideDevToolsContainer {
- NSArray* subviews = [splitView_ subviews];
- DCHECK_EQ([subviews count], 2u);
- NSView* oldDevToolsContentsView = [subviews objectAtIndex:1];
- [oldDevToolsContentsView removeFromSuperview];
- [splitView_ adjustSubviews];
- [focusTracker_ restoreFocusInWindow:[splitView_ window]];
+- (void)hideDevToolsView {
+ devToolsWindow_->web_contents()->GetView()->RemoveOverlayView();
+ [devToolsContainerView_ hideDevTools];
+ [focusTracker_ restoreFocusInWindow:[devToolsContainerView_ window]];
focusTracker_.reset();
}
-- (void)updateDevToolsSplitPosition {
- NSArray* subviews = [splitView_ subviews];
-
- // It seems as if |-setPosition:ofDividerAtIndex:| should do what's needed,
- // but I can't figure out how to use it. Manually resize web and devtools.
- // TODO(alekseys): either make setPosition:ofDividerAtIndex: work or to add a
- // category on NSSplitView to handle manual resizing.
- NSView* webView = [subviews objectAtIndex:0];
- NSRect webFrame = [webView frame];
- NSView* devToolsView = [subviews objectAtIndex:1];
- NSRect devToolsFrame = [devToolsView frame];
-
- BOOL noDivider = devToolsWindow_->dock_side() == DEVTOOLS_DOCK_SIDE_MINIMIZED;
- [splitView_ setDividerHidden:noDivider];
-
- if (devToolsWindow_->dock_side() == DEVTOOLS_DOCK_SIDE_RIGHT) {
- CGFloat size = devToolsWindow_->GetWidth(NSWidth([splitView_ frame]));
- devToolsFrame.size.width = size;
- webFrame.size.width =
- NSWidth([splitView_ frame]) - ([splitView_ dividerThickness] + size);
- } else {
- CGFloat size =
- devToolsWindow_->dock_side() == DEVTOOLS_DOCK_SIDE_MINIMIZED ?
- devToolsWindow_->GetMinimizedHeight() :
- devToolsWindow_->GetHeight(NSHeight([splitView_ frame]));
- devToolsFrame.size.height = size;
- webFrame.size.height =
- NSHeight([splitView_ frame]) - ([splitView_ dividerThickness] + size);
- }
-
- [[splitView_ window] disableScreenUpdatesUntilFlush];
- [webView setFrame:webFrame];
- [devToolsView setFrame:devToolsFrame];
-
- [splitView_ adjustSubviews];
-}
-
-// NSSplitViewDelegate protocol.
-- (BOOL)splitView:(NSSplitView *)splitView
- shouldAdjustSizeOfSubview:(NSView *)subview {
- // Return NO for the devTools view to indicate that it should not be resized
- // automatically. It preserves the height set by the user and also keeps
- // view height the same while changing tabs when one of the tabs shows infobar
- // and others are not.
- if ([[splitView_ subviews] indexOfObject:subview] == 1)
- return NO;
- return YES;
-}
-
-- (NSRect)splitView:(NSSplitView*)splitView
- effectiveRect:(NSRect)proposedEffectiveRect
- forDrawnRect:(NSRect)drawnRect
- ofDividerAtIndex:(NSInteger)dividerIndex {
- if (devToolsWindow_->dock_side() == DEVTOOLS_DOCK_SIDE_MINIMIZED) {
- return NSZeroRect;
- } else {
- return proposedEffectiveRect;
- }
-}
-
-- (CGFloat)splitView:(NSSplitView*)splitView
- constrainMaxCoordinate:(CGFloat)proposedMax
- ofSubviewAt:(NSInteger)dividerIndex {
- if ([splitView_ isVertical]) {
- return NSWidth([splitView_ frame]) - [splitView_ dividerThickness] -
- devToolsWindow_->GetMinimumWidth();
- } else {
- return NSHeight([splitView_ frame]) - [splitView_ dividerThickness] -
- devToolsWindow_->GetMinimumHeight();
- }
-}
-
-- (CGFloat)splitView:(NSSplitView *)splitView
- constrainSplitPosition:(CGFloat)proposedPosition
- ofSubviewAt:(NSInteger)dividerIndex {
- return round(proposedPosition);
-}
-
--(void)splitViewWillResizeSubviews:(NSNotification *)notification {
- [[splitView_ window] disableScreenUpdatesUntilFlush];
-}
-
@end
« no previous file with comments | « chrome/browser/ui/cocoa/dev_tools_controller.h ('k') | chrome/browser/ui/gtk/browser_window_gtk.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698