Commit dbcee380 authored by oshima's avatar oshima Committed by Commit bot

Delete activity upon window deletion

 (there was no leak reported because they're deleted upon shutdown)

A few minor cleanup/improvements
* Added shortcut to close athena. This doesn't update overview/split view mode.
  I'll address it in separate CL.
* Delete unnecessary athena_content_support_lib target. (I somehow missed this in review)
* Separate app_shell specific impl in extensions_delegate  (this is prep for athena+chrome)
* Remove ActivityWidget wrapper and use views::Widget instead, as it seems to be unnecessary. This is also prep for athena+chrome, where AppActivity should use NativeAppWindowViews.

BUG=None
TEST=coverted by unittests.
TBR=jamescook@chromium.org

Review URL: https://codereview.chromium.org/498023003

Cr-Commit-Position: refs/heads/master@{#291935}
parent 900d3d42
...@@ -2,10 +2,9 @@ ...@@ -2,10 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "athena/activity/public/activity_manager.h" #include "athena/activity/activity_manager_impl.h"
#include <algorithm> #include <algorithm>
#include <vector>
#include "athena/activity/public/activity.h" #include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_view_manager.h" #include "athena/activity/public/activity_view_manager.h"
...@@ -17,54 +16,43 @@ namespace { ...@@ -17,54 +16,43 @@ namespace {
ActivityManager* instance = NULL; ActivityManager* instance = NULL;
class ActivityManagerImpl : public ActivityManager { } // namespace
public:
ActivityManagerImpl() {
CHECK(!instance);
instance = this;
}
virtual ~ActivityManagerImpl() {
while (!activities_.empty())
delete activities_.front();
CHECK_EQ(this, instance); ActivityManagerImpl::ActivityManagerImpl() {
instance = NULL; CHECK(!instance);
} instance = this;
}
// ActivityManager: ActivityManagerImpl::~ActivityManagerImpl() {
virtual void AddActivity(Activity* activity) OVERRIDE { while (!activities_.empty())
CHECK(activities_.end() == std::find(activities_.begin(), delete activities_.front();
activities_.end(),
activity));
activities_.push_back(activity);
ActivityViewManager* manager = ActivityViewManager::Get();
manager->AddActivity(activity);
}
virtual void RemoveActivity(Activity* activity) OVERRIDE { CHECK_EQ(this, instance);
std::vector<Activity*>::iterator find = std::find(activities_.begin(), instance = NULL;
activities_.end(), }
activity);
if (find != activities_.end()) {
activities_.erase(find);
ActivityViewManager* manager = ActivityViewManager::Get(); void ActivityManagerImpl::AddActivity(Activity* activity) {
manager->RemoveActivity(activity); CHECK(activities_.end() ==
} std::find(activities_.begin(), activities_.end(), activity));
} activities_.push_back(activity);
ActivityViewManager* manager = ActivityViewManager::Get();
manager->AddActivity(activity);
}
virtual void UpdateActivity(Activity* activity) OVERRIDE { void ActivityManagerImpl::RemoveActivity(Activity* activity) {
std::vector<Activity*>::iterator find =
std::find(activities_.begin(), activities_.end(), activity);
if (find != activities_.end()) {
activities_.erase(find);
ActivityViewManager* manager = ActivityViewManager::Get(); ActivityViewManager* manager = ActivityViewManager::Get();
manager->UpdateActivity(activity); manager->RemoveActivity(activity);
} }
}
private: void ActivityManagerImpl::UpdateActivity(Activity* activity) {
std::vector<Activity*> activities_; ActivityViewManager* manager = ActivityViewManager::Get();
manager->UpdateActivity(activity);
DISALLOW_COPY_AND_ASSIGN(ActivityManagerImpl); }
};
} // namespace
// static // static
ActivityManager* ActivityManager::Create() { ActivityManager* ActivityManager::Create() {
......
// Copyright 2014 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.
#include "athena/activity/public/activity_manager.h"
#include <vector>
#include "base/macros.h"
namespace athena {
class ActivityManagerImpl : public ActivityManager {
public:
ActivityManagerImpl();
virtual ~ActivityManagerImpl();
int num_activities() const { return activities_.size(); }
// ActivityManager:
virtual void AddActivity(Activity* activity) OVERRIDE;
virtual void RemoveActivity(Activity* activity) OVERRIDE;
virtual void UpdateActivity(Activity* activity) OVERRIDE;
private:
std::vector<Activity*> activities_;
DISALLOW_COPY_AND_ASSIGN(ActivityManagerImpl);
};
} // namespace athena
...@@ -2,14 +2,36 @@ ...@@ -2,14 +2,36 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "athena/activity/public/activity_manager.h" #include "athena/activity/activity_manager_impl.h"
#include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_factory.h" #include "athena/activity/public/activity_factory.h"
#include "athena/test/athena_test_base.h" #include "athena/test/athena_test_base.h"
#include "ui/aura/window.h"
typedef athena::test::AthenaTestBase ActivityManagerTest; namespace athena {
typedef test::AthenaTestBase ActivityManagerTest;
TEST_F(ActivityManagerTest, Basic) { TEST_F(ActivityManagerTest, Basic) {
athena::ActivityManager::Get()->AddActivity( ActivityManagerImpl* activity_manager =
static_cast<ActivityManagerImpl*>(ActivityManager::Get());
scoped_ptr<Activity> activity1(
athena::ActivityFactory::Get()->CreateWebActivity(NULL, GURL())); athena::ActivityFactory::Get()->CreateWebActivity(NULL, GURL()));
activity_manager->AddActivity(activity1.get());
EXPECT_EQ(1, activity_manager->num_activities());
Activity* activity2 =
athena::ActivityFactory::Get()->CreateWebActivity(NULL, GURL());
activity_manager->AddActivity(activity2);
EXPECT_EQ(2, activity_manager->num_activities());
activity1.reset();
EXPECT_EQ(1, activity_manager->num_activities());
// Deleting the activity's window should delete the activity itself.
delete activity2->GetWindow();
EXPECT_EQ(0, activity_manager->num_activities());
} }
} // namespace athena
...@@ -9,59 +9,40 @@ ...@@ -9,59 +9,40 @@
#include "athena/activity/activity_widget_delegate.h" #include "athena/activity/activity_widget_delegate.h"
#include "athena/activity/public/activity.h" #include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_manager.h"
#include "athena/activity/public/activity_view_model.h" #include "athena/activity/public/activity_view_model.h"
#include "athena/screen/public/screen_manager.h" #include "athena/screen/public/screen_manager.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
#include "ui/views/view.h" #include "ui/views/view.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_observer.h"
namespace athena { namespace athena {
namespace { namespace {
class ActivityWidget { typedef std::map<Activity*, views::Widget*> ActivityWidgetMap;
public:
explicit ActivityWidget(Activity* activity) views::Widget* CreateWidget(Activity* activity) {
: activity_(activity), widget_(NULL) { ActivityViewModel* view_model = activity->GetActivityViewModel();
ActivityViewModel* view_model = activity->GetActivityViewModel(); views::Widget* widget = new views::Widget;
widget_ = new views::Widget; views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); params.delegate = new ActivityWidgetDelegate(view_model);
params.context = ScreenManager::Get()->GetContext(); params.activatable = views::Widget::InitParams::ACTIVATABLE_YES;
params.delegate = new ActivityWidgetDelegate(view_model); widget->Init(params);
params.activatable = views::Widget::InitParams::ACTIVATABLE_YES; activity->GetActivityViewModel()->Init();
widget_->Init(params); return widget;
activity_->GetActivityViewModel()->Init(); }
}
virtual ~ActivityWidget() {
widget_->Close();
}
void Show() {
Update();
widget_->Show();
widget_->Activate();
}
void Update() {
widget_->UpdateWindowTitle();
}
private:
Activity* activity_;
views::Widget* widget_;
DISALLOW_COPY_AND_ASSIGN(ActivityWidget);
};
ActivityViewManager* instance = NULL; ActivityViewManager* instance = NULL;
class ActivityViewManagerImpl : public ActivityViewManager { class ActivityViewManagerImpl : public ActivityViewManager,
public views::WidgetObserver {
public: public:
ActivityViewManagerImpl() { ActivityViewManagerImpl() {
CHECK(!instance); CHECK(!instance);
instance = this; instance = this;
} }
virtual ~ActivityViewManagerImpl() { virtual ~ActivityViewManagerImpl() {
CHECK_EQ(this, instance); CHECK_EQ(this, instance);
instance = NULL; instance = NULL;
...@@ -70,30 +51,44 @@ class ActivityViewManagerImpl : public ActivityViewManager { ...@@ -70,30 +51,44 @@ class ActivityViewManagerImpl : public ActivityViewManager {
// ActivityViewManager: // ActivityViewManager:
virtual void AddActivity(Activity* activity) OVERRIDE { virtual void AddActivity(Activity* activity) OVERRIDE {
CHECK(activity_widgets_.end() == activity_widgets_.find(activity)); CHECK(activity_widgets_.end() == activity_widgets_.find(activity));
ActivityWidget* container = new ActivityWidget(activity); views::Widget* container = CreateWidget(activity);
container->AddObserver(this);
activity_widgets_[activity] = container; activity_widgets_[activity] = container;
container->UpdateWindowTitle();
container->Show(); container->Show();
container->Activate();
} }
virtual void RemoveActivity(Activity* activity) OVERRIDE { virtual void RemoveActivity(Activity* activity) OVERRIDE {
std::map<Activity*, ActivityWidget*>::iterator find = ActivityWidgetMap::iterator find = activity_widgets_.find(activity);
activity_widgets_.find(activity);
if (find != activity_widgets_.end()) { if (find != activity_widgets_.end()) {
ActivityWidget* widget = find->second; views::Widget* widget = find->second;
widget->RemoveObserver(this);
widget->Close();
activity_widgets_.erase(activity); activity_widgets_.erase(activity);
delete widget;
} }
} }
virtual void UpdateActivity(Activity* activity) OVERRIDE { virtual void UpdateActivity(Activity* activity) OVERRIDE {
std::map<Activity*, ActivityWidget*>::iterator find = ActivityWidgetMap::iterator find = activity_widgets_.find(activity);
activity_widgets_.find(activity);
if (find != activity_widgets_.end()) if (find != activity_widgets_.end())
find->second->Update(); find->second->UpdateWindowTitle();
}
// views::WidgetObserver:
virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE {
for (ActivityWidgetMap::iterator iter = activity_widgets_.begin();
iter != activity_widgets_.end();
++iter) {
if (iter->second == widget) {
delete iter->first;
break;
}
}
} }
private: private:
std::map<Activity*, ActivityWidget*> activity_widgets_; ActivityWidgetMap activity_widgets_;
DISALLOW_COPY_AND_ASSIGN(ActivityViewManagerImpl); DISALLOW_COPY_AND_ASSIGN(ActivityViewManagerImpl);
}; };
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
'activity/activity.cc', 'activity/activity.cc',
'activity/activity_factory.cc', 'activity/activity_factory.cc',
'activity/activity_manager_impl.cc', 'activity/activity_manager_impl.cc',
'activity/activity_manager_impl.h',
'activity/activity_view_manager_impl.cc', 'activity/activity_view_manager_impl.cc',
'activity/activity_frame_view.cc', 'activity/activity_frame_view.cc',
'activity/activity_frame_view.h', 'activity/activity_frame_view.h',
...@@ -115,9 +116,6 @@ ...@@ -115,9 +116,6 @@
'../ui/views/controls/webview/webview.gyp:webview', '../ui/views/controls/webview/webview.gyp:webview',
'../skia/skia.gyp:skia', '../skia/skia.gyp:skia',
], ],
'defines': [
'ATHENA_IMPLEMENTATION',
],
'sources': [ 'sources': [
'content/app_activity.cc', 'content/app_activity.cc',
'content/app_activity.h', 'content/app_activity.h',
...@@ -128,6 +126,8 @@ ...@@ -128,6 +126,8 @@
'content/app_registry_impl.cc', 'content/app_registry_impl.cc',
'content/content_activity_factory.cc', 'content/content_activity_factory.cc',
'content/content_app_model_builder.cc', 'content/content_app_model_builder.cc',
'content/delegate/app_content_control_delegate_impl.cc',
'content/public/app_content_control_delegate.h',
'content/public/app_registry.h', 'content/public/app_registry.h',
'content/public/content_activity_factory.h', 'content/public/content_activity_factory.h',
'content/public/content_app_model_builder.h', 'content/public/content_app_model_builder.h',
...@@ -138,20 +138,19 @@ ...@@ -138,20 +138,19 @@
'content/web_activity.h', 'content/web_activity.h',
'content/web_contents_view_delegate_factory_impl.cc', 'content/web_contents_view_delegate_factory_impl.cc',
'extensions/public/extensions_delegate.h', 'extensions/public/extensions_delegate.h',
'extensions/extensions_delegate_impl.cc', 'extensions/extensions_delegate.cc',
'virtual_keyboard/public/virtual_keyboard_manager.h', 'virtual_keyboard/public/virtual_keyboard_manager.h',
'virtual_keyboard/virtual_keyboard_manager_impl.cc', 'virtual_keyboard/virtual_keyboard_manager_impl.cc',
], ],
}, },
{ {
'target_name': 'athena_content_support_lib', 'target_name': 'athena_app_shell_lib',
'type': 'static_library', 'type': 'static_library',
'dependencies': [ 'dependencies': [
'../content/content.gyp:content_browser', '../extensions/shell/app_shell.gyp:app_shell_lib',
], ],
'sources': [ 'sources': [
'content/delegate/app_content_control_delegate_impl.cc', 'extensions/shell/extensions_delegate_impl.cc',
'content/public/app_content_control_delegate.h',
], ],
}, },
{ {
......
...@@ -27,6 +27,7 @@ class WebActivityController : public AcceleratorHandler { ...@@ -27,6 +27,7 @@ class WebActivityController : public AcceleratorHandler {
CMD_FORWARD, CMD_FORWARD,
CMD_RELOAD, CMD_RELOAD,
CMD_RELOAD_IGNORE_CACHE, CMD_RELOAD_IGNORE_CACHE,
CMD_CLOSE,
}; };
explicit WebActivityController(views::WebView* web_view) explicit WebActivityController(views::WebView* web_view)
...@@ -48,6 +49,7 @@ class WebActivityController : public AcceleratorHandler { ...@@ -48,6 +49,7 @@ class WebActivityController : public AcceleratorHandler {
AF_NONE}, AF_NONE},
{TRIGGER_ON_PRESS, ui::VKEY_BROWSER_BACK, ui::EF_NONE, CMD_BACK, {TRIGGER_ON_PRESS, ui::VKEY_BROWSER_BACK, ui::EF_NONE, CMD_BACK,
AF_NONE}, AF_NONE},
{TRIGGER_ON_PRESS, ui::VKEY_W, ui::EF_CONTROL_DOWN, CMD_CLOSE, AF_NONE},
}; };
accelerator_manager_->RegisterAccelerators( accelerator_manager_->RegisterAccelerators(
accelerator_data, arraysize(accelerator_data), this); accelerator_data, arraysize(accelerator_data), this);
...@@ -85,11 +87,15 @@ class WebActivityController : public AcceleratorHandler { ...@@ -85,11 +87,15 @@ class WebActivityController : public AcceleratorHandler {
virtual bool IsCommandEnabled(int command_id) const OVERRIDE { virtual bool IsCommandEnabled(int command_id) const OVERRIDE {
switch (command_id) { switch (command_id) {
case CMD_RELOAD: case CMD_RELOAD:
case CMD_RELOAD_IGNORE_CACHE:
return true; return true;
case CMD_BACK: case CMD_BACK:
return web_view_->GetWebContents()->GetController().CanGoBack(); return web_view_->GetWebContents()->GetController().CanGoBack();
case CMD_FORWARD: case CMD_FORWARD:
return web_view_->GetWebContents()->GetController().CanGoForward(); return web_view_->GetWebContents()->GetController().CanGoForward();
case CMD_CLOSE:
// TODO(oshima): check onbeforeunload handler.
return true;
} }
return false; return false;
} }
...@@ -109,6 +115,9 @@ class WebActivityController : public AcceleratorHandler { ...@@ -109,6 +115,9 @@ class WebActivityController : public AcceleratorHandler {
case CMD_FORWARD: case CMD_FORWARD:
web_view_->GetWebContents()->GetController().GoForward(); web_view_->GetWebContents()->GetController().GoForward();
return true; return true;
case CMD_CLOSE:
web_view_->GetWidget()->Close();
return true;
} }
return false; return false;
} }
......
include_rules = [ include_rules = [
"+extensions/common", "+extensions/common",
"+extensions/shell/browser",
] ]
// Copyright 2014 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.
#include "athena/extensions/public/extensions_delegate.h"
#include "base/logging.h"
namespace athena {
namespace {
ExtensionsDelegate* instance = NULL;
} // namespace
ExtensionsDelegate::ExtensionsDelegate() {
DCHECK(!instance);
instance = this;
}
ExtensionsDelegate::~ExtensionsDelegate() {
DCHECK(instance);
instance = NULL;
}
// static
ExtensionsDelegate* ExtensionsDelegate::Get(content::BrowserContext* context) {
DCHECK(instance);
DCHECK_EQ(context, instance->GetBrowserContext());
return instance;
}
// static
void ExtensionsDelegate::Shutdown() {
DCHECK(instance);
delete instance;
}
} // namespace athena
include_rules = [
"+extensions/shell/browser",
]
...@@ -10,8 +10,6 @@ ...@@ -10,8 +10,6 @@
namespace athena { namespace athena {
namespace { namespace {
ExtensionsDelegate* instance = NULL;
class ShellExtensionsDelegate : public ExtensionsDelegate { class ShellExtensionsDelegate : public ExtensionsDelegate {
public: public:
explicit ShellExtensionsDelegate(content::BrowserContext* context) explicit ShellExtensionsDelegate(content::BrowserContext* context)
...@@ -45,33 +43,10 @@ class ShellExtensionsDelegate : public ExtensionsDelegate { ...@@ -45,33 +43,10 @@ class ShellExtensionsDelegate : public ExtensionsDelegate {
} // namespace } // namespace
ExtensionsDelegate::ExtensionsDelegate() {
DCHECK(!instance);
instance = this;
}
ExtensionsDelegate::~ExtensionsDelegate() {
DCHECK(instance);
instance = NULL;
}
// static
ExtensionsDelegate* ExtensionsDelegate::Get(content::BrowserContext* context) {
DCHECK(instance);
DCHECK_EQ(context, instance->GetBrowserContext());
return instance;
}
// static // static
void ExtensionsDelegate::CreateExtensionsDelegateForShell( void ExtensionsDelegate::CreateExtensionsDelegateForShell(
content::BrowserContext* context) { content::BrowserContext* context) {
new ShellExtensionsDelegate(context); new ShellExtensionsDelegate(context);
} }
// static
void ExtensionsDelegate::Shutdown() {
DCHECK(instance);
delete instance;
}
} // namespace athena } // namespace athena
...@@ -89,6 +89,7 @@ class AthenaViewsDelegate : public views::ViewsDelegate { ...@@ -89,6 +89,7 @@ class AthenaViewsDelegate : public views::ViewsDelegate {
virtual void OnBeforeWidgetInit( virtual void OnBeforeWidgetInit(
views::Widget::InitParams* params, views::Widget::InitParams* params,
views::internal::NativeWidgetDelegate* delegate) OVERRIDE { views::internal::NativeWidgetDelegate* delegate) OVERRIDE {
params->context = athena::ScreenManager::Get()->GetContext();
} }
DISALLOW_COPY_AND_ASSIGN(AthenaViewsDelegate); DISALLOW_COPY_AND_ASSIGN(AthenaViewsDelegate);
...@@ -130,7 +131,6 @@ void StartAthenaEnv(scoped_refptr<base::TaskRunner> file_runner) { ...@@ -130,7 +131,6 @@ void StartAthenaEnv(scoped_refptr<base::TaskRunner> file_runner) {
} }
void StartAthenaSessionWithContext(content::BrowserContext* context) { void StartAthenaSessionWithContext(content::BrowserContext* context) {
athena::ExtensionsDelegate::CreateExtensionsDelegateForShell(context);
StartAthenaSession(new athena::ContentActivityFactory(), StartAthenaSession(new athena::ContentActivityFactory(),
new athena::ContentAppModelBuilder(context)); new athena::ContentAppModelBuilder(context));
athena::VirtualKeyboardManager::Create(context); athena::VirtualKeyboardManager::Create(context);
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include "athena/activity/public/activity_manager.h" #include "athena/activity/public/activity_manager.h"
#include "athena/content/public/web_contents_view_delegate_creator.h" #include "athena/content/public/web_contents_view_delegate_creator.h"
#include "athena/env/public/athena_env.h" #include "athena/env/public/athena_env.h"
#include "athena/extensions/public/extensions_delegate.h"
#include "athena/main/athena_app_window_controller.h"
#include "athena/main/athena_launcher.h" #include "athena/main/athena_launcher.h"
#include "athena/screen/public/screen_manager.h" #include "athena/screen/public/screen_manager.h"
#include "base/command_line.h" #include "base/command_line.h"
...@@ -87,6 +89,7 @@ class AthenaBrowserMainDelegate : public extensions::ShellBrowserMainDelegate { ...@@ -87,6 +89,7 @@ class AthenaBrowserMainDelegate : public extensions::ShellBrowserMainDelegate {
athena::StartAthenaEnv(content::BrowserThread::GetMessageLoopProxyForThread( athena::StartAthenaEnv(content::BrowserThread::GetMessageLoopProxyForThread(
content::BrowserThread::FILE)); content::BrowserThread::FILE));
athena::ExtensionsDelegate::CreateExtensionsDelegateForShell(context);
athena::StartAthenaSessionWithContext(context); athena::StartAthenaSessionWithContext(context);
} }
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
'dependencies': [ 'dependencies': [
'../athena.gyp:athena_lib', '../athena.gyp:athena_lib',
'../athena.gyp:athena_content_lib', '../athena.gyp:athena_content_lib',
'../athena.gyp:athena_content_support_lib',
'../resources/athena_resources.gyp:athena_resources', '../resources/athena_resources.gyp:athena_resources',
# debug_widow.cc depends on this. Remove this once debug_window # debug_widow.cc depends on this. Remove this once debug_window
# is removed. # is removed.
...@@ -55,8 +54,8 @@ ...@@ -55,8 +54,8 @@
'type': 'executable', 'type': 'executable',
'dependencies': [ 'dependencies': [
'../../ui/accessibility/accessibility.gyp:ax_gen', '../../ui/accessibility/accessibility.gyp:ax_gen',
'../athena.gyp:athena_app_shell_lib',
'../resources/athena_resources.gyp:athena_pak', '../resources/athena_resources.gyp:athena_pak',
'../../extensions/shell/app_shell.gyp:app_shell_lib',
'athena_main_lib', 'athena_main_lib',
], ],
'include_dirs': [ 'include_dirs': [
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment