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

Unified Diff: chrome/browser/tab_contents/render_view_context_menu.cc

Issue 149604: Begin implementation of the context menu for Video and Audio tags. (Closed)
Patch Set: Fix small style issues. Created 11 years, 5 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/tab_contents/render_view_context_menu.h ('k') | chrome/common/render_messages.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/tab_contents/render_view_context_menu.cc
diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc
index a922825c43ddb8e4eeb12d20ddc7118a1d40c1e5..ecc6e5c91fa8ed697d9da00ee854fc2be8b85b23 100644
--- a/chrome/browser/tab_contents/render_view_context_menu.cc
+++ b/chrome/browser/tab_contents/render_view_context_menu.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -28,6 +28,15 @@
#include "net/base/escape.h"
#include "net/base/net_util.h"
+// Constants for the standard playback rates provided by the context
+// menu. If another rate is reported, it will be considered unknown and
+// no rate will be selected in the submenu.
+static const double kSlowPlaybackRate = 0.5f;
+static const double kNormalPlaybackRate = 1.0f;
+static const double kFastPlaybackRate = 1.25f;
+static const double kFasterPlaybackRate = 1.50f;
+static const double kDoubleTimePlaybackRate = 2.0f;
+
RenderViewContextMenu::RenderViewContextMenu(
TabContents* tab_contents,
const ContextMenuParams& params)
@@ -42,11 +51,12 @@ RenderViewContextMenu::~RenderViewContextMenu() {
// Menu construction functions -------------------------------------------------
void RenderViewContextMenu::Init() {
- InitMenu(params_.node);
+ InitMenu(params_.node, params_.media_params);
DoInit();
}
-void RenderViewContextMenu::InitMenu(ContextNode node) {
+void RenderViewContextMenu::InitMenu(ContextNode node,
+ ContextMenuMediaParams media_params) {
if (node.type & ContextNode::PAGE)
AppendPageItems();
if (node.type & ContextNode::FRAME)
@@ -60,6 +70,18 @@ void RenderViewContextMenu::InitMenu(ContextNode node) {
AppendImageItems();
}
+ if (node.type & ContextNode::VIDEO) {
+ if (node.type & ContextNode::LINK)
+ AppendSeparator();
+ AppendVideoItems(media_params);
+ }
+
+ if (node.type & ContextNode::AUDIO) {
+ if (node.type & ContextNode::LINK)
+ AppendSeparator();
+ AppendAudioItems(media_params);
+ }
+
if (node.type & ContextNode::EDITABLE)
AppendEditableItems();
else if (node.type & ContextNode::SELECTION ||
@@ -98,6 +120,58 @@ void RenderViewContextMenu::AppendImageItems() {
AppendMenuItem(IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB);
}
+void RenderViewContextMenu::AppendAudioItems(
+ ContextMenuMediaParams media_params) {
+ AppendMediaItems(media_params);
+ AppendSeparator();
+ AppendMenuItem(IDS_CONTENT_CONTEXT_SAVEAUDIOAS);
+ AppendMenuItem(IDS_CONTENT_CONTEXT_COPYAUDIOLOCATION);
+ AppendMenuItem(IDS_CONTENT_CONTEXT_OPENAUDIONEWTAB);
+}
+
+void RenderViewContextMenu::AppendVideoItems(
+ ContextMenuMediaParams media_params) {
+ AppendMediaItems(media_params);
+ AppendMenuItem(IDS_CONTENT_CONTEXT_FULLSCREEN);
+ AppendSeparator();
+ AppendMenuItem(IDS_CONTENT_CONTEXT_SAVEVIDEOAS);
+ AppendMenuItem(IDS_CONTENT_CONTEXT_SAVESCREENSHOTAS);
+ AppendMenuItem(IDS_CONTENT_CONTEXT_COPYVIDEOLOCATION);
+ AppendMenuItem(IDS_CONTENT_CONTEXT_OPENVIDEONEWTAB);
+}
+
+void RenderViewContextMenu::AppendMediaItems(
+ ContextMenuMediaParams media_params) {
+ if (media_params.player_state & ContextMenuMediaParams::PLAYER_PAUSED) {
+ AppendMenuItem(IDS_CONTENT_CONTEXT_PLAY);
+ } else {
+ AppendMenuItem(IDS_CONTENT_CONTEXT_PAUSE);
+ }
+
+ if (media_params.player_state & ContextMenuMediaParams::PLAYER_MUTED) {
+ AppendMenuItem(IDS_CONTENT_CONTEXT_UNMUTE);
+ } else {
+ AppendMenuItem(IDS_CONTENT_CONTEXT_MUTE);
+ }
+
+ AppendCheckboxMenuItem(IDS_CONTENT_CONTEXT_LOOP,
+ l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_LOOP));
+
+ StartSubMenu(IDS_CONTENT_CONTEXT_PLAYBACKRATE_MENU,
+ l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAYBACKRATE_MENU));
+ AppendRadioMenuItem(IDS_CONTENT_CONTEXT_PLAYBACKRATE_SLOW,
+ l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAYBACKRATE_SLOW));
+ AppendRadioMenuItem(IDS_CONTENT_CONTEXT_PLAYBACKRATE_NORMAL,
+ l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAYBACKRATE_NORMAL));
+ AppendRadioMenuItem(IDS_CONTENT_CONTEXT_PLAYBACKRATE_FAST,
+ l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAYBACKRATE_FAST));
+ AppendRadioMenuItem(IDS_CONTENT_CONTEXT_PLAYBACKRATE_FASTER,
+ l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAYBACKRATE_FASTER));
+ AppendRadioMenuItem(IDS_CONTENT_CONTEXT_PLAYBACKRATE_DOUBLETIME,
+ l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLAYBACKRATE_DOUBLETIME));
+ FinishSubMenu();
+}
+
void RenderViewContextMenu::AppendPageItems() {
AppendMenuItem(IDS_CONTENT_CONTEXT_BACK);
AppendMenuItem(IDS_CONTENT_CONTEXT_FORWARD);
@@ -246,20 +320,58 @@ bool RenderViewContextMenu::IsItemCommandEnabled(int id) const {
URLRequest::IsHandledURL(params_.link_url);
case IDS_CONTENT_CONTEXT_SAVEIMAGEAS:
- return params_.image_url.is_valid() &&
- URLRequest::IsHandledURL(params_.image_url);
+ return params_.src_url.is_valid() &&
+ URLRequest::IsHandledURL(params_.src_url);
case IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB:
// The images shown in the most visited thumbnails do not currently open
// in a new tab as they should. Disabling this context menu option for
// now, as a quick hack, before we resolve this issue (Issue = 2608).
// TODO (sidchat): Enable this option once this issue is resolved.
- if (params_.image_url.scheme() == chrome::kChromeUIScheme)
+ if (params_.src_url.scheme() == chrome::kChromeUIScheme)
return false;
return true;
+ case IDS_CONTENT_CONTEXT_FULLSCREEN:
+ // TODO(ajwong): Enable fullsceren after we actually implement this.
+ return false;
+
+ // Media control commands should all be disabled if the player is in an
+ // error state.
+ case IDS_CONTENT_CONTEXT_PLAY:
+ case IDS_CONTENT_CONTEXT_PAUSE:
+ case IDS_CONTENT_CONTEXT_MUTE:
+ case IDS_CONTENT_CONTEXT_UNMUTE:
+ case IDS_CONTENT_CONTEXT_LOOP:
+ case IDS_CONTENT_CONTEXT_PLAYBACKRATE_MENU:
+ case IDS_CONTENT_CONTEXT_PLAYBACKRATE_SLOW:
+ case IDS_CONTENT_CONTEXT_PLAYBACKRATE_NORMAL:
+ case IDS_CONTENT_CONTEXT_PLAYBACKRATE_FAST:
+ case IDS_CONTENT_CONTEXT_PLAYBACKRATE_FASTER:
+ case IDS_CONTENT_CONTEXT_PLAYBACKRATE_DOUBLETIME:
+ return (params_.media_params.player_state &
+ ContextMenuMediaParams::PLAYER_ERROR) == 0;
+
+ case IDS_CONTENT_CONTEXT_SAVESCREENSHOTAS:
+ // TODO(ajwong): Enable save screenshot after we actually implement
+ // this.
+ return false;
+
+ case IDS_CONTENT_CONTEXT_COPYAUDIOLOCATION:
+ case IDS_CONTENT_CONTEXT_COPYVIDEOLOCATION:
case IDS_CONTENT_CONTEXT_COPYIMAGELOCATION:
- return params_.image_url.is_valid();
+ return params_.src_url.is_valid();
+
+ case IDS_CONTENT_CONTEXT_SAVEAUDIOAS:
+ case IDS_CONTENT_CONTEXT_SAVEVIDEOAS:
+ return (params_.media_params.player_state &
+ ContextMenuMediaParams::PLAYER_CAN_SAVE) &&
+ params_.src_url.is_valid() &&
+ URLRequest::IsHandledURL(params_.src_url);
+
+ case IDS_CONTENT_CONTEXT_OPENAUDIONEWTAB:
+ case IDS_CONTENT_CONTEXT_OPENVIDEONEWTAB:
+ return true;
case IDS_CONTENT_CONTEXT_SAVEPAGEAS:
return SavePackage::IsSavableURL(source_tab_contents_->GetURL());
@@ -324,6 +436,29 @@ bool RenderViewContextMenu::IsItemCommandEnabled(int id) const {
}
bool RenderViewContextMenu::ItemIsChecked(int id) const {
+ // Select the correct playback rate.
+ if (id == IDS_CONTENT_CONTEXT_PLAYBACKRATE_SLOW) {
+ return params_.media_params.playback_rate == kSlowPlaybackRate;
+ }
+ if (id == IDS_CONTENT_CONTEXT_PLAYBACKRATE_NORMAL) {
+ return params_.media_params.playback_rate == kNormalPlaybackRate;
+ }
+ if (id == IDS_CONTENT_CONTEXT_PLAYBACKRATE_FAST) {
+ return params_.media_params.playback_rate == kFastPlaybackRate;
+ }
+ if (id == IDS_CONTENT_CONTEXT_PLAYBACKRATE_FASTER) {
+ return params_.media_params.playback_rate == kFasterPlaybackRate;
+ }
+ if (id == IDS_CONTENT_CONTEXT_PLAYBACKRATE_DOUBLETIME) {
+ return params_.media_params.playback_rate == kDoubleTimePlaybackRate;
+ }
+
+ // See if the video is set to looping.
+ if (id == IDS_CONTENT_CONTEXT_LOOP) {
+ return (params_.media_params.player_state &
+ ContextMenuMediaParams::PLAYER_LOOP) != 0;
+ }
+
// Check box for 'Check the Spelling of this field'.
if (id == IDC_CHECK_SPELLING_OF_THIS_FIELD) {
return (params_.spellcheck_enabled &&
@@ -371,13 +506,15 @@ void RenderViewContextMenu::ExecuteItemCommand(int id) {
OpenURL(params_.link_url, OFF_THE_RECORD, PageTransition::LINK);
break;
+ case IDS_CONTENT_CONTEXT_SAVEAUDIOAS:
+ case IDS_CONTENT_CONTEXT_SAVEVIDEOAS:
case IDS_CONTENT_CONTEXT_SAVEIMAGEAS:
case IDS_CONTENT_CONTEXT_SAVELINKAS: {
const GURL& referrer =
params_.frame_url.is_empty() ? params_.page_url : params_.frame_url;
const GURL& url =
(id == IDS_CONTENT_CONTEXT_SAVELINKAS ? params_.link_url :
- params_.image_url);
+ params_.src_url);
DownloadManager* dlm = profile_->GetDownloadManager();
dlm->DownloadUrl(url, referrer, params_.frame_charset,
source_tab_contents_);
@@ -388,16 +525,20 @@ void RenderViewContextMenu::ExecuteItemCommand(int id) {
WriteURLToClipboard(params_.unfiltered_link_url);
break;
+ case IDS_CONTENT_CONTEXT_COPYAUDIOLOCATION:
+ case IDS_CONTENT_CONTEXT_COPYVIDEOLOCATION:
case IDS_CONTENT_CONTEXT_COPYIMAGELOCATION:
- WriteURLToClipboard(params_.image_url);
+ WriteURLToClipboard(params_.src_url);
break;
case IDS_CONTENT_CONTEXT_COPYIMAGE:
CopyImageAt(params_.x, params_.y);
break;
+ case IDS_CONTENT_CONTEXT_OPENAUDIONEWTAB:
+ case IDS_CONTENT_CONTEXT_OPENVIDEONEWTAB:
case IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB:
- OpenURL(params_.image_url, NEW_BACKGROUND_TAB, PageTransition::LINK);
+ OpenURL(params_.src_url, NEW_BACKGROUND_TAB, PageTransition::LINK);
break;
case IDS_CONTENT_CONTEXT_BACK:
@@ -632,8 +773,7 @@ void RenderViewContextMenu::Inspect(int x, int y) {
source_tab_contents_->render_view_host(), x, y);
}
-void RenderViewContextMenu::WriteTextToClipboard(
- const string16& text) {
+void RenderViewContextMenu::WriteTextToClipboard(const string16& text) {
Clipboard* clipboard = g_browser_process->clipboard();
if (!clipboard)
« no previous file with comments | « chrome/browser/tab_contents/render_view_context_menu.h ('k') | chrome/common/render_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698