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

Side by Side Diff: chrome/browser/views/location_bar_view.cc

Issue 1001002: Initial support for inspecting extension popups. (Closed)
Patch Set: pre submit Created 10 years, 9 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
« no previous file with comments | « chrome/browser/views/location_bar_view.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « chrome/browser/views/location_bar_view.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698