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

Side by Side Diff: chrome/browser/tab_contents/render_view_context_menu.cc

Issue 4090011: Fix bug with context menus in incognito mode. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: manifest fix Created 10 years, 1 month 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 | Annotate | Revision Log
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 <algorithm> 5 #include <algorithm>
6 #include <set> 6 #include <set>
7 7
8 #include "chrome/browser/tab_contents/render_view_context_menu.h" 8 #include "chrome/browser/tab_contents/render_view_context_menu.h"
9 9
10 #include "app/l10n_util.h" 10 #include "app/l10n_util.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
14 #include "base/stl_util-inl.h" 14 #include "base/stl_util-inl.h"
15 #include "base/string_util.h" 15 #include "base/string_util.h"
16 #include "base/time.h" 16 #include "base/time.h"
17 #include "chrome/app/chrome_dll_resource.h" 17 #include "chrome/app/chrome_dll_resource.h"
18 #include "chrome/browser/autocomplete/autocomplete_classifier.h" 18 #include "chrome/browser/autocomplete/autocomplete_classifier.h"
19 #include "chrome/browser/autocomplete/autocomplete_edit.h" 19 #include "chrome/browser/autocomplete/autocomplete_edit.h"
20 #include "chrome/browser/autocomplete/autocomplete_match.h" 20 #include "chrome/browser/autocomplete/autocomplete_match.h"
21 #include "chrome/browser/browser_process.h" 21 #include "chrome/browser/browser_process.h"
22 #include "chrome/browser/child_process_security_policy.h" 22 #include "chrome/browser/child_process_security_policy.h"
23 #include "chrome/browser/debugger/devtools_manager.h" 23 #include "chrome/browser/debugger/devtools_manager.h"
24 #include "chrome/browser/debugger/devtools_window.h" 24 #include "chrome/browser/debugger/devtools_window.h"
25 #include "chrome/browser/download/download_manager.h" 25 #include "chrome/browser/download/download_manager.h"
26 #include "chrome/browser/extensions/extension_event_router.h"
26 #include "chrome/browser/extensions/extensions_service.h" 27 #include "chrome/browser/extensions/extensions_service.h"
27 #include "chrome/browser/fonts_languages_window.h" 28 #include "chrome/browser/fonts_languages_window.h"
28 #include "chrome/browser/metrics/user_metrics.h" 29 #include "chrome/browser/metrics/user_metrics.h"
29 #include "chrome/browser/net/browser_url_util.h" 30 #include "chrome/browser/net/browser_url_util.h"
30 #include "chrome/browser/page_info_window.h" 31 #include "chrome/browser/page_info_window.h"
31 #include "chrome/browser/platform_util.h" 32 #include "chrome/browser/platform_util.h"
32 #include "chrome/browser/prefs/pref_member.h" 33 #include "chrome/browser/prefs/pref_member.h"
33 #include "chrome/browser/prefs/pref_service.h" 34 #include "chrome/browser/prefs/pref_service.h"
34 #include "chrome/browser/profile.h" 35 #include "chrome/browser/profile.h"
35 #include "chrome/browser/renderer_host/render_view_host.h" 36 #include "chrome/browser/renderer_host/render_view_host.h"
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 if (patterns.is_empty()) 144 if (patterns.is_empty())
144 return true; 145 return true;
145 return patterns.ContainsURL(url); 146 return patterns.ContainsURL(url);
146 } 147 }
147 148
148 static const GURL& GetDocumentURL(const ContextMenuParams& params) { 149 static const GURL& GetDocumentURL(const ContextMenuParams& params) {
149 return params.frame_url.is_empty() ? params.page_url : params.frame_url; 150 return params.frame_url.is_empty() ? params.page_url : params.frame_url;
150 } 151 }
151 152
152 // Given a list of items, returns the ones that match given the contents 153 // Given a list of items, returns the ones that match given the contents
153 // of |params|. 154 // of |params| and the profile.
154 static ExtensionMenuItem::List GetRelevantExtensionItems( 155 static ExtensionMenuItem::List GetRelevantExtensionItems(
155 const ExtensionMenuItem::List& items, 156 const ExtensionMenuItem::List& items,
156 const ContextMenuParams& params) { 157 const ContextMenuParams& params,
158 Profile* profile,
159 bool can_cross_incognito) {
157 ExtensionMenuItem::List result; 160 ExtensionMenuItem::List result;
158 for (ExtensionMenuItem::List::const_iterator i = items.begin(); 161 for (ExtensionMenuItem::List::const_iterator i = items.begin();
159 i != items.end(); ++i) { 162 i != items.end(); ++i) {
160 const ExtensionMenuItem* item = *i; 163 const ExtensionMenuItem* item = *i;
161 164
162 if (!ExtensionContextMatch(params, item->contexts())) 165 if (!ExtensionContextMatch(params, item->contexts()))
163 continue; 166 continue;
164 167
165 const GURL& document_url = GetDocumentURL(params); 168 const GURL& document_url = GetDocumentURL(params);
166 if (!ExtensionPatternMatch(item->document_url_patterns(), document_url)) 169 if (!ExtensionPatternMatch(item->document_url_patterns(), document_url))
167 continue; 170 continue;
168 171
169 const GURL& target_url = 172 const GURL& target_url =
170 params.src_url.is_empty() ? params.link_url : params.src_url; 173 params.src_url.is_empty() ? params.link_url : params.src_url;
171 if (!ExtensionPatternMatch(item->target_url_patterns(), target_url)) 174 if (!ExtensionPatternMatch(item->target_url_patterns(), target_url))
172 continue; 175 continue;
173 176
174 result.push_back(*i); 177 if (item->id().profile == profile || can_cross_incognito)
178 result.push_back(*i);
175 } 179 }
176 return result; 180 return result;
177 } 181 }
178 182
179 void RenderViewContextMenu::AppendExtensionItems( 183 void RenderViewContextMenu::AppendExtensionItems(
180 const std::string& extension_id, int* index) { 184 const std::string& extension_id, int* index) {
181 ExtensionsService* service = profile_->GetExtensionsService(); 185 ExtensionsService* service = profile_->GetExtensionsService();
182 ExtensionMenuManager* manager = service->menu_manager(); 186 ExtensionMenuManager* manager = service->menu_manager();
183 const Extension* extension = service->GetExtensionById(extension_id, false); 187 const Extension* extension = service->GetExtensionById(extension_id, false);
188 bool can_cross_incognito =
189 ExtensionEventRouter::CanCrossIncognito(profile_, extension);
184 DCHECK_GE(*index, 0); 190 DCHECK_GE(*index, 0);
185 int max_index = 191 int max_index =
186 IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST - IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST; 192 IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST - IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST;
187 if (!extension || *index >= max_index) 193 if (!extension || *index >= max_index)
188 return; 194 return;
189 195
190 // Find matching items. 196 // Find matching items.
191 const ExtensionMenuItem::List* all_items = manager->MenuItems(extension_id); 197 const ExtensionMenuItem::List* all_items = manager->MenuItems(extension_id);
192 if (!all_items || all_items->empty()) 198 if (!all_items || all_items->empty())
193 return; 199 return;
194 ExtensionMenuItem::List items = 200 ExtensionMenuItem::List items =
195 GetRelevantExtensionItems(*all_items, params_); 201 GetRelevantExtensionItems(*all_items, params_, profile_,
202 can_cross_incognito);
196 if (items.empty()) 203 if (items.empty())
197 return; 204 return;
198 205
199 // If this is the first extension-provided menu item, add a separator. 206 // If this is the first extension-provided menu item, add a separator.
200 if (*index == 0) 207 if (*index == 0)
201 menu_model_.AddSeparator(); 208 menu_model_.AddSeparator();
202 209
203 int menu_id = IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST + (*index)++; 210 int menu_id = IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST + (*index)++;
204 211
205 // Extensions are only allowed one top-level slot (and it can't be a radio or 212 // Extensions are only allowed one top-level slot (and it can't be a radio or
206 // checkbox item because we are going to put the extension icon next to it). 213 // checkbox item because we are going to put the extension icon next to it).
207 // If they have more than that, we automatically push them into a submenu. 214 // If they have more than that, we automatically push them into a submenu.
208 string16 title; 215 string16 title;
209 ExtensionMenuItem::List submenu_items; 216 ExtensionMenuItem::List submenu_items;
210 if (items.size() > 1 || items[0]->type() != ExtensionMenuItem::NORMAL) { 217 if (items.size() > 1 || items[0]->type() != ExtensionMenuItem::NORMAL) {
211 title = UTF8ToUTF16(extension->name()); 218 title = UTF8ToUTF16(extension->name());
212 submenu_items = items; 219 submenu_items = items;
213 } else { 220 } else {
214 ExtensionMenuItem* item = items[0]; 221 ExtensionMenuItem* item = items[0];
215 extension_item_map_[menu_id] = item->id(); 222 extension_item_map_[menu_id] = item->id();
216 title = item->TitleWithReplacement(PrintableSelectionText(), 223 title = item->TitleWithReplacement(PrintableSelectionText(),
217 kMaxExtensionItemTitleLength); 224 kMaxExtensionItemTitleLength);
218 submenu_items = GetRelevantExtensionItems(item->children(), params_); 225 submenu_items = GetRelevantExtensionItems(item->children(), params_,
226 profile_, can_cross_incognito);
219 } 227 }
220 228
221 // Now add our item(s) to the menu_model_. 229 // Now add our item(s) to the menu_model_.
222 if (submenu_items.empty()) { 230 if (submenu_items.empty()) {
223 menu_model_.AddItem(menu_id, title); 231 menu_model_.AddItem(menu_id, title);
224 } else { 232 } else {
225 menus::SimpleMenuModel* submenu = new menus::SimpleMenuModel(this); 233 menus::SimpleMenuModel* submenu = new menus::SimpleMenuModel(this);
226 extension_menu_models_.push_back(submenu); 234 extension_menu_models_.push_back(submenu);
227 menu_model_.AddSubMenu(menu_id, title, submenu); 235 menu_model_.AddSubMenu(menu_id, title, submenu);
228 RecursivelyAppendExtensionItems(submenu_items, submenu, index); 236 RecursivelyAppendExtensionItems(submenu_items, can_cross_incognito, submenu,
237 index);
229 } 238 }
230 SetExtensionIcon(extension_id); 239 SetExtensionIcon(extension_id);
231 } 240 }
232 241
233 void RenderViewContextMenu::RecursivelyAppendExtensionItems( 242 void RenderViewContextMenu::RecursivelyAppendExtensionItems(
234 const ExtensionMenuItem::List& items, 243 const ExtensionMenuItem::List& items,
244 bool can_cross_incognito,
235 menus::SimpleMenuModel* menu_model, 245 menus::SimpleMenuModel* menu_model,
236 int *index) { 246 int *index) {
237 string16 selection_text = PrintableSelectionText(); 247 string16 selection_text = PrintableSelectionText();
238 ExtensionMenuItem::Type last_type = ExtensionMenuItem::NORMAL; 248 ExtensionMenuItem::Type last_type = ExtensionMenuItem::NORMAL;
239 int radio_group_id = 1; 249 int radio_group_id = 1;
240 250
241 for (ExtensionMenuItem::List::const_iterator i = items.begin(); 251 for (ExtensionMenuItem::List::const_iterator i = items.begin();
242 i != items.end(); ++i) { 252 i != items.end(); ++i) {
243 ExtensionMenuItem* item = *i; 253 ExtensionMenuItem* item = *i;
244 254
245 // If last item was of type radio but the current one isn't, auto-insert 255 // If last item was of type radio but the current one isn't, auto-insert
246 // a separator. The converse case is handled below. 256 // a separator. The converse case is handled below.
247 if (last_type == ExtensionMenuItem::RADIO && 257 if (last_type == ExtensionMenuItem::RADIO &&
248 item->type() != ExtensionMenuItem::RADIO) { 258 item->type() != ExtensionMenuItem::RADIO) {
249 menu_model->AddSeparator(); 259 menu_model->AddSeparator();
250 last_type = ExtensionMenuItem::SEPARATOR; 260 last_type = ExtensionMenuItem::SEPARATOR;
251 } 261 }
252 262
253 int menu_id = IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST + (*index)++; 263 int menu_id = IDC_EXTENSIONS_CONTEXT_CUSTOM_FIRST + (*index)++;
254 if (menu_id >= IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST) 264 if (menu_id >= IDC_EXTENSIONS_CONTEXT_CUSTOM_LAST)
255 return; 265 return;
256 extension_item_map_[menu_id] = item->id(); 266 extension_item_map_[menu_id] = item->id();
257 string16 title = item->TitleWithReplacement(selection_text, 267 string16 title = item->TitleWithReplacement(selection_text,
258 kMaxExtensionItemTitleLength); 268 kMaxExtensionItemTitleLength);
259 if (item->type() == ExtensionMenuItem::NORMAL) { 269 if (item->type() == ExtensionMenuItem::NORMAL) {
260 ExtensionMenuItem::List children = 270 ExtensionMenuItem::List children =
261 GetRelevantExtensionItems(item->children(), params_); 271 GetRelevantExtensionItems(item->children(), params_,
272 profile_, can_cross_incognito);
262 if (children.size() == 0) { 273 if (children.size() == 0) {
263 menu_model->AddItem(menu_id, title); 274 menu_model->AddItem(menu_id, title);
264 } else { 275 } else {
265 menus::SimpleMenuModel* submenu = new menus::SimpleMenuModel(this); 276 menus::SimpleMenuModel* submenu = new menus::SimpleMenuModel(this);
266 extension_menu_models_.push_back(submenu); 277 extension_menu_models_.push_back(submenu);
267 menu_model->AddSubMenu(menu_id, title, submenu); 278 menu_model->AddSubMenu(menu_id, title, submenu);
268 RecursivelyAppendExtensionItems(children, submenu, index); 279 RecursivelyAppendExtensionItems(children, can_cross_incognito,
280 submenu, index);
269 } 281 }
270 } else if (item->type() == ExtensionMenuItem::CHECKBOX) { 282 } else if (item->type() == ExtensionMenuItem::CHECKBOX) {
271 menu_model->AddCheckItem(menu_id, title); 283 menu_model->AddCheckItem(menu_id, title);
272 } else if (item->type() == ExtensionMenuItem::RADIO) { 284 } else if (item->type() == ExtensionMenuItem::RADIO) {
273 if (i != items.begin() && 285 if (i != items.begin() &&
274 last_type != ExtensionMenuItem::RADIO) { 286 last_type != ExtensionMenuItem::RADIO) {
275 radio_group_id++; 287 radio_group_id++;
276 288
277 // Auto-append a separator if needed. 289 // Auto-append a separator if needed.
278 if (last_type != ExtensionMenuItem::SEPARATOR) 290 if (last_type != ExtensionMenuItem::SEPARATOR)
(...skipping 1196 matching lines...) Expand 10 before | Expand all | Expand 10 after
1475 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages), 1487 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages),
1476 g_browser_process->clipboard()); 1488 g_browser_process->clipboard());
1477 } 1489 }
1478 1490
1479 void RenderViewContextMenu::MediaPlayerActionAt( 1491 void RenderViewContextMenu::MediaPlayerActionAt(
1480 const gfx::Point& location, 1492 const gfx::Point& location,
1481 const WebMediaPlayerAction& action) { 1493 const WebMediaPlayerAction& action) {
1482 source_tab_contents_->render_view_host()->MediaPlayerActionAt( 1494 source_tab_contents_->render_view_host()->MediaPlayerActionAt(
1483 location, action); 1495 location, action);
1484 } 1496 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698