Chromium Code Reviews| Index: chrome/browser/extensions/menu_manager.cc |
| diff --git a/chrome/browser/extensions/menu_manager.cc b/chrome/browser/extensions/menu_manager.cc |
| index 424366390b34035298c5790bd32d417cd7ed67a8..bb8ead316c5e1eedc8f1506e751d01e566f7e3d9 100644 |
| --- a/chrome/browser/extensions/menu_manager.cc |
| +++ b/chrome/browser/extensions/menu_manager.cc |
| @@ -19,6 +19,7 @@ |
| #include "chrome/browser/extensions/menu_manager_factory.h" |
| #include "chrome/browser/extensions/state_store.h" |
| #include "chrome/browser/extensions/tab_helper.h" |
| +#include "chrome/browser/guestview/guestview.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/common/extensions/api/context_menus.h" |
| #include "content/public/browser/notification_details.h" |
| @@ -509,6 +510,49 @@ bool MenuManager::RemoveContextMenuItem(const MenuItem::Id& id) { |
| return result; |
| } |
| +void MenuManager::RemoveAllWebviewContextItems(const std::string& extension_id, |
| + int webview_instance_id) { |
| + MenuItem::List::iterator i; |
| + for (i = context_items_[extension_id].begin(); |
|
Fady Samuel
2014/03/04 01:56:46
I think it would be much cleaner if context items
lazyboy
2014/03/04 16:11:31
Hmmm, for most cases, webview_instance_id is 0, ad
Fady Samuel
2014/03/04 16:36:00
There is no additional indirection being added in
lazyboy
2014/03/04 20:50:24
Included instance id to the key, called MenuItem::
|
| + i != context_items_[extension_id].end(); |
| + ++i) { |
| + MenuItem* item = *i; |
| + if (item->id().webview_instance_id != webview_instance_id) |
| + continue; |
| + items_by_id_.erase(item->id()); |
| + |
| + // Remove descendants from this item and erase them from the lookup cache. |
| + std::set<MenuItem::Id> removed_ids = item->RemoveAllDescendants(); |
| + std::set<MenuItem::Id>::const_iterator j; |
| + for (j = removed_ids.begin(); j != removed_ids.end(); ++j) |
| + items_by_id_.erase(*j); |
| + } |
| + |
| + // TODO(lazyboy): Consider better data structure. We are naivly iterating |
| + // through each items in the extension and remvoving the ones that belong |
| + // to the webview. |
| + MenuItem::List& items = context_items_[extension_id]; |
| + i = items.begin(); |
| + MenuItem::List::iterator check_iter = items.begin(); |
| + MenuItem::List::iterator insert_iter = items.begin(); |
| + |
| + while (check_iter != items.end()) { |
| + int item_webview_instance_id = (*check_iter)->id().webview_instance_id; |
| + if (item_webview_instance_id != webview_instance_id) { |
| + *insert_iter = *check_iter; |
| + ++insert_iter; |
| + } else { |
| + delete *check_iter; |
| + } |
| + ++check_iter; |
| + } |
| + |
| + // Shrink. |
| + items.resize(insert_iter - items.begin()); |
| + if (!items.size()) |
| + context_items_.erase(extension_id); |
| +} |
| + |
| void MenuManager::RemoveAllContextItems(const std::string& extension_id) { |
| MenuItem::List::iterator i; |
| for (i = context_items_[extension_id].begin(); |
| @@ -646,6 +690,10 @@ void MenuManager::ExecuteCommand(Profile* profile, |
| properties->SetBoolean("editable", params.is_editable); |
| + GuestView* guest_view = GuestView::FromWebContents(web_contents); |
| + if (guest_view) |
| + properties->SetInteger("webviewInstanceId", guest_view->view_instance_id()); |
|
Fady Samuel
2014/03/04 01:56:46
What is this?
lazyboy
2014/03/04 16:11:31
This is a property on the onClick event.
Fady Samuel
2014/03/04 16:36:00
Is this visible to the developer? What's it used f
lazyboy
2014/03/04 20:50:24
Yes.
This is to indicate which webview the event c
lazyboy
2014/03/04 21:13:49
As discussed offline, I've removed exposing webvie
|
| + |
| args->Append(properties); |
| // Add the tab info to the argument list. |
| @@ -683,6 +731,7 @@ void MenuManager::ExecuteCommand(Profile* profile, |
| } |
| { |
| + // Dispatch to menu item's .onclick handler. |
| scoped_ptr<Event> event(new Event( |
| event_names::kOnContextMenus, |
| scoped_ptr<base::ListValue>(args->DeepCopy()))); |
| @@ -691,10 +740,15 @@ void MenuManager::ExecuteCommand(Profile* profile, |
| event_router->DispatchEventToExtension(item->extension_id(), event.Pass()); |
| } |
| { |
| - scoped_ptr<Event> event(new Event(context_menus::OnClicked::kEventName, |
| - args.Pass())); |
| + // Dispatch to .contextMenus.onClicked handler. |
| + scoped_ptr<Event> event( |
| + new Event(guest_view ? event_names::kOnWebviewContextMenus |
| + : context_menus::OnClicked::kEventName, |
| + args.Pass())); |
| event->restrict_to_browser_context = profile; |
| event->user_gesture = EventRouter::USER_GESTURE_ENABLED; |
| + if (guest_view) |
| + event->filter_info.SetInstanceID(guest_view->view_instance_id()); |
| event_router->DispatchEventToExtension(item->extension_id(), event.Pass()); |
| } |
| } |
| @@ -763,13 +817,16 @@ void MenuManager::WriteToStorage(const Extension* extension) { |
| if (top_items) { |
| for (MenuItem::List::const_iterator i = top_items->begin(); |
| i != top_items->end(); ++i) { |
| + if ((*i)->id().webview_instance_id) |
| + continue; |
| (*i)->GetFlattenedSubtree(&all_items); |
| } |
| } |
| - if (store_) |
| + if (store_) { |
| store_->SetExtensionValue(extension->id(), kContextMenusKey, |
| MenuItemsToValue(all_items)); |
| + } |
| } |
| void MenuManager::ReadFromStorage(const std::string& extension_id, |
| @@ -859,19 +916,21 @@ void MenuManager::RemoveAllIncognitoContextItems() { |
| RemoveContextMenuItem(*remove_iter); |
| } |
| -MenuItem::Id::Id() : incognito(false), uid(0) {} |
| +MenuItem::Id::Id() : incognito(false), uid(0), webview_instance_id(0) {} |
| MenuItem::Id::Id(bool incognito, const std::string& extension_id) |
| - : incognito(incognito), extension_id(extension_id), uid(0) {} |
| + : incognito(incognito), |
| + extension_id(extension_id), |
| + uid(0), |
| + webview_instance_id(0) {} |
| MenuItem::Id::~Id() { |
| } |
| bool MenuItem::Id::operator==(const Id& other) const { |
| - return (incognito == other.incognito && |
| - extension_id == other.extension_id && |
| - uid == other.uid && |
| - string_uid == other.string_uid); |
| + return (incognito == other.incognito && extension_id == other.extension_id && |
| + uid == other.uid && string_uid == other.string_uid && |
| + webview_instance_id == other.webview_instance_id); |
| } |
| bool MenuItem::Id::operator!=(const Id& other) const { |
| @@ -885,10 +944,15 @@ bool MenuItem::Id::operator<(const Id& other) const { |
| if (extension_id < other.extension_id) |
| return true; |
| if (extension_id == other.extension_id) { |
| - if (uid < other.uid) |
| + if (webview_instance_id < other.webview_instance_id) |
| return true; |
| - if (uid == other.uid) |
| - return string_uid < other.string_uid; |
| + |
| + if (webview_instance_id == other.webview_instance_id) { |
| + if (uid < other.uid) |
| + return true; |
| + if (uid == other.uid) |
| + return string_uid < other.string_uid; |
| + } |
| } |
| } |
| return false; |