| Index: chrome/renderer/plugins/plugin_preroller.cc
|
| diff --git a/chrome/renderer/plugins/plugin_preroller.cc b/chrome/renderer/plugins/plugin_preroller.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..34d830f07aa2126f563f362dec66ae493a67fc28
|
| --- /dev/null
|
| +++ b/chrome/renderer/plugins/plugin_preroller.cc
|
| @@ -0,0 +1,88 @@
|
| +// Copyright 2015 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_preroller.h"
|
| +
|
| +#include "base/base64.h"
|
| +#include "chrome/grit/renderer_resources.h"
|
| +#include "chrome/renderer/plugins/chrome_plugin_placeholder.h"
|
| +#include "third_party/WebKit/public/platform/WebRect.h"
|
| +#include "third_party/WebKit/public/web/WebElement.h"
|
| +#include "third_party/WebKit/public/web/WebPlugin.h"
|
| +#include "third_party/WebKit/public/web/WebPluginContainer.h"
|
| +#include "ui/gfx/codec/png_codec.h"
|
| +
|
| +PluginPreroller::PluginPreroller(content::RenderFrame* render_frame,
|
| + blink::WebLocalFrame* frame,
|
| + const blink::WebPluginParams& params,
|
| + const content::WebPluginInfo& info,
|
| + const std::string& identifier,
|
| + const base::string16& name,
|
| + const base::string16& message,
|
| + blink::WebPlugin* plugin,
|
| + content::PluginInstanceThrottler* throttler)
|
| + : RenderFrameObserver(render_frame),
|
| + frame_(frame),
|
| + params_(params),
|
| + info_(info),
|
| + identifier_(identifier),
|
| + name_(name),
|
| + message_(message),
|
| + plugin_(plugin),
|
| + throttler_(throttler) {
|
| + DCHECK(plugin);
|
| + DCHECK(throttler);
|
| + throttler_->AddObserver(this);
|
| +}
|
| +
|
| +PluginPreroller::~PluginPreroller() {
|
| + if (throttler_)
|
| + throttler_->RemoveObserver(this);
|
| +}
|
| +
|
| +void PluginPreroller::OnKeyframeExtracted(const SkBitmap* bitmap) {
|
| + std::vector<unsigned char> png_data;
|
| + if (!gfx::PNGCodec::EncodeBGRASkBitmap(*bitmap, false, &png_data)) {
|
| + DLOG(ERROR) << "Provided keyframe could not be encoded as PNG.";
|
| + return;
|
| + }
|
| +
|
| + base::StringPiece png_as_string(reinterpret_cast<char*>(&png_data[0]),
|
| + png_data.size());
|
| +
|
| + std::string data_url_header = "data:image/png;base64,";
|
| + std::string data_url_body;
|
| + base::Base64Encode(png_as_string, &data_url_body);
|
| + keyframe_data_url_ = GURL(data_url_header + data_url_body);
|
| +}
|
| +
|
| +void PluginPreroller::OnThrottleStateChange() {
|
| + if (!throttler_->IsThrottled())
|
| + return;
|
| +
|
| + ChromePluginPlaceholder* placeholder =
|
| + ChromePluginPlaceholder::CreateBlockedPlugin(
|
| + render_frame(), frame_, params_, info_, identifier_, name_,
|
| + IDR_PLUGIN_POSTER_HTML, message_, keyframe_data_url_);
|
| + placeholder->SetPremadePlugin(plugin_, throttler_);
|
| + placeholder->set_power_saver_mode(
|
| + content::PluginPowerSaverMode::POWER_SAVER_MODE_PERIPHERAL_THROTTLED);
|
| + placeholder->set_allow_loading(true);
|
| +
|
| + blink::WebPluginContainer* container = plugin_->container();
|
| + container->setPlugin(placeholder->plugin());
|
| +
|
| + bool success = placeholder->plugin()->initialize(container);
|
| + DCHECK(success);
|
| +
|
| + container->invalidate();
|
| + container->reportGeometry();
|
| +
|
| + delete this;
|
| +}
|
| +
|
| +void PluginPreroller::OnThrottlerDestroyed() {
|
| + throttler_ = nullptr;
|
| + delete this;
|
| +}
|
|
|