| Index: athena/content/web_activity.cc
|
| diff --git a/athena/content/web_activity.cc b/athena/content/web_activity.cc
|
| index 69d44f09369eeacbdc654cf172c33bb5d41a8519..15d3e56092f38aa07964ccc40f34efd05debaeb0 100644
|
| --- a/athena/content/web_activity.cc
|
| +++ b/athena/content/web_activity.cc
|
| @@ -4,10 +4,13 @@
|
|
|
| #include "athena/content/web_activity.h"
|
|
|
| +#include "athena/activity/public/activity_factory.h"
|
| #include "athena/activity/public/activity_manager.h"
|
| #include "athena/input/public/accelerator_manager.h"
|
| #include "content/public/browser/native_web_keyboard_event.h"
|
| +#include "content/public/browser/navigation_controller.h"
|
| #include "content/public/browser/web_contents.h"
|
| +#include "content/public/browser/web_contents_delegate.h"
|
| #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
|
| #include "ui/views/controls/webview/webview.h"
|
| #include "ui/views/focus/focus_manager.h"
|
| @@ -124,32 +127,30 @@ class AthenaWebView : public views::WebView {
|
| public:
|
| AthenaWebView(content::BrowserContext* context)
|
| : views::WebView(context), controller_(new WebActivityController(this)) {
|
| - // We create the first web contents ourselves to allow us to replace it
|
| - // later on.
|
| - SetWebContents(content::WebContents::Create(
|
| - content::WebContents::CreateParams(context)));
|
| // TODO(skuhne): Add content observer to detect renderer crash and set
|
| // content status to unloaded if that happens.
|
| }
|
| - virtual ~AthenaWebView() {
|
| - // |WebView| does not own the content, so we need to destroy it here.
|
| - content::WebContents* current_contents = GetWebContents();
|
| - SetWebContents(NULL);
|
| - delete current_contents;
|
| +
|
| + AthenaWebView(content::WebContents* web_contents)
|
| + : views::WebView(web_contents->GetBrowserContext()),
|
| + controller_(new WebActivityController(this)) {
|
| + scoped_ptr<content::WebContents> old_contents(
|
| + SwapWebContents(scoped_ptr<content::WebContents>(web_contents)));
|
| }
|
|
|
| + virtual ~AthenaWebView() {}
|
| +
|
| void InstallAccelerators() { controller_->InstallAccelerators(); }
|
|
|
| void EvictContent() {
|
| - content::WebContents* old_contents = GetWebContents();
|
| + scoped_ptr<content::WebContents> old_contents(SwapWebContents(
|
| + scoped_ptr<content::WebContents>(content::WebContents::Create(
|
| + content::WebContents::CreateParams(browser_context())))));
|
| evicted_web_contents_.reset(
|
| content::WebContents::Create(content::WebContents::CreateParams(
|
| old_contents->GetBrowserContext())));
|
| evicted_web_contents_->GetController().CopyStateFrom(
|
| old_contents->GetController());
|
| - SetWebContents(content::WebContents::Create(
|
| - content::WebContents::CreateParams(old_contents->GetBrowserContext())));
|
| - delete old_contents;
|
| // As soon as the new contents becomes visible, it should reload.
|
| // TODO(skuhne): This breaks script connections with other activities.
|
| // Even though this is the same technique as used by the TabStripModel,
|
| @@ -159,16 +160,60 @@ class AthenaWebView : public views::WebView {
|
|
|
| void ReloadContent() {
|
| CHECK(evicted_web_contents_.get());
|
| - content::WebContents* null_contents = GetWebContents();
|
| - SetWebContents(evicted_web_contents_.release());
|
| - delete null_contents;
|
| + scoped_ptr<content::WebContents> replaced_contents(SwapWebContents(
|
| + evicted_web_contents_.Pass()));
|
| }
|
|
|
| // Check if the content got evicted.
|
| const bool IsContentEvicted() { return !!evicted_web_contents_.get(); }
|
|
|
| - private:
|
| - // WebContentsDelegate:
|
| + // content::WebContentsDelegate:
|
| + virtual content::WebContents* OpenURLFromTab(
|
| + content::WebContents* source,
|
| + const content::OpenURLParams& params) OVERRIDE {
|
| + switch(params.disposition) {
|
| + case CURRENT_TAB: {
|
| + DCHECK(source == web_contents());
|
| + content::NavigationController::LoadURLParams load_url_params(
|
| + params.url);
|
| + load_url_params.referrer = params.referrer;
|
| + load_url_params.frame_tree_node_id = params.frame_tree_node_id;
|
| + load_url_params.transition_type = params.transition;
|
| + load_url_params.extra_headers = params.extra_headers;
|
| + load_url_params.should_replace_current_entry =
|
| + params.should_replace_current_entry;
|
| + load_url_params.is_renderer_initiated = params.is_renderer_initiated;
|
| + load_url_params.transferred_global_request_id =
|
| + params.transferred_global_request_id;
|
| + web_contents()->GetController().LoadURLWithParams(load_url_params);
|
| + return web_contents();
|
| + }
|
| + case NEW_FOREGROUND_TAB:
|
| + case NEW_BACKGROUND_TAB:
|
| + case NEW_POPUP:
|
| + case NEW_WINDOW: {
|
| + ActivityManager::Get()->AddActivity(
|
| + ActivityFactory::Get()->CreateWebActivity(browser_context(),
|
| + params.url));
|
| + break;
|
| + }
|
| + default:
|
| + break;
|
| + }
|
| + // NULL is returned if the URL wasn't opened immediately.
|
| + return NULL;
|
| + }
|
| +
|
| + virtual void AddNewContents(content::WebContents* source,
|
| + content::WebContents* new_contents,
|
| + WindowOpenDisposition disposition,
|
| + const gfx::Rect& initial_pos,
|
| + bool user_gesture,
|
| + bool* was_blocked) OVERRIDE {
|
| + ActivityManager::Get()->AddActivity(
|
| + new WebActivity(new AthenaWebView(new_contents)));
|
| + }
|
| +
|
| virtual bool PreHandleKeyboardEvent(
|
| content::WebContents* source,
|
| const content::NativeWebKeyboardEvent& event,
|
| @@ -183,6 +228,7 @@ class AthenaWebView : public views::WebView {
|
| controller_->HandleKeyboardEvent(source, event);
|
| }
|
|
|
| + private:
|
| scoped_ptr<WebActivityController> controller_;
|
|
|
| // If the activity got evicted, this is the web content which holds the known
|
| @@ -200,6 +246,16 @@ WebActivity::WebActivity(content::BrowserContext* browser_context,
|
| current_state_(ACTIVITY_UNLOADED) {
|
| }
|
|
|
| +WebActivity::WebActivity(AthenaWebView* web_view)
|
| + : browser_context_(web_view->browser_context()),
|
| + url_(web_view->GetWebContents()->GetURL()),
|
| + web_view_(web_view),
|
| + current_state_(ACTIVITY_UNLOADED) {
|
| + // Transition to state ACTIVITY_INVISIBLE to perform the same setup steps
|
| + // as on new activities (namely adding a WebContentsObserver).
|
| + SetCurrentState(ACTIVITY_INVISIBLE);
|
| +}
|
| +
|
| WebActivity::~WebActivity() {
|
| // It is not required to change the activity state to UNLOADED - unless we
|
| // would add state observers.
|
|
|