| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/renderer/blocked_plugin.h" | 5 #include "chrome/renderer/blocked_plugin.h" |
| 6 | 6 |
| 7 #include "base/string_piece.h" | 7 #include "base/string_piece.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "base/values.h" | 9 #include "base/values.h" |
| 10 #include "chrome/common/jstemplate_builder.h" | 10 #include "chrome/common/jstemplate_builder.h" |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 // TODO(cevans) - move these to a shared header file so that there are no | 49 // TODO(cevans) - move these to a shared header file so that there are no |
| 50 // collisions in the longer term. Currently, blocked_plugin.cc is the only | 50 // collisions in the longer term. Currently, blocked_plugin.cc is the only |
| 51 // user of custom menu commands (extension menu items have their own range). | 51 // user of custom menu commands (extension menu items have their own range). |
| 52 static const unsigned kMenuActionLoad = 1; | 52 static const unsigned kMenuActionLoad = 1; |
| 53 static const unsigned kMenuActionRemove = 2; | 53 static const unsigned kMenuActionRemove = 2; |
| 54 | 54 |
| 55 static const BlockedPlugin* g_last_active_menu; | 55 static const BlockedPlugin* g_last_active_menu; |
| 56 | 56 |
| 57 BlockedPlugin::BlockedPlugin(RenderView* render_view, | 57 BlockedPlugin::BlockedPlugin(RenderView* render_view, |
| 58 WebFrame* frame, | 58 WebFrame* frame, |
| 59 const webkit::npapi::PluginGroup& info, | |
| 60 const WebPluginParams& params, | 59 const WebPluginParams& params, |
| 61 const WebPreferences& preferences, | 60 const WebPreferences& preferences, |
| 62 int template_id, | 61 int template_id, |
| 62 const string16& name, |
| 63 const string16& message, | 63 const string16& message, |
| 64 bool is_blocked_for_prerendering, | 64 bool is_blocked_for_prerendering, |
| 65 bool allow_loading) | 65 bool allow_loading) |
| 66 : RenderViewObserver(render_view), | 66 : RenderViewObserver(render_view), |
| 67 frame_(frame), | 67 frame_(frame), |
| 68 plugin_params_(params), | 68 plugin_params_(params), |
| 69 name_(name), |
| 69 is_blocked_for_prerendering_(is_blocked_for_prerendering), | 70 is_blocked_for_prerendering_(is_blocked_for_prerendering), |
| 70 hidden_(false), | 71 hidden_(false), |
| 71 allow_loading_(allow_loading) { | 72 allow_loading_(allow_loading) { |
| 72 const base::StringPiece template_html( | 73 const base::StringPiece template_html( |
| 73 ResourceBundle::GetSharedInstance().GetRawDataResource(template_id)); | 74 ResourceBundle::GetSharedInstance().GetRawDataResource(template_id)); |
| 74 | 75 |
| 75 DCHECK(!template_html.empty()) << "unable to load template. ID: " | 76 DCHECK(!template_html.empty()) << "unable to load template. ID: " |
| 76 << template_id; | 77 << template_id; |
| 77 | 78 |
| 78 DictionaryValue values; | 79 DictionaryValue values; |
| 79 values.SetString("message", message); | 80 values.SetString("message", message); |
| 80 name_ = info.GetGroupName(); | |
| 81 values.SetString("name", name_); | 81 values.SetString("name", name_); |
| 82 values.SetString("hide", l10n_util::GetStringUTF8(IDS_PLUGIN_HIDE)); | 82 values.SetString("hide", l10n_util::GetStringUTF8(IDS_PLUGIN_HIDE)); |
| 83 | 83 |
| 84 // "t" is the id of the templates root node. | 84 // "t" is the id of the templates root node. |
| 85 std::string html_data = jstemplate_builder::GetTemplatesHtml( | 85 std::string html_data = jstemplate_builder::GetTemplatesHtml( |
| 86 template_html, &values, "t"); | 86 template_html, &values, "t"); |
| 87 | 87 |
| 88 plugin_ = webkit::npapi::WebViewPlugin::Create(this, | 88 plugin_ = webkit::npapi::WebViewPlugin::Create(this, |
| 89 preferences, | 89 preferences, |
| 90 html_data, | 90 html_data, |
| 91 GURL(kBlockedPluginDataURL)); | 91 GURL(kBlockedPluginDataURL)); |
| 92 } | 92 } |
| 93 | 93 |
| 94 BlockedPlugin::~BlockedPlugin() { | 94 BlockedPlugin::~BlockedPlugin() { |
| 95 } | 95 } |
| 96 | 96 |
| 97 void BlockedPlugin::BindWebFrame(WebFrame* frame) { | 97 void BlockedPlugin::BindWebFrame(WebFrame* frame) { |
| 98 BindToJavascript(frame, "plugin"); | 98 BindToJavascript(frame, "plugin"); |
| 99 BindMethod("load", &BlockedPlugin::Load); | 99 BindMethod("load", &BlockedPlugin::Load); |
| 100 BindMethod("hide", &BlockedPlugin::Hide); | 100 BindMethod("hide", &BlockedPlugin::Hide); |
| 101 } | 101 } |
| 102 | 102 |
| 103 void BlockedPlugin::WillDestroyPlugin() { | 103 void BlockedPlugin::WillDestroyPlugin() { |
| 104 delete this; | 104 delete this; |
| 105 } | 105 } |
| 106 | 106 |
| 107 void BlockedPlugin::ShowContextMenu(const WebKit::WebMouseEvent& event) { | 107 void BlockedPlugin::ShowContextMenu(const WebKit::WebMouseEvent& event) { |
| 108 WebContextMenuData menu_data; | 108 WebContextMenuData menu_data; |
| 109 WebVector<WebMenuItemInfo> custom_items(static_cast<size_t>(4)); | |
| 110 | 109 |
| 111 WebMenuItemInfo name_item; | 110 size_t num_items = name_.empty() ? 2u : 4u; |
| 112 name_item.label = name_; | 111 WebVector<WebMenuItemInfo> custom_items(num_items); |
| 113 name_item.hasTextDirectionOverride = false; | |
| 114 name_item.textDirection = WebKit::WebTextDirectionDefault; | |
| 115 custom_items[0] = name_item; | |
| 116 | 112 |
| 117 WebMenuItemInfo separator_item; | 113 size_t i = 0; |
| 118 separator_item.type = WebMenuItemInfo::Separator; | 114 if (!name_.empty()) { |
| 119 custom_items[1] = separator_item; | 115 WebMenuItemInfo name_item; |
| 116 name_item.label = name_; |
| 117 name_item.hasTextDirectionOverride = false; |
| 118 name_item.textDirection = WebKit::WebTextDirectionDefault; |
| 119 custom_items[i++] = name_item; |
| 120 |
| 121 WebMenuItemInfo separator_item; |
| 122 separator_item.type = WebMenuItemInfo::Separator; |
| 123 custom_items[i++] = separator_item; |
| 124 } |
| 120 | 125 |
| 121 WebMenuItemInfo run_item; | 126 WebMenuItemInfo run_item; |
| 122 run_item.action = kMenuActionLoad; | 127 run_item.action = kMenuActionLoad; |
| 123 // Disable this menu item if the plugin is blocked by policy. | 128 // Disable this menu item if the plugin is blocked by policy. |
| 124 run_item.enabled = allow_loading_; | 129 run_item.enabled = allow_loading_; |
| 125 run_item.label = WebString::fromUTF8( | 130 run_item.label = WebString::fromUTF8( |
| 126 l10n_util::GetStringUTF8(IDS_CONTENT_CONTEXT_PLUGIN_RUN).c_str()); | 131 l10n_util::GetStringUTF8(IDS_CONTENT_CONTEXT_PLUGIN_RUN).c_str()); |
| 127 run_item.hasTextDirectionOverride = false; | 132 run_item.hasTextDirectionOverride = false; |
| 128 run_item.textDirection = WebKit::WebTextDirectionDefault; | 133 run_item.textDirection = WebKit::WebTextDirectionDefault; |
| 129 custom_items[2] = run_item; | 134 custom_items[i++] = run_item; |
| 130 | 135 |
| 131 WebMenuItemInfo hide_item; | 136 WebMenuItemInfo hide_item; |
| 132 hide_item.action = kMenuActionRemove; | 137 hide_item.action = kMenuActionRemove; |
| 133 hide_item.enabled = true; | 138 hide_item.enabled = true; |
| 134 hide_item.label = WebString::fromUTF8( | 139 hide_item.label = WebString::fromUTF8( |
| 135 l10n_util::GetStringUTF8(IDS_CONTENT_CONTEXT_PLUGIN_HIDE).c_str()); | 140 l10n_util::GetStringUTF8(IDS_CONTENT_CONTEXT_PLUGIN_HIDE).c_str()); |
| 136 hide_item.hasTextDirectionOverride = false; | 141 hide_item.hasTextDirectionOverride = false; |
| 137 hide_item.textDirection = WebKit::WebTextDirectionDefault; | 142 hide_item.textDirection = WebKit::WebTextDirectionDefault; |
| 138 custom_items[3] = hide_item; | 143 custom_items[i++] = hide_item; |
| 139 | 144 |
| 140 menu_data.customItems.swap(custom_items); | 145 menu_data.customItems.swap(custom_items); |
| 141 menu_data.mousePosition = WebPoint(event.windowX, event.windowY); | 146 menu_data.mousePosition = WebPoint(event.windowX, event.windowY); |
| 142 render_view()->showContextMenu(NULL, menu_data); | 147 render_view()->showContextMenu(NULL, menu_data); |
| 143 g_last_active_menu = this; | 148 g_last_active_menu = this; |
| 144 } | 149 } |
| 145 | 150 |
| 146 bool BlockedPlugin::OnMessageReceived(const IPC::Message& message) { | 151 bool BlockedPlugin::OnMessageReceived(const IPC::Message& message) { |
| 147 // We don't swallow ViewMsg_CustomContextMenuAction because we listen for all | 152 // We don't swallow ViewMsg_CustomContextMenuAction because we listen for all |
| 148 // custom menu IDs, and not just our own. We don't swallow | 153 // custom menu IDs, and not just our own. We don't swallow |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 element = parent.toConst<WebElement>(); | 264 element = parent.toConst<WebElement>(); |
| 260 if (element.hasAttribute("style")) { | 265 if (element.hasAttribute("style")) { |
| 261 WebString style_str = element.getAttribute("style"); | 266 WebString style_str = element.getAttribute("style"); |
| 262 if (width_regex.match(style_str) >= 0 && | 267 if (width_regex.match(style_str) >= 0 && |
| 263 height_regex.match(style_str) >= 0) | 268 height_regex.match(style_str) >= 0) |
| 264 element.setAttribute("style", "display: none;"); | 269 element.setAttribute("style", "display: none;"); |
| 265 } | 270 } |
| 266 } | 271 } |
| 267 } | 272 } |
| 268 } | 273 } |
| OLD | NEW |