| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 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/tab_contents/render_view_context_menu.h" | 5 #include "chrome/browser/tab_contents/render_view_context_menu.h" |
| 6 | 6 |
| 7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
| 8 #include "base/clipboard.h" | 8 #include "base/clipboard.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/scoped_clipboard_writer.h" | 11 #include "base/scoped_clipboard_writer.h" |
| 12 #include "chrome/app/chrome_dll_resource.h" | 12 #include "chrome/app/chrome_dll_resource.h" |
| 13 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
| 14 #include "chrome/browser/debugger/devtools_manager.h" | 14 #include "chrome/browser/debugger/devtools_manager.h" |
| 15 #include "chrome/browser/download/download_manager.h" | 15 #include "chrome/browser/download/download_manager.h" |
| 16 #include "chrome/browser/fonts_languages_window.h" | 16 #include "chrome/browser/fonts_languages_window.h" |
| 17 #include "chrome/browser/page_info_window.h" | 17 #include "chrome/browser/page_info_window.h" |
| 18 #include "chrome/browser/profile.h" | 18 #include "chrome/browser/profile.h" |
| 19 #include "chrome/browser/search_engines/template_url_model.h" | 19 #include "chrome/browser/search_engines/template_url_model.h" |
| 20 #include "chrome/browser/spellchecker.h" | 20 #include "chrome/browser/spellchecker.h" |
| 21 #include "chrome/browser/tab_contents/navigation_entry.h" | 21 #include "chrome/browser/tab_contents/navigation_entry.h" |
| 22 #include "chrome/browser/tab_contents/tab_contents.h" | 22 #include "chrome/browser/tab_contents/tab_contents.h" |
| 23 #include "chrome/common/chrome_switches.h" | 23 #include "chrome/common/chrome_switches.h" |
| 24 #include "chrome/common/platform_util.h" | 24 #include "chrome/common/platform_util.h" |
| 25 #include "chrome/common/pref_service.h" | 25 #include "chrome/common/pref_service.h" |
| 26 #include "chrome/common/url_constants.h" | 26 #include "chrome/common/url_constants.h" |
| 27 #include "grit/generated_resources.h" | 27 #include "grit/generated_resources.h" |
| 28 #include "net/base/escape.h" | 28 #include "net/base/escape.h" |
| 29 #include "net/base/net_util.h" | 29 #include "net/base/net_util.h" |
| 30 | 30 |
| 31 // Constants for the standard playback rates provided by the context |
| 32 // menu. If another rate is reported, it will be considered unknown and |
| 33 // no rate will be selected in the submenu. |
| 34 static const double kSlowPlaybackRate = 0.5f; |
| 35 static const double kNormalPlaybackRate = 1.0f; |
| 36 static const double kFastPlaybackRate = 1.25f; |
| 37 static const double kFasterPlaybackRate = 1.50f; |
| 38 static const double kDoubleTimePlaybackRate = 2.0f; |
| 39 |
| 31 RenderViewContextMenu::RenderViewContextMenu( | 40 RenderViewContextMenu::RenderViewContextMenu( |
| 32 TabContents* tab_contents, | 41 TabContents* tab_contents, |
| 33 const ContextMenuParams& params) | 42 const ContextMenuParams& params) |
| 34 : params_(params), | 43 : params_(params), |
| 35 source_tab_contents_(tab_contents), | 44 source_tab_contents_(tab_contents), |
| 36 profile_(tab_contents->profile()) { | 45 profile_(tab_contents->profile()) { |
| 37 } | 46 } |
| 38 | 47 |
| 39 RenderViewContextMenu::~RenderViewContextMenu() { | 48 RenderViewContextMenu::~RenderViewContextMenu() { |
| 40 } | 49 } |
| 41 | 50 |
| 42 // Menu construction functions ------------------------------------------------- | 51 // Menu construction functions ------------------------------------------------- |
| 43 | 52 |
| 44 void RenderViewContextMenu::Init() { | 53 void RenderViewContextMenu::Init() { |
| 45 InitMenu(params_.node); | 54 InitMenu(params_.node, params_.media_params); |
| 46 DoInit(); | 55 DoInit(); |
| 47 } | 56 } |
| 48 | 57 |
| 49 void RenderViewContextMenu::InitMenu(ContextNode node) { | 58 void RenderViewContextMenu::InitMenu(ContextNode node, |
| 59 ContextMenuMediaParams media_params) { |
| 50 if (node.type & ContextNode::PAGE) | 60 if (node.type & ContextNode::PAGE) |
| 51 AppendPageItems(); | 61 AppendPageItems(); |
| 52 if (node.type & ContextNode::FRAME) | 62 if (node.type & ContextNode::FRAME) |
| 53 AppendFrameItems(); | 63 AppendFrameItems(); |
| 54 if (node.type & ContextNode::LINK) | 64 if (node.type & ContextNode::LINK) |
| 55 AppendLinkItems(); | 65 AppendLinkItems(); |
| 56 | 66 |
| 57 if (node.type & ContextNode::IMAGE) { | 67 if (node.type & ContextNode::IMAGE) { |
| 58 if (node.type & ContextNode::LINK) | 68 if (node.type & ContextNode::LINK) |
| 59 AppendSeparator(); | 69 AppendSeparator(); |
| 60 AppendImageItems(); | 70 AppendImageItems(); |
| 61 } | 71 } |
| 62 | 72 |
| 73 if (node.type & ContextNode::VIDEO) { |
| 74 if (node.type & ContextNode::LINK) |
| 75 AppendSeparator(); |
| 76 AppendVideoItems(media_params); |
| 77 } |
| 78 |
| 79 if (node.type & ContextNode::AUDIO) { |
| 80 if (node.type & ContextNode::LINK) |
| 81 AppendSeparator(); |
| 82 AppendAudioItems(media_params); |
| 83 } |
| 84 |
| 63 if (node.type & ContextNode::EDITABLE) | 85 if (node.type & ContextNode::EDITABLE) |
| 64 AppendEditableItems(); | 86 AppendEditableItems(); |
| 65 else if (node.type & ContextNode::SELECTION || | 87 else if (node.type & ContextNode::SELECTION || |
| 66 node.type & ContextNode::LINK) | 88 node.type & ContextNode::LINK) |
| 67 AppendCopyItem(); | 89 AppendCopyItem(); |
| 68 | 90 |
| 69 if (node.type & ContextNode::SELECTION) | 91 if (node.type & ContextNode::SELECTION) |
| 70 AppendSearchProvider(); | 92 AppendSearchProvider(); |
| 71 AppendSeparator(); | 93 AppendSeparator(); |
| 72 AppendDeveloperItems(); | 94 AppendDeveloperItems(); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 91 } | 113 } |
| 92 } | 114 } |
| 93 | 115 |
| 94 void RenderViewContextMenu::AppendImageItems() { | 116 void RenderViewContextMenu::AppendImageItems() { |
| 95 AppendMenuItem(IDS_CONTENT_CONTEXT_SAVEIMAGEAS); | 117 AppendMenuItem(IDS_CONTENT_CONTEXT_SAVEIMAGEAS); |
| 96 AppendMenuItem(IDS_CONTENT_CONTEXT_COPYIMAGELOCATION); | 118 AppendMenuItem(IDS_CONTENT_CONTEXT_COPYIMAGELOCATION); |
| 97 AppendMenuItem(IDS_CONTENT_CONTEXT_COPYIMAGE); | 119 AppendMenuItem(IDS_CONTENT_CONTEXT_COPYIMAGE); |
| 98 AppendMenuItem(IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB); | 120 AppendMenuItem(IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB); |
| 99 } | 121 } |
| 100 | 122 |
| 123 void RenderViewContextMenu::AppendAudioItems( |
| 124 ContextMenuMediaParams media_params) { |
| 125 AppendMediaItems(media_params); |
| 126 AppendSeparator(); |
| 127 AppendMenuItem(IDS_CONTENT_CONTEXT_SAVEAUDIOAS); |
| 128 AppendMenuItem(IDS_CONTENT_CONTEXT_COPYAUDIOLOCATION); |
| 129 AppendMenuItem(IDS_CONTENT_CONTEXT_OPENAUDIONEWTAB); |
| 130 } |
| 131 |
| 132 void RenderViewContextMenu::AppendVideoItems( |
| 133 ContextMenuMediaParams media_params) { |
| 134 AppendMediaItems(media_params); |
| 135 AppendMenuItem(IDS_CONTENT_CONTEXT_FULLSCREEN); |
| 136 AppendSeparator(); |
| 137 AppendMenuItem(IDS_CONTENT_CONTEXT_SAVEVIDEOAS); |
| 138 AppendMenuItem(IDS_CONTENT_CONTEXT_SAVESCREENSHOTAS); |
| 139 AppendMenuItem(IDS_CONTENT_CONTEXT_COPYVIDEOLOCATION); |
| 140 AppendMenuItem(IDS_CONTENT_CONTEXT_OPENVIDEONEWTAB); |
| 141 } |
| 142 |
| 143 void RenderViewContextMenu::AppendMediaItems( |
| 144 ContextMenuMediaParams media_params) { |
| 145 if (media_params.player_state & ContextMenuMediaParams::PLAYER_PAUSED) { |
| 146 AppendMenuItem(IDS_CONTENT_CONTEXT_PLAY); |
| 147 } else { |
| 148 AppendMenuItem(IDS_CONTENT_CONTEXT_PAUSE); |
| 149 } |
| 150 |
| 151 if (media_params.player_state & ContextMenuMediaParams::PLAYER_MUTED) { |
| 152 AppendMenuItem(IDS_CONTENT_CONTEXT_UNMUTE); |
| 153 } else { |
| 154 AppendMenuItem(IDS_CONTENT_CONTEXT_MUTE); |
| 155 } |
| 156 |
| 157 AppendCheckboxMenuItem(IDS_CONTENT_CONTEXT_LOOP, |
| 158 l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_LOOP)); |
| 159 |
| 160 StartSubMenu(IDS_CONTENT_CONTEXT_PLAYBACKRATE_MENU, |
| 161 l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAYBACKRATE_MENU)); |
| 162 AppendRadioMenuItem(IDS_CONTENT_CONTEXT_PLAYBACKRATE_SLOW, |
| 163 l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAYBACKRATE_SLOW)); |
| 164 AppendRadioMenuItem(IDS_CONTENT_CONTEXT_PLAYBACKRATE_NORMAL, |
| 165 l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAYBACKRATE_NORMAL)); |
| 166 AppendRadioMenuItem(IDS_CONTENT_CONTEXT_PLAYBACKRATE_FAST, |
| 167 l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAYBACKRATE_FAST)); |
| 168 AppendRadioMenuItem(IDS_CONTENT_CONTEXT_PLAYBACKRATE_FASTER, |
| 169 l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAYBACKRATE_FASTER)); |
| 170 AppendRadioMenuItem(IDS_CONTENT_CONTEXT_PLAYBACKRATE_DOUBLETIME, |
| 171 l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAYBACKRATE_DOUBLETIME)); |
| 172 FinishSubMenu(); |
| 173 } |
| 174 |
| 101 void RenderViewContextMenu::AppendPageItems() { | 175 void RenderViewContextMenu::AppendPageItems() { |
| 102 AppendMenuItem(IDS_CONTENT_CONTEXT_BACK); | 176 AppendMenuItem(IDS_CONTENT_CONTEXT_BACK); |
| 103 AppendMenuItem(IDS_CONTENT_CONTEXT_FORWARD); | 177 AppendMenuItem(IDS_CONTENT_CONTEXT_FORWARD); |
| 104 AppendMenuItem(IDS_CONTENT_CONTEXT_RELOAD); | 178 AppendMenuItem(IDS_CONTENT_CONTEXT_RELOAD); |
| 105 AppendSeparator(); | 179 AppendSeparator(); |
| 106 AppendMenuItem(IDS_CONTENT_CONTEXT_SAVEPAGEAS); | 180 AppendMenuItem(IDS_CONTENT_CONTEXT_SAVEPAGEAS); |
| 107 AppendMenuItem(IDS_CONTENT_CONTEXT_PRINT); | 181 AppendMenuItem(IDS_CONTENT_CONTEXT_PRINT); |
| 108 AppendMenuItem(IDS_CONTENT_CONTEXT_VIEWPAGESOURCE); | 182 AppendMenuItem(IDS_CONTENT_CONTEXT_VIEWPAGESOURCE); |
| 109 AppendMenuItem(IDS_CONTENT_CONTEXT_VIEWPAGEINFO); | 183 AppendMenuItem(IDS_CONTENT_CONTEXT_VIEWPAGEINFO); |
| 110 } | 184 } |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 return params_.link_url.is_valid(); | 313 return params_.link_url.is_valid(); |
| 240 | 314 |
| 241 case IDS_CONTENT_CONTEXT_COPYLINKLOCATION: | 315 case IDS_CONTENT_CONTEXT_COPYLINKLOCATION: |
| 242 return params_.unfiltered_link_url.is_valid(); | 316 return params_.unfiltered_link_url.is_valid(); |
| 243 | 317 |
| 244 case IDS_CONTENT_CONTEXT_SAVELINKAS: | 318 case IDS_CONTENT_CONTEXT_SAVELINKAS: |
| 245 return params_.link_url.is_valid() && | 319 return params_.link_url.is_valid() && |
| 246 URLRequest::IsHandledURL(params_.link_url); | 320 URLRequest::IsHandledURL(params_.link_url); |
| 247 | 321 |
| 248 case IDS_CONTENT_CONTEXT_SAVEIMAGEAS: | 322 case IDS_CONTENT_CONTEXT_SAVEIMAGEAS: |
| 249 return params_.image_url.is_valid() && | 323 return params_.src_url.is_valid() && |
| 250 URLRequest::IsHandledURL(params_.image_url); | 324 URLRequest::IsHandledURL(params_.src_url); |
| 251 | 325 |
| 252 case IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB: | 326 case IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB: |
| 253 // The images shown in the most visited thumbnails do not currently open | 327 // The images shown in the most visited thumbnails do not currently open |
| 254 // in a new tab as they should. Disabling this context menu option for | 328 // in a new tab as they should. Disabling this context menu option for |
| 255 // now, as a quick hack, before we resolve this issue (Issue = 2608). | 329 // now, as a quick hack, before we resolve this issue (Issue = 2608). |
| 256 // TODO (sidchat): Enable this option once this issue is resolved. | 330 // TODO (sidchat): Enable this option once this issue is resolved. |
| 257 if (params_.image_url.scheme() == chrome::kChromeUIScheme) | 331 if (params_.src_url.scheme() == chrome::kChromeUIScheme) |
| 258 return false; | 332 return false; |
| 259 return true; | 333 return true; |
| 260 | 334 |
| 335 case IDS_CONTENT_CONTEXT_FULLSCREEN: |
| 336 // TODO(ajwong): Enable fullsceren after we actually implement this. |
| 337 return false; |
| 338 |
| 339 // Media control commands should all be disabled if the player is in an |
| 340 // error state. |
| 341 case IDS_CONTENT_CONTEXT_PLAY: |
| 342 case IDS_CONTENT_CONTEXT_PAUSE: |
| 343 case IDS_CONTENT_CONTEXT_MUTE: |
| 344 case IDS_CONTENT_CONTEXT_UNMUTE: |
| 345 case IDS_CONTENT_CONTEXT_LOOP: |
| 346 case IDS_CONTENT_CONTEXT_PLAYBACKRATE_MENU: |
| 347 case IDS_CONTENT_CONTEXT_PLAYBACKRATE_SLOW: |
| 348 case IDS_CONTENT_CONTEXT_PLAYBACKRATE_NORMAL: |
| 349 case IDS_CONTENT_CONTEXT_PLAYBACKRATE_FAST: |
| 350 case IDS_CONTENT_CONTEXT_PLAYBACKRATE_FASTER: |
| 351 case IDS_CONTENT_CONTEXT_PLAYBACKRATE_DOUBLETIME: |
| 352 return (params_.media_params.player_state & |
| 353 ContextMenuMediaParams::PLAYER_ERROR) == 0; |
| 354 |
| 355 case IDS_CONTENT_CONTEXT_SAVESCREENSHOTAS: |
| 356 // TODO(ajwong): Enable save screenshot after we actually implement |
| 357 // this. |
| 358 return false; |
| 359 |
| 360 case IDS_CONTENT_CONTEXT_COPYAUDIOLOCATION: |
| 361 case IDS_CONTENT_CONTEXT_COPYVIDEOLOCATION: |
| 261 case IDS_CONTENT_CONTEXT_COPYIMAGELOCATION: | 362 case IDS_CONTENT_CONTEXT_COPYIMAGELOCATION: |
| 262 return params_.image_url.is_valid(); | 363 return params_.src_url.is_valid(); |
| 364 |
| 365 case IDS_CONTENT_CONTEXT_SAVEAUDIOAS: |
| 366 case IDS_CONTENT_CONTEXT_SAVEVIDEOAS: |
| 367 return (params_.media_params.player_state & |
| 368 ContextMenuMediaParams::PLAYER_CAN_SAVE) && |
| 369 params_.src_url.is_valid() && |
| 370 URLRequest::IsHandledURL(params_.src_url); |
| 371 |
| 372 case IDS_CONTENT_CONTEXT_OPENAUDIONEWTAB: |
| 373 case IDS_CONTENT_CONTEXT_OPENVIDEONEWTAB: |
| 374 return true; |
| 263 | 375 |
| 264 case IDS_CONTENT_CONTEXT_SAVEPAGEAS: | 376 case IDS_CONTENT_CONTEXT_SAVEPAGEAS: |
| 265 return SavePackage::IsSavableURL(source_tab_contents_->GetURL()); | 377 return SavePackage::IsSavableURL(source_tab_contents_->GetURL()); |
| 266 | 378 |
| 267 case IDS_CONTENT_CONTEXT_OPENFRAMENEWTAB: | 379 case IDS_CONTENT_CONTEXT_OPENFRAMENEWTAB: |
| 268 case IDS_CONTENT_CONTEXT_OPENFRAMENEWWINDOW: | 380 case IDS_CONTENT_CONTEXT_OPENFRAMENEWWINDOW: |
| 269 return params_.frame_url.is_valid(); | 381 return params_.frame_url.is_valid(); |
| 270 | 382 |
| 271 case IDS_CONTENT_CONTEXT_UNDO: | 383 case IDS_CONTENT_CONTEXT_UNDO: |
| 272 return !!(params_.edit_flags & ContextNode::CAN_UNDO); | 384 return !!(params_.edit_flags & ContextNode::CAN_UNDO); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 | 429 |
| 318 case IDS_CONTENT_CONTEXT_SAVEFRAMEAS: | 430 case IDS_CONTENT_CONTEXT_SAVEFRAMEAS: |
| 319 case IDS_CONTENT_CONTEXT_PRINTFRAME: | 431 case IDS_CONTENT_CONTEXT_PRINTFRAME: |
| 320 case IDS_CONTENT_CONTEXT_ADDSEARCHENGINE: // Not implemented. | 432 case IDS_CONTENT_CONTEXT_ADDSEARCHENGINE: // Not implemented. |
| 321 default: | 433 default: |
| 322 return false; | 434 return false; |
| 323 } | 435 } |
| 324 } | 436 } |
| 325 | 437 |
| 326 bool RenderViewContextMenu::ItemIsChecked(int id) const { | 438 bool RenderViewContextMenu::ItemIsChecked(int id) const { |
| 439 // Select the correct playback rate. |
| 440 if (id == IDS_CONTENT_CONTEXT_PLAYBACKRATE_SLOW) { |
| 441 return params_.media_params.playback_rate == kSlowPlaybackRate; |
| 442 } |
| 443 if (id == IDS_CONTENT_CONTEXT_PLAYBACKRATE_NORMAL) { |
| 444 return params_.media_params.playback_rate == kNormalPlaybackRate; |
| 445 } |
| 446 if (id == IDS_CONTENT_CONTEXT_PLAYBACKRATE_FAST) { |
| 447 return params_.media_params.playback_rate == kFastPlaybackRate; |
| 448 } |
| 449 if (id == IDS_CONTENT_CONTEXT_PLAYBACKRATE_FASTER) { |
| 450 return params_.media_params.playback_rate == kFasterPlaybackRate; |
| 451 } |
| 452 if (id == IDS_CONTENT_CONTEXT_PLAYBACKRATE_DOUBLETIME) { |
| 453 return params_.media_params.playback_rate == kDoubleTimePlaybackRate; |
| 454 } |
| 455 |
| 456 // See if the video is set to looping. |
| 457 if (id == IDS_CONTENT_CONTEXT_LOOP) { |
| 458 return (params_.media_params.player_state & |
| 459 ContextMenuMediaParams::PLAYER_LOOP) != 0; |
| 460 } |
| 461 |
| 327 // Check box for 'Check the Spelling of this field'. | 462 // Check box for 'Check the Spelling of this field'. |
| 328 if (id == IDC_CHECK_SPELLING_OF_THIS_FIELD) { | 463 if (id == IDC_CHECK_SPELLING_OF_THIS_FIELD) { |
| 329 return (params_.spellcheck_enabled && | 464 return (params_.spellcheck_enabled && |
| 330 profile_->GetPrefs()->GetBoolean(prefs::kEnableSpellCheck)); | 465 profile_->GetPrefs()->GetBoolean(prefs::kEnableSpellCheck)); |
| 331 } | 466 } |
| 332 | 467 |
| 333 // Don't bother getting the display language vector if this isn't a spellcheck | 468 // Don't bother getting the display language vector if this isn't a spellcheck |
| 334 // language. | 469 // language. |
| 335 if ((id < IDC_SPELLCHECK_LANGUAGES_FIRST) || | 470 if ((id < IDC_SPELLCHECK_LANGUAGES_FIRST) || |
| 336 (id >= IDC_SPELLCHECK_LANGUAGES_LAST)) | 471 (id >= IDC_SPELLCHECK_LANGUAGES_LAST)) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 364 break; | 499 break; |
| 365 | 500 |
| 366 case IDS_CONTENT_CONTEXT_OPENLINKNEWWINDOW: | 501 case IDS_CONTENT_CONTEXT_OPENLINKNEWWINDOW: |
| 367 OpenURL(params_.link_url, NEW_WINDOW, PageTransition::LINK); | 502 OpenURL(params_.link_url, NEW_WINDOW, PageTransition::LINK); |
| 368 break; | 503 break; |
| 369 | 504 |
| 370 case IDS_CONTENT_CONTEXT_OPENLINKOFFTHERECORD: | 505 case IDS_CONTENT_CONTEXT_OPENLINKOFFTHERECORD: |
| 371 OpenURL(params_.link_url, OFF_THE_RECORD, PageTransition::LINK); | 506 OpenURL(params_.link_url, OFF_THE_RECORD, PageTransition::LINK); |
| 372 break; | 507 break; |
| 373 | 508 |
| 509 case IDS_CONTENT_CONTEXT_SAVEAUDIOAS: |
| 510 case IDS_CONTENT_CONTEXT_SAVEVIDEOAS: |
| 374 case IDS_CONTENT_CONTEXT_SAVEIMAGEAS: | 511 case IDS_CONTENT_CONTEXT_SAVEIMAGEAS: |
| 375 case IDS_CONTENT_CONTEXT_SAVELINKAS: { | 512 case IDS_CONTENT_CONTEXT_SAVELINKAS: { |
| 376 const GURL& referrer = | 513 const GURL& referrer = |
| 377 params_.frame_url.is_empty() ? params_.page_url : params_.frame_url; | 514 params_.frame_url.is_empty() ? params_.page_url : params_.frame_url; |
| 378 const GURL& url = | 515 const GURL& url = |
| 379 (id == IDS_CONTENT_CONTEXT_SAVELINKAS ? params_.link_url : | 516 (id == IDS_CONTENT_CONTEXT_SAVELINKAS ? params_.link_url : |
| 380 params_.image_url); | 517 params_.src_url); |
| 381 DownloadManager* dlm = profile_->GetDownloadManager(); | 518 DownloadManager* dlm = profile_->GetDownloadManager(); |
| 382 dlm->DownloadUrl(url, referrer, params_.frame_charset, | 519 dlm->DownloadUrl(url, referrer, params_.frame_charset, |
| 383 source_tab_contents_); | 520 source_tab_contents_); |
| 384 break; | 521 break; |
| 385 } | 522 } |
| 386 | 523 |
| 387 case IDS_CONTENT_CONTEXT_COPYLINKLOCATION: | 524 case IDS_CONTENT_CONTEXT_COPYLINKLOCATION: |
| 388 WriteURLToClipboard(params_.unfiltered_link_url); | 525 WriteURLToClipboard(params_.unfiltered_link_url); |
| 389 break; | 526 break; |
| 390 | 527 |
| 528 case IDS_CONTENT_CONTEXT_COPYAUDIOLOCATION: |
| 529 case IDS_CONTENT_CONTEXT_COPYVIDEOLOCATION: |
| 391 case IDS_CONTENT_CONTEXT_COPYIMAGELOCATION: | 530 case IDS_CONTENT_CONTEXT_COPYIMAGELOCATION: |
| 392 WriteURLToClipboard(params_.image_url); | 531 WriteURLToClipboard(params_.src_url); |
| 393 break; | 532 break; |
| 394 | 533 |
| 395 case IDS_CONTENT_CONTEXT_COPYIMAGE: | 534 case IDS_CONTENT_CONTEXT_COPYIMAGE: |
| 396 CopyImageAt(params_.x, params_.y); | 535 CopyImageAt(params_.x, params_.y); |
| 397 break; | 536 break; |
| 398 | 537 |
| 538 case IDS_CONTENT_CONTEXT_OPENAUDIONEWTAB: |
| 539 case IDS_CONTENT_CONTEXT_OPENVIDEONEWTAB: |
| 399 case IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB: | 540 case IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB: |
| 400 OpenURL(params_.image_url, NEW_BACKGROUND_TAB, PageTransition::LINK); | 541 OpenURL(params_.src_url, NEW_BACKGROUND_TAB, PageTransition::LINK); |
| 401 break; | 542 break; |
| 402 | 543 |
| 403 case IDS_CONTENT_CONTEXT_BACK: | 544 case IDS_CONTENT_CONTEXT_BACK: |
| 404 source_tab_contents_->controller().GoBack(); | 545 source_tab_contents_->controller().GoBack(); |
| 405 break; | 546 break; |
| 406 | 547 |
| 407 case IDS_CONTENT_CONTEXT_FORWARD: | 548 case IDS_CONTENT_CONTEXT_FORWARD: |
| 408 source_tab_contents_->controller().GoForward(); | 549 source_tab_contents_->controller().GoForward(); |
| 409 break; | 550 break; |
| 410 | 551 |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 625 | 766 |
| 626 void RenderViewContextMenu::CopyImageAt(int x, int y) { | 767 void RenderViewContextMenu::CopyImageAt(int x, int y) { |
| 627 source_tab_contents_->render_view_host()->CopyImageAt(x, y); | 768 source_tab_contents_->render_view_host()->CopyImageAt(x, y); |
| 628 } | 769 } |
| 629 | 770 |
| 630 void RenderViewContextMenu::Inspect(int x, int y) { | 771 void RenderViewContextMenu::Inspect(int x, int y) { |
| 631 DevToolsManager::GetInstance()->InspectElement( | 772 DevToolsManager::GetInstance()->InspectElement( |
| 632 source_tab_contents_->render_view_host(), x, y); | 773 source_tab_contents_->render_view_host(), x, y); |
| 633 } | 774 } |
| 634 | 775 |
| 635 void RenderViewContextMenu::WriteTextToClipboard( | 776 void RenderViewContextMenu::WriteTextToClipboard(const string16& text) { |
| 636 const string16& text) { | |
| 637 Clipboard* clipboard = g_browser_process->clipboard(); | 777 Clipboard* clipboard = g_browser_process->clipboard(); |
| 638 | 778 |
| 639 if (!clipboard) | 779 if (!clipboard) |
| 640 return; | 780 return; |
| 641 | 781 |
| 642 ScopedClipboardWriter scw(clipboard); | 782 ScopedClipboardWriter scw(clipboard); |
| 643 scw.WriteText(text); | 783 scw.WriteText(text); |
| 644 } | 784 } |
| 645 | 785 |
| 646 void RenderViewContextMenu::WriteURLToClipboard(const GURL& url) { | 786 void RenderViewContextMenu::WriteURLToClipboard(const GURL& url) { |
| 647 std::string utf8_text = url.SchemeIs(chrome::kMailToScheme) ? url.path() : | 787 std::string utf8_text = url.SchemeIs(chrome::kMailToScheme) ? url.path() : |
| 648 // Unescaping path and query is not a good idea because other | 788 // Unescaping path and query is not a good idea because other |
| 649 // applications may not enocode non-ASCII characters in UTF-8. | 789 // applications may not enocode non-ASCII characters in UTF-8. |
| 650 // So the 4th parameter of net::FormatUrl() should be false. | 790 // So the 4th parameter of net::FormatUrl() should be false. |
| 651 // See crbug.com/2820. | 791 // See crbug.com/2820. |
| 652 WideToUTF8(net::FormatUrl( | 792 WideToUTF8(net::FormatUrl( |
| 653 url, profile_->GetPrefs()->GetString(prefs::kAcceptLanguages), | 793 url, profile_->GetPrefs()->GetString(prefs::kAcceptLanguages), |
| 654 false, UnescapeRule::NONE, NULL, NULL)); | 794 false, UnescapeRule::NONE, NULL, NULL)); |
| 655 | 795 |
| 656 WriteTextToClipboard(UTF8ToUTF16(utf8_text)); | 796 WriteTextToClipboard(UTF8ToUTF16(utf8_text)); |
| 657 DidWriteURLToClipboard(utf8_text); | 797 DidWriteURLToClipboard(utf8_text); |
| 658 } | 798 } |
| OLD | NEW |