14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "components/plugins/renderer/plugin_placeholder.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/bind.h" 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/bind_helpers.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/json/string_escape.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/strings/string_piece.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/strings/string_util.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/values.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/common/content_constants.h" 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/common/context_menu_params.h" 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/renderer/render_frame.h" 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/renderer/render_thread.h" 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h" 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h" 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginContainer.h" 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/WebKit/public/web/WebScriptSource.h" 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/re2/re2/re2.h" 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using content::RenderThread; 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using content::UserMetricsAction; 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebElement; 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFrame; 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebNode; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPlugin; 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPluginContainer; 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPluginParams; 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebScriptSource; 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLRequest; 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using webkit_glue::CppArgumentList; 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using webkit_glue::CppVariant; 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace plugins { 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PluginPlaceholder::PluginPlaceholder(content::RenderFrame* render_frame, 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebFrame* frame, 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const WebPluginParams& params, 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& html_data, 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GURL placeholderDataUrl) 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : content::RenderFrameObserver(render_frame), 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) frame_(frame), 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) plugin_params_(params), 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) plugin_(WebViewPlugin::Create(this, 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame->GetWebkitPreferences(), 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) html_data, 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) placeholderDataUrl)), 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) is_blocked_for_prerendering_(false), 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) allow_loading_(false), 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) hidden_(false), 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) finished_loading_(false) {} 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)PluginPlaceholder::~PluginPlaceholder() {} 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::BindWebFrame(WebFrame* frame) { 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BindToJavascript(frame, "plugin"); 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BindCallback( 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "load", 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&PluginPlaceholder::LoadCallback, base::Unretained(this))); 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BindCallback( 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "hide", 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&PluginPlaceholder::HideCallback, base::Unretained(this))); 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BindCallback("didFinishLoading", 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&PluginPlaceholder::DidFinishLoadingCallback, 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Unretained(this))); 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::ReplacePlugin(WebPlugin* new_plugin) { 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CHECK(plugin_); 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!new_plugin) return; 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebPluginContainer* container = plugin_->container(); 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Set the new plug-in on the container before initializing it. 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) container->setPlugin(new_plugin); 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Save the element in case the plug-in is removed from the page during 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // initialization. 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebElement element = container->element(); 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!new_plugin->initialize(container)) { 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We couldn't initialize the new plug-in. Restore the old one and abort. 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) container->setPlugin(plugin_); 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The plug-in has been removed from the page. Destroy the old plug-in 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // (which will destroy us). 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!element.pluginContainer()) { 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) plugin_->destroy(); 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // During initialization, the new plug-in might have replaced itself in turn 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // with another plug-in. Make sure not to use the passed in |new_plugin| after 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // this point. 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new_plugin = container->plugin(); 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) plugin_->RestoreTitleText(); 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) container->invalidate(); 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) container->reportGeometry(); 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) plugin_->ReplayReceivedData(new_plugin); 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) plugin_->destroy(); 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::HidePlugin() { 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) hidden_ = true; 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebPluginContainer* container = plugin_->container(); 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebElement element = container->element(); 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) element.setAttribute("style", "display: none;"); 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // If we have a width and height, search for a parent (often <div>) with the 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // same dimensions. If we find such a parent, hide that as well. 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // This makes much more uncovered page content usable (including clickable) 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // as opposed to merely visible. 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(cevans) -- it's a foul heurisitc but we're going to tolerate it for 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // now for these reasons: 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // 1) Makes the user experience better. 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // 2) Foulness is encapsulated within this single function. 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // 3) Confidence in no fasle positives. 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // 4) Seems to have a good / low false negative rate at this time. 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (element.hasAttribute("width") && element.hasAttribute("height")) { 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string width_str("width:[\\s]*"); 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) width_str += element.getAttribute("width").utf8().data(); 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (EndsWith(width_str, "px", false)) { 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) width_str = width_str.substr(0, width_str.length() - 2); 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TrimWhitespace(width_str, TRIM_TRAILING, &width_str); 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) width_str += "[\\s]*px"; 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string height_str("height:[\\s]*"); 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) height_str += element.getAttribute("height").utf8().data(); 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (EndsWith(height_str, "px", false)) { 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) height_str = height_str.substr(0, height_str.length() - 2); 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TrimWhitespace(height_str, TRIM_TRAILING, &height_str); 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) height_str += "[\\s]*px"; 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebNode parent = element; 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) while (!parent.parentNode().isNull()) { 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) parent = parent.parentNode(); 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!parent.isElementNode()) 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) continue; 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) element = parent.toConst<WebElement>(); 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (element.hasAttribute("style")) { 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string style_str = element.getAttribute("style").utf8(); 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (RE2::PartialMatch(style_str, width_str) && 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RE2::PartialMatch(style_str, height_str)) 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) element.setAttribute("style", "display: none;"); 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::WillDestroyPlugin() { delete this; } 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PluginPlaceholder::SetMessage(const base::string16& message) { 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) message_ = message; 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (finished_loading_) 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateMessage(); 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::UpdateMessage() { 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string script = 165d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) "window.setMessage(" + base::GetQuotedJSONString(message_) + ")"; 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) plugin_->web_view()->mainFrame()->executeScript( 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebScriptSource(ASCIIToUTF16(script))); 1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::ShowContextMenu(const WebMouseEvent& event) { 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Does nothing by default. Will be overridden if a specific browser wants 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // a context menu. 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::OnLoadBlockedPlugins(const std::string& identifier) { 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!identifier.empty() && identifier != identifier_) 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderThread::Get()->RecordAction(UserMetricsAction("Plugin_Load_UI")); 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LoadPlugin(); 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::OnSetIsPrerendering(bool is_prerendering) { 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Prerendering can only be enabled prior to a RenderView's first navigation, 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // so no BlockedPlugin should see the notification that enables prerendering. 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(!is_prerendering); 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (is_blocked_for_prerendering_ && !is_prerendering) 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LoadPlugin(); 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::LoadPlugin() { 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // This is not strictly necessary but is an important defense in case the 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // event propagation changes between "close" vs. "click-to-play". 1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (hidden_) 1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!allow_loading_) { 1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NOTREACHED(); 1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(mmenke): In the case of prerendering, feed into 2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // ChromeContentRendererClient::CreatePlugin instead, to 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // reduce the chance of future regressions. 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebPlugin* plugin = 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame()->CreatePlugin(frame_, plugin_info_, plugin_params_); 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReplacePlugin(plugin); 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::LoadCallback(const CppArgumentList& args, 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CppVariant* result) { 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderThread::Get()->RecordAction(UserMetricsAction("Plugin_Load_Click")); 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LoadPlugin(); 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::HideCallback(const CppArgumentList& args, 2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CppVariant* result) { 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderThread::Get()->RecordAction(UserMetricsAction("Plugin_Hide_Click")); 2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) HidePlugin(); 2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::DidFinishLoadingCallback(const CppArgumentList& args, 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CppVariant* result) { 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) finished_loading_ = true; 2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (message_.length() > 0) 2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateMessage(); 2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::SetPluginInfo( 2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const content::WebPluginInfo& plugin_info) { 2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) plugin_info_ = plugin_info; 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const content::WebPluginInfo& PluginPlaceholder::GetPluginInfo() const { 2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return plugin_info_; 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PluginPlaceholder::SetIdentifier(const std::string& identifier) { 2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) identifier_ = identifier; 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebFrame* PluginPlaceholder::GetFrame() { return frame_; } 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const blink::WebPluginParams& PluginPlaceholder::GetPluginParams() const { 2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return plugin_params_; 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace plugins 249