| Index: chrome/browser/views/location_bar_view.cc
|
| diff --git a/chrome/browser/views/location_bar_view.cc b/chrome/browser/views/location_bar_view.cc
|
| index 2d32c52497ce4ca9cc5612fe10428860dedfd6e5..edbe5f273bb9d63c5e9034a8924cc1964d43321c 100644
|
| --- a/chrome/browser/views/location_bar_view.cc
|
| +++ b/chrome/browser/views/location_bar_view.cc
|
| @@ -24,6 +24,7 @@
|
| #include "chrome/browser/profile.h"
|
| #include "chrome/browser/search_engines/template_url_model.h"
|
| #include "chrome/browser/view_ids.h"
|
| +#include "chrome/browser/views/extensions/extension_popup.h"
|
| #include "grit/generated_resources.h"
|
| #include "grit/theme_resources.h"
|
|
|
| @@ -695,6 +696,14 @@ void LocationBarView::RefreshPageActionViews() {
|
| if (!service)
|
| return;
|
|
|
| + std::map<ExtensionAction*, bool> old_visibility;
|
| + for (size_t i = 0; i < page_action_views_.size(); i++) {
|
| + old_visibility[page_action_views_[i]->image_view()->page_action()] =
|
| + page_action_views_[i]->IsVisible();
|
| + }
|
| +
|
| + // Remember the previous visibility of the page actions so that we can
|
| + // notify when this changes.
|
| for (size_t i = 0; i < service->extensions()->size(); ++i) {
|
| if (service->extensions()->at(i)->page_action())
|
| page_actions.push_back(service->extensions()->at(i)->page_action());
|
| @@ -721,8 +730,20 @@ void LocationBarView::RefreshPageActionViews() {
|
| if (!page_action_views_.empty() && contents) {
|
| GURL url = GURL(WideToUTF8(model_->GetText()));
|
|
|
| - for (size_t i = 0; i < page_action_views_.size(); i++)
|
| + for (size_t i = 0; i < page_action_views_.size(); i++) {
|
| page_action_views_[i]->UpdateVisibility(contents, url);
|
| +
|
| + // Check if the visibility of the action changed and notify if it did.
|
| + ExtensionAction* action =
|
| + page_action_views_[i]->image_view()->page_action();
|
| + if (old_visibility.find(action) == old_visibility.end() ||
|
| + old_visibility[action] != page_action_views_[i]->IsVisible()) {
|
| + NotificationService::current()->Notify(
|
| + NotificationType::EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED,
|
| + Source<ExtensionAction>(action),
|
| + Details<TabContents>(contents));
|
| + }
|
| + }
|
| }
|
| }
|
|
|
| @@ -1268,6 +1289,36 @@ LocationBarView::PageActionImageView::~PageActionImageView() {
|
| tracker_->StopTrackingImageLoad();
|
| }
|
|
|
| +void LocationBarView::PageActionImageView::ExecuteAction(int button) {
|
| + if (page_action_->has_popup()) {
|
| + gfx::Point origin;
|
| + View::ConvertPointToScreen(this, &origin);
|
| + gfx::Rect rect = bounds();
|
| + rect.set_x(origin.x());
|
| + rect.set_y(origin.y());
|
| +
|
| + // In tests, GetLastActive could return NULL, so we need to have
|
| + // a fallback.
|
| + // TODO(erikkay): Find a better way to get the Browser that this
|
| + // button is in.
|
| + Browser* browser = BrowserList::GetLastActiveWithProfile(profile_);
|
| + if (!browser)
|
| + browser = BrowserList::FindBrowserWithProfile(profile_);
|
| + ExtensionPopup::Show(page_action_->popup_url(), browser, rect);
|
| + } else {
|
| + ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted(
|
| + profile_, page_action_->extension_id(), page_action_->id(),
|
| + current_tab_id_, current_url_.spec(), button);
|
| + }
|
| +}
|
| +
|
| +void LocationBarView::PageActionImageView::OnMouseMoved(
|
| + const views::MouseEvent& event) {
|
| + // PageActionImageView uses normal tooltips rather than the info bubble,
|
| + // so just do nothing here rather than letting LocationBarImageView start
|
| + // its hover timer.
|
| +}
|
| +
|
| bool LocationBarView::PageActionImageView::OnMousePressed(
|
| const views::MouseEvent& event) {
|
| int button = -1;
|
| @@ -1277,10 +1328,8 @@ bool LocationBarView::PageActionImageView::OnMousePressed(
|
| button = 2;
|
| else if (event.IsRightMouseButton())
|
| button = 3;
|
| - // Our PageAction icon was clicked on, notify proper authorities.
|
| - ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted(
|
| - profile_, page_action_->extension_id(), page_action_->id(),
|
| - current_tab_id_, current_url_.spec(), button);
|
| +
|
| + ExecuteAction(button);
|
| return true;
|
| }
|
|
|
| @@ -1324,6 +1373,7 @@ void LocationBarView::PageActionImageView::UpdateVisibility(
|
| if (visible) {
|
| // Set the tooltip.
|
| tooltip_ = page_action_->GetTitle(current_tab_id_);
|
| + SetTooltipText(ASCIIToWide(tooltip_));
|
|
|
| // Set the image.
|
| // It can come from three places. In descending order of priority:
|
| @@ -1413,3 +1463,45 @@ int LocationBarView::PageActionVisibleCount() {
|
| }
|
| return result;
|
| }
|
| +
|
| +ExtensionAction* LocationBarView::GetPageAction(size_t index) {
|
| + if (index < page_action_views_.size())
|
| + return page_action_views_[index]->image_view()->page_action();
|
| +
|
| + NOTREACHED();
|
| + return NULL;
|
| +}
|
| +
|
| +ExtensionAction* LocationBarView::GetVisiblePageAction(size_t index) {
|
| + if (index >= 0) {
|
| + size_t current = 0;
|
| + for (size_t i = 0; i < page_action_views_.size(); ++i) {
|
| + if (page_action_views_[i]->IsVisible()) {
|
| + if (current == index)
|
| + return page_action_views_[i]->image_view()->page_action();
|
| +
|
| + ++current;
|
| + }
|
| + }
|
| + }
|
| +
|
| + NOTREACHED();
|
| + return NULL;
|
| +}
|
| +
|
| +void LocationBarView::TestPageActionPressed(size_t index) {
|
| + if (index >= 0) {
|
| + size_t current = 0;
|
| + for (size_t i = 0; i < page_action_views_.size(); ++i) {
|
| + if (page_action_views_[i]->IsVisible()) {
|
| + if (current == index) {
|
| + const int button = 1; // Left mouse button.
|
| + page_action_views_[i]->image_view()->ExecuteAction(button);
|
| + return;
|
| + }
|
| + ++current;
|
| + }
|
| + }
|
| + }
|
| + NOTREACHED();
|
| +}
|
|
|