Chromium Code Reviews| Index: chrome/browser/ui/views/search_view_controller.cc |
| diff --git a/chrome/browser/ui/views/search_view_controller.cc b/chrome/browser/ui/views/search_view_controller.cc |
| index ac457f27e2c7ac86cf0579d09fe9e5720adfa52c..8e97b025fa2f55ac707b4992a936db7e27c69f9f 100644 |
| --- a/chrome/browser/ui/views/search_view_controller.cc |
| +++ b/chrome/browser/ui/views/search_view_controller.cc |
| @@ -12,14 +12,23 @@ |
| #include "chrome/browser/ui/views/frame/contents_container.h" |
| #include "chrome/browser/ui/views/location_bar/location_bar_container.h" |
| #include "chrome/browser/ui/webui/instant_ui.h" |
| +#include "chrome/common/url_constants.h" |
| +#include "content/public/browser/notification_service.h" |
| +#include "content/public/browser/notification_source.h" |
| +#include "content/public/browser/notification_types.h" |
| #include "grit/theme_resources.h" |
| #include "ui/compositor/layer.h" |
| #include "ui/compositor/scoped_layer_animation_settings.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/gfx/canvas.h" |
| +#include "ui/views/controls/webview/webview.h" |
| #include "ui/views/layout/fill_layout.h" |
| #include "ui/views/layout/layout_manager.h" |
| +#if defined(USE_AURA) |
| +#include "ui/aura/window.h" |
| +#endif |
| + |
| namespace { |
| // SearchContainerView --------------------------------------------------------- |
| @@ -141,12 +150,11 @@ class NTPViewLayoutManager : public views::LayoutManager { |
| logo_pref.width(), |
| logo_pref.height()); |
| - gfx::Size content_pref(content_view_->GetPreferredSize()); |
| - int content_y = std::max(chrome::search::kOmniboxYPosition + 50, |
| - host->height() - content_pref.height() - 50); |
| - content_view_->SetBounds((host->width() - content_pref.width()) / 2, |
| - content_y, content_pref.width(), |
| - content_pref.height()); |
| + int content_y = chrome::search::kOmniboxYPosition + 50; |
| + content_view_->SetBounds(0, |
| + content_y, |
| + host->width(), |
| + host->height() - content_y); |
| } |
| virtual gfx::Size GetPreferredSize(views::View* host) OVERRIDE { |
| @@ -216,22 +224,28 @@ void SearchViewController::OmniboxPopupViewParent::ChildPreferredSizeChanged( |
| // SearchViewController -------------------------------------------------------- |
| SearchViewController::SearchViewController( |
| + chrome::search::SearchModel* search_model, |
| + content::BrowserContext* browser_context, |
| ContentsContainer* contents_container) |
| - : contents_container_(contents_container), |
| + : search_model_(search_model), |
| + browser_context_(browser_context), |
| + contents_container_(contents_container), |
| location_bar_container_(NULL), |
| state_(STATE_NOT_VISIBLE), |
| - tab_(NULL), |
| search_container_(NULL), |
| ntp_view_(NULL), |
| logo_view_(NULL), |
| content_view_(NULL), |
| omnibox_popup_view_parent_(NULL) { |
| + search_model_->AddObserver(this); |
| omnibox_popup_view_parent_ = new OmniboxPopupViewParent(this); |
| + registrar_.Add(this, |
| + content::NOTIFICATION_WEB_CONTENTS_CONNECTED, |
| + content::NotificationService::AllSources()); |
| } |
| SearchViewController::~SearchViewController() { |
| - if (search_model()) |
| - search_model()->RemoveObserver(this); |
| + search_model_->RemoveObserver(this); |
| // If the |omnibox_popup_view_| isn't parented, delete it. Otherwise it'll be |
| // deleted by its parent. |
| @@ -243,17 +257,7 @@ views::View* SearchViewController::omnibox_popup_view_parent() { |
| return omnibox_popup_view_parent_; |
| } |
| -void SearchViewController::SetTabContents(TabContents* tab) { |
| - if (tab_ == tab) |
|
dhollowa
2012/07/20 00:34:09
I pulled this logic out because this class should
sky
2012/07/20 15:58:13
This code needs to run at a specific time. The ord
|
| - return; |
| - |
| - if (search_model()) |
| - search_model()->RemoveObserver(this); |
| - tab_ = tab; |
| - if (search_model()) |
| - search_model()->AddObserver(this); |
| - |
| - UpdateState(); |
| +void SearchViewController::SetTabContents(TabContents* tab_contents) { |
| } |
| void SearchViewController::StackAtTop() { |
| @@ -262,7 +266,10 @@ void SearchViewController::StackAtTop() { |
| StackViewsLayerAtTop(search_container_); |
| StackViewsLayerAtTop(ntp_view_); |
| StackViewsLayerAtTop(logo_view_); |
| - StackViewsLayerAtTop(content_view_); |
| + if (content_view_ && content_view_->web_contents()) { |
| + ntp_view_->layer()->StackAtTop( |
| + content_view_->web_contents()->GetNativeView()->layer()); |
| + } |
| } |
| #else |
| NOTIMPLEMENTED(); |
| @@ -292,12 +299,8 @@ void SearchViewController::OnImplicitAnimationsCompleted() { |
| } |
| void SearchViewController::UpdateState() { |
| - if (!search_model()) { |
| - DestroyViews(); |
| - return; |
| - } |
| State new_state = STATE_NOT_VISIBLE; |
| - switch (search_model()->mode().mode) { |
| + switch (search_model_->mode().mode) { |
| case chrome::search::Mode::MODE_DEFAULT: |
| break; |
| @@ -306,7 +309,7 @@ void SearchViewController::UpdateState() { |
| break; |
| case chrome::search::Mode::MODE_SEARCH: |
| - if (search_model()->mode().animate && state_ == STATE_NTP) { |
| + if (search_model_->mode().animate && state_ == STATE_NTP) { |
| new_state = STATE_ANIMATING; |
| } else { |
| // Only enter into MODE_SEARCH if the omnibox is visible. |
| @@ -334,6 +337,7 @@ void SearchViewController::SetState(State state) { |
| case STATE_NTP: |
| DestroyViews(); |
| CreateViews(); |
| + content_view_->LoadInitialURL(GURL(chrome::kChromeUINewTabURL)); |
| break; |
| case STATE_ANIMATING: |
| @@ -377,7 +381,8 @@ void SearchViewController::StartAnimation() { |
| } |
| { |
| - ui::Layer* content_layer = content_view_->layer(); |
| + ui::Layer* content_layer = |
| + content_view_->web_contents()->GetNativeView()->layer(); |
| ui::ScopedLayerAnimationSettings settings(content_layer->GetAnimator()); |
| settings.SetTransitionDuration( |
| base::TimeDelta::FromMilliseconds(180 * factor)); |
| @@ -405,17 +410,13 @@ void SearchViewController::CreateViews() { |
| logo_view_->SetPaintToLayer(true); |
| logo_view_->SetFillsBoundsOpaquely(false); |
| - // TODO: replace with WebContents for NTP. |
| - content_view_ = new views::View; |
| - content_view_->SetLayoutManager( |
| - new FixedSizeLayoutManager(gfx::Size(400, 200))); |
| - content_view_->set_background( |
| - views::Background::CreateSolidBackground(SK_ColorBLUE)); |
| - content_view_->SetPaintToLayer(true); |
| + content_view_ = new views::WebView(browser_context_); |
| content_view_->SetFillsBoundsOpaquely(false); |
| ntp_view_->SetLayoutManager( |
| new NTPViewLayoutManager(logo_view_, content_view_)); |
| + ntp_view_->AddChildView(logo_view_); |
| + ntp_view_->AddChildView(content_view_); |
| search_container_ = |
| new SearchContainerView(ntp_view_, omnibox_popup_view_parent_); |
| @@ -423,9 +424,6 @@ void SearchViewController::CreateViews() { |
| search_container_->SetLayoutManager(new views::FillLayout); |
| search_container_->layer()->SetMasksToBounds(true); |
| - ntp_view_->AddChildView(logo_view_); |
| - ntp_view_->AddChildView(content_view_); |
| - |
| contents_container_->SetOverlay(search_container_); |
| } |
| @@ -440,8 +438,10 @@ void SearchViewController::DestroyViews() { |
| contents_container_->SetOverlay(NULL); |
| delete search_container_; |
| - search_container_ = ntp_view_ = NULL; |
| - content_view_ = logo_view_ = NULL; |
| + search_container_ = NULL; |
| + ntp_view_ = NULL; |
| + logo_view_ = NULL; |
| + content_view_ = NULL; |
| state_ = STATE_NOT_VISIBLE; |
| } |
| @@ -455,6 +455,17 @@ void SearchViewController::PopupVisibilityChanged() { |
| } |
| } |
| -chrome::search::SearchModel* SearchViewController::search_model() { |
| - return tab_ ? tab_->search_tab_helper()->model() : NULL; |
| -} |
| +void SearchViewController::Observe( |
| + int type, |
| + const content::NotificationSource& source, |
| + const content::NotificationDetails& details) { |
| + DCHECK_EQ(type, content::NOTIFICATION_WEB_CONTENTS_CONNECTED); |
|
dhollowa
2012/07/20 00:34:09
sky, what I'm seeing is that during launch, when t
sky
2012/07/20 15:58:13
At the time this class is created everything shoul
|
| + if (!content_view_) |
| + return; |
| + |
| + registrar_.Remove(this, |
| + content::NOTIFICATION_WEB_CONTENTS_CONNECTED, |
| + content::NotificationService::AllSources()); |
| + content_view_->SetWebContents(NULL); |
| + content_view_->LoadInitialURL(GURL(chrome::kChromeUINewTabURL)); |
| + } |