| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/views/location_bar_view.h" | 5 #include "chrome/browser/views/location_bar_view.h" |
| 6 | 6 |
| 7 #if defined(OS_LINUX) | 7 #if defined(OS_LINUX) |
| 8 #include <gtk/gtk.h> | 8 #include <gtk/gtk.h> |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 1409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1420 Profile* profile, | 1420 Profile* profile, |
| 1421 ExtensionAction* page_action, | 1421 ExtensionAction* page_action, |
| 1422 const BubblePositioner* bubble_positioner) | 1422 const BubblePositioner* bubble_positioner) |
| 1423 : LocationBarImageView(bubble_positioner), | 1423 : LocationBarImageView(bubble_positioner), |
| 1424 owner_(owner), | 1424 owner_(owner), |
| 1425 profile_(profile), | 1425 profile_(profile), |
| 1426 page_action_(page_action), | 1426 page_action_(page_action), |
| 1427 tracker_(NULL), | 1427 tracker_(NULL), |
| 1428 current_tab_id_(-1), | 1428 current_tab_id_(-1), |
| 1429 preview_enabled_(false), | 1429 preview_enabled_(false), |
| 1430 popup_(NULL), | 1430 popup_(NULL) { |
| 1431 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { | |
| 1432 Extension* extension = profile->GetExtensionsService()->GetExtensionById( | 1431 Extension* extension = profile->GetExtensionsService()->GetExtensionById( |
| 1433 page_action->extension_id(), false); | 1432 page_action->extension_id(), false); |
| 1434 DCHECK(extension); | 1433 DCHECK(extension); |
| 1435 | 1434 |
| 1436 // Load all the icons declared in the manifest. This is the contents of the | 1435 // Load all the icons declared in the manifest. This is the contents of the |
| 1437 // icons array, plus the default_icon property, if any. | 1436 // icons array, plus the default_icon property, if any. |
| 1438 std::vector<std::string> icon_paths(*page_action->icon_paths()); | 1437 std::vector<std::string> icon_paths(*page_action->icon_paths()); |
| 1439 if (!page_action_->default_icon_path().empty()) | 1438 if (!page_action_->default_icon_path().empty()) |
| 1440 icon_paths.push_back(page_action_->default_icon_path()); | 1439 icon_paths.push_back(page_action_->default_icon_path()); |
| 1441 | 1440 |
| 1442 tracker_ = new ImageLoadingTracker(this, icon_paths.size()); | 1441 tracker_ = new ImageLoadingTracker(this, icon_paths.size()); |
| 1443 for (std::vector<std::string>::iterator iter = icon_paths.begin(); | 1442 for (std::vector<std::string>::iterator iter = icon_paths.begin(); |
| 1444 iter != icon_paths.end(); ++iter) { | 1443 iter != icon_paths.end(); ++iter) { |
| 1445 tracker_->PostLoadImageTask( | 1444 tracker_->PostLoadImageTask( |
| 1446 extension->GetResource(*iter), | 1445 extension->GetResource(*iter), |
| 1447 gfx::Size(Extension::kPageActionIconMaxSize, | 1446 gfx::Size(Extension::kPageActionIconMaxSize, |
| 1448 Extension::kPageActionIconMaxSize)); | 1447 Extension::kPageActionIconMaxSize)); |
| 1449 } | 1448 } |
| 1450 | |
| 1451 registrar_.Add(this, NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE, | |
| 1452 Source<Profile>(profile_)); | |
| 1453 } | 1449 } |
| 1454 | 1450 |
| 1455 LocationBarView::PageActionImageView::~PageActionImageView() { | 1451 LocationBarView::PageActionImageView::~PageActionImageView() { |
| 1456 if (tracker_) | 1452 if (tracker_) |
| 1457 tracker_->StopTrackingImageLoad(); | 1453 tracker_->StopTrackingImageLoad(); |
| 1458 | 1454 |
| 1459 if (popup_) | 1455 if (popup_) |
| 1460 HidePopup(); | 1456 HidePopup(); |
| 1461 } | 1457 } |
| 1462 | 1458 |
| 1463 void LocationBarView::PageActionImageView::ExecuteAction(int button) { | 1459 void LocationBarView::PageActionImageView::ExecuteAction(int button, |
| 1460 bool inspect_with_devtools) { |
| 1464 if (current_tab_id_ < 0) { | 1461 if (current_tab_id_ < 0) { |
| 1465 NOTREACHED() << "No current tab."; | 1462 NOTREACHED() << "No current tab."; |
| 1466 return; | 1463 return; |
| 1467 } | 1464 } |
| 1468 | 1465 |
| 1469 if (page_action_->HasPopup(current_tab_id_)) { | 1466 if (page_action_->HasPopup(current_tab_id_)) { |
| 1470 // In tests, GetLastActive could return NULL, so we need to have | 1467 // In tests, GetLastActive could return NULL, so we need to have |
| 1471 // a fallback. | 1468 // a fallback. |
| 1472 // TODO(erikkay): Find a better way to get the Browser that this | 1469 // TODO(erikkay): Find a better way to get the Browser that this |
| 1473 // button is in. | 1470 // button is in. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1493 rect.set_y(origin.y()); | 1490 rect.set_y(origin.y()); |
| 1494 | 1491 |
| 1495 popup_ = ExtensionPopup::Show( | 1492 popup_ = ExtensionPopup::Show( |
| 1496 page_action_->GetPopupUrl(current_tab_id_), | 1493 page_action_->GetPopupUrl(current_tab_id_), |
| 1497 browser, | 1494 browser, |
| 1498 browser->profile(), | 1495 browser->profile(), |
| 1499 browser->window()->GetNativeHandle(), | 1496 browser->window()->GetNativeHandle(), |
| 1500 rect, | 1497 rect, |
| 1501 BubbleBorder::TOP_RIGHT, | 1498 BubbleBorder::TOP_RIGHT, |
| 1502 true, // Activate the popup window. | 1499 true, // Activate the popup window. |
| 1503 ExtensionPopup::BUBBLE_CHROME); | 1500 inspect_with_devtools, |
| 1504 popup_->set_delegate(this); | 1501 ExtensionPopup::BUBBLE_CHROME, |
| 1502 this); // ExtensionPopup::Observer |
| 1505 } else { | 1503 } else { |
| 1506 ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted( | 1504 ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted( |
| 1507 profile_, page_action_->extension_id(), page_action_->id(), | 1505 profile_, page_action_->extension_id(), page_action_->id(), |
| 1508 current_tab_id_, current_url_.spec(), button); | 1506 current_tab_id_, current_url_.spec(), button); |
| 1509 } | 1507 } |
| 1510 } | 1508 } |
| 1511 | 1509 |
| 1512 void LocationBarView::PageActionImageView::OnMouseMoved( | 1510 void LocationBarView::PageActionImageView::OnMouseMoved( |
| 1513 const views::MouseEvent& event) { | 1511 const views::MouseEvent& event) { |
| 1514 // PageActionImageView uses normal tooltips rather than the info bubble, | 1512 // PageActionImageView uses normal tooltips rather than the info bubble, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1540 ConvertPointToScreen(this, &point); | 1538 ConvertPointToScreen(this, &point); |
| 1541 | 1539 |
| 1542 // Make the menu appear below the button. | 1540 // Make the menu appear below the button. |
| 1543 point.Offset(0, height()); | 1541 point.Offset(0, height()); |
| 1544 | 1542 |
| 1545 Extension* extension = profile_->GetExtensionsService()->GetExtensionById( | 1543 Extension* extension = profile_->GetExtensionsService()->GetExtensionById( |
| 1546 page_action()->extension_id(), false); | 1544 page_action()->extension_id(), false); |
| 1547 | 1545 |
| 1548 if (!context_menu_.get()) | 1546 if (!context_menu_.get()) |
| 1549 context_menu_.reset(new ExtensionActionContextMenu()); | 1547 context_menu_.reset(new ExtensionActionContextMenu()); |
| 1550 context_menu_->Run(extension, point); | 1548 context_menu_->Run(extension, |
| 1549 extension->page_action(), |
| 1550 this, // ExtensionActionContextMenuModel::Delegate |
| 1551 profile_->GetPrefs(), |
| 1552 point); |
| 1551 return; | 1553 return; |
| 1552 } | 1554 } |
| 1553 | 1555 |
| 1554 ExecuteAction(button); | 1556 ExecuteAction(button, false); // inspect_with_devtools |
| 1555 } | 1557 } |
| 1556 | 1558 |
| 1557 void LocationBarView::PageActionImageView::ShowInfoBubble() { | 1559 void LocationBarView::PageActionImageView::ShowInfoBubble() { |
| 1558 ShowInfoBubbleImpl(ASCIIToWide(tooltip_), GetColor(false, TEXT)); | 1560 ShowInfoBubbleImpl(ASCIIToWide(tooltip_), GetColor(false, TEXT)); |
| 1559 } | 1561 } |
| 1560 | 1562 |
| 1561 void LocationBarView::PageActionImageView::OnImageLoaded(SkBitmap* image, | 1563 void LocationBarView::PageActionImageView::OnImageLoaded(SkBitmap* image, |
| 1562 size_t index) { | 1564 size_t index) { |
| 1563 // We loaded icons()->size() icons, plus one extra if the page action had | 1565 // We loaded icons()->size() icons, plus one extra if the page action had |
| 1564 // a default icon. | 1566 // a default icon. |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1622 icon = iter->second; | 1624 icon = iter->second; |
| 1623 } | 1625 } |
| 1624 } | 1626 } |
| 1625 | 1627 |
| 1626 if (!icon.isNull()) | 1628 if (!icon.isNull()) |
| 1627 SetImage(&icon); | 1629 SetImage(&icon); |
| 1628 } | 1630 } |
| 1629 SetVisible(visible); | 1631 SetVisible(visible); |
| 1630 } | 1632 } |
| 1631 | 1633 |
| 1632 void LocationBarView::PageActionImageView::BubbleBrowserWindowClosing( | 1634 void LocationBarView::PageActionImageView::ShowPopupForDevToolsWindow( |
| 1633 BrowserBubble* bubble) { | 1635 Extension* extension, ExtensionAction* extension_action) { |
| 1634 HidePopup(); | 1636 ExecuteAction(1, // left-click |
| 1637 true); // inspect_with_devtools |
| 1635 } | 1638 } |
| 1636 | 1639 |
| 1637 void LocationBarView::PageActionImageView::BubbleLostFocus( | 1640 void LocationBarView::PageActionImageView::ExtensionPopupClosed( |
| 1638 BrowserBubble* bubble, bool lost_focus_to_child) { | 1641 ExtensionPopup* popup) { |
| 1639 // Don't close when we are losing focus to a child window, this is the case | 1642 DCHECK_EQ(popup_, popup); |
| 1640 // for select popups and alert for example. | 1643 // ExtensionPopup is ref-counted, so we don't need to delete it. |
| 1641 if (!popup_ || lost_focus_to_child) | 1644 popup_ = NULL; |
| 1642 return; | |
| 1643 | |
| 1644 MessageLoop::current()->PostTask(FROM_HERE, | |
| 1645 method_factory_.NewRunnableMethod( | |
| 1646 &LocationBarView::PageActionImageView::HidePopup)); | |
| 1647 } | 1645 } |
| 1648 | 1646 |
| 1649 void LocationBarView::PageActionImageView::HidePopup() { | 1647 void LocationBarView::PageActionImageView::HidePopup() { |
| 1650 if (!popup_) | 1648 if (popup_) |
| 1651 return; | 1649 popup_->Close(); |
| 1652 | |
| 1653 // This sometimes gets called via a timer (See BubbleLostFocus), so clear | |
| 1654 // the method factory. in case one is pending. | |
| 1655 method_factory_.RevokeAll(); | |
| 1656 | |
| 1657 // Save the popup in a local since destroying it calls BubbleLostFocus, | |
| 1658 // which will try to call HidePopup() again. | |
| 1659 ExtensionPopup* closing_popup = popup_; | |
| 1660 popup_ = NULL; | |
| 1661 | |
| 1662 closing_popup->DetachFromBrowser(); | |
| 1663 delete closing_popup; | |
| 1664 } | |
| 1665 | |
| 1666 void LocationBarView::PageActionImageView::Observe( | |
| 1667 NotificationType type, | |
| 1668 const NotificationSource& source, | |
| 1669 const NotificationDetails& details) { | |
| 1670 switch (type.value) { | |
| 1671 case NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE: | |
| 1672 // If we aren't the host of the popup, then disregard the notification. | |
| 1673 if (!popup_ || Details<ExtensionHost>(popup_->host()) != details) | |
| 1674 return; | |
| 1675 | |
| 1676 HidePopup(); | |
| 1677 break; | |
| 1678 default: | |
| 1679 NOTREACHED() << "Unexpected notification"; | |
| 1680 break; | |
| 1681 } | |
| 1682 } | 1650 } |
| 1683 | 1651 |
| 1684 //////////////////////////////////////////////////////////////////////////////// | 1652 //////////////////////////////////////////////////////////////////////////////// |
| 1685 // LocationBarView, LocationBar implementation: | 1653 // LocationBarView, LocationBar implementation: |
| 1686 | 1654 |
| 1687 void LocationBarView::ShowFirstRunBubble(bool use_OEM_bubble) { | 1655 void LocationBarView::ShowFirstRunBubble(bool use_OEM_bubble) { |
| 1688 // We wait 30 milliseconds to open. It allows less flicker. | 1656 // We wait 30 milliseconds to open. It allows less flicker. |
| 1689 Task* task = first_run_bubble_.NewRunnableMethod( | 1657 Task* task = first_run_bubble_.NewRunnableMethod( |
| 1690 &LocationBarView::ShowFirstRunBubbleInternal, use_OEM_bubble); | 1658 &LocationBarView::ShowFirstRunBubbleInternal, use_OEM_bubble); |
| 1691 MessageLoop::current()->PostDelayedTask(FROM_HERE, task, 30); | 1659 MessageLoop::current()->PostDelayedTask(FROM_HERE, task, 30); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1760 NOTREACHED(); | 1728 NOTREACHED(); |
| 1761 return NULL; | 1729 return NULL; |
| 1762 } | 1730 } |
| 1763 | 1731 |
| 1764 void LocationBarView::TestPageActionPressed(size_t index) { | 1732 void LocationBarView::TestPageActionPressed(size_t index) { |
| 1765 size_t current = 0; | 1733 size_t current = 0; |
| 1766 for (size_t i = 0; i < page_action_views_.size(); ++i) { | 1734 for (size_t i = 0; i < page_action_views_.size(); ++i) { |
| 1767 if (page_action_views_[i]->IsVisible()) { | 1735 if (page_action_views_[i]->IsVisible()) { |
| 1768 if (current == index) { | 1736 if (current == index) { |
| 1769 const int kLeftMouseButton = 1; | 1737 const int kLeftMouseButton = 1; |
| 1770 page_action_views_[i]->image_view()->ExecuteAction(kLeftMouseButton); | 1738 page_action_views_[i]->image_view()->ExecuteAction(kLeftMouseButton, |
| 1739 false); // inspect_with_devtools |
| 1771 return; | 1740 return; |
| 1772 } | 1741 } |
| 1773 ++current; | 1742 ++current; |
| 1774 } | 1743 } |
| 1775 } | 1744 } |
| 1776 | 1745 |
| 1777 NOTREACHED(); | 1746 NOTREACHED(); |
| 1778 } | 1747 } |
| OLD | NEW |