summaryrefslogtreecommitdiff
path: root/chromium/content/renderer/render_frame_impl.cc
diff options
context:
space:
mode:
authorAndras Becsi <andras.becsi@digia.com>2014-03-18 13:16:26 +0100
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2014-03-20 15:55:39 +0100
commit3f0f86b0caed75241fa71c95a5d73bc0164348c5 (patch)
tree92b9fb00f2e9e90b0be2262093876d4f43b6cd13 /chromium/content/renderer/render_frame_impl.cc
parente90d7c4b152c56919d963987e2503f9909a666d2 (diff)
downloadqtwebengine-chromium-3f0f86b0caed75241fa71c95a5d73bc0164348c5.tar.gz
Update to new stable branch 1750
This also includes an updated ninja and chromium dependencies needed on Windows. Change-Id: Icd597d80ed3fa4425933c9f1334c3c2e31291c42 Reviewed-by: Zoltan Arvai <zarvai@inf.u-szeged.hu> Reviewed-by: Zeno Albisser <zeno.albisser@digia.com>
Diffstat (limited to 'chromium/content/renderer/render_frame_impl.cc')
-rw-r--r--chromium/content/renderer/render_frame_impl.cc882
1 files changed, 692 insertions, 190 deletions
diff --git a/chromium/content/renderer/render_frame_impl.cc b/chromium/content/renderer/render_frame_impl.cc
index 2cec72d37c3..2d9628e41b9 100644
--- a/chromium/content/renderer/render_frame_impl.cc
+++ b/chromium/content/renderer/render_frame_impl.cc
@@ -4,12 +4,19 @@
#include "content/renderer/render_frame_impl.h"
+#include <map>
+#include <string>
+
#include "base/command_line.h"
+#include "base/i18n/char_iterator.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "content/child/appcache/appcache_dispatcher.h"
+#include "content/child/plugin_messages.h"
#include "content/child/quota_dispatcher.h"
#include "content/child/request_extra_data.h"
+#include "content/child/service_worker/web_service_worker_provider_impl.h"
+#include "content/common/frame_messages.h"
#include "content/common/socket_stream_handle_data.h"
#include "content/common/swapped_out_messages.h"
#include "content/common/view_messages.h"
@@ -19,15 +26,20 @@
#include "content/public/renderer/content_renderer_client.h"
#include "content/public/renderer/document_state.h"
#include "content/public/renderer/navigation_state.h"
+#include "content/public/renderer/render_frame_observer.h"
+#include "content/renderer/accessibility/renderer_accessibility.h"
#include "content/renderer/browser_plugin/browser_plugin.h"
#include "content/renderer/browser_plugin/browser_plugin_manager.h"
#include "content/renderer/internal_document_state_data.h"
+#include "content/renderer/npapi/plugin_channel_host.h"
#include "content/renderer/render_thread_impl.h"
#include "content/renderer/render_view_impl.h"
+#include "content/renderer/render_widget_fullscreen_pepper.h"
#include "content/renderer/renderer_webapplicationcachehost_impl.h"
#include "content/renderer/websharedworker_proxy.h"
#include "net/base/net_errors.h"
#include "net/http/http_util.h"
+#include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h"
#include "third_party/WebKit/public/platform/WebString.h"
#include "third_party/WebKit/public/platform/WebURL.h"
#include "third_party/WebKit/public/platform/WebURLError.h"
@@ -40,38 +52,53 @@
#include "third_party/WebKit/public/web/WebPluginParams.h"
#include "third_party/WebKit/public/web/WebSearchableFormData.h"
#include "third_party/WebKit/public/web/WebSecurityOrigin.h"
-#include "third_party/WebKit/public/web/WebStorageQuotaCallbacks.h"
#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
#include "third_party/WebKit/public/web/WebView.h"
#include "webkit/child/weburlresponse_extradata_impl.h"
+#if defined(ENABLE_PLUGINS)
+#include "content/renderer/npapi/webplugin_impl.h"
+#include "content/renderer/pepper/pepper_browser_connection.h"
+#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
+#include "content/renderer/pepper/pepper_webplugin_impl.h"
+#include "content/renderer/pepper/plugin_module.h"
+#endif
+
#if defined(ENABLE_WEBRTC)
#include "content/renderer/media/rtc_peer_connection_handler.h"
#endif
-using WebKit::WebDataSource;
-using WebKit::WebDocument;
-using WebKit::WebFrame;
-using WebKit::WebNavigationPolicy;
-using WebKit::WebPluginParams;
-using WebKit::WebReferrerPolicy;
-using WebKit::WebSearchableFormData;
-using WebKit::WebSecurityOrigin;
-using WebKit::WebStorageQuotaCallbacks;
-using WebKit::WebString;
-using WebKit::WebURL;
-using WebKit::WebURLError;
-using WebKit::WebURLRequest;
-using WebKit::WebURLResponse;
-using WebKit::WebUserGestureIndicator;
-using WebKit::WebVector;
-using WebKit::WebView;
+using blink::WebDataSource;
+using blink::WebDocument;
+using blink::WebFrame;
+using blink::WebNavigationPolicy;
+using blink::WebPluginParams;
+using blink::WebReferrerPolicy;
+using blink::WebSearchableFormData;
+using blink::WebSecurityOrigin;
+using blink::WebServiceWorkerProvider;
+using blink::WebStorageQuotaCallbacks;
+using blink::WebString;
+using blink::WebURL;
+using blink::WebURLError;
+using blink::WebURLRequest;
+using blink::WebURLResponse;
+using blink::WebUserGestureIndicator;
+using blink::WebVector;
+using blink::WebView;
using base::Time;
using base::TimeDelta;
using webkit_glue::WebURLResponseExtraDataImpl;
namespace content {
+namespace {
+
+typedef std::map<blink::WebFrame*, RenderFrameImpl*> FrameMap;
+base::LazyInstance<FrameMap> g_child_frame_map = LAZY_INSTANCE_INITIALIZER;
+
+} // namespace
+
static RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) =
NULL;
@@ -80,13 +107,10 @@ RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view,
int32 routing_id) {
DCHECK(routing_id != MSG_ROUTING_NONE);
- RenderFrameImpl* render_frame = NULL;
if (g_create_render_frame_impl)
- render_frame = g_create_render_frame_impl(render_view, routing_id);
+ return g_create_render_frame_impl(render_view, routing_id);
else
- render_frame = new RenderFrameImpl(render_view, routing_id);
-
- return render_frame;
+ return new RenderFrameImpl(render_view, routing_id);
}
// static
@@ -102,18 +126,318 @@ RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id)
routing_id_(routing_id),
is_swapped_out_(false),
is_detaching_(false) {
+ RenderThread::Get()->AddRoute(routing_id_, this);
+#if defined(ENABLE_PLUGINS)
+ new PepperBrowserConnection(this);
+#endif
+
+ GetContentClient()->renderer()->RenderFrameCreated(this);
}
RenderFrameImpl::~RenderFrameImpl() {
+ FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone());
+ FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct());
+ RenderThread::Get()->RemoveRoute(routing_id_);
}
-int RenderFrameImpl::GetRoutingID() const {
- return routing_id_;
+RenderWidget* RenderFrameImpl::GetRenderWidget() {
+ return render_view_;
+}
+
+#if defined(ENABLE_PLUGINS)
+void RenderFrameImpl::PepperPluginCreated(RendererPpapiHost* host) {
+ FOR_EACH_OBSERVER(RenderFrameObserver, observers_,
+ DidCreatePepperPlugin(host));
+}
+
+void RenderFrameImpl::PepperInstanceCreated(
+ PepperPluginInstanceImpl* instance) {
+ active_pepper_instances_.insert(instance);
+}
+
+void RenderFrameImpl::PepperInstanceDeleted(
+ PepperPluginInstanceImpl* instance) {
+ active_pepper_instances_.erase(instance);
+
+ if (render_view_->pepper_last_mouse_event_target() == instance)
+ render_view_->set_pepper_last_mouse_event_target(NULL);
+ if (render_view_->focused_pepper_plugin() == instance)
+ PepperFocusChanged(instance, false);
+}
+
+void RenderFrameImpl::PepperDidChangeCursor(
+ PepperPluginInstanceImpl* instance,
+ const blink::WebCursorInfo& cursor) {
+ // Update the cursor appearance immediately if the requesting plugin is the
+ // one which receives the last mouse event. Otherwise, the new cursor won't be
+ // picked up until the plugin gets the next input event. That is bad if, e.g.,
+ // the plugin would like to set an invisible cursor when there isn't any user
+ // input for a while.
+ if (instance == render_view_->pepper_last_mouse_event_target())
+ GetRenderWidget()->didChangeCursor(cursor);
+}
+
+void RenderFrameImpl::PepperDidReceiveMouseEvent(
+ PepperPluginInstanceImpl* instance) {
+ render_view_->set_pepper_last_mouse_event_target(instance);
+}
+
+void RenderFrameImpl::PepperFocusChanged(PepperPluginInstanceImpl* instance,
+ bool focused) {
+ if (focused)
+ render_view_->set_focused_pepper_plugin(instance);
+ else if (render_view_->focused_pepper_plugin() == instance)
+ render_view_->set_focused_pepper_plugin(NULL);
+
+ GetRenderWidget()->UpdateTextInputType();
+ GetRenderWidget()->UpdateSelectionBounds();
+}
+
+void RenderFrameImpl::PepperTextInputTypeChanged(
+ PepperPluginInstanceImpl* instance) {
+ if (instance != render_view_->focused_pepper_plugin())
+ return;
+
+ GetRenderWidget()->UpdateTextInputType();
+ if (render_view_->renderer_accessibility()) {
+ render_view_->renderer_accessibility()->FocusedNodeChanged(
+ blink::WebNode());
+ }
+}
+
+void RenderFrameImpl::PepperCaretPositionChanged(
+ PepperPluginInstanceImpl* instance) {
+ if (instance != render_view_->focused_pepper_plugin())
+ return;
+ GetRenderWidget()->UpdateSelectionBounds();
+}
+
+void RenderFrameImpl::PepperCancelComposition(
+ PepperPluginInstanceImpl* instance) {
+ if (instance != render_view_->focused_pepper_plugin())
+ return;
+ Send(new ViewHostMsg_ImeCancelComposition(render_view_->GetRoutingID()));;
+#if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_AURA)
+ GetRenderWidget()->UpdateCompositionInfo(true);
+#endif
+}
+
+void RenderFrameImpl::PepperSelectionChanged(
+ PepperPluginInstanceImpl* instance) {
+ if (instance != render_view_->focused_pepper_plugin())
+ return;
+ render_view_->SyncSelectionIfRequired();
+}
+
+RenderWidgetFullscreenPepper* RenderFrameImpl::CreatePepperFullscreenContainer(
+ PepperPluginInstanceImpl* plugin) {
+ GURL active_url;
+ if (render_view_->webview() && render_view_->webview()->mainFrame())
+ active_url = GURL(render_view_->webview()->mainFrame()->document().url());
+ RenderWidgetFullscreenPepper* widget = RenderWidgetFullscreenPepper::Create(
+ GetRenderWidget()->routing_id(), plugin, active_url,
+ GetRenderWidget()->screenInfo());
+ widget->show(blink::WebNavigationPolicyIgnore);
+ return widget;
+}
+
+bool RenderFrameImpl::IsPepperAcceptingCompositionEvents() const {
+ if (!render_view_->focused_pepper_plugin())
+ return false;
+ return render_view_->focused_pepper_plugin()->
+ IsPluginAcceptingCompositionEvents();
+}
+
+void RenderFrameImpl::PluginCrashed(const base::FilePath& plugin_path,
+ base::ProcessId plugin_pid) {
+ // TODO(jam): dispatch this IPC in RenderFrameHost and switch to use
+ // routing_id_ as a result.
+ Send(new FrameHostMsg_PluginCrashed(routing_id_, plugin_path, plugin_pid));
+}
+
+void RenderFrameImpl::DidInitiatePaint() {
+ // Notify all instances that we painted. The same caveats apply as for
+ // ViewFlushedPaint regarding instances closing themselves, so we take
+ // similar precautions.
+ PepperPluginSet plugins = active_pepper_instances_;
+ for (PepperPluginSet::iterator i = plugins.begin(); i != plugins.end(); ++i) {
+ if (active_pepper_instances_.find(*i) != active_pepper_instances_.end())
+ (*i)->ViewInitiatedPaint();
+ }
+}
+
+void RenderFrameImpl::DidFlushPaint() {
+ // Notify all instances that we flushed. This will call into the plugin, and
+ // we it may ask to close itself as a result. This will, in turn, modify our
+ // set, possibly invalidating the iterator. So we iterate on a copy that
+ // won't change out from under us.
+ PepperPluginSet plugins = active_pepper_instances_;
+ for (PepperPluginSet::iterator i = plugins.begin(); i != plugins.end(); ++i) {
+ // The copy above makes sure our iterator is never invalid if some plugins
+ // are destroyed. But some plugin may decide to close all of its views in
+ // response to a paint in one of them, so we need to make sure each one is
+ // still "current" before using it.
+ //
+ // It's possible that a plugin was destroyed, but another one was created
+ // with the same address. In this case, we'll call ViewFlushedPaint on that
+ // new plugin. But that's OK for this particular case since we're just
+ // notifying all of our instances that the view flushed, and the new one is
+ // one of our instances.
+ //
+ // What about the case where a new one is created in a callback at a new
+ // address and we don't issue the callback? We're still OK since this
+ // callback is used for flush callbacks and we could not have possibly
+ // started a new paint for the new plugin while processing a previous paint
+ // for an existing one.
+ if (active_pepper_instances_.find(*i) != active_pepper_instances_.end())
+ (*i)->ViewFlushedPaint();
+ }
+}
+
+PepperPluginInstanceImpl* RenderFrameImpl::GetBitmapForOptimizedPluginPaint(
+ const gfx::Rect& paint_bounds,
+ TransportDIB** dib,
+ gfx::Rect* location,
+ gfx::Rect* clip,
+ float* scale_factor) {
+ for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
+ i != active_pepper_instances_.end(); ++i) {
+ PepperPluginInstanceImpl* instance = *i;
+ // In Flash fullscreen , the plugin contents should be painted onto the
+ // fullscreen widget instead of the web page.
+ if (!instance->FlashIsFullscreenOrPending() &&
+ instance->GetBitmapForOptimizedPluginPaint(paint_bounds, dib, location,
+ clip, scale_factor))
+ return *i;
+ }
+ return NULL;
+}
+
+void RenderFrameImpl::PageVisibilityChanged(bool shown) {
+ // Inform PPAPI plugins that their page is no longer visible.
+ for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
+ i != active_pepper_instances_.end(); ++i)
+ (*i)->PageVisibilityChanged(shown);
+}
+
+void RenderFrameImpl::OnSetFocus(bool enable) {
+ // Notify all Pepper plugins.
+ for (PepperPluginSet::iterator i = active_pepper_instances_.begin();
+ i != active_pepper_instances_.end(); ++i)
+ (*i)->SetContentAreaFocus(enable);
+}
+
+void RenderFrameImpl::WillHandleMouseEvent(const blink::WebMouseEvent& event) {
+ // This method is called for every mouse event that the render view receives.
+ // And then the mouse event is forwarded to WebKit, which dispatches it to the
+ // event target. Potentially a Pepper plugin will receive the event.
+ // In order to tell whether a plugin gets the last mouse event and which it
+ // is, we set |pepper_last_mouse_event_target_| to NULL here. If a plugin gets
+ // the event, it will notify us via DidReceiveMouseEvent() and set itself as
+ // |pepper_last_mouse_event_target_|.
+ render_view_->set_pepper_last_mouse_event_target(NULL);
}
+void RenderFrameImpl::SimulateImeSetComposition(
+ const base::string16& text,
+ const std::vector<blink::WebCompositionUnderline>& underlines,
+ int selection_start,
+ int selection_end) {
+ render_view_->OnImeSetComposition(
+ text, underlines, selection_start, selection_end);
+}
+
+void RenderFrameImpl::SimulateImeConfirmComposition(
+ const base::string16& text,
+ const gfx::Range& replacement_range) {
+ render_view_->OnImeConfirmComposition(text, replacement_range, false);
+}
+
+
+void RenderFrameImpl::OnImeSetComposition(
+ const base::string16& text,
+ const std::vector<blink::WebCompositionUnderline>& underlines,
+ int selection_start,
+ int selection_end) {
+ // When a PPAPI plugin has focus, we bypass WebKit.
+ if (!IsPepperAcceptingCompositionEvents()) {
+ pepper_composition_text_ = text;
+ } else {
+ // TODO(kinaba) currently all composition events are sent directly to
+ // plugins. Use DOM event mechanism after WebKit is made aware about
+ // plugins that support composition.
+ // The code below mimics the behavior of WebCore::Editor::setComposition.
+
+ // Empty -> nonempty: composition started.
+ if (pepper_composition_text_.empty() && !text.empty()) {
+ render_view_->focused_pepper_plugin()->HandleCompositionStart(
+ base::string16());
+ }
+ // Nonempty -> empty: composition canceled.
+ if (!pepper_composition_text_.empty() && text.empty()) {
+ render_view_->focused_pepper_plugin()->HandleCompositionEnd(
+ base::string16());
+ }
+ pepper_composition_text_ = text;
+ // Nonempty: composition is ongoing.
+ if (!pepper_composition_text_.empty()) {
+ render_view_->focused_pepper_plugin()->HandleCompositionUpdate(
+ pepper_composition_text_, underlines, selection_start,
+ selection_end);
+ }
+ }
+}
+
+void RenderFrameImpl::OnImeConfirmComposition(
+ const base::string16& text,
+ const gfx::Range& replacement_range,
+ bool keep_selection) {
+ // When a PPAPI plugin has focus, we bypass WebKit.
+ // Here, text.empty() has a special meaning. It means to commit the last
+ // update of composition text (see
+ // RenderWidgetHost::ImeConfirmComposition()).
+ const base::string16& last_text = text.empty() ? pepper_composition_text_
+ : text;
+
+ // last_text is empty only when both text and pepper_composition_text_ is.
+ // Ignore it.
+ if (last_text.empty())
+ return;
+
+ if (!IsPepperAcceptingCompositionEvents()) {
+ base::i18n::UTF16CharIterator iterator(&last_text);
+ int32 i = 0;
+ while (iterator.Advance()) {
+ blink::WebKeyboardEvent char_event;
+ char_event.type = blink::WebInputEvent::Char;
+ char_event.timeStampSeconds = base::Time::Now().ToDoubleT();
+ char_event.modifiers = 0;
+ char_event.windowsKeyCode = last_text[i];
+ char_event.nativeKeyCode = last_text[i];
+
+ const int32 char_start = i;
+ for (; i < iterator.array_pos(); ++i) {
+ char_event.text[i - char_start] = last_text[i];
+ char_event.unmodifiedText[i - char_start] = last_text[i];
+ }
+
+ if (GetRenderWidget()->webwidget())
+ GetRenderWidget()->webwidget()->handleInputEvent(char_event);
+ }
+ } else {
+ // Mimics the order of events sent by WebKit.
+ // See WebCore::Editor::setComposition() for the corresponding code.
+ render_view_->focused_pepper_plugin()->HandleCompositionEnd(last_text);
+ render_view_->focused_pepper_plugin()->HandleTextInput(last_text);
+ }
+ pepper_composition_text_.clear();
+}
+
+#endif // ENABLE_PLUGINS
+
bool RenderFrameImpl::Send(IPC::Message* message) {
if (is_detaching_ ||
- (is_swapped_out_ &&
+ ((is_swapped_out_ || render_view_->is_swapped_out()) &&
!SwappedOutMessages::CanSendWhileSwappedOut(message))) {
delete message;
return false;
@@ -123,85 +447,121 @@ bool RenderFrameImpl::Send(IPC::Message* message) {
}
bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) {
+ ObserverListBase<RenderFrameObserver>::Iterator it(observers_);
+ RenderFrameObserver* observer;
+ while ((observer = it.GetNext()) != NULL) {
+ if (observer->OnMessageReceived(msg))
+ return true;
+ }
+
// TODO(ajwong): Fill in with message handlers as various components
// are migrated over to understand frames.
return false;
}
-// WebKit::WebFrameClient implementation -------------------------------------
+RenderView* RenderFrameImpl::GetRenderView() {
+ return render_view_;
+}
+
+int RenderFrameImpl::GetRoutingID() {
+ return routing_id_;
+}
+
+WebPreferences& RenderFrameImpl::GetWebkitPreferences() {
+ return render_view_->GetWebkitPreferences();
+}
+
+int RenderFrameImpl::ShowContextMenu(ContextMenuClient* client,
+ const ContextMenuParams& params) {
+ return render_view_->ShowContextMenu(client, params);
+}
+
+void RenderFrameImpl::CancelContextMenu(int request_id) {
+ return render_view_->CancelContextMenu(request_id);
+}
+
+blink::WebPlugin* RenderFrameImpl::CreatePlugin(
+ blink::WebFrame* frame,
+ const WebPluginInfo& info,
+ const blink::WebPluginParams& params) {
+#if defined(ENABLE_PLUGINS)
+ bool pepper_plugin_was_registered = false;
+ scoped_refptr<PluginModule> pepper_module(PluginModule::Create(
+ this, info, &pepper_plugin_was_registered));
+ if (pepper_plugin_was_registered) {
+ if (pepper_module.get()) {
+ // TODO(jam): change to take RenderFrame.
+ return new PepperWebPluginImpl(
+ pepper_module.get(), params, render_view_->AsWeakPtr(), this);
+ }
+ }
+#if defined(OS_CHROMEOS)
+ LOG(WARNING) << "Pepper module/plugin creation failed.";
+ return NULL;
+#else
+ // TODO(jam): change to take RenderFrame.
+ return new WebPluginImpl(frame, params, info.path, render_view_->AsWeakPtr(),
+ this);
+#endif
+#else
+ return NULL;
+#endif
+}
-WebKit::WebPlugin* RenderFrameImpl::createPlugin(
- WebKit::WebFrame* frame,
- const WebKit::WebPluginParams& params) {
- WebKit::WebPlugin* plugin = NULL;
+void RenderFrameImpl::LoadURLExternally(
+ blink::WebFrame* frame,
+ const blink::WebURLRequest& request,
+ blink::WebNavigationPolicy policy) {
+ loadURLExternally(frame, request, policy);
+}
+
+// blink::WebFrameClient implementation ----------------------------------------
+
+blink::WebPlugin* RenderFrameImpl::createPlugin(
+ blink::WebFrame* frame,
+ const blink::WebPluginParams& params) {
+ blink::WebPlugin* plugin = NULL;
if (GetContentClient()->renderer()->OverrideCreatePlugin(
- render_view_, frame, params, &plugin)) {
+ this, frame, params, &plugin)) {
return plugin;
}
-#if defined(ENABLE_PLUGINS)
if (UTF16ToASCII(params.mimeType) == kBrowserPluginMimeType) {
return render_view_->GetBrowserPluginManager()->CreateBrowserPlugin(
- render_view_, frame, params);
+ render_view_, frame);
}
+#if defined(ENABLE_PLUGINS)
WebPluginInfo info;
std::string mime_type;
- bool found = render_view_->GetPluginInfo(
- params.url, frame->top()->document().url(), params.mimeType.utf8(),
- &info, &mime_type);
+ bool found = false;
+ Send(new FrameHostMsg_GetPluginInfo(
+ routing_id_, params.url, frame->top()->document().url(),
+ params.mimeType.utf8(), &found, &info, &mime_type));
if (!found)
return NULL;
WebPluginParams params_to_use = params;
params_to_use.mimeType = WebString::fromUTF8(mime_type);
- return render_view_->CreatePlugin(frame, info, params_to_use);
+ return CreatePlugin(frame, info, params_to_use);
#else
return NULL;
#endif // defined(ENABLE_PLUGINS)
}
-WebKit::WebSharedWorker* RenderFrameImpl::createSharedWorker(
- WebKit::WebFrame* frame,
- const WebKit::WebURL& url,
- const WebKit::WebString& name,
- unsigned long long document_id) {
- int route_id = MSG_ROUTING_NONE;
- bool exists = false;
- bool url_mismatch = false;
- ViewHostMsg_CreateWorker_Params params;
- params.url = url;
- params.name = name;
- params.document_id = document_id;
- params.render_view_route_id = render_view_->GetRoutingID();
- params.route_id = MSG_ROUTING_NONE;
- params.script_resource_appcache_id = 0;
- render_view_->Send(new ViewHostMsg_LookupSharedWorker(
- params, &exists, &route_id, &url_mismatch));
- if (url_mismatch) {
- return NULL;
- } else {
- return new WebSharedWorkerProxy(RenderThreadImpl::current(),
- document_id,
- exists,
- route_id,
- render_view_->GetRoutingID());
- }
-}
-
-WebKit::WebMediaPlayer* RenderFrameImpl::createMediaPlayer(
- WebKit::WebFrame* frame,
- const WebKit::WebURL& url,
- WebKit::WebMediaPlayerClient* client) {
+blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer(
+ blink::WebFrame* frame,
+ const blink::WebURL& url,
+ blink::WebMediaPlayerClient* client) {
// TODO(nasko): Moving the implementation here involves moving a few media
// related client objects here or referencing them in the RenderView. Needs
// more work to understand where the proper place for those objects is.
- return render_view_->createMediaPlayer(frame, url, client);
+ return render_view_->CreateMediaPlayer(this, frame, url, client);
}
-WebKit::WebApplicationCacheHost* RenderFrameImpl::createApplicationCacheHost(
- WebKit::WebFrame* frame,
- WebKit::WebApplicationCacheHostClient* client) {
+blink::WebApplicationCacheHost* RenderFrameImpl::createApplicationCacheHost(
+ blink::WebFrame* frame,
+ blink::WebApplicationCacheHostClient* client) {
if (!frame || !frame->view())
return NULL;
return new RendererWebApplicationCacheHostImpl(
@@ -209,26 +569,75 @@ WebKit::WebApplicationCacheHost* RenderFrameImpl::createApplicationCacheHost(
RenderThreadImpl::current()->appcache_dispatcher()->backend_proxy());
}
-WebKit::WebCookieJar* RenderFrameImpl::cookieJar(WebKit::WebFrame* frame) {
+blink::WebWorkerPermissionClientProxy*
+RenderFrameImpl::createWorkerPermissionClientProxy(WebFrame* frame) {
+ if (!frame || !frame->view())
+ return NULL;
+ return GetContentClient()->renderer()->CreateWorkerPermissionClientProxy(
+ RenderViewImpl::FromWebView(frame->view()), frame);
+}
+
+blink::WebCookieJar* RenderFrameImpl::cookieJar(blink::WebFrame* frame) {
return render_view_->cookieJar(frame);
}
-void RenderFrameImpl::didAccessInitialDocument(WebKit::WebFrame* frame) {
+blink::WebServiceWorkerProvider* RenderFrameImpl::createServiceWorkerProvider(
+ blink::WebFrame* frame,
+ blink::WebServiceWorkerProviderClient* client) {
+ return new WebServiceWorkerProviderImpl(
+ ChildThread::current()->thread_safe_sender(),
+ make_scoped_ptr(client));
+}
+
+void RenderFrameImpl::didAccessInitialDocument(blink::WebFrame* frame) {
render_view_->didAccessInitialDocument(frame);
}
-void RenderFrameImpl::didCreateFrame(WebKit::WebFrame* parent,
- WebKit::WebFrame* child) {
- render_view_->Send(new ViewHostMsg_FrameAttached(
- render_view_->GetRoutingID(), parent->identifier(), child->identifier(),
- UTF16ToUTF8(child->assignedName())));
+blink::WebFrame* RenderFrameImpl::createChildFrame(
+ blink::WebFrame* parent,
+ const blink::WebString& name) {
+ RenderFrameImpl* child_render_frame = this;
+ long long child_frame_identifier = WebFrame::generateEmbedderIdentifier();
+ if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
+ // Synchronously notify the browser of a child frame creation to get the
+ // routing_id for the RenderFrame.
+ int routing_id;
+ Send(new FrameHostMsg_CreateChildFrame(routing_id_,
+ parent->identifier(),
+ child_frame_identifier,
+ UTF16ToUTF8(name),
+ &routing_id));
+ child_render_frame = RenderFrameImpl::Create(render_view_, routing_id);
+ }
+
+ blink::WebFrame* web_frame = WebFrame::create(child_render_frame,
+ child_frame_identifier);
+
+ if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
+ g_child_frame_map.Get().insert(
+ std::make_pair(web_frame, child_render_frame));
+ }
+
+ return web_frame;
}
-void RenderFrameImpl::didDisownOpener(WebKit::WebFrame* frame) {
+void RenderFrameImpl::didDisownOpener(blink::WebFrame* frame) {
render_view_->didDisownOpener(frame);
}
-void RenderFrameImpl::frameDetached(WebKit::WebFrame* frame) {
+void RenderFrameImpl::frameDetached(blink::WebFrame* frame) {
+ // NOTE: This function is called on the frame that is being detached and not
+ // the parent frame. This is different from createChildFrame() which is
+ // called on the parent frame.
+ CHECK(!is_detaching_);
+
+ int64 parent_frame_id = -1;
+ if (frame->parent())
+ parent_frame_id = frame->parent()->identifier();
+
+ Send(new FrameHostMsg_Detach(routing_id_, parent_frame_id,
+ frame->identifier()));
+
// Currently multiple WebCore::Frames can send frameDetached to a single
// RenderFrameImpl. This is legacy behavior from when RenderViewImpl served
// as a shared WebFrameClient for multiple Webcore::Frame objects. It also
@@ -236,32 +645,42 @@ void RenderFrameImpl::frameDetached(WebKit::WebFrame* frame) {
// even though one WebCore::Frame may have detached itself, others will
// still need to use this object.
if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
- // TODO(ajwong): Add CHECK(!is_detaching_) once we guarantee each
- // RenderFrameImpl is only used by one WebCore::Frame.
+ // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be
+ // sent before setting |is_detaching_| to true. In contrast, Observers
+ // should only be notified afterwards so they cannot call back into and
+ // have IPCs fired off.
is_detaching_ = true;
}
- int64 parent_frame_id = -1;
- if (frame->parent())
- parent_frame_id = frame->parent()->identifier();
-
- render_view_->Send(new ViewHostMsg_FrameDetached(render_view_->GetRoutingID(),
- parent_frame_id,
- frame->identifier()));
-
// Call back to RenderViewImpl for observers to be notified.
// TODO(nasko): Remove once we have RenderFrameObserver.
render_view_->frameDetached(frame);
+
+ frame->close();
+
+ if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
+ // If the frame does not have a parent, it is the main frame. The main
+ // frame is owned by the containing RenderViewHost so it does not require
+ // any cleanup here.
+ if (frame->parent()) {
+ FrameMap::iterator it = g_child_frame_map.Get().find(frame);
+ DCHECK(it != g_child_frame_map.Get().end());
+ DCHECK_EQ(it->second, this);
+ g_child_frame_map.Get().erase(it);
+ delete this;
+ // Object is invalid after this point.
+ }
+ }
}
-void RenderFrameImpl::willClose(WebKit::WebFrame* frame) {
+void RenderFrameImpl::willClose(blink::WebFrame* frame) {
// Call back to RenderViewImpl for observers to be notified.
// TODO(nasko): Remove once we have RenderFrameObserver.
render_view_->willClose(frame);
}
-void RenderFrameImpl::didChangeName(WebKit::WebFrame* frame,
- const WebKit::WebString& name) {
+void RenderFrameImpl::didChangeName(blink::WebFrame* frame,
+ const blink::WebString& name) {
if (!render_view_->renderer_preferences_.report_frame_name_changes)
return;
@@ -272,19 +691,27 @@ void RenderFrameImpl::didChangeName(WebKit::WebFrame* frame,
UTF16ToUTF8(name)));
}
-void RenderFrameImpl::loadURLExternally(WebKit::WebFrame* frame,
- const WebKit::WebURLRequest& request,
- WebKit::WebNavigationPolicy policy) {
+void RenderFrameImpl::didMatchCSS(
+ blink::WebFrame* frame,
+ const blink::WebVector<blink::WebString>& newly_matching_selectors,
+ const blink::WebVector<blink::WebString>& stopped_matching_selectors) {
+ render_view_->didMatchCSS(
+ frame, newly_matching_selectors, stopped_matching_selectors);
+}
+
+void RenderFrameImpl::loadURLExternally(blink::WebFrame* frame,
+ const blink::WebURLRequest& request,
+ blink::WebNavigationPolicy policy) {
loadURLExternally(frame, request, policy, WebString());
}
void RenderFrameImpl::loadURLExternally(
- WebKit::WebFrame* frame,
- const WebKit::WebURLRequest& request,
- WebKit::WebNavigationPolicy policy,
- const WebKit::WebString& suggested_name) {
+ blink::WebFrame* frame,
+ const blink::WebURLRequest& request,
+ blink::WebNavigationPolicy policy,
+ const blink::WebString& suggested_name) {
Referrer referrer(RenderViewImpl::GetReferrerFromRequest(frame, request));
- if (policy == WebKit::WebNavigationPolicyDownload) {
+ if (policy == blink::WebNavigationPolicyDownload) {
render_view_->Send(new ViewHostMsg_DownloadUrl(render_view_->GetRoutingID(),
request.url(), referrer,
suggested_name));
@@ -293,36 +720,36 @@ void RenderFrameImpl::loadURLExternally(
}
}
-WebKit::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation(
- WebKit::WebFrame* frame,
- WebKit::WebDataSource::ExtraData* extra_data,
- const WebKit::WebURLRequest& request,
- WebKit::WebNavigationType type,
- WebKit::WebNavigationPolicy default_policy,
+blink::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation(
+ blink::WebFrame* frame,
+ blink::WebDataSource::ExtraData* extra_data,
+ const blink::WebURLRequest& request,
+ blink::WebNavigationType type,
+ blink::WebNavigationPolicy default_policy,
bool is_redirect) {
return render_view_->decidePolicyForNavigation(
frame, extra_data, request, type, default_policy, is_redirect);
}
-WebKit::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation(
- WebKit::WebFrame* frame,
- const WebKit::WebURLRequest& request,
- WebKit::WebNavigationType type,
- WebKit::WebNavigationPolicy default_policy,
+blink::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation(
+ blink::WebFrame* frame,
+ const blink::WebURLRequest& request,
+ blink::WebNavigationType type,
+ blink::WebNavigationPolicy default_policy,
bool is_redirect) {
return render_view_->decidePolicyForNavigation(
frame, request, type, default_policy, is_redirect);
}
-void RenderFrameImpl::willSendSubmitEvent(WebKit::WebFrame* frame,
- const WebKit::WebFormElement& form) {
+void RenderFrameImpl::willSendSubmitEvent(blink::WebFrame* frame,
+ const blink::WebFormElement& form) {
// Call back to RenderViewImpl for observers to be notified.
// TODO(nasko): Remove once we have RenderFrameObserver.
render_view_->willSendSubmitEvent(frame, form);
}
-void RenderFrameImpl::willSubmitForm(WebKit::WebFrame* frame,
- const WebKit::WebFormElement& form) {
+void RenderFrameImpl::willSubmitForm(blink::WebFrame* frame,
+ const blink::WebFormElement& form) {
DocumentState* document_state =
DocumentState::FromDataSource(frame->provisionalDataSource());
NavigationState* navigation_state = document_state->navigation_state();
@@ -345,8 +772,8 @@ void RenderFrameImpl::willSubmitForm(WebKit::WebFrame* frame,
render_view_->willSubmitForm(frame, form);
}
-void RenderFrameImpl::didCreateDataSource(WebKit::WebFrame* frame,
- WebKit::WebDataSource* datasource) {
+void RenderFrameImpl::didCreateDataSource(blink::WebFrame* frame,
+ blink::WebDataSource* datasource) {
// TODO(nasko): Move implementation here. Needed state:
// * pending_navigation_params_
// * webview
@@ -356,24 +783,64 @@ void RenderFrameImpl::didCreateDataSource(WebKit::WebFrame* frame,
render_view_->didCreateDataSource(frame, datasource);
}
-void RenderFrameImpl::didStartProvisionalLoad(WebKit::WebFrame* frame) {
- // TODO(nasko): Move implementation here. Needed state:
- // * is_swapped_out_
- // * navigation_gesture_
- // * completed_client_redirect_src_
- render_view_->didStartProvisionalLoad(frame);
+void RenderFrameImpl::didStartProvisionalLoad(blink::WebFrame* frame) {
+ WebDataSource* ds = frame->provisionalDataSource();
+
+ // In fast/loader/stop-provisional-loads.html, we abort the load before this
+ // callback is invoked.
+ if (!ds)
+ return;
+
+ DocumentState* document_state = DocumentState::FromDataSource(ds);
+
+ // We should only navigate to swappedout:// when is_swapped_out_ is true.
+ CHECK((ds->request().url() != GURL(kSwappedOutURL)) ||
+ render_view_->is_swapped_out()) <<
+ "Heard swappedout:// when not swapped out.";
+
+ // Update the request time if WebKit has better knowledge of it.
+ if (document_state->request_time().is_null()) {
+ double event_time = ds->triggeringEventTime();
+ if (event_time != 0.0)
+ document_state->set_request_time(Time::FromDoubleT(event_time));
+ }
+
+ // Start time is only set after request time.
+ document_state->set_start_load_time(Time::Now());
+
+ bool is_top_most = !frame->parent();
+ if (is_top_most) {
+ render_view_->set_navigation_gesture(
+ WebUserGestureIndicator::isProcessingUserGesture() ?
+ NavigationGestureUser : NavigationGestureAuto);
+ } else if (ds->replacesCurrentHistoryItem()) {
+ // Subframe navigations that don't add session history items must be
+ // marked with AUTO_SUBFRAME. See also didFailProvisionalLoad for how we
+ // handle loading of error pages.
+ document_state->navigation_state()->set_transition_type(
+ PAGE_TRANSITION_AUTO_SUBFRAME);
+ }
+
+ FOR_EACH_OBSERVER(
+ RenderViewObserver, render_view_->observers(),
+ DidStartProvisionalLoad(frame));
+
+ Send(new FrameHostMsg_DidStartProvisionalLoadForFrame(
+ routing_id_, frame->identifier(),
+ frame->parent() ? frame->parent()->identifier() : -1,
+ is_top_most, ds->request().url()));
}
void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad(
- WebKit::WebFrame* frame) {
+ blink::WebFrame* frame) {
// TODO(nasko): Move implementation here. Needed state:
// * page_id_
render_view_->didReceiveServerRedirectForProvisionalLoad(frame);
}
void RenderFrameImpl::didFailProvisionalLoad(
- WebKit::WebFrame* frame,
- const WebKit::WebURLError& error) {
+ blink::WebFrame* frame,
+ const blink::WebURLError& error) {
// TODO(nasko): Move implementation here. Needed state:
// * page_id_
// * pending_navigation_params_
@@ -383,7 +850,7 @@ void RenderFrameImpl::didFailProvisionalLoad(
render_view_->didFailProvisionalLoad(frame, error);
}
-void RenderFrameImpl::didCommitProvisionalLoad(WebKit::WebFrame* frame,
+void RenderFrameImpl::didCommitProvisionalLoad(blink::WebFrame* frame,
bool is_new_navigation) {
// TODO(nasko): Move implementation here. Needed state:
// * page_id_
@@ -398,7 +865,7 @@ void RenderFrameImpl::didCommitProvisionalLoad(WebKit::WebFrame* frame,
render_view_->didCommitProvisionalLoad(frame, is_new_navigation);
}
-void RenderFrameImpl::didClearWindowObject(WebKit::WebFrame* frame) {
+void RenderFrameImpl::didClearWindowObject(blink::WebFrame* frame) {
// TODO(nasko): Move implementation here. Needed state:
// * enabled_bindings_
// * dom_automation_controller_
@@ -406,7 +873,7 @@ void RenderFrameImpl::didClearWindowObject(WebKit::WebFrame* frame) {
render_view_->didClearWindowObject(frame);
}
-void RenderFrameImpl::didCreateDocumentElement(WebKit::WebFrame* frame) {
+void RenderFrameImpl::didCreateDocumentElement(blink::WebFrame* frame) {
// Notify the browser about non-blank documents loading in the top frame.
GURL url = frame->document().url();
if (url.is_valid() && url.spec() != kAboutBlankURL) {
@@ -423,60 +890,60 @@ void RenderFrameImpl::didCreateDocumentElement(WebKit::WebFrame* frame) {
render_view_->didCreateDocumentElement(frame);
}
-void RenderFrameImpl::didReceiveTitle(WebKit::WebFrame* frame,
- const WebKit::WebString& title,
- WebKit::WebTextDirection direction) {
+void RenderFrameImpl::didReceiveTitle(blink::WebFrame* frame,
+ const blink::WebString& title,
+ blink::WebTextDirection direction) {
// TODO(nasko): Investigate wheather implementation should move here.
render_view_->didReceiveTitle(frame, title, direction);
}
-void RenderFrameImpl::didChangeIcon(WebKit::WebFrame* frame,
- WebKit::WebIconURL::Type icon_type) {
+void RenderFrameImpl::didChangeIcon(blink::WebFrame* frame,
+ blink::WebIconURL::Type icon_type) {
// TODO(nasko): Investigate wheather implementation should move here.
render_view_->didChangeIcon(frame, icon_type);
}
-void RenderFrameImpl::didFinishDocumentLoad(WebKit::WebFrame* frame) {
+void RenderFrameImpl::didFinishDocumentLoad(blink::WebFrame* frame) {
// TODO(nasko): Move implementation here. No state needed, just observers
// notification in before updating encoding.
render_view_->didFinishDocumentLoad(frame);
}
-void RenderFrameImpl::didHandleOnloadEvents(WebKit::WebFrame* frame) {
+void RenderFrameImpl::didHandleOnloadEvents(blink::WebFrame* frame) {
// TODO(nasko): Move implementation here. Needed state:
// * page_id_
render_view_->didHandleOnloadEvents(frame);
}
-void RenderFrameImpl::didFailLoad(WebKit::WebFrame* frame,
- const WebKit::WebURLError& error) {
+void RenderFrameImpl::didFailLoad(blink::WebFrame* frame,
+ const blink::WebURLError& error) {
// TODO(nasko): Move implementation here. No state needed.
render_view_->didFailLoad(frame, error);
}
-void RenderFrameImpl::didFinishLoad(WebKit::WebFrame* frame) {
+void RenderFrameImpl::didFinishLoad(blink::WebFrame* frame) {
// TODO(nasko): Move implementation here. No state needed, just observers
// notification before sending message to the browser process.
render_view_->didFinishLoad(frame);
}
-void RenderFrameImpl::didNavigateWithinPage(WebKit::WebFrame* frame,
+void RenderFrameImpl::didNavigateWithinPage(blink::WebFrame* frame,
bool is_new_navigation) {
// TODO(nasko): Move implementation here. No state needed, just observers
// notification before sending message to the browser process.
render_view_->didNavigateWithinPage(frame, is_new_navigation);
}
-void RenderFrameImpl::didUpdateCurrentHistoryItem(WebKit::WebFrame* frame) {
+void RenderFrameImpl::didUpdateCurrentHistoryItem(blink::WebFrame* frame) {
// TODO(nasko): Move implementation here. Needed methods:
// * StartNavStateSyncTimerIfNecessary
render_view_->didUpdateCurrentHistoryItem(frame);
}
void RenderFrameImpl::willRequestAfterPreconnect(
- WebKit::WebFrame* frame,
- WebKit::WebURLRequest& request) {
- WebKit::WebReferrerPolicy referrer_policy = WebKit::WebReferrerPolicyDefault;
+ blink::WebFrame* frame,
+ blink::WebURLRequest& request) {
+ blink::WebReferrerPolicy referrer_policy = blink::WebReferrerPolicyDefault;
WebString custom_user_agent;
if (request.extraData()) {
@@ -498,10 +965,10 @@ void RenderFrameImpl::willRequestAfterPreconnect(
}
void RenderFrameImpl::willSendRequest(
- WebKit::WebFrame* frame,
+ blink::WebFrame* frame,
unsigned identifier,
- WebKit::WebURLRequest& request,
- const WebKit::WebURLResponse& redirect_response) {
+ blink::WebURLRequest& request,
+ const blink::WebURLResponse& redirect_response) {
// The request my be empty during tests.
if (request.url().isEmpty())
return;
@@ -536,7 +1003,7 @@ void RenderFrameImpl::willSendRequest(
if (internal_data->is_cache_policy_override_set())
request.setCachePolicy(internal_data->cache_policy_override());
- WebKit::WebReferrerPolicy referrer_policy;
+ blink::WebReferrerPolicy referrer_policy;
if (internal_data->is_referrer_policy_set()) {
referrer_policy = internal_data->referrer_policy();
internal_data->clear_referrer_policy();
@@ -565,10 +1032,26 @@ void RenderFrameImpl::willSendRequest(
}
}
+ // Attach |should_replace_current_entry| state to requests so that, should
+ // this navigation later require a request transfer, all state is preserved
+ // when it is re-created in the new process.
+ bool should_replace_current_entry = false;
+ if (navigation_state->is_content_initiated()) {
+ should_replace_current_entry = data_source->replacesCurrentHistoryItem();
+ } else {
+ // If the navigation is browser-initiated, the NavigationState contains the
+ // correct value instead of the WebDataSource.
+ //
+ // TODO(davidben): Avoid this awkward duplication of state. See comment on
+ // NavigationState::should_replace_current_entry().
+ should_replace_current_entry =
+ navigation_state->should_replace_current_entry();
+ }
request.setExtraData(
new RequestExtraData(referrer_policy,
custom_user_agent,
was_after_preconnect_request,
+ routing_id_,
(frame == top_frame),
frame->identifier(),
GURL(frame->document().securityOrigin().toString()),
@@ -576,6 +1059,7 @@ void RenderFrameImpl::willSendRequest(
frame->parent() ? frame->parent()->identifier() : -1,
navigation_state->allow_download(),
transition_type,
+ should_replace_current_entry,
navigation_state->transferred_request_child_id(),
navigation_state->transferred_request_request_id()));
@@ -613,9 +1097,9 @@ void RenderFrameImpl::willSendRequest(
}
void RenderFrameImpl::didReceiveResponse(
- WebKit::WebFrame* frame,
+ blink::WebFrame* frame,
unsigned identifier,
- const WebKit::WebURLResponse& response) {
+ const blink::WebURLResponse& response) {
// Only do this for responses that correspond to a provisional data source
// of the top-most frame. If we have a provisional data source, then we
// can't have any sub-resources yet, so we know that this response must
@@ -658,7 +1142,7 @@ void RenderFrameImpl::didReceiveResponse(
internal_data->set_use_error_page(true);
}
-void RenderFrameImpl::didFinishResourceLoad(WebKit::WebFrame* frame,
+void RenderFrameImpl::didFinishResourceLoad(blink::WebFrame* frame,
unsigned identifier) {
// TODO(nasko): Move implementation here. Needed state:
// * devtools_agent_
@@ -668,9 +1152,9 @@ void RenderFrameImpl::didFinishResourceLoad(WebKit::WebFrame* frame,
}
void RenderFrameImpl::didLoadResourceFromMemoryCache(
- WebKit::WebFrame* frame,
- const WebKit::WebURLRequest& request,
- const WebKit::WebURLResponse& response) {
+ blink::WebFrame* frame,
+ const blink::WebURLRequest& request,
+ const blink::WebURLResponse& response) {
// The recipients of this message have no use for data: URLs: they don't
// affect the page's insecure content list and are not in the disk cache. To
// prevent large (1M+) data: URLs from crashing in the IPC system, we simply
@@ -690,28 +1174,37 @@ void RenderFrameImpl::didLoadResourceFromMemoryCache(
ResourceType::FromTargetType(request.targetType())));
}
-void RenderFrameImpl::didDisplayInsecureContent(WebKit::WebFrame* frame) {
+void RenderFrameImpl::didDisplayInsecureContent(blink::WebFrame* frame) {
render_view_->Send(new ViewHostMsg_DidDisplayInsecureContent(
render_view_->GetRoutingID()));
}
void RenderFrameImpl::didRunInsecureContent(
- WebKit::WebFrame* frame,
- const WebKit::WebSecurityOrigin& origin,
- const WebKit::WebURL& target) {
+ blink::WebFrame* frame,
+ const blink::WebSecurityOrigin& origin,
+ const blink::WebURL& target) {
render_view_->Send(new ViewHostMsg_DidRunInsecureContent(
render_view_->GetRoutingID(),
origin.toString().utf8(),
target));
}
+void RenderFrameImpl::didAbortLoading(blink::WebFrame* frame) {
+#if defined(ENABLE_PLUGINS)
+ if (frame != render_view_->webview()->mainFrame())
+ return;
+ PluginChannelHost::Broadcast(
+ new PluginHostMsg_DidAbortLoading(render_view_->GetRoutingID()));
+#endif
+}
+
void RenderFrameImpl::didExhaustMemoryAvailableForScript(
- WebKit::WebFrame* frame) {
+ blink::WebFrame* frame) {
render_view_->Send(new ViewHostMsg_JSOutOfMemory(
render_view_->GetRoutingID()));
}
-void RenderFrameImpl::didCreateScriptContext(WebKit::WebFrame* frame,
+void RenderFrameImpl::didCreateScriptContext(blink::WebFrame* frame,
v8::Handle<v8::Context> context,
int extension_group,
int world_id) {
@@ -719,32 +1212,32 @@ void RenderFrameImpl::didCreateScriptContext(WebKit::WebFrame* frame,
frame, context, extension_group, world_id);
}
-void RenderFrameImpl::willReleaseScriptContext(WebKit::WebFrame* frame,
+void RenderFrameImpl::willReleaseScriptContext(blink::WebFrame* frame,
v8::Handle<v8::Context> context,
int world_id) {
GetContentClient()->renderer()->WillReleaseScriptContext(
frame, context, world_id);
}
-void RenderFrameImpl::didFirstVisuallyNonEmptyLayout(WebKit::WebFrame* frame) {
+void RenderFrameImpl::didFirstVisuallyNonEmptyLayout(blink::WebFrame* frame) {
render_view_->didFirstVisuallyNonEmptyLayout(frame);
}
-void RenderFrameImpl::didChangeContentsSize(WebKit::WebFrame* frame,
- const WebKit::WebSize& size) {
+void RenderFrameImpl::didChangeContentsSize(blink::WebFrame* frame,
+ const blink::WebSize& size) {
// TODO(nasko): Move implementation here. Needed state:
// * cached_has_main_frame_horizontal_scrollbar_
// * cached_has_main_frame_vertical_scrollbar_
render_view_->didChangeContentsSize(frame, size);
}
-void RenderFrameImpl::didChangeScrollOffset(WebKit::WebFrame* frame) {
+void RenderFrameImpl::didChangeScrollOffset(blink::WebFrame* frame) {
// TODO(nasko): Move implementation here. Needed methods:
// * StartNavStateSyncTimerIfNecessary
render_view_->didChangeScrollOffset(frame);
}
-void RenderFrameImpl::willInsertBody(WebKit::WebFrame* frame) {
+void RenderFrameImpl::willInsertBody(blink::WebFrame* frame) {
if (!frame->parent()) {
render_view_->Send(new ViewHostMsg_WillInsertBody(
render_view_->GetRoutingID()));
@@ -766,22 +1259,22 @@ void RenderFrameImpl::reportFindInPageMatchCount(int request_id,
void RenderFrameImpl::reportFindInPageSelection(
int request_id,
int active_match_ordinal,
- const WebKit::WebRect& selection_rect) {
+ const blink::WebRect& selection_rect) {
render_view_->Send(new ViewHostMsg_Find_Reply(
render_view_->GetRoutingID(), request_id, -1, selection_rect,
active_match_ordinal, false));
}
void RenderFrameImpl::requestStorageQuota(
- WebKit::WebFrame* frame,
- WebKit::WebStorageQuotaType type,
+ blink::WebFrame* frame,
+ blink::WebStorageQuotaType type,
unsigned long long requested_size,
- WebKit::WebStorageQuotaCallbacks* callbacks) {
+ blink::WebStorageQuotaCallbacks* callbacks) {
DCHECK(frame);
WebSecurityOrigin origin = frame->document().securityOrigin();
if (origin.isUnique()) {
// Unique origins cannot store persistent state.
- callbacks->didFail(WebKit::WebStorageQuotaErrorAbort);
+ callbacks->didFail(blink::WebStorageQuotaErrorAbort);
return;
}
ChildThread::current()->quota_dispatcher()->RequestStorageQuota(
@@ -791,35 +1284,35 @@ void RenderFrameImpl::requestStorageQuota(
}
void RenderFrameImpl::willOpenSocketStream(
- WebKit::WebSocketStreamHandle* handle) {
+ blink::WebSocketStreamHandle* handle) {
SocketStreamHandleData::AddToHandle(handle, render_view_->GetRoutingID());
}
void RenderFrameImpl::willStartUsingPeerConnectionHandler(
- WebKit::WebFrame* frame,
- WebKit::WebRTCPeerConnectionHandler* handler) {
+ blink::WebFrame* frame,
+ blink::WebRTCPeerConnectionHandler* handler) {
#if defined(ENABLE_WEBRTC)
static_cast<RTCPeerConnectionHandler*>(handler)->associateWithFrame(frame);
#endif
}
bool RenderFrameImpl::willCheckAndDispatchMessageEvent(
- WebKit::WebFrame* sourceFrame,
- WebKit::WebFrame* targetFrame,
- WebKit::WebSecurityOrigin targetOrigin,
- WebKit::WebDOMMessageEvent event) {
+ blink::WebFrame* sourceFrame,
+ blink::WebFrame* targetFrame,
+ blink::WebSecurityOrigin targetOrigin,
+ blink::WebDOMMessageEvent event) {
// TODO(nasko): Move implementation here. Needed state:
// * is_swapped_out_
return render_view_->willCheckAndDispatchMessageEvent(
sourceFrame, targetFrame, targetOrigin, event);
}
-WebKit::WebString RenderFrameImpl::userAgentOverride(
- WebKit::WebFrame* frame,
- const WebKit::WebURL& url) {
+blink::WebString RenderFrameImpl::userAgentOverride(
+ blink::WebFrame* frame,
+ const blink::WebURL& url) {
if (!render_view_->webview() || !render_view_->webview()->mainFrame() ||
render_view_->renderer_preferences_.user_agent_override.empty()) {
- return WebKit::WebString();
+ return blink::WebString();
}
// If we're in the middle of committing a load, the data source we need
@@ -836,16 +1329,16 @@ WebKit::WebString RenderFrameImpl::userAgentOverride(
if (internal_data && internal_data->is_overriding_user_agent())
return WebString::fromUTF8(
render_view_->renderer_preferences_.user_agent_override);
- return WebKit::WebString();
+ return blink::WebString();
}
-WebKit::WebString RenderFrameImpl::doNotTrackValue(WebKit::WebFrame* frame) {
+blink::WebString RenderFrameImpl::doNotTrackValue(blink::WebFrame* frame) {
if (render_view_->renderer_preferences_.enable_do_not_track)
return WebString::fromUTF8("1");
return WebString();
}
-bool RenderFrameImpl::allowWebGL(WebKit::WebFrame* frame, bool default_value) {
+bool RenderFrameImpl::allowWebGL(blink::WebFrame* frame, bool default_value) {
if (!default_value)
return false;
@@ -858,7 +1351,7 @@ bool RenderFrameImpl::allowWebGL(WebKit::WebFrame* frame, bool default_value) {
return !blocked;
}
-void RenderFrameImpl::didLoseWebGLContext(WebKit::WebFrame* frame,
+void RenderFrameImpl::didLoseWebGLContext(blink::WebFrame* frame,
int arb_robustness_status_code) {
render_view_->Send(new ViewHostMsg_DidLose3DContext(
GURL(frame->top()->document().securityOrigin().toString()),
@@ -866,4 +1359,13 @@ void RenderFrameImpl::didLoseWebGLContext(WebKit::WebFrame* frame,
arb_robustness_status_code));
}
+void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) {
+ observers_.AddObserver(observer);
+}
+
+void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) {
+ observer->RenderFrameGone();
+ observers_.RemoveObserver(observer);
+}
+
} // namespace content