summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/app/nibs/PreviewableContents.xib192
-rw-r--r--chrome/browser/instant/instant_model.cc5
-rw-r--r--chrome/browser/ui/cocoa/tab_contents/instant_preview_controller_mac.mm7
-rw-r--r--chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.h14
-rw-r--r--chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.mm84
-rw-r--r--chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller_browsertest.mm100
-rw-r--r--chrome/chrome_nibs.gypi1
-rw-r--r--chrome/chrome_tests.gypi1
8 files changed, 194 insertions, 210 deletions
diff --git a/chrome/app/nibs/PreviewableContents.xib b/chrome/app/nibs/PreviewableContents.xib
deleted file mode 100644
index 17caaec..0000000
--- a/chrome/app/nibs/PreviewableContents.xib
+++ /dev/null
@@ -1,192 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
- <data>
- <int key="IBDocument.SystemTarget">1070</int>
- <string key="IBDocument.SystemVersion">12B19</string>
- <string key="IBDocument.InterfaceBuilderVersion">2549</string>
- <string key="IBDocument.AppKitVersion">1187</string>
- <string key="IBDocument.HIToolboxVersion">624.00</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="NS.object.0">2549</string>
- </object>
- <object class="NSArray" key="IBDocument.IntegratedClassDependencies">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>NSCustomObject</string>
- <string>NSCustomView</string>
- </object>
- <object class="NSArray" key="IBDocument.PluginDependencies">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.Metadata">
- <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
- <integer value="1" key="NS.object.0"/>
- </object>
- <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSCustomObject" id="1001">
- <string key="NSClassName">PreviewableContentsController</string>
- </object>
- <object class="NSCustomObject" id="1003">
- <string key="NSClassName">FirstResponder</string>
- </object>
- <object class="NSCustomObject" id="1004">
- <string key="NSClassName">NSApplication</string>
- </object>
- <object class="NSCustomView" id="1005">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">274</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSCustomView" id="115467025">
- <reference key="NSNextResponder" ref="1005"/>
- <int key="NSvFlags">274</int>
- <string key="NSFrameSize">{480, 360}</string>
- <reference key="NSSuperview" ref="1005"/>
- <reference key="NSWindow"/>
- <string key="NSClassName">NSView</string>
- </object>
- </object>
- <string key="NSFrameSize">{480, 360}</string>
- <reference key="NSSuperview"/>
- <reference key="NSWindow"/>
- <string key="NSClassName">NSView</string>
- </object>
- </object>
- <object class="IBObjectContainer" key="IBDocument.Objects">
- <object class="NSMutableArray" key="connectionRecords">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">view</string>
- <reference key="source" ref="1001"/>
- <reference key="destination" ref="1005"/>
- </object>
- <int key="connectionID">8</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">activeContainer_</string>
- <reference key="source" ref="1001"/>
- <reference key="destination" ref="115467025"/>
- </object>
- <int key="connectionID">9</int>
- </object>
- </object>
- <object class="IBMutableOrderedSet" key="objectRecords">
- <object class="NSArray" key="orderedObjects">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBObjectRecord">
- <int key="objectID">0</int>
- <object class="NSArray" key="object" id="0">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
- <reference key="children" ref="1000"/>
- <nil key="parent"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-2</int>
- <reference key="object" ref="1001"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">File's Owner</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-1</int>
- <reference key="object" ref="1003"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">First Responder</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">-3</int>
- <reference key="object" ref="1004"/>
- <reference key="parent" ref="0"/>
- <string key="objectName">Application</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">1</int>
- <reference key="object" ref="1005"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="115467025"/>
- </object>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">2</int>
- <reference key="object" ref="115467025"/>
- <reference key="parent" ref="1005"/>
- </object>
- </object>
- </object>
- <object class="NSMutableDictionary" key="flattenedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>-1.IBPluginDependency</string>
- <string>-2.IBPluginDependency</string>
- <string>-3.IBPluginDependency</string>
- <string>1.IBPluginDependency</string>
- <string>2.IBPluginDependency</string>
- </object>
- <object class="NSArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- </object>
- </object>
- <object class="NSMutableDictionary" key="unlocalizedProperties">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <reference key="dict.values" ref="0"/>
- </object>
- <nil key="activeLocalization"/>
- <object class="NSMutableDictionary" key="localizations">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference key="dict.sortedKeys" ref="0"/>
- <reference key="dict.values" ref="0"/>
- </object>
- <nil key="sourceID"/>
- <int key="maxID">10</int>
- </object>
- <object class="IBClassDescriber" key="IBDocument.Classes">
- <object class="NSMutableArray" key="referencedPartialClassDescriptions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBPartialClassDescription">
- <string key="className">PreviewableContentsController</string>
- <string key="superclassName">NSViewController</string>
- <object class="NSMutableDictionary" key="outlets">
- <string key="NS.key.0">activeContainer_</string>
- <string key="NS.object.0">NSView</string>
- </object>
- <object class="NSMutableDictionary" key="toOneOutletInfosByName">
- <string key="NS.key.0">activeContainer_</string>
- <object class="IBToOneOutletInfo" key="NS.object.0">
- <string key="name">activeContainer_</string>
- <string key="candidateClassName">NSView</string>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBProjectSource</string>
- <string key="minorKey">./Classes/PreviewableContentsController.h</string>
- </object>
- </object>
- </object>
- </object>
- <int key="IBDocument.localizationMode">0</int>
- <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
- <real value="1070" key="NS.object.0"/>
- </object>
- <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
- <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
- <integer value="3000" key="NS.object.0"/>
- </object>
- <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
- <int key="IBDocument.defaultPropertyAccessControl">3</int>
- </data>
-</archive>
diff --git a/chrome/browser/instant/instant_model.cc b/chrome/browser/instant/instant_model.cc
index 2a333bd..5c3c9cc 100644
--- a/chrome/browser/instant/instant_model.cc
+++ b/chrome/browser/instant/instant_model.cc
@@ -49,7 +49,10 @@ void InstantModel::SetPreviewContents(content::WebContents* preview_contents) {
}
content::WebContents* InstantModel::GetPreviewContents() const {
- return controller_->GetPreviewContents();
+ // |controller_| maybe NULL durning tests.
+ if (controller_)
+ return controller_->GetPreviewContents();
+ return preview_contents_;
}
void InstantModel::AddObserver(InstantModelObserver* observer) const {
diff --git a/chrome/browser/ui/cocoa/tab_contents/instant_preview_controller_mac.mm b/chrome/browser/ui/cocoa/tab_contents/instant_preview_controller_mac.mm
index d915d63..fb32888 100644
--- a/chrome/browser/ui/cocoa/tab_contents/instant_preview_controller_mac.mm
+++ b/chrome/browser/ui/cocoa/tab_contents/instant_preview_controller_mac.mm
@@ -22,9 +22,10 @@ InstantPreviewControllerMac::~InstantPreviewControllerMac() {
void InstantPreviewControllerMac::PreviewStateChanged(
const InstantModel& model) {
- if (model.mode().is_search_suggestions()) {
- // TODO(dhollowa): Needs height and units implementation on Mac.
- [preview_ showPreview:model.GetPreviewContents()];
+ if (model.mode().is_ntp() || model.mode().is_search_suggestions()) {
+ [preview_ showPreview:model.GetPreviewContents()
+ height:model.height()
+ heightUnits:model.height_units()];
} else {
[preview_ hidePreview];
}
diff --git a/chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.h b/chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.h
index 1d0da58..de51c95 100644
--- a/chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.h
+++ b/chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.h
@@ -7,7 +7,9 @@
#import <Cocoa/Cocoa.h>
+#include "base/memory/scoped_nsobject.h"
#include "base/memory/scoped_ptr.h"
+#include "chrome/common/instant_types.h"
class Browser;
@class BrowserWindowController;
@@ -31,13 +33,17 @@ class WebContents;
@interface PreviewableContentsController : NSViewController {
@private
// Container view for the "active" contents.
- IBOutlet NSView* activeContainer_;
+ scoped_nsobject<NSView> activeContainer_;
// The preview WebContents. Will be NULL if no preview is currently showing.
content::WebContents* previewContents_; // weak
// C++ bridge to the Instant model change interface.
scoped_ptr<InstantPreviewControllerMac> instantPreviewController_;
+
+ // The desired height of the preview and units.
+ CGFloat previewHeight_;
+ InstantSizeUnits previewHeightUnits_;
}
@property(readonly, nonatomic) NSView* activeContainer;
@@ -48,7 +54,9 @@ class WebContents;
// Sets the current preview and installs its WebContentsView into the view
// hierarchy. Hides the active view. |preview| must not be NULL.
-- (void)showPreview:(content::WebContents*)preview;
+- (void)showPreview:(content::WebContents*)preview
+ height:(CGFloat)height
+ heightUnits:(InstantSizeUnits)heightUnits;
// Closes the current preview and shows the active view.
- (void)hidePreview;
@@ -60,6 +68,8 @@ class WebContents;
// Returns YES if the preview contents is currently showing.
- (BOOL)isShowingPreview;
+- (InstantPreviewControllerMac*)instantPreviewController;
+
@end
#endif // CHROME_BROWSER_UI_COCOA_TAB_CONTENTS_PREVIEWABLE_CONTENTS_CONTROLLER_H_
diff --git a/chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.mm b/chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.mm
index b80d159..d8bf39d 100644
--- a/chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.mm
+++ b/chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.mm
@@ -8,36 +8,63 @@
#include "chrome/browser/ui/cocoa/tab_contents/instant_preview_controller_mac.h"
#include "content/public/browser/web_contents.h"
-@implementation PreviewableContentsController
+@interface PreviewableContentsController()
+- (void)viewDidResize:(NSNotification*)note;
+- (void)layoutViews;
+- (CGFloat)previewHeightInPixels;
+@end
-@synthesize activeContainer = activeContainer_;
+@implementation PreviewableContentsController
- (id)initWithBrowser:(Browser*)browser
windowController:(BrowserWindowController*)windowController {
- if ((self = [super initWithNibName:@"PreviewableContents"
- bundle:base::mac::FrameworkBundle()])) {
+ if ((self = [super init])) {
+ scoped_nsobject<NSView> view([[NSView alloc] initWithFrame:NSZeroRect]);
+ [view setAutoresizingMask:NSViewHeightSizable | NSViewWidthSizable];
+ [view setAutoresizesSubviews:NO];
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(viewDidResize:)
+ name:NSViewFrameDidChangeNotification
+ object:view];
+ [self setView:view];
+
+ activeContainer_.reset([[NSView alloc] initWithFrame:NSZeroRect]);
+ [view addSubview:activeContainer_];
+
instantPreviewController_.reset(
new InstantPreviewControllerMac(browser, windowController, self));
}
return self;
}
-- (void)showPreview:(content::WebContents*)preview {
+- (void)dealloc {
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+ [super dealloc];
+}
+
+- (void)showPreview:(content::WebContents*)preview
+ height:(CGFloat)height
+ heightUnits:(InstantSizeUnits)heightUnits {
DCHECK(preview);
+ if (previewContents_ == preview &&
+ previewHeight_ == height &&
+ previewHeightUnits_ == heightUnits) {
+ return;
+ }
// Remove any old preview contents before showing the new one.
if (previewContents_)
[previewContents_->GetNativeView() removeFromSuperview];
previewContents_ = preview;
- NSView* previewView = previewContents_->GetNativeView();
-
- // Set the autoresizing of the the preview correctly.
- [previewView setAutoresizingMask:NSViewHeightSizable|NSViewWidthSizable];
- [previewView setFrame:[[self view] bounds]];
+ previewHeight_ = height;
+ previewHeightUnits_ = heightUnits;
// Add the preview contents.
- [[self view] addSubview:previewView];
+ [[self view] addSubview:previewContents_->GetNativeView()];
+ [self layoutViews];
+
previewContents_->WasShown();
}
@@ -63,4 +90,39 @@
return previewContents_ != nil;
}
+- (InstantPreviewControllerMac*)instantPreviewController {
+ return instantPreviewController_.get();
+}
+
+- (NSView*)activeContainer {
+ return activeContainer_.get();
+}
+
+- (void)viewDidResize:(NSNotification*)note {
+ [self layoutViews];
+}
+
+- (void)layoutViews {
+ NSRect bounds = [[self view] bounds];
+
+ if (previewContents_) {
+ NSRect frame = bounds;
+ frame.size.height = [self previewHeightInPixels];
+ frame.origin.y = NSMaxY(bounds) - NSHeight(frame);
+ [previewContents_->GetNativeView() setFrame:frame];
+ }
+
+ [activeContainer_ setFrame:bounds];
+}
+
+- (CGFloat)previewHeightInPixels {
+ CGFloat height = NSHeight([[self view] bounds]);
+ switch (previewHeightUnits_) {
+ case INSTANT_SIZE_PERCENT:
+ return std::min(height, (height * previewHeight_) / 100);
+ case INSTANT_SIZE_PIXELS:
+ return std::min(height, previewHeight_);
+ }
+}
+
@end
diff --git a/chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller_browsertest.mm b/chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller_browsertest.mm
new file mode 100644
index 0000000..871194a
--- /dev/null
+++ b/chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller_browsertest.mm
@@ -0,0 +1,100 @@
+// Copyright 2012 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/ui/cocoa/tab_contents/previewable_contents_controller.h"
+
+#include "chrome/browser/instant/instant_model.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/cocoa/browser_window_controller.h"
+#include "chrome/browser/ui/cocoa/tab_contents/instant_preview_controller_mac.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/browser/web_contents.h"
+#include "ipc/ipc_message.h"
+#import "testing/gtest_mac.h"
+
+class PreviewableContentsControllerTest : public InProcessBrowserTest {
+ public:
+ PreviewableContentsControllerTest() : instant_model_(NULL) {
+ }
+
+ virtual void SetUpOnMainThread() OVERRIDE {
+ web_contents_.reset(content::WebContents::Create(
+ browser()->profile(), NULL, MSG_ROUTING_NONE, NULL));
+ instant_model_.SetPreviewContents(web_contents_.get());
+
+ controller_.reset([[PreviewableContentsController alloc]
+ initWithBrowser:browser()
+ windowController:nil]);
+ [[controller_ view] setFrame:NSMakeRect(0, 0, 100, 200)];
+ instant_model_.AddObserver([controller_ instantPreviewController]);
+ }
+
+ virtual void CleanUpOnMainThread() OVERRIDE {
+ instant_model_.RemoveObserver([controller_ instantPreviewController]);
+ instant_model_.SetPreviewContents(NULL);
+ controller_.reset();
+ web_contents_.reset();
+ }
+
+ void VerifyPreviewFrame(CGFloat expected_height,
+ InstantSizeUnits units) {
+ NSRect container_bounds = [[controller_ view] bounds];
+ NSRect preview_frame =
+ [web_contents_->GetNativeView() frame];
+
+ EXPECT_EQ(NSMinX(container_bounds), NSMinX(preview_frame));
+ EXPECT_EQ(NSWidth(container_bounds), NSWidth(preview_frame));
+ switch (units) {
+ case INSTANT_SIZE_PIXELS:
+ EXPECT_EQ(expected_height, NSHeight(preview_frame));
+ EXPECT_EQ(NSMaxY(container_bounds), NSMaxY(preview_frame));
+ break;
+ case INSTANT_SIZE_PERCENT:
+ EXPECT_EQ((expected_height * NSHeight(container_bounds)) / 100,
+ NSHeight(preview_frame));
+ EXPECT_EQ(NSMaxY(container_bounds), NSMaxY(preview_frame));
+ }
+ }
+
+ protected:
+ InstantModel instant_model_;
+ scoped_ptr<content::WebContents> web_contents_;
+ scoped_nsobject<PreviewableContentsController> controller_;
+};
+
+// Verify that the view is correctly laid out when size is specified in percent.
+IN_PROC_BROWSER_TEST_F(PreviewableContentsControllerTest, SizePerecent) {
+ chrome::search::Mode mode;
+ mode.mode = chrome::search::Mode::MODE_NTP;
+ CGFloat expected_height = 30;
+ InstantSizeUnits units = INSTANT_SIZE_PERCENT;
+ instant_model_.SetPreviewState(mode, expected_height, units);
+
+ EXPECT_NSEQ([web_contents_->GetNativeView() superview],
+ [controller_ view]);
+ VerifyPreviewFrame(expected_height, units);
+
+ // Resize the view and verify that the preview is also resized.
+ [[controller_ view] setFrameSize:NSMakeSize(300, 400)];
+ VerifyPreviewFrame(expected_height, units);
+}
+
+// Verify that the view is correctly laid out when size is specified in pixels.
+IN_PROC_BROWSER_TEST_F(PreviewableContentsControllerTest, SizePixels) {
+ chrome::search::Mode mode;
+ mode.mode = chrome::search::Mode::MODE_NTP;
+ CGFloat expected_height = 30;
+ InstantSizeUnits units = INSTANT_SIZE_PIXELS;
+ instant_model_.SetPreviewState(mode, expected_height, units);
+
+ EXPECT_NSEQ([web_contents_->GetNativeView() superview],
+ [controller_ view]);
+ VerifyPreviewFrame(expected_height, units);
+
+ // Resize the view and verify that the preview is also resized.
+ [[controller_ view] setFrameSize:NSMakeSize(300, 400)];
+ VerifyPreviewFrame(expected_height, units);
+}
diff --git a/chrome/chrome_nibs.gypi b/chrome/chrome_nibs.gypi
index 647cf65..ec9e56f 100644
--- a/chrome/chrome_nibs.gypi
+++ b/chrome/chrome_nibs.gypi
@@ -62,7 +62,6 @@
'app/nibs/InfoBarContainer.xib',
'app/nibs/Notification.xib',
'app/nibs/Panel.xib',
- 'app/nibs/PreviewableContents.xib',
'app/nibs/TabView.xib',
], # mac_untranslated_xibs
'mac_all_xibs': [
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index 785d321..8d3636b 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -1155,6 +1155,7 @@
'browser/ui/cocoa/intents/web_intent_inline_service_view_controller_browsertest.mm',
'browser/ui/cocoa/intents/web_intent_picker_view_controller_browsertest.mm',
'browser/ui/cocoa/ssl_client_certificate_selector_cocoa_browsertest.mm',
+ 'browser/ui/cocoa/tab_contents/previewable_contents_controller_browsertest.mm',
'browser/ui/cocoa/view_id_util_browsertest.mm',
'browser/ui/find_bar/find_bar_host_browsertest.cc',
'browser/ui/fullscreen/fullscreen_controller_browsertest.cc',