summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authoryaar@chromium.org <yaar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-09 18:17:44 +0000
committeryaar@chromium.org <yaar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-09 18:17:44 +0000
commit79e3744bbbb0867f4e356eab96703d425b3fad40 (patch)
tree790f3464f1636e542b15b2a5de852cbb6c5f9c41 /chrome
parent9068747c5591866480bd0888e571cc548d6be546 (diff)
downloadchromium_src-79e3744bbbb0867f4e356eab96703d425b3fad40.zip
chromium_src-79e3744bbbb0867f4e356eab96703d425b3fad40.tar.gz
chromium_src-79e3744bbbb0867f4e356eab96703d425b3fad40.tar.bz2
Moving ShowContextMenu out of WebView_delegate and into WebViewClient
(Part of the Webkit API refactoring effort). Review URL: http://codereview.chromium.org/265011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@28567 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/tab_contents/render_view_context_menu.cc114
-rw-r--r--chrome/browser/tab_contents/render_view_context_menu.h8
-rw-r--r--chrome/common/render_messages.h65
-rw-r--r--chrome/common/webkit_param_traits.h15
-rw-r--r--chrome/renderer/print_web_view_helper.h14
-rw-r--r--chrome/renderer/render_view.cc41
-rw-r--r--chrome/renderer/render_view.h17
7 files changed, 106 insertions, 168 deletions
diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc
index 7c51158..be80fda 100644
--- a/chrome/browser/tab_contents/render_view_context_menu.cc
+++ b/chrome/browser/tab_contents/render_view_context_menu.cc
@@ -30,7 +30,9 @@
#include "grit/generated_resources.h"
#include "net/base/escape.h"
#include "webkit/api/public/WebMediaPlayerAction.h"
+#include "webkit/api/public/WebContextMenuData.h"
+using WebKit::WebContextMenuData;
using WebKit::WebMediaPlayerAction;
namespace {
@@ -66,44 +68,55 @@ RenderViewContextMenu::~RenderViewContextMenu() {
// Menu construction functions -------------------------------------------------
void RenderViewContextMenu::Init() {
- InitMenu(params_.node_type, params_.media_params);
+ InitMenu();
DoInit();
}
-void RenderViewContextMenu::InitMenu(ContextNodeType node_type,
- ContextMenuMediaParams media_params) {
- if (node_type.type & ContextNodeType::PAGE)
- AppendPageItems();
- if (node_type.type & ContextNodeType::FRAME)
- AppendFrameItems();
- if (node_type.type & ContextNodeType::LINK)
- AppendLinkItems();
-
- if (node_type.type & ContextNodeType::IMAGE) {
- if (node_type.type & ContextNodeType::LINK)
- AppendSeparator();
- AppendImageItems();
+void RenderViewContextMenu::InitMenu() {
+
+ bool has_link = !params_.link_url.is_empty();
+ bool has_selection = !params_.selection_text.empty();
+
+ // When no special node or text is selected and selection has no link,
+ // show page items.
+ if (params_.media_type == WebContextMenuData::MediaTypeNone &&
+ !has_link &&
+ !params_.is_editable &&
+ !has_selection) {
+ // If context is in subframe, show subframe options instead.
+ if (!params_.frame_url.is_empty()) {
+ AppendFrameItems();
+ } else if (!params_.page_url.is_empty()) {
+ AppendPageItems();
+ }
}
- if (node_type.type & ContextNodeType::VIDEO) {
- if (node_type.type & ContextNodeType::LINK)
+ if (has_link) {
+ AppendLinkItems();
+ if (params_.media_type != WebContextMenuData::MediaTypeNone)
AppendSeparator();
- AppendVideoItems(media_params);
}
- if (node_type.type & ContextNodeType::AUDIO) {
- if (node_type.type & ContextNodeType::LINK)
- AppendSeparator();
- AppendAudioItems(media_params);
+ switch (params_.media_type) {
+ case WebContextMenuData::MediaTypeNone:
+ break;
+ case WebContextMenuData::MediaTypeImage:
+ AppendImageItems();
+ break;
+ case WebContextMenuData::MediaTypeVideo:
+ AppendVideoItems();
+ break;
+ case WebContextMenuData::MediaTypeAudio:
+ AppendAudioItems();
+ break;
}
- if (node_type.type & ContextNodeType::EDITABLE)
+ if (params_.is_editable)
AppendEditableItems();
- else if (node_type.type & ContextNodeType::SELECTION ||
- node_type.type & ContextNodeType::LINK)
+ else if (has_selection || has_link)
AppendCopyItem();
- if (node_type.type & ContextNodeType::SELECTION)
+ if (has_selection)
AppendSearchProvider();
AppendDeveloperItems();
@@ -138,33 +151,31 @@ void RenderViewContextMenu::AppendImageItems() {
AppendMenuItem(IDS_CONTENT_CONTEXT_OPENIMAGENEWTAB);
}
-void RenderViewContextMenu::AppendAudioItems(
- ContextMenuMediaParams media_params) {
- AppendMediaItems(media_params);
+void RenderViewContextMenu::AppendAudioItems() {
+ AppendMediaItems();
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);
+void RenderViewContextMenu::AppendVideoItems() {
+ AppendMediaItems();
AppendSeparator();
AppendMenuItem(IDS_CONTENT_CONTEXT_SAVEVIDEOAS);
AppendMenuItem(IDS_CONTENT_CONTEXT_COPYVIDEOLOCATION);
AppendMenuItem(IDS_CONTENT_CONTEXT_OPENVIDEONEWTAB);
}
-void RenderViewContextMenu::AppendMediaItems(
- ContextMenuMediaParams media_params) {
- if (media_params.player_state & ContextMenuMediaParams::PAUSED) {
+void RenderViewContextMenu::AppendMediaItems() {
+ int media_flags = params_.media_flags;
+ if (media_flags & WebContextMenuData::MediaPaused) {
AppendMenuItem(IDS_CONTENT_CONTEXT_PLAY);
} else {
AppendMenuItem(IDS_CONTENT_CONTEXT_PAUSE);
}
- if (media_params.player_state & ContextMenuMediaParams::MUTED) {
+ if (media_flags & WebContextMenuData::MediaMuted) {
AppendMenuItem(IDS_CONTENT_CONTEXT_UNMUTE);
} else {
AppendMenuItem(IDS_CONTENT_CONTEXT_MUTE);
@@ -352,15 +363,16 @@ bool RenderViewContextMenu::IsItemCommandEnabled(int id) const {
case IDS_CONTENT_CONTEXT_PLAY:
case IDS_CONTENT_CONTEXT_PAUSE:
case IDS_CONTENT_CONTEXT_LOOP:
- return (params_.media_params.player_state &
- ContextMenuMediaParams::IN_ERROR) == 0;
+ return (params_.media_flags &
+ WebContextMenuData::MediaInError) == 0;
// Mute and unmute should also be disabled if the player has no audio.
case IDS_CONTENT_CONTEXT_MUTE:
case IDS_CONTENT_CONTEXT_UNMUTE:
- return params_.media_params.has_audio &&
- (params_.media_params.player_state &
- ContextMenuMediaParams::IN_ERROR) == 0;
+ return (params_.media_flags &
+ WebContextMenuData::MediaHasAudio) != 0 &&
+ (params_.media_flags &
+ WebContextMenuData::MediaInError) == 0;
case IDS_CONTENT_CONTEXT_SAVESCREENSHOTAS:
// TODO(ajwong): Enable save screenshot after we actually implement
@@ -374,8 +386,8 @@ bool RenderViewContextMenu::IsItemCommandEnabled(int id) const {
case IDS_CONTENT_CONTEXT_SAVEAUDIOAS:
case IDS_CONTENT_CONTEXT_SAVEVIDEOAS:
- return (params_.media_params.player_state &
- ContextMenuMediaParams::CAN_SAVE) &&
+ return (params_.media_flags &
+ WebContextMenuData::MediaCanSave) &&
params_.src_url.is_valid() &&
URLRequest::IsHandledURL(params_.src_url);
@@ -400,25 +412,25 @@ bool RenderViewContextMenu::IsItemCommandEnabled(int id) const {
return params_.frame_url.is_valid();
case IDS_CONTENT_CONTEXT_UNDO:
- return !!(params_.edit_flags & ContextNodeType::CAN_UNDO);
+ return !!(params_.edit_flags & WebContextMenuData::CanUndo);
case IDS_CONTENT_CONTEXT_REDO:
- return !!(params_.edit_flags & ContextNodeType::CAN_REDO);
+ return !!(params_.edit_flags & WebContextMenuData::CanRedo);
case IDS_CONTENT_CONTEXT_CUT:
- return !!(params_.edit_flags & ContextNodeType::CAN_CUT);
+ return !!(params_.edit_flags & WebContextMenuData::CanCut);
case IDS_CONTENT_CONTEXT_COPY:
- return !!(params_.edit_flags & ContextNodeType::CAN_COPY);
+ return !!(params_.edit_flags & WebContextMenuData::CanCopy);
case IDS_CONTENT_CONTEXT_PASTE:
- return !!(params_.edit_flags & ContextNodeType::CAN_PASTE);
+ return !!(params_.edit_flags & WebContextMenuData::CanPaste);
case IDS_CONTENT_CONTEXT_DELETE:
- return !!(params_.edit_flags & ContextNodeType::CAN_DELETE);
+ return !!(params_.edit_flags & WebContextMenuData::CanDelete);
case IDS_CONTENT_CONTEXT_SELECTALL:
- return !!(params_.edit_flags & ContextNodeType::CAN_SELECT_ALL);
+ return !!(params_.edit_flags & WebContextMenuData::CanSelectAll);
case IDS_CONTENT_CONTEXT_OPENLINKOFFTHERECORD:
return !profile_->IsOffTheRecord() && params_.link_url.is_valid();
@@ -457,8 +469,8 @@ bool RenderViewContextMenu::IsItemCommandEnabled(int id) const {
bool RenderViewContextMenu::ItemIsChecked(int id) const {
// See if the video is set to looping.
if (id == IDS_CONTENT_CONTEXT_LOOP) {
- return (params_.media_params.player_state &
- ContextMenuMediaParams::LOOP) != 0;
+ return (params_.media_flags &
+ WebContextMenuData::MediaLoop) != 0;
}
// Check box for 'Check the Spelling of this field'.
diff --git a/chrome/browser/tab_contents/render_view_context_menu.h b/chrome/browser/tab_contents/render_view_context_menu.h
index bd14f8c..7a4bbc8 100644
--- a/chrome/browser/tab_contents/render_view_context_menu.h
+++ b/chrome/browser/tab_contents/render_view_context_menu.h
@@ -33,7 +33,7 @@ class RenderViewContextMenu {
void Init();
protected:
- void InitMenu(ContextNodeType node, ContextMenuMediaParams media_params);
+ void InitMenu();
// Functions to be implemented by platform-specific subclasses ---------------
@@ -80,9 +80,9 @@ class RenderViewContextMenu {
void AppendDeveloperItems();
void AppendLinkItems();
void AppendImageItems();
- void AppendAudioItems(ContextMenuMediaParams media_params);
- void AppendVideoItems(ContextMenuMediaParams media_params);
- void AppendMediaItems(ContextMenuMediaParams media_params);
+ void AppendAudioItems();
+ void AppendVideoItems();
+ void AppendMediaItems();
void AppendPageItems();
void AppendFrameItems();
void AppendCopyItem();
diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h
index 5a6b335..59dc1ac 100644
--- a/chrome/common/render_messages.h
+++ b/chrome/common/render_messages.h
@@ -557,47 +557,6 @@ struct ParamTraits<FilterPolicy::Type> {
};
template <>
-struct ParamTraits<ContextNodeType> {
- typedef ContextNodeType param_type;
- static void Write(Message* m, const param_type& p) {
- m->WriteInt(p.type);
- }
- static bool Read(const Message* m, void** iter, param_type* p) {
- int type;
- if (!m->ReadInt(iter, &type))
- return false;
- *p = ContextNodeType(type);
- return true;
- }
- static void Log(const param_type& p, std::wstring* l) {
- std::wstring event = L"";
-
- if (!p.type) {
- event.append(L"NONE");
- } else {
- event.append(L"(");
- if (p.type & ContextNodeType::PAGE)
- event.append(L"PAGE|");
- if (p.type & ContextNodeType::FRAME)
- event.append(L"FRAME|");
- if (p.type & ContextNodeType::LINK)
- event.append(L"LINK|");
- if (p.type & ContextNodeType::IMAGE)
- event.append(L"IMAGE|");
- if (p.type & ContextNodeType::SELECTION)
- event.append(L"SELECTION|");
- if (p.type & ContextNodeType::EDITABLE)
- event.append(L"EDITABLE|");
- if (p.type & ContextNodeType::MISSPELLED_WORD)
- event.append(L"MISSPELLED_WORD|");
- event.append(L")");
- }
-
- LogParam(event, l);
- }
-};
-
-template <>
struct ParamTraits<webkit_glue::WebAccessibility::InParams> {
typedef webkit_glue::WebAccessibility::InParams param_type;
static void Write(Message* m, const param_type& p) {
@@ -894,24 +853,10 @@ struct ParamTraits<ViewHostMsg_FrameNavigate_Params> {
};
template <>
-struct ParamTraits<ContextMenuMediaParams> {
- typedef ContextMenuMediaParams param_type;
- static void Write(Message* m, const param_type& p) {
- WriteParam(m, p.player_state);
- WriteParam(m, p.has_audio);
- }
- static bool Read(const Message* m, void** iter, param_type* p) {
- return
- ReadParam(m, iter, &p->player_state) &&
- ReadParam(m, iter, &p->has_audio);
- }
-};
-
-template <>
struct ParamTraits<ContextMenuParams> {
typedef ContextMenuParams param_type;
static void Write(Message* m, const param_type& p) {
- WriteParam(m, p.node_type);
+ WriteParam(m, p.media_type);
WriteParam(m, p.x);
WriteParam(m, p.y);
WriteParam(m, p.link_url);
@@ -919,18 +864,19 @@ struct ParamTraits<ContextMenuParams> {
WriteParam(m, p.src_url);
WriteParam(m, p.page_url);
WriteParam(m, p.frame_url);
- WriteParam(m, p.media_params);
+ WriteParam(m, p.media_flags);
WriteParam(m, p.selection_text);
WriteParam(m, p.misspelled_word);
WriteParam(m, p.dictionary_suggestions);
WriteParam(m, p.spellcheck_enabled);
+ WriteParam(m, p.is_editable);
WriteParam(m, p.edit_flags);
WriteParam(m, p.security_info);
WriteParam(m, p.frame_charset);
}
static bool Read(const Message* m, void** iter, param_type* p) {
return
- ReadParam(m, iter, &p->node_type) &&
+ ReadParam(m, iter, &p->media_type) &&
ReadParam(m, iter, &p->x) &&
ReadParam(m, iter, &p->y) &&
ReadParam(m, iter, &p->link_url) &&
@@ -938,11 +884,12 @@ struct ParamTraits<ContextMenuParams> {
ReadParam(m, iter, &p->src_url) &&
ReadParam(m, iter, &p->page_url) &&
ReadParam(m, iter, &p->frame_url) &&
- ReadParam(m, iter, &p->media_params) &&
+ ReadParam(m, iter, &p->media_flags) &&
ReadParam(m, iter, &p->selection_text) &&
ReadParam(m, iter, &p->misspelled_word) &&
ReadParam(m, iter, &p->dictionary_suggestions) &&
ReadParam(m, iter, &p->spellcheck_enabled) &&
+ ReadParam(m, iter, &p->is_editable) &&
ReadParam(m, iter, &p->edit_flags) &&
ReadParam(m, iter, &p->security_info) &&
ReadParam(m, iter, &p->frame_charset);
diff --git a/chrome/common/webkit_param_traits.h b/chrome/common/webkit_param_traits.h
index 8a32741..dacaf08 100644
--- a/chrome/common/webkit_param_traits.h
+++ b/chrome/common/webkit_param_traits.h
@@ -27,6 +27,7 @@
#include "webkit/api/public/WebCache.h"
#include "webkit/api/public/WebCompositionCommand.h"
#include "webkit/api/public/WebConsoleMessage.h"
+#include "webkit/api/public/WebContextMenuData.h"
#include "webkit/api/public/WebDragOperation.h"
#include "webkit/api/public/WebFindOptions.h"
#include "webkit/api/public/WebInputEvent.h"
@@ -357,6 +358,20 @@ struct ParamTraits<WebKit::WebMediaPlayerAction> {
}
};
+template <>
+ struct ParamTraits<WebKit::WebContextMenuData::MediaType> {
+ typedef WebKit::WebContextMenuData::MediaType param_type;
+ static void Write(Message* m, const param_type& p) {
+ m->WriteInt(p);
+ }
+ static bool Read(const Message* m, void** iter, param_type* r) {
+ int temp;
+ bool res = m->ReadInt(iter, &temp);
+ *r = static_cast<param_type>(temp);
+ return res;
+ }
+};
+
} // namespace IPC
#endif // CHROME_COMMON_WEBKIT_PARAM_TRAITS_H_
diff --git a/chrome/renderer/print_web_view_helper.h b/chrome/renderer/print_web_view_helper.h
index 5c14475..893552d 100644
--- a/chrome/renderer/print_web_view_helper.h
+++ b/chrome/renderer/print_web_view_helper.h
@@ -169,6 +169,12 @@ class PrintWebViewHelper : public WebViewDelegate {
virtual bool isShowingSpellingUI() { return false; }
virtual void updateSpellingUIWithMisspelledWord(
const WebKit::WebString& word) {}
+ virtual bool runFileChooser(
+ bool multi_select, const WebKit::WebString& title,
+ const WebKit::WebString& initial_value,
+ WebKit::WebFileChooserCompletion* chooser_completion) {
+ return false;
+ }
virtual void runModalAlertDialog(
WebKit::WebFrame* frame, const WebKit::WebString& message) {}
virtual bool runModalConfirmDialog(
@@ -183,12 +189,8 @@ class PrintWebViewHelper : public WebViewDelegate {
WebKit::WebFrame* frame, const WebKit::WebString& message) {
return true;
}
- virtual bool runFileChooser(
- bool multi_select, const WebKit::WebString& title,
- const WebKit::WebString& initial_value,
- WebKit::WebFileChooserCompletion* chooser_completion) {
- return false;
- }
+ virtual void showContextMenu(
+ WebKit::WebFrame* frame, const WebKit::WebContextMenuData& data) {}
virtual void setStatusText(const WebKit::WebString& text) {}
virtual void setMouseOverURL(const WebKit::WebURL& url) {}
virtual void setToolTipText(
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 4a5d2d4..86dab30 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -79,6 +79,7 @@
#include "webkit/appcache/appcache_interfaces.h"
#include "webkit/default_plugin/default_plugin_shared.h"
#include "webkit/glue/glue_serialize.h"
+#include "webkit/glue/glue_util.h"
#include "webkit/glue/dom_operations.h"
#include "webkit/glue/dom_serializer.h"
#include "webkit/glue/image_decoder.h"
@@ -113,6 +114,7 @@ using webkit_glue::SearchableFormData;
using WebKit::WebColor;
using WebKit::WebColorName;
using WebKit::WebConsoleMessage;
+using WebKit::WebContextMenuData;
using WebKit::WebData;
using WebKit::WebDataSource;
using WebKit::WebDragData;
@@ -1623,6 +1625,11 @@ bool RenderView::runModalBeforeUnloadDialog(
return success;
}
+void RenderView::showContextMenu(
+ WebFrame* frame, const WebContextMenuData& data) {
+ Send(new ViewHostMsg_ContextMenu(routing_id_, ContextMenuParams(data)));
+}
+
void RenderView::setStatusText(const WebString& text) {
}
@@ -2497,40 +2504,6 @@ void RenderView::SyncNavigationState() {
routing_id_, page_id_, webkit_glue::HistoryItemToString(item)));
}
-void RenderView::ShowContextMenu(WebView* webview,
- ContextNodeType node_type,
- int x,
- int y,
- const GURL& link_url,
- const GURL& src_url,
- const GURL& page_url,
- const GURL& frame_url,
- const ContextMenuMediaParams& media_params,
- const std::wstring& selection_text,
- const std::wstring& misspelled_word,
- int edit_flags,
- const std::string& security_info,
- const std::string& frame_charset) {
- ContextMenuParams params;
- params.node_type = node_type;
- params.x = x;
- params.y = y;
- params.src_url = src_url;
- params.link_url = link_url;
- params.unfiltered_link_url = link_url;
- params.page_url = page_url;
- params.frame_url = frame_url;
- params.media_params = media_params;
- params.selection_text = selection_text;
- params.misspelled_word = misspelled_word;
- params.spellcheck_enabled =
- webview->focusedFrame()->isContinuousSpellCheckingEnabled();
- params.edit_flags = edit_flags;
- params.security_info = security_info;
- params.frame_charset = frame_charset;
- Send(new ViewHostMsg_ContextMenu(routing_id_, params));
-}
-
bool RenderView::DownloadImage(int id, const GURL& image_url, int image_size) {
// Make sure webview was not shut down.
if (!webview())
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index 10822a5..72e8f6b 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -36,6 +36,7 @@
#include "third_party/skia/include/core/SkBitmap.h"
#include "testing/gtest/include/gtest/gtest_prod.h"
#include "webkit/api/public/WebConsoleMessage.h"
+#include "webkit/api/public/WebContextMenuData.h"
#include "webkit/api/public/WebFrameClient.h"
#include "webkit/api/public/WebTextDirection.h"
#include "webkit/glue/dom_serializer_delegate.h"
@@ -177,20 +178,6 @@ class RenderView : public RenderWidget,
virtual void OnMissingPluginStatus(
WebPluginDelegateProxy* delegate,
int status);
- virtual void ShowContextMenu(WebView* webview,
- ContextNodeType node_type,
- int x,
- int y,
- const GURL& link_url,
- const GURL& src_url,
- const GURL& page_url,
- const GURL& frame_url,
- const ContextMenuMediaParams& media_params,
- const std::wstring& selection_text,
- const std::wstring& misspelled_word,
- int edit_flags,
- const std::string& security_info,
- const std::string& frame_charset);
virtual WebDevToolsAgentDelegate* GetWebDevToolsAgentDelegate();
virtual bool WasOpenedByUserGesture() const;
virtual void FocusAccessibilityObject(WebCore::AccessibilityObject* acc_obj);
@@ -256,6 +243,8 @@ class RenderView : public RenderWidget,
const WebKit::WebString& default_value, WebKit::WebString* actual_value);
virtual bool runModalBeforeUnloadDialog(
WebKit::WebFrame* frame, const WebKit::WebString& message);
+ virtual void showContextMenu(
+ WebKit::WebFrame* frame, const WebKit::WebContextMenuData& data);
virtual void setStatusText(const WebKit::WebString& text);
virtual void setMouseOverURL(const WebKit::WebURL& url);
virtual void setToolTipText(