Chromium Code Reviews| Index: components/plugins/renderer/webview_plugin.cc |
| diff --git a/components/plugins/renderer/webview_plugin.cc b/components/plugins/renderer/webview_plugin.cc |
| index 8d45c4201aed4e7b9429fc053c946a038c98455f..aa8bdcb60787874e46b7cbbb12f3dad864ee4ddb 100644 |
| --- a/components/plugins/renderer/webview_plugin.cc |
| +++ b/components/plugins/renderer/webview_plugin.cc |
| @@ -53,21 +53,12 @@ WebViewPlugin::WebViewPlugin(content::RenderView* render_view, |
| : content::RenderViewObserver(render_view), |
| delegate_(delegate), |
| container_(nullptr), |
| - web_view_(WebView::create(this, blink::WebPageVisibilityStateVisible)), |
| + finished_loading_(false), |
| focused_(false), |
| is_painting_(false), |
| is_resizing_(false), |
| - web_frame_client_(this), |
| + web_view_helper_(this, preferences), |
| weak_factory_(this) { |
| - // ApplyWebPreferences before making a WebLocalFrame so that the frame sees a |
| - // consistent view of our preferences. |
| - content::RenderView::ApplyWebPreferences(preferences, web_view_); |
| - WebLocalFrame* web_frame = WebLocalFrame::create( |
| - blink::WebTreeScopeType::Document, &web_frame_client_); |
| - web_view_->setMainFrame(web_frame); |
| - // TODO(dcheng): The main frame widget currently has a special case. |
| - // Eliminate this once WebView is no longer a WebWidget. |
| - WebFrameWidget::create(this, web_view_, web_frame); |
| } |
| // static |
| @@ -84,7 +75,29 @@ WebViewPlugin* WebViewPlugin::Create(content::RenderView* render_view, |
| WebViewPlugin::~WebViewPlugin() { |
| DCHECK(!weak_factory_.HasWeakPtrs()); |
| - web_view_->close(); |
| +} |
| + |
| +void WebViewPlugin::ReplayReceivedData(WebPlugin* plugin) { |
| + if (!response_.isNull()) { |
| + plugin->didReceiveResponse(response_); |
| + size_t total_bytes = 0; |
| + for (std::list<std::string>::iterator it = data_.begin(); it != data_.end(); |
| + ++it) { |
| + plugin->didReceiveData( |
| + it->c_str(), base::checked_cast<int>(it->length())); |
| + total_bytes += it->length(); |
| + } |
| + } |
| + // We need to transfer the |focused_| to new plugin after it loaded. |
| + if (focused_) { |
|
Bernhard Bauer
2017/01/03 17:01:33
Nit: It looks like the style for single-line bodie
Nate Chapin
2017/01/03 20:04:26
Done. I had just reverted to what I had deleted, b
|
| + plugin->updateFocus(true, blink::WebFocusTypeNone); |
| + } |
| + if (finished_loading_) { |
| + plugin->didFinishLoading(); |
| + } |
| + if (error_) { |
| + plugin->didFailLoading(*error_); |
| + } |
| } |
| WebPluginContainer* WebViewPlugin::container() const { return container_; } |
| @@ -106,8 +119,8 @@ bool WebViewPlugin::initialize(WebPluginContainer* container) { |
| old_title_ = container_->element().getAttribute("title"); |
| // Propagate device scale and zoom level to inner webview. |
| - web_view_->setDeviceScaleFactor(container_->deviceScaleFactor()); |
| - web_view_->setZoomLevel( |
| + web_view()->setDeviceScaleFactor(container_->deviceScaleFactor()); |
| + web_view()->setZoomLevel( |
| blink::WebView::zoomFactorToZoomLevel(container_->pageZoomFactor())); |
| return true; |
| @@ -133,7 +146,7 @@ v8::Local<v8::Object> WebViewPlugin::v8ScriptableObject(v8::Isolate* isolate) { |
| } |
| void WebViewPlugin::updateAllLifecyclePhases() { |
| - web_view_->updateAllLifecyclePhases(); |
| + web_view()->updateAllLifecyclePhases(); |
| } |
| void WebViewPlugin::paint(WebCanvas* canvas, const WebRect& rect) { |
| @@ -155,7 +168,7 @@ void WebViewPlugin::paint(WebCanvas* canvas, const WebRect& rect) { |
| SkFloatToScalar(1.0 / container_->deviceScaleFactor()); |
| canvas->scale(inverse_scale, inverse_scale); |
| - web_view_->paint(canvas, paint_rect); |
| + web_view()->paint(canvas, paint_rect); |
| canvas->restore(); |
| } |
| @@ -172,7 +185,7 @@ void WebViewPlugin::updateGeometry(const WebRect& window_rect, |
| if (static_cast<gfx::Rect>(window_rect) != rect_) { |
| rect_ = window_rect; |
| - web_view_->resize(rect_.size()); |
| + web_view()->resize(rect_.size()); |
| } |
| // Plugin updates are forbidden during Blink layout. Therefore, |
| @@ -209,77 +222,102 @@ blink::WebInputEventResult WebViewPlugin::handleInputEvent( |
| return blink::WebInputEventResult::HandledSuppressed; |
| } |
| current_cursor_ = cursor; |
| - blink::WebInputEventResult handled = web_view_->handleInputEvent(event); |
| + blink::WebInputEventResult handled = web_view()->handleInputEvent(event); |
| cursor = current_cursor_; |
| return handled; |
| } |
| void WebViewPlugin::didReceiveResponse(const WebURLResponse& response) { |
| - NOTREACHED(); |
| + DCHECK(response_.isNull()); |
| + response_ = response; |
| } |
| void WebViewPlugin::didReceiveData(const char* data, int data_length) { |
| - NOTREACHED(); |
| + data_.push_back(std::string(data, data_length)); |
| } |
| void WebViewPlugin::didFinishLoading() { |
| - NOTREACHED(); |
| + DCHECK(!finished_loading_); |
| + finished_loading_ = true; |
| } |
| void WebViewPlugin::didFailLoading(const WebURLError& error) { |
| - NOTREACHED(); |
| + DCHECK(!error_.get()); |
| + error_.reset(new WebURLError(error)); |
| } |
| -bool WebViewPlugin::acceptsLoadDrops() { return false; } |
| +WebViewPlugin::WebViewHelper::WebViewHelper( |
| + WebViewPlugin* plugin, |
| + const WebPreferences& preferences) : plugin_(plugin) { |
| + // ApplyWebPreferences before making a WebLocalFrame so that the frame sees a |
|
Bernhard Bauer
2017/01/03 17:01:33
Nit: Move this comment right before the call to Ap
Nate Chapin
2017/01/03 20:04:26
Done.
|
| + // consistent view of our preferences. |
| + web_view_ = |
| + WebView::create(this, blink::WebPageVisibilityStateVisible); |
| + content::RenderView::ApplyWebPreferences(preferences, web_view_); |
| + WebLocalFrame* web_frame = WebLocalFrame::create( |
| + blink::WebTreeScopeType::Document, this); |
| + web_view_->setMainFrame(web_frame); |
| + // TODO(dcheng): The main frame widget currently has a special case. |
| + // Eliminate this once WebView is no longer a WebWidget. |
| + WebFrameWidget::create(this, web_view_, web_frame); |
| +} |
| + |
| +WebViewPlugin::WebViewHelper::~WebViewHelper() { |
| + web_view_->close(); |
| +} |
| -void WebViewPlugin::setToolTipText(const WebString& text, |
| - blink::WebTextDirection hint) { |
| - if (container_) |
| - container_->element().setAttribute("title", text); |
| +bool WebViewPlugin::WebViewHelper::acceptsLoadDrops() { return false; } |
| + |
| +void WebViewPlugin::WebViewHelper::setToolTipText( |
| + const WebString& text, |
| + blink::WebTextDirection hint) { |
| + if (plugin_->container_) |
| + plugin_->container_->element().setAttribute("title", text); |
| } |
| -void WebViewPlugin::startDragging(blink::WebReferrerPolicy, |
| - const WebDragData&, |
| - WebDragOperationsMask, |
| - const WebImage&, |
| - const WebPoint&) { |
| +void WebViewPlugin::WebViewHelper::startDragging(blink::WebReferrerPolicy, |
| + const WebDragData&, |
| + WebDragOperationsMask, |
| + const WebImage&, |
| + const WebPoint&) { |
| // Immediately stop dragging. |
| DCHECK(web_view_->mainFrame()->isWebLocalFrame()); |
| web_view_->mainFrame()->toWebLocalFrame()->frameWidget()-> |
| dragSourceSystemDragEnded(); |
| } |
| -bool WebViewPlugin::allowsBrokenNullLayerTreeView() const { |
| +bool WebViewPlugin::WebViewHelper::allowsBrokenNullLayerTreeView() const { |
| return true; |
| } |
| -void WebViewPlugin::didInvalidateRect(const WebRect& rect) { |
| - if (container_) |
| - container_->invalidateRect(rect); |
| +void WebViewPlugin::WebViewHelper::didInvalidateRect(const WebRect& rect) { |
| + if (plugin_->container_) |
| + plugin_->container_->invalidateRect(rect); |
| } |
| -void WebViewPlugin::didChangeCursor(const WebCursorInfo& cursor) { |
| - current_cursor_ = cursor; |
| +void WebViewPlugin::WebViewHelper::didChangeCursor( |
| + const WebCursorInfo& cursor) { |
| + plugin_->current_cursor_ = cursor; |
| } |
| -void WebViewPlugin::scheduleAnimation() { |
| +void WebViewPlugin::WebViewHelper::scheduleAnimation() { |
| // Resizes must be self-contained: any lifecycle updating must |
| // be triggerd from within the WebView or this WebViewPlugin. |
| // This is because this WebViewPlugin is contained in another |
| // Web View which may be in the middle of updating its lifecycle, |
| // but after layout is done, and it is illegal to dirty earlier |
| // lifecycle stages during later ones. |
| - if (is_resizing_) |
| + if (plugin_->is_resizing_) |
| return; |
| - if (container_) { |
| + if (plugin_->container_) { |
| // This should never happen; see also crbug.com/545039 for context. |
|
Bernhard Bauer
2017/01/03 17:01:33
https://crbug.com/545039 has been marked fixed; ca
Nate Chapin
2017/01/03 20:04:26
Double-checked with chrishtr, who added the commen
|
| - CHECK(!is_painting_); |
| - container_->scheduleAnimation(); |
| + CHECK(!plugin_->is_painting_); |
| + plugin_->container_->scheduleAnimation(); |
| } |
| } |
| -void WebViewPlugin::PluginWebFrameClient::didClearWindowObject( |
| +void WebViewPlugin::WebViewHelper::didClearWindowObject( |
| WebLocalFrame* frame) { |
| if (!plugin_->delegate_) |
| return; |
| @@ -296,11 +334,9 @@ void WebViewPlugin::PluginWebFrameClient::didClearWindowObject( |
| plugin_->delegate_->GetV8Handle(isolate)); |
| } |
| -void WebViewPlugin::OnDestruct() {} |
| - |
| void WebViewPlugin::OnZoomLevelChanged() { |
| if (container_) { |
| - web_view_->setZoomLevel( |
| + web_view()->setZoomLevel( |
| blink::WebView::zoomFactorToZoomLevel(container_->pageZoomFactor())); |
| } |
| } |
| @@ -317,5 +353,5 @@ void WebViewPlugin::UpdatePluginForNewGeometry( |
| // The delegate may have dirtied style and layout of the WebView. |
| // See for example the resizePoster function in plugin_poster.html. |
| // Run the lifecycle now so that it is clean. |
| - web_view_->updateAllLifecyclePhases(); |
| + web_view()->updateAllLifecyclePhases(); |
| } |