diff options
author | yaar@chromium.org <yaar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-09 18:17:44 +0000 |
---|---|---|
committer | yaar@chromium.org <yaar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-09 18:17:44 +0000 |
commit | 79e3744bbbb0867f4e356eab96703d425b3fad40 (patch) | |
tree | 790f3464f1636e542b15b2a5de852cbb6c5f9c41 /chrome | |
parent | 9068747c5591866480bd0888e571cc548d6be546 (diff) | |
download | chromium_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.cc | 114 | ||||
-rw-r--r-- | chrome/browser/tab_contents/render_view_context_menu.h | 8 | ||||
-rw-r--r-- | chrome/common/render_messages.h | 65 | ||||
-rw-r--r-- | chrome/common/webkit_param_traits.h | 15 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper.h | 14 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 41 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 17 |
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( |