Chromium Code Reviews| Index: mojo/examples/html_viewer/html_document_view.cc |
| diff --git a/mojo/examples/html_viewer/html_document_view.cc b/mojo/examples/html_viewer/html_document_view.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..64795778f2e787cc89d09e8f1041320dd9193baf |
| --- /dev/null |
| +++ b/mojo/examples/html_viewer/html_document_view.cc |
| @@ -0,0 +1,135 @@ |
| +// Copyright 2014 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 "mojo/examples/html_viewer/html_document_view.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/location.h" |
| +#include "base/single_thread_task_runner.h" |
| +#include "base/thread_task_runner_handle.h" |
| +#include "mojo/services/public/cpp/view_manager/node.h" |
| +#include "mojo/services/public/cpp/view_manager/view.h" |
| +#include "skia/ext/refptr.h" |
| +#include "third_party/WebKit/public/web/WebConsoleMessage.h" |
| +#include "third_party/WebKit/public/web/WebDocument.h" |
| +#include "third_party/WebKit/public/web/WebElement.h" |
| +#include "third_party/WebKit/public/web/WebLocalFrame.h" |
| +#include "third_party/WebKit/public/web/WebScriptSource.h" |
| +#include "third_party/WebKit/public/web/WebSettings.h" |
| +#include "third_party/WebKit/public/web/WebView.h" |
| +#include "third_party/skia/include/core/SkCanvas.h" |
| +#include "third_party/skia/include/core/SkColor.h" |
| +#include "third_party/skia/include/core/SkDevice.h" |
| + |
| +namespace mojo { |
| +namespace examples { |
| +namespace { |
| + |
| +blink::WebData CopyToWebData(DataPipeConsumerHandle handle) { |
| + std::vector<char> data; |
| + for (;;) { |
| + char buf[4096]; |
| + uint32_t num_bytes = sizeof(buf); |
| + MojoResult result = ReadDataRaw( |
| + handle, |
| + buf, |
| + &num_bytes, |
| + MOJO_READ_DATA_FLAG_NONE); |
| + if (result == MOJO_RESULT_SHOULD_WAIT) { |
| + Wait(handle, |
| + MOJO_HANDLE_SIGNAL_READABLE, |
| + MOJO_DEADLINE_INDEFINITE); |
| + } else if (result == MOJO_RESULT_OK) { |
| + data.insert(data.end(), buf, buf + num_bytes); |
| + } else { |
| + break; |
| + } |
| + } |
| + return blink::WebData(data); |
| +} |
| + |
| +void ConfigureSettings(blink::WebSettings* settings) { |
| + settings->setAcceleratedCompositingEnabled(false); |
|
abarth-chromium
2014/06/20 14:44:31
We're on a path to deleting this mode. Can we bre
|
| + settings->setLoadsImagesAutomatically(true); |
| + settings->setJavaScriptEnabled(true); |
| +} |
| + |
| +} // namespace |
| + |
| +HTMLDocumentView::HTMLDocumentView(view_manager::ViewManager* view_manager) |
| + : view_manager_(view_manager), |
| + view_(view_manager::View::Create(view_manager_)), |
| + web_view_(NULL), |
| + repaint_pending_(false), |
| + weak_factory_(this) { |
| +} |
| + |
| +HTMLDocumentView::~HTMLDocumentView() { |
| + if (web_view_) |
| + web_view_->close(); |
| +} |
| + |
| +void HTMLDocumentView::AttachToNode(view_manager::Node* node) { |
| + node->SetActiveView(view_); |
| + view_->SetColor(SK_ColorCYAN); // Dummy background color. |
| + |
| + web_view_ = blink::WebView::create(this); |
| + ConfigureSettings(web_view_->settings()); |
| + web_view_->setMainFrame(blink::WebLocalFrame::create(this)); |
| + |
| + // TODO(darin): Track size of view_manager::Node. |
| + web_view_->resize(gfx::Size(800, 600)); |
| +} |
| + |
| +void HTMLDocumentView::Load(URLResponsePtr response, |
| + ScopedDataPipeConsumerHandle response_body_stream) { |
| + DCHECK(web_view_); |
| + |
| + // TODO(darin): A better solution would be to use loadRequest, but intercept |
| + // the network request and connect it to the response we already have. |
| + blink::WebData data = CopyToWebData(response_body_stream.get()); |
| + web_view_->mainFrame()->loadHTMLString( |
| + data, GURL(response->url), GURL(response->url)); |
| +} |
| + |
| +void HTMLDocumentView::didInvalidateRect(const blink::WebRect& rect) { |
| + if (!repaint_pending_) { |
| + repaint_pending_ = true; |
| + base::ThreadTaskRunnerHandle::Get()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&HTMLDocumentView::Repaint, weak_factory_.GetWeakPtr())); |
| + } |
| +} |
| + |
| +bool HTMLDocumentView::allowsBrokenNullLayerTreeView() const { |
| + return true; // TODO(darin): Switch to using compositor. |
| +} |
| + |
| +void HTMLDocumentView::didAddMessageToConsole( |
| + const blink::WebConsoleMessage& message, |
| + const blink::WebString& source_name, |
| + unsigned source_line, |
| + const blink::WebString& stack_trace) { |
| + printf("### console: %s\n", std::string(message.text.utf8()).c_str()); |
| +} |
| + |
| +void HTMLDocumentView::Repaint() { |
| + repaint_pending_ = false; |
| + |
| + web_view_->animate(0.0); |
| + web_view_->layout(); |
| + |
| + int width = web_view_->size().width; |
| + int height = web_view_->size().height; |
| + |
| + skia::RefPtr<SkCanvas> canvas = skia::AdoptRef(SkCanvas::NewRaster( |
| + SkImageInfo::MakeN32(width, height, kOpaque_SkAlphaType))); |
| + |
| + web_view_->paint(canvas.get(), gfx::Rect(0, 0, width, height)); |
| + |
| + view_->SetContents(canvas->getDevice()->accessBitmap(false)); |
| +} |
| + |
| +} // namespace examples |
| +} // namespace mojo |