OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "athena/content/web_activity.h" | 5 #include "athena/content/web_activity.h" |
6 | 6 |
7 #include "athena/activity/public/activity_factory.h" | 7 #include "athena/activity/public/activity_factory.h" |
8 #include "athena/activity/public/activity_manager.h" | 8 #include "athena/activity/public/activity_manager.h" |
| 9 #include "athena/content/content_proxy.h" |
9 #include "athena/content/public/dialogs.h" | 10 #include "athena/content/public/dialogs.h" |
10 #include "athena/input/public/accelerator_manager.h" | 11 #include "athena/input/public/accelerator_manager.h" |
11 #include "base/bind.h" | 12 #include "base/bind.h" |
12 #include "base/command_line.h" | 13 #include "base/command_line.h" |
13 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
14 #include "content/public/browser/native_web_keyboard_event.h" | 15 #include "content/public/browser/native_web_keyboard_event.h" |
15 #include "content/public/browser/navigation_controller.h" | 16 #include "content/public/browser/navigation_controller.h" |
16 #include "content/public/browser/web_contents.h" | 17 #include "content/public/browser/web_contents.h" |
17 #include "content/public/browser/web_contents_delegate.h" | 18 #include "content/public/browser/web_contents_delegate.h" |
18 #include "content/public/common/content_switches.h" | 19 #include "content/public/common/content_switches.h" |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 } | 170 } |
170 | 171 |
171 virtual ~AthenaWebView() {} | 172 virtual ~AthenaWebView() {} |
172 | 173 |
173 void InstallAccelerators() { controller_->InstallAccelerators(); } | 174 void InstallAccelerators() { controller_->InstallAccelerators(); } |
174 | 175 |
175 void EvictContent() { | 176 void EvictContent() { |
176 scoped_ptr<content::WebContents> old_contents(SwapWebContents( | 177 scoped_ptr<content::WebContents> old_contents(SwapWebContents( |
177 scoped_ptr<content::WebContents>(content::WebContents::Create( | 178 scoped_ptr<content::WebContents>(content::WebContents::Create( |
178 content::WebContents::CreateParams(browser_context()))))); | 179 content::WebContents::CreateParams(browser_context()))))); |
| 180 // If there is a progress bar, we need to get rid of it now since its |
| 181 // associated content, parent window and layers will disappear with evicting |
| 182 // the content. |
| 183 progress_bar_.reset(); |
179 evicted_web_contents_.reset( | 184 evicted_web_contents_.reset( |
180 content::WebContents::Create(content::WebContents::CreateParams( | 185 content::WebContents::Create(content::WebContents::CreateParams( |
181 old_contents->GetBrowserContext()))); | 186 old_contents->GetBrowserContext()))); |
182 evicted_web_contents_->GetController().CopyStateFrom( | 187 evicted_web_contents_->GetController().CopyStateFrom( |
183 old_contents->GetController()); | 188 old_contents->GetController()); |
184 // As soon as the new contents becomes visible, it should reload. | 189 // As soon as the new contents becomes visible, it should reload. |
185 // TODO(skuhne): This breaks script connections with other activities. | 190 // TODO(skuhne): This breaks script connections with other activities. |
186 // Even though this is the same technique as used by the TabStripModel, | 191 // Even though this is the same technique as used by the TabStripModel, |
187 // we might want to address this cleaner since we are more likely to | 192 // we might want to address this cleaner since we are more likely to |
188 // run into this state. by unloading. | 193 // run into this state. by unloading. |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 ActivityViewModel* WebActivity::GetActivityViewModel() { | 373 ActivityViewModel* WebActivity::GetActivityViewModel() { |
369 return this; | 374 return this; |
370 } | 375 } |
371 | 376 |
372 void WebActivity::SetCurrentState(Activity::ActivityState state) { | 377 void WebActivity::SetCurrentState(Activity::ActivityState state) { |
373 DCHECK_NE(state, current_state_); | 378 DCHECK_NE(state, current_state_); |
374 switch (state) { | 379 switch (state) { |
375 case ACTIVITY_VISIBLE: | 380 case ACTIVITY_VISIBLE: |
376 if (!web_view_) | 381 if (!web_view_) |
377 break; | 382 break; |
378 MakeVisible(); | 383 HideContentProxy(); |
379 ReloadAndObserve(); | 384 ReloadAndObserve(); |
380 break; | 385 break; |
381 case ACTIVITY_INVISIBLE: | 386 case ACTIVITY_INVISIBLE: |
382 if (!web_view_) | 387 if (!web_view_) |
383 break; | 388 break; |
| 389 |
384 if (current_state_ == ACTIVITY_VISIBLE) | 390 if (current_state_ == ACTIVITY_VISIBLE) |
385 MakeInvisible(); | 391 ShowContentProxy(); |
386 ReloadAndObserve(); | 392 else |
| 393 ReloadAndObserve(); |
| 394 |
387 break; | 395 break; |
388 case ACTIVITY_BACKGROUND_LOW_PRIORITY: | 396 case ACTIVITY_BACKGROUND_LOW_PRIORITY: |
389 DCHECK(ACTIVITY_VISIBLE == current_state_ || | 397 DCHECK(ACTIVITY_VISIBLE == current_state_ || |
390 ACTIVITY_INVISIBLE == current_state_); | 398 ACTIVITY_INVISIBLE == current_state_); |
391 // TODO(skuhne): Do this. | 399 // TODO(skuhne): Do this. |
392 break; | 400 break; |
393 case ACTIVITY_PERSISTENT: | 401 case ACTIVITY_PERSISTENT: |
394 DCHECK_EQ(ACTIVITY_BACKGROUND_LOW_PRIORITY, current_state_); | 402 DCHECK_EQ(ACTIVITY_BACKGROUND_LOW_PRIORITY, current_state_); |
395 // TODO(skuhne): Do this. As soon as the new resource management is | 403 // TODO(skuhne): Do this. As soon as the new resource management is |
396 // agreed upon - or remove otherwise. | 404 // agreed upon - or remove otherwise. |
397 break; | 405 break; |
398 case ACTIVITY_UNLOADED: | 406 case ACTIVITY_UNLOADED: |
399 DCHECK_NE(ACTIVITY_UNLOADED, current_state_); | 407 DCHECK_NE(ACTIVITY_UNLOADED, current_state_); |
| 408 if (content_proxy_.get()) |
| 409 content_proxy_->ContentWillUnload(); |
400 Observe(NULL); | 410 Observe(NULL); |
401 web_view_->EvictContent(); | 411 web_view_->EvictContent(); |
402 break; | 412 break; |
403 } | 413 } |
404 // Remember the last requested state. | 414 // Remember the last requested state. |
405 current_state_ = state; | 415 current_state_ = state; |
406 } | 416 } |
407 | 417 |
408 Activity::ActivityState WebActivity::GetCurrentState() { | 418 Activity::ActivityState WebActivity::GetCurrentState() { |
409 // If the content is evicted, the state has to be UNLOADED. | 419 // If the content is evicted, the state has to be UNLOADED. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 bool WebActivity::UsesFrame() const { | 462 bool WebActivity::UsesFrame() const { |
453 return true; | 463 return true; |
454 } | 464 } |
455 | 465 |
456 views::View* WebActivity::GetContentsView() { | 466 views::View* WebActivity::GetContentsView() { |
457 if (!web_view_) { | 467 if (!web_view_) { |
458 web_view_ = new AthenaWebView(browser_context_); | 468 web_view_ = new AthenaWebView(browser_context_); |
459 web_view_->LoadInitialURL(url_); | 469 web_view_->LoadInitialURL(url_); |
460 // Make sure the content gets properly shown. | 470 // Make sure the content gets properly shown. |
461 if (current_state_ == ACTIVITY_VISIBLE) { | 471 if (current_state_ == ACTIVITY_VISIBLE) { |
462 MakeVisible(); | 472 HideContentProxy(); |
463 ReloadAndObserve(); | 473 ReloadAndObserve(); |
464 } else if (current_state_ == ACTIVITY_INVISIBLE) { | 474 } else if (current_state_ == ACTIVITY_INVISIBLE) { |
465 MakeInvisible(); | 475 ShowContentProxy(); |
466 ReloadAndObserve(); | 476 ReloadAndObserve(); |
467 } else { | 477 } else { |
468 // If not previously specified, we change the state now to invisible.. | 478 // If not previously specified, we change the state now to invisible.. |
469 SetCurrentState(ACTIVITY_INVISIBLE); | 479 SetCurrentState(ACTIVITY_INVISIBLE); |
470 } | 480 } |
471 } | 481 } |
472 return web_view_; | 482 return web_view_; |
473 } | 483 } |
474 | 484 |
475 void WebActivity::CreateOverviewModeImage() { | |
476 // TODO(skuhne): Create an overview. | |
477 } | |
478 | |
479 gfx::ImageSkia WebActivity::GetOverviewModeImage() { | 485 gfx::ImageSkia WebActivity::GetOverviewModeImage() { |
480 return overview_mode_image_; | 486 if (content_proxy_.get()) |
| 487 content_proxy_->GetContentImage(); |
| 488 return gfx::ImageSkia(); |
481 } | 489 } |
482 | 490 |
483 void WebActivity::PrepareContentsForOverview() { | 491 void WebActivity::PrepareContentsForOverview() { |
484 // Turn on fast resizing to avoid re-laying out the web contents when | 492 // Turn on fast resizing to avoid re-laying out the web contents when |
485 // entering / exiting overview mode. | 493 // entering / exiting overview mode and the content is visible. |
486 web_view_->SetFastResize(true); | 494 if (!content_proxy_.get()) |
| 495 web_view_->SetFastResize(true); |
487 } | 496 } |
488 | 497 |
489 void WebActivity::ResetContentsView() { | 498 void WebActivity::ResetContentsView() { |
490 web_view_->SetFastResize(false); | 499 // Turn on fast resizing to avoid re-laying out the web contents when |
491 web_view_->Layout(); | 500 // entering / exiting overview mode and the content is visible. |
| 501 if (!content_proxy_.get()) { |
| 502 web_view_->SetFastResize(false); |
| 503 web_view_->Layout(); |
| 504 } |
492 } | 505 } |
493 | 506 |
494 void WebActivity::TitleWasSet(content::NavigationEntry* entry, | 507 void WebActivity::TitleWasSet(content::NavigationEntry* entry, |
495 bool explicit_set) { | 508 bool explicit_set) { |
496 ActivityManager::Get()->UpdateActivity(this); | 509 ActivityManager::Get()->UpdateActivity(this); |
497 } | 510 } |
498 | 511 |
499 void WebActivity::DidUpdateFaviconURL( | 512 void WebActivity::DidUpdateFaviconURL( |
500 const std::vector<content::FaviconURL>& candidates) { | 513 const std::vector<content::FaviconURL>& candidates) { |
501 ActivityManager::Get()->UpdateActivity(this); | 514 ActivityManager::Get()->UpdateActivity(this); |
502 } | 515 } |
503 | 516 |
504 void WebActivity::DidChangeThemeColor(SkColor theme_color) { | 517 void WebActivity::DidChangeThemeColor(SkColor theme_color) { |
505 title_color_ = theme_color; | 518 title_color_ = theme_color; |
506 ActivityManager::Get()->UpdateActivity(this); | 519 ActivityManager::Get()->UpdateActivity(this); |
507 } | 520 } |
508 | 521 |
509 void WebActivity::MakeVisible() { | 522 void WebActivity::HideContentProxy() { |
510 // TODO(skuhne): Once we know how to handle the Overview mode, this has to | 523 if (content_proxy_.get()) |
511 // be moved into an ActivityContentController which is used by all activities. | 524 content_proxy_.reset(NULL); |
512 // Make the content visible. | |
513 // TODO(skuhne): If this can be combined with app_activity, move this into a | |
514 // separate class. | |
515 web_view_->SetVisible(true); | |
516 web_view_->GetWebContents()->GetNativeView()->Show(); | |
517 // If we have a proxy image, we can delete it now since the contet goes live. | |
518 // TODO(skuhne): Once we have figured out how to do overview mode that code | |
519 // needs to go here. | |
520 overview_mode_image_ = gfx::ImageSkia(); | |
521 } | 525 } |
522 | 526 |
523 void WebActivity::MakeInvisible() { | 527 void WebActivity::ShowContentProxy() { |
524 // TODO(skuhne): Once we know how to handle the Overview mode, this has to | 528 if (!content_proxy_.get() && web_view_) |
525 // be moved into an ActivityContentController which is used by all activities. | 529 content_proxy_.reset(new ContentProxy(web_view_, this)); |
526 // TODO(skuhne): If this can be combined with app_activity, move this into a | |
527 // separate class. | |
528 DCHECK(web_view_->visible()); | |
529 // Create our proxy image / layer. | |
530 if (current_state_ == ACTIVITY_VISIBLE) { | |
531 // Create a proxy image of the current visible content. | |
532 // TODO(skuhne): Do this once we figure out how to do overview mode. | |
533 overview_mode_image_ = gfx::ImageSkia(); | |
534 } | |
535 // Now we can hide this. | |
536 // Note: This might have to be done asynchronously after the read back took | |
537 // place. | |
538 web_view_->GetWebContents()->GetNativeView()->Hide(); | |
539 web_view_->SetVisible(false); | |
540 } | 530 } |
541 | 531 |
542 void WebActivity::ReloadAndObserve() { | 532 void WebActivity::ReloadAndObserve() { |
543 if (web_view_->IsContentEvicted()) { | 533 if (web_view_->IsContentEvicted()) { |
544 DCHECK_EQ(ACTIVITY_UNLOADED, current_state_); | 534 DCHECK_EQ(ACTIVITY_UNLOADED, current_state_); |
545 web_view_->ReloadContent(); | 535 web_view_->ReloadContent(); |
546 } | 536 } |
547 Observe(web_view_->GetWebContents()); | 537 Observe(web_view_->GetWebContents()); |
548 } | 538 } |
549 | 539 |
550 } // namespace athena | 540 } // namespace athena |
OLD | NEW |