summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa/tab_contents_controller.mm
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/cocoa/tab_contents_controller.mm')
-rw-r--r--chrome/browser/cocoa/tab_contents_controller.mm76
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