OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "chrome/browser/tab_contents.h" | 5 #include "chrome/browser/tab_contents.h" |
6 | 6 |
7 #include "chrome/browser/cert_store.h" | 7 #include "chrome/browser/cert_store.h" |
8 #include "chrome/browser/navigation_entry.h" | 8 #include "chrome/browser/navigation_entry.h" |
| 9 #include "chrome/browser/infobar_delegate.h" |
9 #include "chrome/browser/views/download_shelf_view.h" | 10 #include "chrome/browser/views/download_shelf_view.h" |
10 #include "chrome/browser/views/download_started_animation.h" | 11 #include "chrome/browser/views/download_started_animation.h" |
11 #include "chrome/browser/views/blocked_popup_container.h" | 12 #include "chrome/browser/views/blocked_popup_container.h" |
12 #include "chrome/browser/web_contents.h" | 13 #include "chrome/browser/web_contents.h" |
13 #include "chrome/browser/tab_contents_delegate.h" | 14 #include "chrome/browser/tab_contents_delegate.h" |
14 #include "chrome/common/l10n_util.h" | 15 #include "chrome/common/l10n_util.h" |
15 #include "chrome/common/pref_names.h" | 16 #include "chrome/common/pref_names.h" |
16 #include "chrome/common/pref_service.h" | 17 #include "chrome/common/pref_service.h" |
17 #include "chrome/views/container.h" | 18 #include "chrome/views/container.h" |
18 #include "chrome/views/native_scroll_bar.h" | 19 #include "chrome/views/native_scroll_bar.h" |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 SetInitialFocus(); | 380 SetInitialFocus(); |
380 } | 381 } |
381 view_storage->RemoveView(last_focused_view_storage_id_); | 382 view_storage->RemoveView(last_focused_view_storage_id_); |
382 } | 383 } |
383 } | 384 } |
384 | 385 |
385 void TabContents::SetInitialFocus() { | 386 void TabContents::SetInitialFocus() { |
386 ::SetFocus(GetContainerHWND()); | 387 ::SetFocus(GetContainerHWND()); |
387 } | 388 } |
388 | 389 |
| 390 void TabContents::AddInfoBar(InfoBarDelegate* delegate) { |
| 391 // Look through the existing InfoBarDelegates we have for a match. If we've |
| 392 // already got one that matches, then we don't add the new one. |
| 393 for (size_t i = 0; i < infobar_delegate_count(); ++i) { |
| 394 if (GetInfoBarDelegateAt(i)->EqualsDelegate(delegate)) |
| 395 return; |
| 396 } |
| 397 |
| 398 infobar_delegates_.push_back(delegate); |
| 399 NotificationService::current()->Notify(NOTIFY_TAB_CONTENTS_INFOBAR_ADDED, |
| 400 Source<TabContents>(this), |
| 401 Details<InfoBarDelegate>(delegate)); |
| 402 |
| 403 // Add ourselves as an observer for navigations the first time a delegate is |
| 404 // added. We use this notification to expire InfoBars that need to expire on |
| 405 // page transitions. |
| 406 if (infobar_delegates_.size() == 1) { |
| 407 NotificationService::current()->AddObserver( |
| 408 this, NOTIFY_NAV_ENTRY_COMMITTED, |
| 409 Source<NavigationController>(controller())); |
| 410 } |
| 411 } |
| 412 |
| 413 void TabContents::RemoveInfoBar(InfoBarDelegate* delegate) { |
| 414 std::vector<InfoBarDelegate*>::iterator it = |
| 415 find(infobar_delegates_.begin(), infobar_delegates_.end(), delegate); |
| 416 if (it != infobar_delegates_.end()) { |
| 417 InfoBarDelegate* delegate = *it; |
| 418 infobar_delegates_.erase(it); |
| 419 NotificationService::current()->Notify(NOTIFY_TAB_CONTENTS_INFOBAR_REMOVED, |
| 420 Source<TabContents>(this), |
| 421 Details<InfoBarDelegate>(delegate)); |
| 422 } |
| 423 |
| 424 // Remove ourselves as an observer if we are tracking no more InfoBars. |
| 425 if (infobar_delegates_.empty()) { |
| 426 NotificationService::current()->RemoveObserver( |
| 427 this, NOTIFY_NAV_ENTRY_COMMITTED, |
| 428 Source<NavigationController>(controller())); |
| 429 } |
| 430 } |
| 431 |
389 void TabContents::SetDownloadShelfVisible(bool visible) { | 432 void TabContents::SetDownloadShelfVisible(bool visible) { |
390 if (shelf_visible_ != visible) { | 433 if (shelf_visible_ != visible) { |
391 if (visible) { | 434 if (visible) { |
392 // Invoke GetDownloadShelfView to force the shelf to be created. | 435 // Invoke GetDownloadShelfView to force the shelf to be created. |
393 GetDownloadShelfView(); | 436 GetDownloadShelfView(); |
394 } | 437 } |
395 shelf_visible_ = visible; | 438 shelf_visible_ = visible; |
396 | 439 |
397 if (delegate_) | 440 if (delegate_) |
398 delegate_->ContentsStateChanged(this); | 441 delegate_->ContentsStateChanged(this); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 GetClientRect(GetContainerHWND(), &client_rect); | 503 GetClientRect(GetContainerHWND(), &client_rect); |
461 RepositionSupressedPopupsToFit( | 504 RepositionSupressedPopupsToFit( |
462 gfx::Size(client_rect.Width(), client_rect.Height())); | 505 gfx::Size(client_rect.Width(), client_rect.Height())); |
463 } | 506 } |
464 } | 507 } |
465 | 508 |
466 void TabContents::DidMoveOrResize(ConstrainedWindow* window) { | 509 void TabContents::DidMoveOrResize(ConstrainedWindow* window) { |
467 UpdateWindow(GetContainerHWND()); | 510 UpdateWindow(GetContainerHWND()); |
468 } | 511 } |
469 | 512 |
| 513 void TabContents::Observe(NotificationType type, |
| 514 const NotificationSource& source, |
| 515 const NotificationDetails& details) { |
| 516 DCHECK(type == NOTIFY_NAV_ENTRY_COMMITTED); |
| 517 DCHECK(controller() == Source<NavigationController>(source).ptr()); |
| 518 |
| 519 NavigationController::LoadCommittedDetails& committed_details = |
| 520 *(Details<NavigationController::LoadCommittedDetails>(details).ptr()); |
| 521 ExpireInfoBars(committed_details); |
| 522 } |
| 523 |
470 // static | 524 // static |
471 void TabContents::MigrateShelfView(TabContents* from, TabContents* to) { | 525 void TabContents::MigrateShelfView(TabContents* from, TabContents* to) { |
472 bool was_shelf_visible = from->IsDownloadShelfVisible(); | 526 bool was_shelf_visible = from->IsDownloadShelfVisible(); |
473 if (was_shelf_visible) | 527 if (was_shelf_visible) |
474 to->MigrateShelfViewFrom(from); | 528 to->MigrateShelfViewFrom(from); |
475 to->SetDownloadShelfVisible(was_shelf_visible); | 529 to->SetDownloadShelfVisible(was_shelf_visible); |
476 } | 530 } |
477 | 531 |
478 void TabContents::SetIsLoading(bool is_loading, | 532 void TabContents::SetIsLoading(bool is_loading, |
479 LoadNotificationDetails* details) { | 533 LoadNotificationDetails* details) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 } | 568 } |
515 | 569 |
516 void TabContents::ReleaseDownloadShelfView() { | 570 void TabContents::ReleaseDownloadShelfView() { |
517 download_shelf_view_.release(); | 571 download_shelf_view_.release(); |
518 } | 572 } |
519 | 573 |
520 bool TabContents::ShowingBlockedPopupNotification() const { | 574 bool TabContents::ShowingBlockedPopupNotification() const { |
521 return blocked_popups_ != NULL && | 575 return blocked_popups_ != NULL && |
522 blocked_popups_->GetTabContentsCount() != 0; | 576 blocked_popups_->GetTabContentsCount() != 0; |
523 } | 577 } |
| 578 |
| 579 namespace { |
| 580 bool TransitionIsReload(PageTransition::Type transition) { |
| 581 return PageTransition::StripQualifier(transition) == PageTransition::RELOAD; |
| 582 } |
| 583 } |
| 584 |
| 585 void TabContents::ExpireInfoBars( |
| 586 const NavigationController::LoadCommittedDetails& details) { |
| 587 // Only hide InfoBars when the user has done something that makes the main |
| 588 // frame load. We don't want various automatic or subframe navigations making |
| 589 // it disappear. |
| 590 if (!details.is_user_initiated_main_frame_load()) |
| 591 return; |
| 592 |
| 593 for (size_t i = 0; i < infobar_delegate_count(); ++i) { |
| 594 InfoBarDelegate* delegate = GetInfoBarDelegateAt(i); |
| 595 if (!TransitionIsReload(details.entry->transition_type()) && |
| 596 delegate->ShouldCloseOnNavigate()) { |
| 597 RemoveInfoBar(delegate); |
| 598 } |
| 599 } |
| 600 } |
OLD | NEW |