diff options
Diffstat (limited to 'chrome/browser/cocoa/tab_contents_controller.mm')
-rw-r--r-- | chrome/browser/cocoa/tab_contents_controller.mm | 76 |
1 files changed, 74 insertions, 2 deletions
diff --git a/chrome/browser/cocoa/tab_contents_controller.mm b/chrome/browser/cocoa/tab_contents_controller.mm index 8072683..70daa32 100644 --- a/chrome/browser/cocoa/tab_contents_controller.mm +++ b/chrome/browser/cocoa/tab_contents_controller.mm @@ -6,8 +6,19 @@ #include "base/mac_util.h" #include "base/sys_string_conversions.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/bookmarks/bookmark_model.h" #include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/common/pref_names.h" +#include "chrome/common/pref_service.h" + +// Default offset of the contents splitter in pixels. +static const int kDefaultContentsSplitOffset = 400; + +// Never make the web part of the tab contents smaller than this (needed if the +// window is only a few pixels high). +static const int kMinWebHeight = 50; + @implementation TabContentsController @@ -29,7 +40,12 @@ // Call when the tab view is properly sized and the render widget host view // should be put into the view hierarchy. - (void)ensureContentsVisible { - [contentsBox_ setContentView:contents_->GetNativeView()]; + NSArray* subviews = [contentsContainer_ subviews]; + if ([subviews count] == 0) + [contentsContainer_ addSubview:contents_->GetNativeView()]; + else if ([subviews objectAtIndex:0] != contents_->GetNativeView()) + [contentsContainer_ replaceSubview:[subviews objectAtIndex:0] + with:contents_->GetNativeView()]; } // Returns YES if the tab represented by this controller is the front-most. @@ -57,8 +73,64 @@ // the view is different. if (contents_ != updatedContents) { contents_ = updatedContents; - [contentsBox_ setContentView:contents_->GetNativeView()]; + [self ensureContentsVisible]; } } +- (void)showDevToolsContents:(TabContents*)devToolsContents { + NSArray* subviews = [contentsContainer_ subviews]; + if (devToolsContents) { + DCHECK_GE([subviews count], 1u); + if ([subviews count] == 1) { + [contentsContainer_ addSubview:devToolsContents->GetNativeView()]; + } else { + DCHECK_EQ([subviews count], 2u); + [contentsContainer_ replaceSubview:[subviews objectAtIndex:1] + with:devToolsContents->GetNativeView()]; + } + // Restore split offset. + CGFloat splitOffset = g_browser_process->local_state()->GetInteger( + prefs::kDevToolsSplitLocation); + if (splitOffset == -1) { + // Initial load, set to default value. + splitOffset = kDefaultContentsSplitOffset; + } + splitOffset = MIN(splitOffset, + NSHeight([contentsContainer_ frame]) - kMinWebHeight); + DCHECK_GE(splitOffset, 0) << "kMinWebHeight needs to be smaller than " + << "smallest available tab contents space."; + splitOffset = MAX(0, splitOffset); + + // 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. + NSRect devtoolsFrame = [devToolsContents->GetNativeView() frame]; + devtoolsFrame.size.height = splitOffset; + [devToolsContents->GetNativeView() setFrame:devtoolsFrame]; + + NSRect webFrame = [[subviews objectAtIndex:0] frame]; + webFrame.size.height = NSHeight([contentsContainer_ frame]) - + [self devToolsHeight]; + [[subviews objectAtIndex:0] setFrame:webFrame]; + + [contentsContainer_ adjustSubviews]; + } else { + if ([subviews count] > 1) { + NSView* oldDevToolsContentsView = [subviews objectAtIndex:1]; + // Store split offset when hiding devtools window only. + int splitOffset = NSHeight([oldDevToolsContentsView frame]); + g_browser_process->local_state()->SetInteger( + prefs::kDevToolsSplitLocation, splitOffset); + [oldDevToolsContentsView removeFromSuperview]; + } + } +} + +- (CGFloat)devToolsHeight { + NSArray* subviews = [contentsContainer_ subviews]; + if ([subviews count] < 2) + return 0; + return NSHeight([[subviews objectAtIndex:1] frame]) + + [contentsContainer_ dividerThickness]; +} + @end |