OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/plugins/chrome_plugin_placeholder.h" | 5 #include "chrome/renderer/plugins/chrome_plugin_placeholder.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 #include "ui/base/webui/jstemplate_builder.h" | 42 #include "ui/base/webui/jstemplate_builder.h" |
43 #include "ui/gfx/geometry/size.h" | 43 #include "ui/gfx/geometry/size.h" |
44 #include "url/origin.h" | 44 #include "url/origin.h" |
45 #include "url/url_util.h" | 45 #include "url/url_util.h" |
46 | 46 |
47 using base::UserMetricsAction; | 47 using base::UserMetricsAction; |
48 using content::RenderThread; | 48 using content::RenderThread; |
49 using content::RenderView; | 49 using content::RenderView; |
50 | 50 |
51 namespace { | 51 namespace { |
52 const ChromePluginPlaceholder* g_last_active_menu = NULL; | 52 const ChromePluginPlaceholder* g_last_active_menu = nullptr; |
53 } // namespace | 53 } // namespace |
54 | 54 |
55 gin::WrapperInfo ChromePluginPlaceholder::kWrapperInfo = { | 55 gin::WrapperInfo ChromePluginPlaceholder::kWrapperInfo = { |
56 gin::kEmbedderNativeGin}; | 56 gin::kEmbedderNativeGin}; |
57 | 57 |
58 ChromePluginPlaceholder::ChromePluginPlaceholder( | 58 ChromePluginPlaceholder::ChromePluginPlaceholder( |
59 content::RenderFrame* render_frame, | 59 content::RenderFrame* render_frame, |
60 blink::WebLocalFrame* frame, | |
61 const blink::WebPluginParams& params, | 60 const blink::WebPluginParams& params, |
62 const std::string& html_data, | 61 const std::string& html_data, |
63 const base::string16& title) | 62 const base::string16& title) |
64 : plugins::LoadablePluginPlaceholder(render_frame, | 63 : plugins::LoadablePluginPlaceholder(render_frame, |
65 frame, | |
66 params, | 64 params, |
67 html_data), | 65 html_data), |
68 status_(ChromeViewHostMsg_GetPluginInfo_Status::kAllowed), | 66 status_(ChromeViewHostMsg_GetPluginInfo_Status::kAllowed), |
69 title_(title), | 67 title_(title), |
70 context_menu_request_id_(0), | 68 context_menu_request_id_(0), |
71 did_send_blocked_content_notification_(false) { | 69 did_send_blocked_content_notification_(false) { |
72 RenderThread::Get()->AddObserver(this); | 70 RenderThread::Get()->AddObserver(this); |
73 } | 71 } |
74 | 72 |
75 ChromePluginPlaceholder::~ChromePluginPlaceholder() { | 73 ChromePluginPlaceholder::~ChromePluginPlaceholder() { |
76 RenderThread::Get()->RemoveObserver(this); | 74 RenderThread::Get()->RemoveObserver(this); |
77 if (context_menu_request_id_ && render_frame()) | 75 if (context_menu_request_id_ && render_frame()) |
78 render_frame()->CancelContextMenu(context_menu_request_id_); | 76 render_frame()->CancelContextMenu(context_menu_request_id_); |
79 | 77 |
80 if (placeholder_routing_id_ == MSG_ROUTING_NONE) | 78 if (placeholder_routing_id_ == MSG_ROUTING_NONE) |
81 return; | 79 return; |
82 RenderThread::Get()->RemoveRoute(placeholder_routing_id_); | 80 RenderThread::Get()->RemoveRoute(placeholder_routing_id_); |
83 } | 81 } |
84 | 82 |
85 // TODO(bauerb): Move this method to NonLoadablePluginPlaceholder? | 83 // TODO(bauerb): Move this method to NonLoadablePluginPlaceholder? |
86 // static | 84 // static |
87 ChromePluginPlaceholder* ChromePluginPlaceholder::CreateLoadableMissingPlugin( | 85 ChromePluginPlaceholder* ChromePluginPlaceholder::CreateLoadableMissingPlugin( |
88 content::RenderFrame* render_frame, | 86 content::RenderFrame* render_frame, |
89 blink::WebLocalFrame* frame, | |
90 const blink::WebPluginParams& params) { | 87 const blink::WebPluginParams& params) { |
91 const base::StringPiece template_html( | 88 const base::StringPiece template_html( |
92 ResourceBundle::GetSharedInstance().GetRawDataResource( | 89 ResourceBundle::GetSharedInstance().GetRawDataResource( |
93 IDR_BLOCKED_PLUGIN_HTML)); | 90 IDR_BLOCKED_PLUGIN_HTML)); |
94 | 91 |
95 base::DictionaryValue values; | 92 base::DictionaryValue values; |
96 values.SetString("message", | 93 values.SetString("message", |
97 l10n_util::GetStringUTF8(IDS_PLUGIN_NOT_SUPPORTED)); | 94 l10n_util::GetStringUTF8(IDS_PLUGIN_NOT_SUPPORTED)); |
98 | 95 |
99 std::string html_data = webui::GetI18nTemplateHtml(template_html, &values); | 96 std::string html_data = webui::GetI18nTemplateHtml(template_html, &values); |
100 | 97 |
101 // Will destroy itself when its WebViewPlugin is going away. | 98 // Will destroy itself when its WebViewPlugin is going away. |
102 return new ChromePluginPlaceholder(render_frame, frame, params, html_data, | 99 return new ChromePluginPlaceholder(render_frame, params, html_data, |
103 params.mime_type.Utf16()); | 100 params.mime_type.Utf16()); |
104 } | 101 } |
105 | 102 |
106 // static | 103 // static |
107 ChromePluginPlaceholder* ChromePluginPlaceholder::CreateBlockedPlugin( | 104 ChromePluginPlaceholder* ChromePluginPlaceholder::CreateBlockedPlugin( |
108 content::RenderFrame* render_frame, | 105 content::RenderFrame* render_frame, |
109 blink::WebLocalFrame* frame, | |
110 const blink::WebPluginParams& params, | 106 const blink::WebPluginParams& params, |
111 const content::WebPluginInfo& info, | 107 const content::WebPluginInfo& info, |
112 const std::string& identifier, | 108 const std::string& identifier, |
113 const base::string16& name, | 109 const base::string16& name, |
114 int template_id, | 110 int template_id, |
115 const base::string16& message, | 111 const base::string16& message, |
116 const PowerSaverInfo& power_saver_info) { | 112 const PowerSaverInfo& power_saver_info) { |
117 base::DictionaryValue values; | 113 base::DictionaryValue values; |
118 values.SetString("message", message); | 114 values.SetString("message", message); |
119 values.SetString("name", name); | 115 values.SetString("name", name); |
120 values.SetString("hide", l10n_util::GetStringUTF8(IDS_PLUGIN_HIDE)); | 116 values.SetString("hide", l10n_util::GetStringUTF8(IDS_PLUGIN_HIDE)); |
121 values.SetString( | 117 values.SetString( |
122 "pluginType", | 118 "pluginType", |
123 frame->View()->MainFrame()->IsWebLocalFrame() && | 119 render_frame->IsMainFrame() && |
124 frame->View()->MainFrame()->GetDocument().IsPluginDocument() | 120 render_frame->GetWebFrame()->GetDocument().IsPluginDocument() |
125 ? "document" | 121 ? "document" |
126 : "embedded"); | 122 : "embedded"); |
127 | 123 |
128 if (!power_saver_info.poster_attribute.empty()) { | 124 if (!power_saver_info.poster_attribute.empty()) { |
129 values.SetString("poster", power_saver_info.poster_attribute); | 125 values.SetString("poster", power_saver_info.poster_attribute); |
130 values.SetString("baseurl", power_saver_info.base_url.spec()); | 126 values.SetString("baseurl", power_saver_info.base_url.spec()); |
131 | 127 |
132 if (!power_saver_info.custom_poster_size.IsEmpty()) { | 128 if (!power_saver_info.custom_poster_size.IsEmpty()) { |
133 float zoom_factor = | 129 float zoom_factor = blink::WebView::ZoomLevelToZoomFactor( |
134 blink::WebView::ZoomLevelToZoomFactor(frame->View()->ZoomLevel()); | 130 render_frame->GetWebFrame()->View()->ZoomLevel()); |
135 int width = | 131 int width = |
136 roundf(power_saver_info.custom_poster_size.width() / zoom_factor); | 132 roundf(power_saver_info.custom_poster_size.width() / zoom_factor); |
137 int height = | 133 int height = |
138 roundf(power_saver_info.custom_poster_size.height() / zoom_factor); | 134 roundf(power_saver_info.custom_poster_size.height() / zoom_factor); |
139 values.SetString("visibleWidth", base::IntToString(width) + "px"); | 135 values.SetString("visibleWidth", base::IntToString(width) + "px"); |
140 values.SetString("visibleHeight", base::IntToString(height) + "px"); | 136 values.SetString("visibleHeight", base::IntToString(height) + "px"); |
141 } | 137 } |
142 } | 138 } |
143 | 139 |
144 const base::StringPiece template_html( | 140 const base::StringPiece template_html( |
145 ResourceBundle::GetSharedInstance().GetRawDataResource(template_id)); | 141 ResourceBundle::GetSharedInstance().GetRawDataResource(template_id)); |
146 | 142 |
147 DCHECK(!template_html.empty()) << "unable to load template. ID: " | 143 DCHECK(!template_html.empty()) << "unable to load template. ID: " |
148 << template_id; | 144 << template_id; |
149 std::string html_data = webui::GetI18nTemplateHtml(template_html, &values); | 145 std::string html_data = webui::GetI18nTemplateHtml(template_html, &values); |
150 | 146 |
151 // |blocked_plugin| will destroy itself when its WebViewPlugin is going away. | 147 // |blocked_plugin| will destroy itself when its WebViewPlugin is going away. |
152 ChromePluginPlaceholder* blocked_plugin = new ChromePluginPlaceholder( | 148 ChromePluginPlaceholder* blocked_plugin = |
153 render_frame, frame, params, html_data, name); | 149 new ChromePluginPlaceholder(render_frame, params, html_data, name); |
154 | 150 |
155 if (!power_saver_info.poster_attribute.empty()) | 151 if (!power_saver_info.poster_attribute.empty()) |
156 blocked_plugin->BlockForPowerSaverPoster(); | 152 blocked_plugin->BlockForPowerSaverPoster(); |
157 blocked_plugin->SetPluginInfo(info); | 153 blocked_plugin->SetPluginInfo(info); |
158 blocked_plugin->SetIdentifier(identifier); | 154 blocked_plugin->SetIdentifier(identifier); |
159 | 155 |
160 blocked_plugin->set_power_saver_enabled(power_saver_info.power_saver_enabled); | 156 blocked_plugin->set_power_saver_enabled(power_saver_info.power_saver_enabled); |
161 blocked_plugin->set_blocked_for_background_tab( | 157 blocked_plugin->set_blocked_for_background_tab( |
162 power_saver_info.blocked_for_background_tab); | 158 power_saver_info.blocked_for_background_tab); |
163 | 159 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 SetMessage(l10n_util::GetStringFUTF16(IDS_PLUGIN_DOWNLOAD_ERROR_SHORT, | 219 SetMessage(l10n_util::GetStringFUTF16(IDS_PLUGIN_DOWNLOAD_ERROR_SHORT, |
224 plugin_name_)); | 220 plugin_name_)); |
225 } | 221 } |
226 | 222 |
227 void ChromePluginPlaceholder::OnSetPrerenderMode( | 223 void ChromePluginPlaceholder::OnSetPrerenderMode( |
228 prerender::PrerenderMode mode) { | 224 prerender::PrerenderMode mode) { |
229 OnSetIsPrerendering(mode != prerender::NO_PRERENDER); | 225 OnSetIsPrerendering(mode != prerender::NO_PRERENDER); |
230 } | 226 } |
231 | 227 |
232 void ChromePluginPlaceholder::PluginListChanged() { | 228 void ChromePluginPlaceholder::PluginListChanged() { |
233 if (!GetFrame() || !plugin()) | 229 if (!render_frame() || !plugin()) |
234 return; | 230 return; |
235 | 231 |
236 // Checking with GetFrame() is equivalent to checking render_frame(). | |
237 DCHECK(render_frame()); | |
238 | |
239 ChromeViewHostMsg_GetPluginInfo_Output output; | 232 ChromeViewHostMsg_GetPluginInfo_Output output; |
240 std::string mime_type(GetPluginParams().mime_type.Utf8()); | 233 std::string mime_type(GetPluginParams().mime_type.Utf8()); |
241 render_frame()->Send(new ChromeViewHostMsg_GetPluginInfo( | 234 render_frame()->Send(new ChromeViewHostMsg_GetPluginInfo( |
242 routing_id(), GURL(GetPluginParams().url), | 235 routing_id(), GURL(GetPluginParams().url), |
243 GetFrame()->Top()->GetSecurityOrigin(), mime_type, &output)); | 236 render_frame()->GetWebFrame()->Top()->GetSecurityOrigin(), mime_type, |
| 237 &output)); |
244 if (output.status == status_) | 238 if (output.status == status_) |
245 return; | 239 return; |
246 blink::WebPlugin* new_plugin = ChromeContentRendererClient::CreatePlugin( | 240 blink::WebPlugin* new_plugin = ChromeContentRendererClient::CreatePlugin( |
247 render_frame(), GetFrame(), GetPluginParams(), output); | 241 render_frame(), GetPluginParams(), output); |
248 ReplacePlugin(new_plugin); | 242 ReplacePlugin(new_plugin); |
249 if (!new_plugin) { | 243 if (!new_plugin) { |
250 PluginUMAReporter::GetInstance()->ReportPluginMissing( | 244 PluginUMAReporter::GetInstance()->ReportPluginMissing( |
251 GetPluginParams().mime_type.Utf8(), GURL(GetPluginParams().url)); | 245 GetPluginParams().mime_type.Utf8(), GURL(GetPluginParams().url)); |
252 } | 246 } |
253 } | 247 } |
254 | 248 |
255 void ChromePluginPlaceholder::OnMenuAction(int request_id, unsigned action) { | 249 void ChromePluginPlaceholder::OnMenuAction(int request_id, unsigned action) { |
256 DCHECK_EQ(context_menu_request_id_, request_id); | 250 DCHECK_EQ(context_menu_request_id_, request_id); |
257 if (g_last_active_menu != this) | 251 if (g_last_active_menu != this) |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 enable_flash_item.action = chrome::MENU_COMMAND_ENABLE_FLASH; | 317 enable_flash_item.action = chrome::MENU_COMMAND_ENABLE_FLASH; |
324 enable_flash_item.enabled = true; | 318 enable_flash_item.enabled = true; |
325 enable_flash_item.label = | 319 enable_flash_item.label = |
326 l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_ENABLE_FLASH); | 320 l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_ENABLE_FLASH); |
327 params.custom_items.push_back(enable_flash_item); | 321 params.custom_items.push_back(enable_flash_item); |
328 } | 322 } |
329 | 323 |
330 content::MenuItem hide_item; | 324 content::MenuItem hide_item; |
331 hide_item.action = chrome::MENU_COMMAND_PLUGIN_HIDE; | 325 hide_item.action = chrome::MENU_COMMAND_PLUGIN_HIDE; |
332 bool is_main_frame_plugin_document = | 326 bool is_main_frame_plugin_document = |
333 GetFrame()->View()->MainFrame()->IsWebLocalFrame() && | 327 render_frame()->IsMainFrame() && |
334 GetFrame()->View()->MainFrame()->GetDocument().IsPluginDocument(); | 328 render_frame()->GetWebFrame()->GetDocument().IsPluginDocument(); |
335 hide_item.enabled = !is_main_frame_plugin_document; | 329 hide_item.enabled = !is_main_frame_plugin_document; |
336 hide_item.label = l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLUGIN_HIDE); | 330 hide_item.label = l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_PLUGIN_HIDE); |
337 params.custom_items.push_back(hide_item); | 331 params.custom_items.push_back(hide_item); |
338 | 332 |
339 blink::WebPoint point(event.PositionInWidget().x, event.PositionInWidget().y); | 333 blink::WebPoint point(event.PositionInWidget().x, event.PositionInWidget().y); |
340 if (plugin() && plugin()->Container()) | 334 if (plugin() && plugin()->Container()) |
341 point = plugin()->Container()->LocalToRootFramePoint(point); | 335 point = plugin()->Container()->LocalToRootFramePoint(point); |
342 | 336 |
343 params.x = point.x; | 337 params.x = point.x; |
344 params.y = point.y; | 338 params.y = point.y; |
345 | 339 |
346 context_menu_request_id_ = render_frame()->ShowContextMenu(this, params); | 340 context_menu_request_id_ = render_frame()->ShowContextMenu(this, params); |
347 g_last_active_menu = this; | 341 g_last_active_menu = this; |
348 } | 342 } |
349 | 343 |
350 blink::WebPlugin* ChromePluginPlaceholder::CreatePlugin() { | 344 blink::WebPlugin* ChromePluginPlaceholder::CreatePlugin() { |
351 std::unique_ptr<content::PluginInstanceThrottler> throttler; | 345 std::unique_ptr<content::PluginInstanceThrottler> throttler; |
352 // If the plugin has already been marked essential in its placeholder form, | 346 // If the plugin has already been marked essential in its placeholder form, |
353 // we shouldn't create a new throttler and start the process all over again. | 347 // we shouldn't create a new throttler and start the process all over again. |
354 if (power_saver_enabled()) { | 348 if (power_saver_enabled()) { |
355 throttler = content::PluginInstanceThrottler::Create( | 349 throttler = content::PluginInstanceThrottler::Create( |
356 heuristic_run_before_ ? content::RenderFrame::DONT_RECORD_DECISION | 350 heuristic_run_before_ ? content::RenderFrame::DONT_RECORD_DECISION |
357 : content::RenderFrame::RECORD_DECISION); | 351 : content::RenderFrame::RECORD_DECISION); |
358 // PluginPreroller manages its own lifetime. | 352 // PluginPreroller manages its own lifetime. |
359 new PluginPreroller(render_frame(), GetFrame(), GetPluginParams(), | 353 new PluginPreroller(render_frame(), GetPluginParams(), GetPluginInfo(), |
360 GetPluginInfo(), GetIdentifier(), title_, | 354 GetIdentifier(), title_, |
361 l10n_util::GetStringFUTF16(IDS_PLUGIN_BLOCKED, title_), | 355 l10n_util::GetStringFUTF16(IDS_PLUGIN_BLOCKED, title_), |
362 throttler.get()); | 356 throttler.get()); |
363 } | 357 } |
364 return render_frame()->CreatePlugin(GetFrame(), GetPluginInfo(), | 358 return render_frame()->CreatePlugin(GetPluginInfo(), GetPluginParams(), |
365 GetPluginParams(), std::move(throttler)); | 359 std::move(throttler)); |
366 } | 360 } |
367 | 361 |
368 void ChromePluginPlaceholder::OnBlockedTinyContent() { | 362 void ChromePluginPlaceholder::OnBlockedTinyContent() { |
369 DCHECK(render_frame()); | 363 DCHECK(render_frame()); |
370 if (did_send_blocked_content_notification_) | 364 if (did_send_blocked_content_notification_) |
371 return; | 365 return; |
372 | 366 |
373 did_send_blocked_content_notification_ = true; | 367 did_send_blocked_content_notification_ = true; |
374 ContentSettingsObserver::Get(render_frame()) | 368 ContentSettingsObserver::Get(render_frame()) |
375 ->DidBlockContentType(CONTENT_SETTINGS_TYPE_PLUGINS, title_); | 369 ->DidBlockContentType(CONTENT_SETTINGS_TYPE_PLUGINS, title_); |
(...skipping 15 matching lines...) Expand all Loading... |
391 | 385 |
392 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 386 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
393 switches::kEnablePluginPlaceholderTesting)) { | 387 switches::kEnablePluginPlaceholderTesting)) { |
394 builder.SetMethod<void (ChromePluginPlaceholder::*)()>( | 388 builder.SetMethod<void (ChromePluginPlaceholder::*)()>( |
395 "didFinishIconRepositionForTesting", | 389 "didFinishIconRepositionForTesting", |
396 &ChromePluginPlaceholder::DidFinishIconRepositionForTestingCallback); | 390 &ChromePluginPlaceholder::DidFinishIconRepositionForTestingCallback); |
397 } | 391 } |
398 | 392 |
399 return builder; | 393 return builder; |
400 } | 394 } |
OLD | NEW |