// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/renderer/plugins/plugin_placeholder.h" #include "base/string_util.h" #include "chrome/renderer/plugins/plugin_uma.h" #include "content/public/renderer/render_view.h" #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebData.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebRegularExpression.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCaseSensitivity.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" using WebKit::WebElement; using WebKit::WebFrame; using WebKit::WebMouseEvent; using WebKit::WebNode; using WebKit::WebPlugin; using WebKit::WebPluginContainer; using WebKit::WebPluginParams; using WebKit::WebRegularExpression; using WebKit::WebString; using webkit::WebPluginInfo; using webkit::WebViewPlugin; static const char* const kPluginPlaceholderDataURL = "chrome://pluginplaceholderdata/"; PluginPlaceholder::PluginPlaceholder(content::RenderView* render_view, WebFrame* frame, const WebPluginParams& params, const std::string& html_data) : content::RenderViewObserver(render_view), frame_(frame), plugin_params_(params), plugin_(WebViewPlugin::Create( this, render_view->GetWebkitPreferences(), html_data, GURL(kPluginPlaceholderDataURL))) { } PluginPlaceholder::~PluginPlaceholder() { } void PluginPlaceholder::BindWebFrame(WebFrame* frame) { BindToJavascript(frame, "plugin"); } void PluginPlaceholder::LoadPluginInternal(const WebPluginInfo& plugin_info) { CHECK(plugin_); WebPluginContainer* container = plugin_->container(); WebPlugin* new_plugin = render_view()->CreatePlugin(frame_, plugin_info, plugin_params_); if (new_plugin && new_plugin->initialize(container)) { plugin_->RestoreTitleText(); container->setPlugin(new_plugin); container->invalidate(); container->reportGeometry(); plugin_->ReplayReceivedData(new_plugin); plugin_->destroy(); } else { MissingPluginReporter::GetInstance()->ReportPluginMissing( plugin_params_.mimeType.utf8(), plugin_params_.url); } } void PluginPlaceholder::HidePluginInternal() { WebPluginContainer* container = plugin_->container(); WebElement element = container->element(); element.setAttribute("style", "display: none;"); // If we have a width and height, search for a parent (often