diff options
author | alekseys@chromium.org <alekseys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-09 18:11:57 +0000 |
---|---|---|
committer | alekseys@chromium.org <alekseys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-09 18:11:57 +0000 |
commit | a578606f5e15b4db72928f955995e71a92b683f9 (patch) | |
tree | 188b1dec0f544a795dac8db48a0abe4aa7bbcf1c /chrome/browser/cocoa/dev_tools_controller.mm | |
parent | a8c4602bfcedf0ad1ab0731bcfaa3da3c2e1cded (diff) | |
download | chromium_src-a578606f5e15b4db72928f955995e71a92b683f9.zip chromium_src-a578606f5e15b4db72928f955995e71a92b683f9.tar.gz chromium_src-a578606f5e15b4db72928f955995e71a92b683f9.tar.bz2 |
Move devtools and sidebar handling to BWC and ensure the order of layout adjustments
during tab change updates to eliminate UI flickering.
TabContents.xib changes: devtools and sidebar NSSplitViews removed (moved to BrowserWindow.xib),
contentsContainer_ view removed (now it's inserted at runtime).
BrowserWindow.xib chnages: devtools and sidebar NSSplitViews added into FastResizeView.
BUG=22717, 31633
TEST=Run unit_tests, browser_tests and interactive_ui_tests.
Open google.com in one tab (it's easy to spot content relayout on google.com), trigger an infobar
and content scroll bar on another tab (ru.wikipedia.org with translation infobar will do), switch
tabs back and forth. Content should not relayout, scroll bar should not "jump".
Open new tab and make sure bookmark bar is not always visible, open any site which triggers infobar
and big enough to show content scroll bar on another tab, switch tabs back and forth. Content should
not relayout, scroolbar should not "jump".
Repeat the tests above with sidebar opened on any of these tabs, page and sidebar content should not
relayout, sidebar should stay the same width, scrollbar should not "jump".
Repeat the tests above with devtools docked.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58964 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa/dev_tools_controller.mm')
-rw-r--r-- | chrome/browser/cocoa/dev_tools_controller.mm | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/chrome/browser/cocoa/dev_tools_controller.mm b/chrome/browser/cocoa/dev_tools_controller.mm new file mode 100644 index 0000000..1a7e3b6 --- /dev/null +++ b/chrome/browser/cocoa/dev_tools_controller.mm @@ -0,0 +1,105 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "chrome/browser/cocoa/dev_tools_controller.h" + +#include <algorithm> + +#include <Cocoa/Cocoa.h> + +#include "chrome/browser/browser.h" +#include "chrome/browser/browser_process.h" +#import "chrome/browser/cocoa/view_id_util.h" +#include "chrome/browser/debugger/devtools_window.h" +#include "chrome/browser/prefs/pref_service.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/common/pref_names.h" + +namespace { + +// Default offset of the contents splitter in pixels. +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). +const int kMinWebHeight = 50; + +} // end namespace + + +@interface DevToolsController (Private) +- (void)showDevToolsContents:(TabContents*)devToolsContents; +@end + + +@implementation DevToolsController + +- (id)initWithView:(NSSplitView*)devToolsView + delegate:(id<DevToolsControllerDelegate>)delegate { + DCHECK(delegate); + if ((self = [super init])) { + devToolsView_.reset([devToolsView retain]); + delegate_ = delegate; + } + return self; +} + +- (void)updateDevToolsForTabContents:(TabContents*)contents { + // Get current devtools content. + TabContents* devToolsContents = contents ? + DevToolsWindow::GetDevToolsContents(contents) : NULL; + + [self showDevToolsContents:devToolsContents]; +} + +- (void)showDevToolsContents:(TabContents*)devToolsContents { + NSArray* subviews = [devToolsView_ subviews]; + if (devToolsContents) { + DCHECK_GE([subviews count], 1u); + + // |devToolsView| is a TabContentsViewCocoa 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->GetNativeView(); + view_id_util::SetID(devToolsView, VIEW_ID_DEV_TOOLS_DOCKED); + + CGFloat splitOffset = 0; + if ([subviews count] == 1) { + // Load the default split offset. + splitOffset = g_browser_process->local_state()->GetInteger( + prefs::kDevToolsSplitLocation); + if (splitOffset < 0) { + // Initial load, set to default value. + splitOffset = kDefaultContentsSplitOffset; + } + [devToolsView_ addSubview:devToolsView]; + } else { + DCHECK_EQ([subviews count], 2u); + // If devtools are already visible, keep the current size. + splitOffset = NSHeight([devToolsView frame]); + [devToolsView_ replaceSubview:[subviews objectAtIndex:1] + with:devToolsView]; + } + + // Make sure |splitOffset| isn't too large or too small. + splitOffset = + std::min(splitOffset, NSHeight([devToolsView_ frame]) - kMinWebHeight); + DCHECK_GE(splitOffset, 0) << "kMinWebHeight needs to be smaller than " + << "smallest available tab contents space."; + splitOffset = std::max(static_cast<CGFloat>(0), splitOffset); + + [delegate_ resizeDevToolsToNewHeight:splitOffset]; + } 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]; + } + } +} + +@end |