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