| Index: extensions/renderer/guest_view/mime_handler_view_container.cc
|
| diff --git a/extensions/renderer/guest_view/mime_handler_view_container.cc b/extensions/renderer/guest_view/mime_handler_view_container.cc
|
| index ce2868ccdf10d87caf3108ebc83c0523c2e6834f..592ffed2ffcee589c08b3148da28f547e8fab549 100644
|
| --- a/extensions/renderer/guest_view/mime_handler_view_container.cc
|
| +++ b/extensions/renderer/guest_view/mime_handler_view_container.cc
|
| @@ -7,29 +7,49 @@
|
| #include "content/public/renderer/render_frame.h"
|
| #include "extensions/common/extension_messages.h"
|
| #include "extensions/common/guest_view/guest_view_constants.h"
|
| +#include "third_party/WebKit/public/web/WebDocument.h"
|
| +#include "third_party/WebKit/public/web/WebLocalFrame.h"
|
|
|
| namespace extensions {
|
|
|
| MimeHandlerViewContainer::MimeHandlerViewContainer(
|
| content::RenderFrame* render_frame,
|
| - const std::string& mime_type)
|
| + const std::string& mime_type,
|
| + const GURL& original_url)
|
| : GuestViewContainer(render_frame),
|
| - mime_type_(mime_type) {
|
| + mime_type_(mime_type),
|
| + original_url_(original_url) {
|
| DCHECK(!mime_type_.empty());
|
| + is_embedded_ = !render_frame->GetWebFrame()->document().isPluginDocument();
|
| }
|
|
|
| -MimeHandlerViewContainer::~MimeHandlerViewContainer() {}
|
| +MimeHandlerViewContainer::~MimeHandlerViewContainer() {
|
| + if (loader_)
|
| + loader_->cancel();
|
| +}
|
|
|
| void MimeHandlerViewContainer::DidFinishLoading() {
|
| - DCHECK_NE(element_instance_id(), guestview::kInstanceIDNone);
|
| - render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest(
|
| - routing_id(), html_string_, mime_type_, element_instance_id()));
|
| + DCHECK(!is_embedded_);
|
| + CreateMimeHandlerViewGuest();
|
| }
|
|
|
| void MimeHandlerViewContainer::DidReceiveData(const char* data,
|
| int data_length) {
|
| - std::string value(data, data_length);
|
| - html_string_ += value;
|
| + html_string_ += std::string(data, data_length);
|
| +}
|
| +
|
| +void MimeHandlerViewContainer::Ready() {
|
| + blink::WebFrame* frame = render_frame()->GetWebFrame();
|
| + blink::WebURLLoaderOptions options;
|
| + // The embedded plugin is allowed to be cross-origin.
|
| + options.crossOriginRequestPolicy =
|
| + blink::WebURLLoaderOptions::CrossOriginRequestPolicyAllow;
|
| + DCHECK(!loader_);
|
| + loader_.reset(frame->createAssociatedURLLoader());
|
| +
|
| + // TODO(raymes): Currently this URL request won't be correctly intercepted as
|
| + // a stream.
|
| + loader_->loadAsynchronously(blink::WebURLRequest(original_url_), this);
|
| }
|
|
|
| bool MimeHandlerViewContainer::HandlesMessage(const IPC::Message& message) {
|
| @@ -46,6 +66,21 @@ bool MimeHandlerViewContainer::OnMessage(const IPC::Message& message) {
|
| return handled;
|
| }
|
|
|
| +void MimeHandlerViewContainer::didReceiveData(blink::WebURLLoader* /* unused */,
|
| + const char* data,
|
| + int data_length,
|
| + int /* unused */) {
|
| + html_string_ += std::string(data, data_length);
|
| +}
|
| +
|
| +void MimeHandlerViewContainer::didFinishLoading(
|
| + blink::WebURLLoader* /* unused */,
|
| + double /* unused */,
|
| + int64_t /* unused */) {
|
| + DCHECK(is_embedded_);
|
| + CreateMimeHandlerViewGuest();
|
| +}
|
| +
|
| void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK(
|
| int element_instance_id) {
|
| DCHECK_NE(this->element_instance_id(), guestview::kInstanceIDNone);
|
| @@ -53,4 +88,16 @@ void MimeHandlerViewContainer::OnCreateMimeHandlerViewGuestACK(
|
| render_frame()->AttachGuest(element_instance_id);
|
| }
|
|
|
| +void MimeHandlerViewContainer::CreateMimeHandlerViewGuest() {
|
| + // The loader has completed loading |html_string_| so we can dispose it.
|
| + loader_.reset();
|
| +
|
| + // Parse the stream URL to ensure it's valid.
|
| + GURL stream_url(html_string_);
|
| +
|
| + DCHECK_NE(element_instance_id(), guestview::kInstanceIDNone);
|
| + render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest(
|
| + routing_id(), stream_url.spec(), mime_type_, element_instance_id()));
|
| +}
|
| +
|
| } // namespace extensions
|
|
|