| 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 37c1759d0838036e607ae79bc649a24715c8e24b..98823bcd9ae70572a6aca1baf8cea15974e55833 100644
 | 
| --- a/chrome/browser/views/location_bar_view.cc
 | 
| +++ b/chrome/browser/views/location_bar_view.cc
 | 
| @@ -1427,8 +1427,7 @@ LocationBarView::PageActionImageView::PageActionImageView(
 | 
|        tracker_(NULL),
 | 
|        current_tab_id_(-1),
 | 
|        preview_enabled_(false),
 | 
| -      popup_(NULL),
 | 
| -      ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
 | 
| +      popup_(NULL) {
 | 
|    Extension* extension = profile->GetExtensionsService()->GetExtensionById(
 | 
|        page_action->extension_id(), false);
 | 
|    DCHECK(extension);
 | 
| @@ -1447,9 +1446,6 @@ LocationBarView::PageActionImageView::PageActionImageView(
 | 
|          gfx::Size(Extension::kPageActionIconMaxSize,
 | 
|                    Extension::kPageActionIconMaxSize));
 | 
|    }
 | 
| -
 | 
| -  registrar_.Add(this, NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE,
 | 
| -                 Source<Profile>(profile_));
 | 
|  }
 | 
|  
 | 
|  LocationBarView::PageActionImageView::~PageActionImageView() {
 | 
| @@ -1460,7 +1456,8 @@ LocationBarView::PageActionImageView::~PageActionImageView() {
 | 
|      HidePopup();
 | 
|  }
 | 
|  
 | 
| -void LocationBarView::PageActionImageView::ExecuteAction(int button) {
 | 
| +void LocationBarView::PageActionImageView::ExecuteAction(int button,
 | 
| +    bool inspect_with_devtools) {
 | 
|    if (current_tab_id_ < 0) {
 | 
|      NOTREACHED() << "No current tab.";
 | 
|      return;
 | 
| @@ -1500,8 +1497,9 @@ void LocationBarView::PageActionImageView::ExecuteAction(int button) {
 | 
|          rect,
 | 
|          BubbleBorder::TOP_RIGHT,
 | 
|          true,  // Activate the popup window.
 | 
| -        ExtensionPopup::BUBBLE_CHROME);
 | 
| -    popup_->set_delegate(this);
 | 
| +        inspect_with_devtools,
 | 
| +        ExtensionPopup::BUBBLE_CHROME,
 | 
| +        this);  // ExtensionPopup::Observer
 | 
|    } else {
 | 
|      ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted(
 | 
|          profile_, page_action_->extension_id(), page_action_->id(),
 | 
| @@ -1547,11 +1545,15 @@ void LocationBarView::PageActionImageView::OnMouseReleased(
 | 
|  
 | 
|      if (!context_menu_.get())
 | 
|        context_menu_.reset(new ExtensionActionContextMenu());
 | 
| -    context_menu_->Run(extension, point);
 | 
| +    context_menu_->Run(extension,
 | 
| +                       extension->page_action(),
 | 
| +                       this,  // ExtensionActionContextMenuModel::Delegate
 | 
| +                       profile_->GetPrefs(),
 | 
| +                       point);
 | 
|      return;
 | 
|    }
 | 
|  
 | 
| -  ExecuteAction(button);
 | 
| +  ExecuteAction(button, false);  // inspect_with_devtools
 | 
|  }
 | 
|  
 | 
|  void LocationBarView::PageActionImageView::ShowInfoBubble() {
 | 
| @@ -1629,56 +1631,22 @@ void LocationBarView::PageActionImageView::UpdateVisibility(
 | 
|    SetVisible(visible);
 | 
|  }
 | 
|  
 | 
| -void LocationBarView::PageActionImageView::BubbleBrowserWindowClosing(
 | 
| -    BrowserBubble* bubble) {
 | 
| -  HidePopup();
 | 
| -}
 | 
| -
 | 
| -void LocationBarView::PageActionImageView::BubbleLostFocus(
 | 
| -    BrowserBubble* bubble, bool lost_focus_to_child) {
 | 
| -  // Don't close when we are losing focus to a child window, this is the case
 | 
| -  // for select popups and alert for example.
 | 
| -  if (!popup_ || lost_focus_to_child)
 | 
| -    return;
 | 
| -
 | 
| -  MessageLoop::current()->PostTask(FROM_HERE,
 | 
| -      method_factory_.NewRunnableMethod(
 | 
| -          &LocationBarView::PageActionImageView::HidePopup));
 | 
| +void LocationBarView::PageActionImageView::ShowPopupForDevToolsWindow(
 | 
| +    Extension* extension, ExtensionAction* extension_action) {
 | 
| +  ExecuteAction(1,  // left-click
 | 
| +                true);  // inspect_with_devtools
 | 
|  }
 | 
|  
 | 
| -void LocationBarView::PageActionImageView::HidePopup() {
 | 
| -  if (!popup_)
 | 
| -    return;
 | 
| -
 | 
| -  // This sometimes gets called via a timer (See BubbleLostFocus), so clear
 | 
| -  // the method factory. in case one is pending.
 | 
| -  method_factory_.RevokeAll();
 | 
| -
 | 
| -  // Save the popup in a local since destroying it calls BubbleLostFocus,
 | 
| -  // which will try to call HidePopup() again.
 | 
| -  ExtensionPopup* closing_popup = popup_;
 | 
| +void LocationBarView::PageActionImageView::ExtensionPopupClosed(
 | 
| +    ExtensionPopup* popup) {
 | 
| +  DCHECK_EQ(popup_, popup);
 | 
| +  // ExtensionPopup is ref-counted, so we don't need to delete it.
 | 
|    popup_ = NULL;
 | 
| -
 | 
| -  closing_popup->DetachFromBrowser();
 | 
| -  delete closing_popup;
 | 
|  }
 | 
|  
 | 
| -void LocationBarView::PageActionImageView::Observe(
 | 
| -    NotificationType type,
 | 
| -    const NotificationSource& source,
 | 
| -    const NotificationDetails& details) {
 | 
| -  switch (type.value) {
 | 
| -    case NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE:
 | 
| -      // If we aren't the host of the popup, then disregard the notification.
 | 
| -      if (!popup_ || Details<ExtensionHost>(popup_->host()) != details)
 | 
| -        return;
 | 
| -
 | 
| -      HidePopup();
 | 
| -      break;
 | 
| -    default:
 | 
| -      NOTREACHED() << "Unexpected notification";
 | 
| -      break;
 | 
| -  }
 | 
| +void LocationBarView::PageActionImageView::HidePopup() {
 | 
| +  if (popup_)
 | 
| +    popup_->Close();
 | 
|  }
 | 
|  
 | 
|  ////////////////////////////////////////////////////////////////////////////////
 | 
| @@ -1767,7 +1735,8 @@ void LocationBarView::TestPageActionPressed(size_t index) {
 | 
|      if (page_action_views_[i]->IsVisible()) {
 | 
|        if (current == index) {
 | 
|          const int kLeftMouseButton = 1;
 | 
| -        page_action_views_[i]->image_view()->ExecuteAction(kLeftMouseButton);
 | 
| +        page_action_views_[i]->image_view()->ExecuteAction(kLeftMouseButton,
 | 
| +            false);  // inspect_with_devtools
 | 
|          return;
 | 
|        }
 | 
|        ++current;
 | 
| 
 |