Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(717)

Side by Side Diff: athena/content/web_activity.cc

Issue 548633005: Adding overview / layer framework to Activities so that unloaded / sleeping activities can be shown… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/input/public/accelerator_manager.h" 10 #include "athena/input/public/accelerator_manager.h"
10 #include "base/bind.h" 11 #include "base/bind.h"
11 #include "base/command_line.h" 12 #include "base/command_line.h"
12 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
13 #include "content/public/browser/native_web_keyboard_event.h" 14 #include "content/public/browser/native_web_keyboard_event.h"
14 #include "content/public/browser/navigation_controller.h" 15 #include "content/public/browser/navigation_controller.h"
15 #include "content/public/browser/web_contents.h" 16 #include "content/public/browser/web_contents.h"
16 #include "content/public/browser/web_contents_delegate.h" 17 #include "content/public/browser/web_contents_delegate.h"
17 #include "content/public/common/content_switches.h" 18 #include "content/public/common/content_switches.h"
18 #include "ui/aura/window.h" 19 #include "ui/aura/window.h"
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 } 169 }
169 170
170 virtual ~AthenaWebView() {} 171 virtual ~AthenaWebView() {}
171 172
172 void InstallAccelerators() { controller_->InstallAccelerators(); } 173 void InstallAccelerators() { controller_->InstallAccelerators(); }
173 174
174 void EvictContent() { 175 void EvictContent() {
175 scoped_ptr<content::WebContents> old_contents(SwapWebContents( 176 scoped_ptr<content::WebContents> old_contents(SwapWebContents(
176 scoped_ptr<content::WebContents>(content::WebContents::Create( 177 scoped_ptr<content::WebContents>(content::WebContents::Create(
177 content::WebContents::CreateParams(browser_context()))))); 178 content::WebContents::CreateParams(browser_context())))));
179 // If there is a progress bar, we need to get rid of it now since its
180 // associated content, parent window and layers will disappear with evicting
181 // the content.
182 progress_bar_.reset();
178 evicted_web_contents_.reset( 183 evicted_web_contents_.reset(
179 content::WebContents::Create(content::WebContents::CreateParams( 184 content::WebContents::Create(content::WebContents::CreateParams(
180 old_contents->GetBrowserContext()))); 185 old_contents->GetBrowserContext())));
181 evicted_web_contents_->GetController().CopyStateFrom( 186 evicted_web_contents_->GetController().CopyStateFrom(
182 old_contents->GetController()); 187 old_contents->GetController());
183 // As soon as the new contents becomes visible, it should reload. 188 // As soon as the new contents becomes visible, it should reload.
184 // TODO(skuhne): This breaks script connections with other activities. 189 // TODO(skuhne): This breaks script connections with other activities.
185 // Even though this is the same technique as used by the TabStripModel, 190 // Even though this is the same technique as used by the TabStripModel,
186 // we might want to address this cleaner since we are more likely to 191 // we might want to address this cleaner since we are more likely to
187 // run into this state. by unloading. 192 // run into this state. by unloading.
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 ActivityViewModel* WebActivity::GetActivityViewModel() { 358 ActivityViewModel* WebActivity::GetActivityViewModel() {
354 return this; 359 return this;
355 } 360 }
356 361
357 void WebActivity::SetCurrentState(Activity::ActivityState state) { 362 void WebActivity::SetCurrentState(Activity::ActivityState state) {
358 DCHECK_NE(state, current_state_); 363 DCHECK_NE(state, current_state_);
359 switch (state) { 364 switch (state) {
360 case ACTIVITY_VISIBLE: 365 case ACTIVITY_VISIBLE:
361 if (!web_view_) 366 if (!web_view_)
362 break; 367 break;
363 MakeVisible(); 368 HideContentProxy();
364 ReloadAndObserve(); 369 ReloadAndObserve();
365 break; 370 break;
366 case ACTIVITY_INVISIBLE: 371 case ACTIVITY_INVISIBLE:
367 if (!web_view_) 372 if (!web_view_)
368 break; 373 break;
374
369 if (current_state_ == ACTIVITY_VISIBLE) 375 if (current_state_ == ACTIVITY_VISIBLE)
370 MakeInvisible(); 376 ShowContentProxy();
371 ReloadAndObserve(); 377 else
378 ReloadAndObserve();
379
372 break; 380 break;
373 case ACTIVITY_BACKGROUND_LOW_PRIORITY: 381 case ACTIVITY_BACKGROUND_LOW_PRIORITY:
374 DCHECK(ACTIVITY_VISIBLE == current_state_ || 382 DCHECK(ACTIVITY_VISIBLE == current_state_ ||
375 ACTIVITY_INVISIBLE == current_state_); 383 ACTIVITY_INVISIBLE == current_state_);
376 // TODO(skuhne): Do this. 384 // TODO(skuhne): Do this.
377 break; 385 break;
378 case ACTIVITY_PERSISTENT: 386 case ACTIVITY_PERSISTENT:
379 DCHECK_EQ(ACTIVITY_BACKGROUND_LOW_PRIORITY, current_state_); 387 DCHECK_EQ(ACTIVITY_BACKGROUND_LOW_PRIORITY, current_state_);
380 // TODO(skuhne): Do this. As soon as the new resource management is 388 // TODO(skuhne): Do this. As soon as the new resource management is
381 // agreed upon - or remove otherwise. 389 // agreed upon - or remove otherwise.
382 break; 390 break;
383 case ACTIVITY_UNLOADED: 391 case ACTIVITY_UNLOADED:
384 DCHECK_NE(ACTIVITY_UNLOADED, current_state_); 392 DCHECK_NE(ACTIVITY_UNLOADED, current_state_);
393 if (content_proxy_.get())
394 content_proxy_->ContentWillUnload();
385 Observe(NULL); 395 Observe(NULL);
386 web_view_->EvictContent(); 396 web_view_->EvictContent();
387 break; 397 break;
388 } 398 }
389 // Remember the last requested state. 399 // Remember the last requested state.
390 current_state_ = state; 400 current_state_ = state;
391 } 401 }
392 402
393 Activity::ActivityState WebActivity::GetCurrentState() { 403 Activity::ActivityState WebActivity::GetCurrentState() {
394 // If the content is evicted, the state has to be UNLOADED. 404 // If the content is evicted, the state has to be UNLOADED.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 bool WebActivity::UsesFrame() const { 447 bool WebActivity::UsesFrame() const {
438 return true; 448 return true;
439 } 449 }
440 450
441 views::View* WebActivity::GetContentsView() { 451 views::View* WebActivity::GetContentsView() {
442 if (!web_view_) { 452 if (!web_view_) {
443 web_view_ = new AthenaWebView(browser_context_); 453 web_view_ = new AthenaWebView(browser_context_);
444 web_view_->LoadInitialURL(url_); 454 web_view_->LoadInitialURL(url_);
445 // Make sure the content gets properly shown. 455 // Make sure the content gets properly shown.
446 if (current_state_ == ACTIVITY_VISIBLE) { 456 if (current_state_ == ACTIVITY_VISIBLE) {
447 MakeVisible(); 457 HideContentProxy();
448 ReloadAndObserve(); 458 ReloadAndObserve();
449 } else if (current_state_ == ACTIVITY_INVISIBLE) { 459 } else if (current_state_ == ACTIVITY_INVISIBLE) {
450 MakeInvisible(); 460 ShowContentProxy();
451 ReloadAndObserve(); 461 ReloadAndObserve();
452 } else { 462 } else {
453 // If not previously specified, we change the state now to invisible.. 463 // If not previously specified, we change the state now to invisible..
454 SetCurrentState(ACTIVITY_INVISIBLE); 464 SetCurrentState(ACTIVITY_INVISIBLE);
455 } 465 }
456 } 466 }
457 return web_view_; 467 return web_view_;
458 } 468 }
459 469
460 void WebActivity::CreateOverviewModeImage() {
461 // TODO(skuhne): Create an overview.
462 }
463
464 gfx::ImageSkia WebActivity::GetOverviewModeImage() { 470 gfx::ImageSkia WebActivity::GetOverviewModeImage() {
465 return overview_mode_image_; 471 if (content_proxy_.get())
472 content_proxy_->GetContentImage();
473 return gfx::ImageSkia();
466 } 474 }
467 475
468 void WebActivity::PrepareContentsForOverview() { 476 void WebActivity::PrepareContentsForOverview() {
469 // Turn on fast resizing to avoid re-laying out the web contents when 477 // Turn on fast resizing to avoid re-laying out the web contents when
470 // entering / exiting overview mode. 478 // entering / exiting overview mode and the content is visible.
471 web_view_->SetFastResize(true); 479 if (!content_proxy_.get())
480 web_view_->SetFastResize(true);
472 } 481 }
473 482
474 void WebActivity::ResetContentsView() { 483 void WebActivity::ResetContentsView() {
475 web_view_->SetFastResize(false); 484 // Turn on fast resizing to avoid re-laying out the web contents when
476 web_view_->Layout(); 485 // entering / exiting overview mode and the content is visible.
486 if (!content_proxy_.get()) {
487 web_view_->SetFastResize(false);
488 web_view_->Layout();
489 }
477 } 490 }
478 491
479 void WebActivity::TitleWasSet(content::NavigationEntry* entry, 492 void WebActivity::TitleWasSet(content::NavigationEntry* entry,
480 bool explicit_set) { 493 bool explicit_set) {
481 ActivityManager::Get()->UpdateActivity(this); 494 ActivityManager::Get()->UpdateActivity(this);
482 } 495 }
483 496
484 void WebActivity::DidUpdateFaviconURL( 497 void WebActivity::DidUpdateFaviconURL(
485 const std::vector<content::FaviconURL>& candidates) { 498 const std::vector<content::FaviconURL>& candidates) {
486 ActivityManager::Get()->UpdateActivity(this); 499 ActivityManager::Get()->UpdateActivity(this);
487 } 500 }
488 501
489 void WebActivity::DidChangeThemeColor(SkColor theme_color) { 502 void WebActivity::DidChangeThemeColor(SkColor theme_color) {
490 title_color_ = theme_color; 503 title_color_ = theme_color;
491 ActivityManager::Get()->UpdateActivity(this); 504 ActivityManager::Get()->UpdateActivity(this);
492 } 505 }
493 506
494 void WebActivity::MakeVisible() { 507 void WebActivity::HideContentProxy() {
495 // TODO(skuhne): Once we know how to handle the Overview mode, this has to 508 if (content_proxy_.get())
496 // be moved into an ActivityContentController which is used by all activities. 509 content_proxy_.reset(NULL);
497 // Make the content visible.
498 // TODO(skuhne): If this can be combined with app_activity, move this into a
499 // separate class.
500 web_view_->SetVisible(true);
501 web_view_->GetWebContents()->GetNativeView()->Show();
502 // If we have a proxy image, we can delete it now since the contet goes live.
503 // TODO(skuhne): Once we have figured out how to do overview mode that code
504 // needs to go here.
505 overview_mode_image_ = gfx::ImageSkia();
506 } 510 }
507 511
508 void WebActivity::MakeInvisible() { 512 void WebActivity::ShowContentProxy() {
509 // TODO(skuhne): Once we know how to handle the Overview mode, this has to 513 if (!content_proxy_.get() && web_view_)
510 // be moved into an ActivityContentController which is used by all activities. 514 content_proxy_.reset(new ContentProxy(web_view_, this));
511 // TODO(skuhne): If this can be combined with app_activity, move this into a
512 // separate class.
513 DCHECK(web_view_->visible());
514 // Create our proxy image / layer.
515 if (current_state_ == ACTIVITY_VISIBLE) {
516 // Create a proxy image of the current visible content.
517 // TODO(skuhne): Do this once we figure out how to do overview mode.
518 overview_mode_image_ = gfx::ImageSkia();
519 }
520 // Now we can hide this.
521 // Note: This might have to be done asynchronously after the read back took
522 // place.
523 web_view_->GetWebContents()->GetNativeView()->Hide();
524 web_view_->SetVisible(false);
525 } 515 }
526 516
527 void WebActivity::ReloadAndObserve() { 517 void WebActivity::ReloadAndObserve() {
528 if (web_view_->IsContentEvicted()) { 518 if (web_view_->IsContentEvicted()) {
529 DCHECK_EQ(ACTIVITY_UNLOADED, current_state_); 519 DCHECK_EQ(ACTIVITY_UNLOADED, current_state_);
530 web_view_->ReloadContent(); 520 web_view_->ReloadContent();
531 } 521 }
532 Observe(web_view_->GetWebContents()); 522 Observe(web_view_->GetWebContents());
533 } 523 }
534 524
535 } // namespace athena 525 } // namespace athena
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698