summaryrefslogtreecommitdiffstats
path: root/ui/app_list
diff options
context:
space:
mode:
Diffstat (limited to 'ui/app_list')
-rw-r--r--ui/app_list/app_list_view_delegate.h8
-rw-r--r--ui/app_list/cocoa/app_list_view_controller.h3
-rw-r--r--ui/app_list/cocoa/app_list_view_controller.mm13
-rw-r--r--ui/app_list/cocoa/app_list_view_controller_unittest.mm26
-rw-r--r--ui/app_list/cocoa/apps_grid_controller.h3
-rw-r--r--ui/app_list/cocoa/apps_grid_controller.mm58
-rw-r--r--ui/app_list/cocoa/apps_grid_controller_unittest.mm10
-rw-r--r--ui/app_list/cocoa/test/apps_grid_controller_test_helper.h11
-rw-r--r--ui/app_list/cocoa/test/apps_grid_controller_test_helper.mm17
-rw-r--r--ui/app_list/test/app_list_test_model.cc2
-rw-r--r--ui/app_list/test/app_list_test_view_delegate.cc14
-rw-r--r--ui/app_list/test/app_list_test_view_delegate.h14
-rw-r--r--ui/app_list/views/app_list_main_view.cc25
-rw-r--r--ui/app_list/views/app_list_main_view.h5
-rw-r--r--ui/app_list/views/app_list_view.cc30
-rw-r--r--ui/app_list/views/app_list_view.h4
16 files changed, 112 insertions, 131 deletions
diff --git a/ui/app_list/app_list_view_delegate.h b/ui/app_list/app_list_view_delegate.h
index 563afc4..f2634a4 100644
--- a/ui/app_list/app_list_view_delegate.h
+++ b/ui/app_list/app_list_view_delegate.h
@@ -64,11 +64,9 @@ class APP_LIST_EXPORT AppListViewDelegate {
// only used by non-Ash Windows.
virtual void SetProfileByPath(const base::FilePath& profile_path) = 0;
- // Invoked to initialize the model that AppListView uses. This binds the given
- // model to this AppListViewDelegate and makes the AppListViewDelegate
- // responsible for updating the model.
- // Note that AppListView owns the model.
- virtual void InitModel(AppListModel* model) = 0;
+ // Gets the model associated with the view delegate. The model may be owned
+ // by the delegate, or owned elsewhere (e.g. a profile keyed service).
+ virtual AppListModel* GetModel() = 0;
// Gets the SigninDelegate for the app list. Owned by the AppListViewDelegate.
virtual SigninDelegate* GetSigninDelegate() = 0;
diff --git a/ui/app_list/cocoa/app_list_view_controller.h b/ui/app_list/cocoa/app_list_view_controller.h
index b993a67..3573ab1 100644
--- a/ui/app_list/cocoa/app_list_view_controller.h
+++ b/ui/app_list/cocoa/app_list_view_controller.h
@@ -63,9 +63,6 @@ APP_LIST_EXPORT
- (NSSegmentedControl*)pagerControl;
- (NSView*)backgroundView;
-- (void)setDelegate:(scoped_ptr<app_list::AppListViewDelegate>)newDelegate
- withTestModel:(scoped_ptr<app_list::AppListModel>)newModel;
-
@end
#endif // UI_APP_LIST_COCOA_APP_LIST_VIEW_CONTROLLER_H_
diff --git a/ui/app_list/cocoa/app_list_view_controller.mm b/ui/app_list/cocoa/app_list_view_controller.mm
index d9b4f54..51a71cf 100644
--- a/ui/app_list/cocoa/app_list_view_controller.mm
+++ b/ui/app_list/cocoa/app_list_view_controller.mm
@@ -150,18 +150,18 @@ void AppListModelObserverBridge::OnAppListModelSigninStatusChanged() {
return delegate_.get();
}
-- (void)setDelegate:(scoped_ptr<app_list::AppListViewDelegate>)newDelegate
- withTestModel:(scoped_ptr<app_list::AppListModel>)newModel {
+- (void)setDelegate:(scoped_ptr<app_list::AppListViewDelegate>)newDelegate {
if (delegate_) {
// First clean up, in reverse order.
app_list_model_observer_bridge_.reset();
[appsSearchResultsController_ setDelegate:nil];
[appsSearchBoxController_ setDelegate:nil];
+ [appsGridController_ setDelegate:nil];
}
delegate_.reset(newDelegate.release());
+ if (!delegate_)
+ return;
[appsGridController_ setDelegate:delegate_.get()];
- if (newModel.get())
- [appsGridController_ setModel:newModel.Pass()];
[appsSearchBoxController_ setDelegate:self];
[appsSearchResultsController_ setDelegate:self];
app_list_model_observer_bridge_.reset(
@@ -169,11 +169,6 @@ void AppListModelObserverBridge::OnAppListModelSigninStatusChanged() {
[self onSigninStatusChanged];
}
-- (void)setDelegate:(scoped_ptr<app_list::AppListViewDelegate>)newDelegate {
- [self setDelegate:newDelegate.Pass()
- withTestModel:scoped_ptr<app_list::AppListModel>()];
-}
-
-(void)loadAndSetView {
pagerControl_.reset([[AppListPagerView alloc] init]);
[pagerControl_ setTarget:appsGridController_];
diff --git a/ui/app_list/cocoa/app_list_view_controller_unittest.mm b/ui/app_list/cocoa/app_list_view_controller_unittest.mm
index 2836ceb..2f1ea39 100644
--- a/ui/app_list/cocoa/app_list_view_controller_unittest.mm
+++ b/ui/app_list/cocoa/app_list_view_controller_unittest.mm
@@ -21,6 +21,10 @@ class AppListViewControllerTest : public AppsGridControllerTestHelper,
virtual void SetUp() OVERRIDE {
app_list_view_controller_.reset([[AppListViewController alloc] init]);
+ scoped_ptr<AppListTestViewDelegate> delegate(new AppListTestViewDelegate);
+ delegate->set_test_signin_delegate(this);
+ [app_list_view_controller_
+ setDelegate:delegate.PassAs<app_list::AppListViewDelegate>()];
SetUpWithGridController([app_list_view_controller_ appsGridController]);
[[test_window() contentView] addSubview:[app_list_view_controller_ view]];
}
@@ -32,12 +36,13 @@ class AppListViewControllerTest : public AppsGridControllerTestHelper,
AppsGridControllerTestHelper::TearDown();
}
- virtual void ResetModel(scoped_ptr<AppListModel> new_model) OVERRIDE {
+ void ReplaceTestModel(int item_count) {
+ [app_list_view_controller_
+ setDelegate:scoped_ptr<app_list::AppListViewDelegate>()];
scoped_ptr<AppListTestViewDelegate> delegate(new AppListTestViewDelegate);
- delegate->set_test_signin_delegate(this);
+ delegate->ReplaceTestModel(item_count);
[app_list_view_controller_
- setDelegate:delegate.PassAs<AppListViewDelegate>()
- withTestModel:new_model.Pass()];
+ setDelegate:delegate.PassAs<app_list::AppListViewDelegate>()];
}
// SigninDelegate overrides:
@@ -60,6 +65,15 @@ class AppListViewControllerTest : public AppsGridControllerTestHelper,
return base::string16();
}
+ AppListTestViewDelegate* delegate() {
+ return static_cast<AppListTestViewDelegate*>(
+ [app_list_view_controller_ delegate]);
+ }
+
+ AppListTestModel* model() {
+ return delegate()->GetTestModel();
+ }
+
protected:
base::scoped_nsobject<AppListViewController> app_list_view_controller_;
@@ -122,9 +136,7 @@ TEST_F(AppListViewControllerTest, SignedIn) {
// Test the view when signin is required.
TEST_F(AppListViewControllerTest, NeedsSignin) {
// Begin the test with a signed out app list.
- scoped_ptr<AppListModel> new_model(new AppListModel);
- new_model->SetSignedIn(false);
- ResetModel(new_model.Pass());
+ model()->SetSignedIn(false);
EXPECT_EQ(2u, [[[app_list_view_controller_ view] subviews] count]);
EXPECT_TRUE([[app_list_view_controller_ backgroundView] isHidden]);
diff --git a/ui/app_list/cocoa/apps_grid_controller.h b/ui/app_list/cocoa/apps_grid_controller.h
index b53c814..e565331 100644
--- a/ui/app_list/cocoa/apps_grid_controller.h
+++ b/ui/app_list/cocoa/apps_grid_controller.h
@@ -29,7 +29,6 @@ APP_LIST_EXPORT
AppListPagerDelegate,
NSCollectionViewDelegate> {
@private
- scoped_ptr<app_list::AppListModel> model_;
app_list::AppListViewDelegate* delegate_; // Weak. Owned by view controller.
scoped_ptr<app_list::AppsGridDelegateBridge> bridge_;
@@ -66,8 +65,6 @@ APP_LIST_EXPORT
- (app_list::AppListModel*)model;
-- (void)setModel:(scoped_ptr<app_list::AppListModel>)newModel;
-
- (void)setDelegate:(app_list::AppListViewDelegate*)newDelegate;
- (size_t)visiblePage;
diff --git a/ui/app_list/cocoa/apps_grid_controller.mm b/ui/app_list/cocoa/apps_grid_controller.mm
index d450ef4..dc5145c 100644
--- a/ui/app_list/cocoa/apps_grid_controller.mm
+++ b/ui/app_list/cocoa/apps_grid_controller.mm
@@ -164,7 +164,6 @@ class AppsGridDelegateBridge : public AppListItemListObserver {
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
- [self setModel:scoped_ptr<app_list::AppListModel>()];
[super dealloc];
}
@@ -181,45 +180,43 @@ class AppsGridDelegateBridge : public AppListItemListObserver {
}
- (app_list::AppListModel*)model {
- return model_.get();
+ return delegate_ ? delegate_->GetModel() : NULL;
}
-- (void)setModel:(scoped_ptr<app_list::AppListModel>)newModel {
- if (model_) {
- model_->item_list()->RemoveObserver(bridge_.get());
+- (void)setDelegate:(app_list::AppListViewDelegate*)newDelegate {
+ if (delegate_) {
+ app_list::AppListModel* oldModel = delegate_->GetModel();
+ if (oldModel)
+ oldModel->item_list()->RemoveObserver(bridge_.get());
+ }
- // Since the model is about to be deleted, and the AppKit objects might be
- // sitting in an NSAutoreleasePool, ensure there are no references to the
- // model.
- for (size_t i = 0; i < [items_ count]; ++i)
- [[self itemAtIndex:i] setModel:NULL];
+ // Since the old model may be getting deleted, and the AppKit objects might
+ // be sitting in an NSAutoreleasePool, ensure there are no references to
+ // the model.
+ for (size_t i = 0; i < [items_ count]; ++i)
+ [[self itemAtIndex:i] setModel:NULL];
- [items_ removeAllObjects];
- [self updatePages:0];
- [self scrollToPage:0];
- }
+ [items_ removeAllObjects];
+ [self updatePages:0];
+ [self scrollToPage:0];
+
+ delegate_ = newDelegate;
+ if (!delegate_)
+ return;
- model_.reset(newModel.release());
- if (!model_)
+ app_list::AppListModel* newModel = delegate_->GetModel();
+ if (!newModel)
return;
- model_->item_list()->AddObserver(bridge_.get());
- for (size_t i = 0; i < model_->item_list()->item_count(); ++i) {
- app_list::AppListItemModel* itemModel = model_->item_list()->item_at(i);
+ newModel->item_list()->AddObserver(bridge_.get());
+ for (size_t i = 0; i < newModel->item_list()->item_count(); ++i) {
+ app_list::AppListItemModel* itemModel = newModel->item_list()->item_at(i);
[items_ insertObject:[NSValue valueWithPointer:itemModel]
atIndex:i];
}
[self updatePages:0];
}
-- (void)setDelegate:(app_list::AppListViewDelegate*)newDelegate {
- scoped_ptr<app_list::AppListModel> newModel(new app_list::AppListModel);
- delegate_ = newDelegate;
- if (delegate_)
- delegate_->InitModel(newModel.get()); // Populates items.
- [self setModel:newModel.Pass()];
-}
-
- (size_t)visiblePage {
return visiblePage_;
}
@@ -524,9 +521,10 @@ class AppsGridDelegateBridge : public AppListItemListObserver {
if (itemIndex == modelIndex)
return;
- model_->item_list()->RemoveObserver(bridge_.get());
- model_->item_list()->MoveItem(itemIndex, modelIndex);
- model_->item_list()->AddObserver(bridge_.get());
+ app_list::AppListItemList* itemList = [self model]->item_list();
+ itemList->RemoveObserver(bridge_.get());
+ itemList->MoveItem(itemIndex, modelIndex);
+ itemList->AddObserver(bridge_.get());
}
- (AppsCollectionViewDragManager*)dragManager {
diff --git a/ui/app_list/cocoa/apps_grid_controller_unittest.mm b/ui/app_list/cocoa/apps_grid_controller_unittest.mm
index 5692574..b43ab44 100644
--- a/ui/app_list/cocoa/apps_grid_controller_unittest.mm
+++ b/ui/app_list/cocoa/apps_grid_controller_unittest.mm
@@ -113,6 +113,16 @@ class AppsGridControllerTest : public AppsGridControllerTestHelper {
AppsGridControllerTestHelper::TearDown();
}
+ void ReplaceTestModel(int item_count) {
+ // Clear the delegate before reseting and destroying the model.
+ [owned_apps_grid_controller_ setDelegate:NULL];
+
+ owned_delegate_->ReplaceTestModel(item_count);
+ [owned_apps_grid_controller_ setDelegate:owned_delegate_.get()];
+ }
+
+ AppListTestModel* model() { return owned_delegate_->GetTestModel(); }
+
private:
base::scoped_nsobject<AppsGridController> owned_apps_grid_controller_;
scoped_ptr<AppListTestViewDelegate> owned_delegate_;
diff --git a/ui/app_list/cocoa/test/apps_grid_controller_test_helper.h b/ui/app_list/cocoa/test/apps_grid_controller_test_helper.h
index 1e2eb27..64c9e15 100644
--- a/ui/app_list/cocoa/test/apps_grid_controller_test_helper.h
+++ b/ui/app_list/cocoa/test/apps_grid_controller_test_helper.h
@@ -13,12 +13,8 @@
namespace app_list {
-class AppListModel;
-
namespace test {
-class AppListTestModel;
-
class AppsGridControllerTestHelper : public ui::CocoaTest {
public:
static const size_t kItemsPerPage;
@@ -38,9 +34,6 @@ class AppsGridControllerTestHelper : public ui::CocoaTest {
void SimulateMouseEnterItemAt(size_t index);
void SimulateMouseExitItemAt(size_t index);
- // Do a bulk replacement of the items in the grid.
- void ReplaceTestModel(int item_count);
-
// Get a string representation of the items as they are currently ordered in
// the view. Each page will start and end with a | character.
std::string GetViewContent() const;
@@ -57,10 +50,6 @@ class AppsGridControllerTestHelper : public ui::CocoaTest {
NSCollectionView* GetPageAt(size_t index);
NSView* GetSelectedView();
- AppListTestModel* model();
-
- virtual void ResetModel(scoped_ptr<AppListModel> model);
-
AppsGridController* apps_grid_controller_;
private:
diff --git a/ui/app_list/cocoa/test/apps_grid_controller_test_helper.mm b/ui/app_list/cocoa/test/apps_grid_controller_test_helper.mm
index 9b971a82..f24b7d4 100644
--- a/ui/app_list/cocoa/test/apps_grid_controller_test_helper.mm
+++ b/ui/app_list/cocoa/test/apps_grid_controller_test_helper.mm
@@ -9,7 +9,6 @@
#include "ui/app_list/app_list_item_model.h"
#import "ui/app_list/cocoa/apps_grid_controller.h"
#import "ui/app_list/cocoa/apps_grid_view_item.h"
-#include "ui/app_list/test/app_list_test_model.h"
#import "ui/base/test/cocoa_test_event_utils.h"
namespace app_list {
@@ -28,7 +27,6 @@ void AppsGridControllerTestHelper::SetUpWithGridController(
AppsGridController* grid_controller) {
ui::CocoaTest::SetUp();
apps_grid_controller_ = grid_controller;
- ReplaceTestModel(0);
}
void AppsGridControllerTestHelper::SimulateClick(NSView* view) {
@@ -52,17 +50,6 @@ void AppsGridControllerTestHelper::SimulateMouseExitItemAt(size_t index) {
cocoa_test_event_utils::EnterExitEventWithType(NSMouseExited)];
}
-void AppsGridControllerTestHelper::ReplaceTestModel(int item_count) {
- scoped_ptr<AppListTestModel> new_model(new AppListTestModel);
- new_model->PopulateApps(item_count);
- ResetModel(new_model.PassAs<AppListModel>());
-}
-
-void AppsGridControllerTestHelper::ResetModel(
- scoped_ptr<AppListModel> new_model) {
- [apps_grid_controller_ setModel:new_model.Pass()];
-}
-
std::string AppsGridControllerTestHelper::GetViewContent() const {
std::string s;
for (size_t page_index = 0; page_index < [apps_grid_controller_ pageCount];
@@ -128,9 +115,5 @@ NSView* AppsGridControllerTestHelper::GetSelectedView() {
return GetItemViewAt([apps_grid_controller_ selectedItemIndex]);
}
-AppListTestModel* AppsGridControllerTestHelper::model() {
- return static_cast<AppListTestModel*>([apps_grid_controller_ model]);
-}
-
} // namespace test
} // namespace app_list
diff --git a/ui/app_list/test/app_list_test_model.cc b/ui/app_list/test/app_list_test_model.cc
index 4fd1acc..c9ca1c1 100644
--- a/ui/app_list/test/app_list_test_model.cc
+++ b/ui/app_list/test/app_list_test_model.cc
@@ -45,7 +45,7 @@ std::string AppListTestModel::GetItemName(int id) {
}
void AppListTestModel::PopulateApps(int n) {
- int start_index = item_list()->item_count();
+ int start_index = static_cast<int>(item_list()->item_count());
for (int i = 0; i < n; ++i)
CreateAndAddItem(GetItemName(start_index + i));
}
diff --git a/ui/app_list/test/app_list_test_view_delegate.cc b/ui/app_list/test/app_list_test_view_delegate.cc
index d04ae4e..aba8d93 100644
--- a/ui/app_list/test/app_list_test_view_delegate.cc
+++ b/ui/app_list/test/app_list_test_view_delegate.cc
@@ -6,6 +6,8 @@
#include "base/callback.h"
#include "base/files/file_path.h"
+#include "ui/app_list/app_list_model.h"
+#include "ui/app_list/test/app_list_test_model.h"
#include "ui/gfx/image/image_skia.h"
namespace app_list {
@@ -13,7 +15,8 @@ namespace test {
AppListTestViewDelegate::AppListTestViewDelegate()
: dismiss_count_(0),
- test_signin_delegate_(NULL) {
+ test_signin_delegate_(NULL),
+ model_(new AppListTestModel) {
}
AppListTestViewDelegate::~AppListTestViewDelegate() {}
@@ -22,6 +25,10 @@ bool AppListTestViewDelegate::ForceNativeDesktop() const {
return false;
}
+AppListModel* AppListTestViewDelegate::GetModel() {
+ return model_.get();
+}
+
SigninDelegate* AppListTestViewDelegate::GetSigninDelegate() {
return test_signin_delegate_;
}
@@ -48,5 +55,10 @@ const AppListViewDelegate::Users& AppListTestViewDelegate::GetUsers() const {
return users_;
}
+void AppListTestViewDelegate::ReplaceTestModel(int item_count) {
+ model_.reset(new AppListTestModel);
+ model_->PopulateApps(item_count);
+}
+
} // namespace test
} // namespace app_list
diff --git a/ui/app_list/test/app_list_test_view_delegate.h b/ui/app_list/test/app_list_test_view_delegate.h
index 9f1bacd..bbe3447 100644
--- a/ui/app_list/test/app_list_test_view_delegate.h
+++ b/ui/app_list/test/app_list_test_view_delegate.h
@@ -7,13 +7,16 @@
#include "base/callback_forward.h"
#include "base/compiler_specific.h"
+#include "base/memory/scoped_ptr.h"
#include "ui/app_list/app_list_view_delegate.h"
namespace app_list {
namespace test {
+class AppListTestModel;
+
// A concrete AppListViewDelegate for unit tests.
-class AppListTestViewDelegate : public AppListViewDelegate {
+class AppListTestViewDelegate : public AppListViewDelegate {
public:
AppListTestViewDelegate();
virtual ~AppListTestViewDelegate();
@@ -30,7 +33,7 @@ class AppListTestViewDelegate : public AppListViewDelegate {
// AppListViewDelegate overrides:
virtual bool ForceNativeDesktop() const OVERRIDE;
virtual void SetProfileByPath(const base::FilePath& profile_path) OVERRIDE {}
- virtual void InitModel(AppListModel* model) OVERRIDE {}
+ virtual AppListModel* GetModel() OVERRIDE;
virtual SigninDelegate* GetSigninDelegate() OVERRIDE;
virtual void GetShortcutPathForApp(
const std::string& app_id,
@@ -54,11 +57,16 @@ class AppListTestViewDelegate : public AppListViewDelegate {
virtual content::WebContents* GetStartPageContents() OVERRIDE;
virtual const Users& GetUsers() const OVERRIDE;
+ // Do a bulk replacement of the items in the model.
+ void ReplaceTestModel(int item_count);
+
+ AppListTestModel* GetTestModel() { return model_.get(); }
+
private:
int dismiss_count_;
Users users_;
SigninDelegate* test_signin_delegate_; // Weak. Owned by test.
-
+ scoped_ptr<AppListTestModel> model_;
};
} // namespace test
diff --git a/ui/app_list/views/app_list_main_view.cc b/ui/app_list/views/app_list_main_view.cc
index dd1a30c..a4cd7a9 100644
--- a/ui/app_list/views/app_list_main_view.cc
+++ b/ui/app_list/views/app_list_main_view.cc
@@ -78,11 +78,10 @@ class AppListMainView::IconLoader : public AppListItemModelObserver {
// AppListMainView:
AppListMainView::AppListMainView(AppListViewDelegate* delegate,
- AppListModel* model,
PaginationModel* pagination_model,
gfx::NativeView parent)
: delegate_(delegate),
- model_(model),
+ model_(delegate->GetModel()),
search_box_view_(NULL),
contents_view_(NULL),
weak_ptr_factory_(this) {
@@ -201,11 +200,7 @@ void AppListMainView::ActivateApp(AppListItemModel* item, int event_flags) {
void AppListMainView::GetShortcutPathForApp(
const std::string& app_id,
const base::Callback<void(const base::FilePath&)>& callback) {
- if (delegate_) {
- delegate_->GetShortcutPathForApp(app_id, callback);
- return;
- }
- callback.Run(base::FilePath());
+ delegate_->GetShortcutPathForApp(app_id, callback);
}
void AppListMainView::QueryChanged(SearchBoxView* sender) {
@@ -214,24 +209,20 @@ void AppListMainView::QueryChanged(SearchBoxView* sender) {
bool should_show_search = !query.empty();
contents_view_->ShowSearchResults(should_show_search);
- if (delegate_) {
- if (should_show_search)
- delegate_->StartSearch();
- else
- delegate_->StopSearch();
- }
+ if (should_show_search)
+ delegate_->StartSearch();
+ else
+ delegate_->StopSearch();
}
void AppListMainView::OpenResult(SearchResult* result, int event_flags) {
- if (delegate_)
- delegate_->OpenSearchResult(result, event_flags);
+ delegate_->OpenSearchResult(result, event_flags);
}
void AppListMainView::InvokeResultAction(SearchResult* result,
int action_index,
int event_flags) {
- if (delegate_)
- delegate_->InvokeSearchResultAction(result, action_index, event_flags);
+ delegate_->InvokeSearchResultAction(result, action_index, event_flags);
}
void AppListMainView::OnResultInstalled(SearchResult* result) {
diff --git a/ui/app_list/views/app_list_main_view.h b/ui/app_list/views/app_list_main_view.h
index b9a5cdc..c0de4a0 100644
--- a/ui/app_list/views/app_list_main_view.h
+++ b/ui/app_list/views/app_list_main_view.h
@@ -38,7 +38,6 @@ class AppListMainView : public views::View,
public:
// Takes ownership of |delegate|.
explicit AppListMainView(AppListViewDelegate* delegate,
- AppListModel* model,
PaginationModel* pagination_model,
gfx::NativeView parent);
virtual ~AppListMainView();
@@ -90,8 +89,8 @@ class AppListMainView : public views::View,
virtual void OnResultInstalled(SearchResult* result) OVERRIDE;
virtual void OnResultUninstalled(SearchResult* result) OVERRIDE;
- AppListViewDelegate* delegate_;
- AppListModel* model_;
+ AppListViewDelegate* delegate_; // Owned by parent (AppListView)
+ AppListModel* model_; // Unowned; ownership is handled by |delegate_|.
SearchBoxView* search_box_view_; // Owned by views hierarchy.
ContentsView* contents_view_; // Owned by views hierarchy.
diff --git a/ui/app_list/views/app_list_view.cc b/ui/app_list/views/app_list_view.cc
index 3d7ece3..d6e9dfa 100644
--- a/ui/app_list/views/app_list_view.cc
+++ b/ui/app_list/views/app_list_view.cc
@@ -67,18 +67,16 @@ bool SupportsShadow() {
// AppListView:
AppListView::AppListView(AppListViewDelegate* delegate)
- : model_(new AppListModel),
- delegate_(delegate),
+ : delegate_(delegate),
app_list_main_view_(NULL),
signin_view_(NULL) {
- if (delegate_)
- delegate_->InitModel(model_.get());
- model_->AddObserver(this);
+ CHECK(delegate);
+ delegate_->GetModel()->AddObserver(this);
}
AppListView::~AppListView() {
- model_->RemoveObserver(this);
- // Models are going away, ensure their references are cleared.
+ delegate_->GetModel()->RemoveObserver(this);
+ // Remove child views first to ensure no remaining dependencies on delegate_.
RemoveAllChildViews(true);
}
@@ -128,10 +126,7 @@ void AppListView::ShowWhenReady() {
void AppListView::Close() {
app_list_main_view_->Close();
- if (delegate_)
- delegate_->Dismiss();
- else
- GetWidget()->Close();
+ delegate_->Dismiss();
}
void AppListView::UpdateBounds() {
@@ -159,8 +154,9 @@ void AppListView::Prerender() {
}
void AppListView::OnSigninStatusChanged() {
- signin_view_->SetVisible(!model_->signed_in());
- app_list_main_view_->SetVisible(model_->signed_in());
+ AppListModel* model = delegate_->GetModel();
+ signin_view_->SetVisible(!model->signed_in());
+ app_list_main_view_->SetVisible(model->signed_in());
app_list_main_view_->search_box_view()->InvalidateMenu();
}
@@ -199,7 +195,6 @@ void AppListView::InitAsBubbleInternal(gfx::NativeView parent,
bool border_accepts_events,
const gfx::Vector2d& anchor_offset) {
app_list_main_view_ = new AppListMainView(delegate_.get(),
- model_.get(),
pagination_model,
parent);
AddChildView(app_list_main_view_);
@@ -209,10 +204,9 @@ void AppListView::InitAsBubbleInternal(gfx::NativeView parent,
app_list_main_view_->layer()->SetMasksToBounds(true);
#endif
- signin_view_ = new SigninView(
- delegate_ ? delegate_->GetSigninDelegate()
- : NULL,
- app_list_main_view_->GetPreferredSize().width());
+ signin_view_ =
+ new SigninView(delegate_->GetSigninDelegate(),
+ app_list_main_view_->GetPreferredSize().width());
AddChildView(signin_view_);
OnSigninStatusChanged();
diff --git a/ui/app_list/views/app_list_view.h b/ui/app_list/views/app_list_view.h
index 46c3784..2d273ce 100644
--- a/ui/app_list/views/app_list_view.h
+++ b/ui/app_list/views/app_list_view.h
@@ -102,7 +102,6 @@ class APP_LIST_EXPORT AppListView : public views::BubbleDelegateView,
HWND GetHWND() const;
#endif
- AppListModel* model() { return model_.get(); }
AppListMainView* app_list_main_view() { return app_list_main_view_; }
private:
@@ -139,10 +138,9 @@ class APP_LIST_EXPORT AppListView : public views::BubbleDelegateView,
SigninDelegate* GetSigninDelegate();
- scoped_ptr<AppListModel> model_;
scoped_ptr<AppListViewDelegate> delegate_;
- AppListMainView* app_list_main_view_;
+ AppListMainView* app_list_main_view_;
SigninView* signin_view_;
ObserverList<Observer> observers_;