Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1341)

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 1991273003: Fire visibilityChange event on out-of-process iframes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressing comments Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/render_frame_impl.h" 5 #include "content/renderer/render_frame_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 903
904 RenderFrameImpl* render_frame = 904 RenderFrameImpl* render_frame =
905 RenderFrameImpl::Create(render_view, routing_id); 905 RenderFrameImpl::Create(render_view, routing_id);
906 render_frame->InitializeBlameContext(nullptr); 906 render_frame->InitializeBlameContext(nullptr);
907 WebLocalFrame* web_frame = WebLocalFrame::create( 907 WebLocalFrame* web_frame = WebLocalFrame::create(
908 blink::WebTreeScopeType::Document, render_frame, opener); 908 blink::WebTreeScopeType::Document, render_frame, opener);
909 render_frame->BindToWebFrame(web_frame); 909 render_frame->BindToWebFrame(web_frame);
910 render_view->webview()->setMainFrame(web_frame); 910 render_view->webview()->setMainFrame(web_frame);
911 render_frame->render_widget_ = RenderWidget::CreateForFrame( 911 render_frame->render_widget_ = RenderWidget::CreateForFrame(
912 widget_routing_id, hidden, screen_info, compositor_deps, web_frame); 912 widget_routing_id, hidden, screen_info, compositor_deps, web_frame);
913 // TODO(kenrb): Observing shouldn't be necessary when we sort out
914 // WasShown and WasHidden, separating page-level visibility from
915 // frame-level visibility.
916 // TODO(avi): This DCHECK is to track cleanup for https://crbug.com/545684 913 // TODO(avi): This DCHECK is to track cleanup for https://crbug.com/545684
917 DCHECK_EQ(render_view->GetWidget(), render_frame->render_widget_) 914 DCHECK_EQ(render_view->GetWidget(), render_frame->render_widget_)
918 << "Main frame is no longer reusing the RenderView as its widget! " 915 << "Main frame is no longer reusing the RenderView as its widget! "
919 << "Does the RenderFrame need to register itself with the RenderWidget?"; 916 << "Does the RenderFrame need to register itself with the RenderWidget?";
920 return render_frame; 917 return render_frame;
921 } 918 }
922 919
923 // static 920 // static
924 void RenderFrameImpl::CreateFrame( 921 void RenderFrameImpl::CreateFrame(
925 int routing_id, 922 int routing_id,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
982 979
983 if (widget_params.routing_id != MSG_ROUTING_NONE) { 980 if (widget_params.routing_id != MSG_ROUTING_NONE) {
984 CHECK(!web_frame->parent() || 981 CHECK(!web_frame->parent() ||
985 SiteIsolationPolicy::AreCrossProcessFramesPossible()); 982 SiteIsolationPolicy::AreCrossProcessFramesPossible());
986 render_frame->render_widget_ = RenderWidget::CreateForFrame( 983 render_frame->render_widget_ = RenderWidget::CreateForFrame(
987 widget_params.routing_id, widget_params.hidden, 984 widget_params.routing_id, widget_params.hidden,
988 render_frame->render_view_->screen_info(), compositor_deps, web_frame); 985 render_frame->render_view_->screen_info(), compositor_deps, web_frame);
989 // TODO(avi): The main frame re-uses the RenderViewImpl as its widget, so 986 // TODO(avi): The main frame re-uses the RenderViewImpl as its widget, so
990 // avoid double-registering the frame as an observer. 987 // avoid double-registering the frame as an observer.
991 // https://crbug.com/545684 988 // https://crbug.com/545684
992 if (web_frame->parent()) { 989 if (web_frame->parent())
993 // TODO(kenrb): Observing shouldn't be necessary when we sort out
994 // WasShown and WasHidden, separating page-level visibility from
995 // frame-level visibility.
996 render_frame->render_widget_->RegisterRenderFrame(render_frame); 990 render_frame->render_widget_->RegisterRenderFrame(render_frame);
997 }
998 } 991 }
999 992
1000 render_frame->Initialize(); 993 render_frame->Initialize();
1001 } 994 }
1002 995
1003 // static 996 // static
1004 RenderFrame* RenderFrame::FromWebFrame(blink::WebFrame* web_frame) { 997 RenderFrame* RenderFrame::FromWebFrame(blink::WebFrame* web_frame) {
1005 return RenderFrameImpl::FromWebFrame(web_frame); 998 return RenderFrameImpl::FromWebFrame(web_frame);
1006 } 999 }
1007 1000
(...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after
1626 if (is_main_frame_) 1619 if (is_main_frame_)
1627 render_view_->SetSwappedOut(true); 1620 render_view_->SetSwappedOut(true);
1628 1621
1629 // Transfer settings such as initial drawing parameters to the remote frame, 1622 // Transfer settings such as initial drawing parameters to the remote frame,
1630 // if one is created, that will replace this frame. 1623 // if one is created, that will replace this frame.
1631 if (!is_main_frame_) 1624 if (!is_main_frame_)
1632 proxy->web_frame()->initializeFromFrame(frame_); 1625 proxy->web_frame()->initializeFromFrame(frame_);
1633 1626
1634 // Let WebKit know that this view is hidden so it can drop resources and 1627 // Let WebKit know that this view is hidden so it can drop resources and
1635 // stop compositing. 1628 // stop compositing.
1636 // TODO(creis): Support this for subframes as well.
1637 if (is_main_frame_) { 1629 if (is_main_frame_) {
1638 render_view_->webview()->setVisibilityState( 1630 render_view_->webview()->setVisibilityState(
1639 blink::WebPageVisibilityStateHidden, false); 1631 blink::WebPageVisibilityStateHidden, false);
1640 } 1632 }
1641 1633
1642 RenderViewImpl* render_view = render_view_.get(); 1634 RenderViewImpl* render_view = render_view_.get();
1643 bool is_main_frame = is_main_frame_; 1635 bool is_main_frame = is_main_frame_;
1644 int routing_id = GetRoutingID(); 1636 int routing_id = GetRoutingID();
1645 1637
1646 // Now that all of the cleanup is complete and the browser side is notified, 1638 // Now that all of the cleanup is complete and the browser side is notified,
(...skipping 2250 matching lines...) Expand 10 before | Expand all | Expand 10 after
3897 // Explicitly set the SkipServiceWorker flag here if the renderer process 3889 // Explicitly set the SkipServiceWorker flag here if the renderer process
3898 // hasn't received SetControllerServiceWorker message. 3890 // hasn't received SetControllerServiceWorker message.
3899 if (!provider->IsControlledByServiceWorker()) 3891 if (!provider->IsControlledByServiceWorker())
3900 request.setSkipServiceWorker(true); 3892 request.setSkipServiceWorker(true);
3901 } 3893 }
3902 3894
3903 WebFrame* parent = frame->parent(); 3895 WebFrame* parent = frame->parent();
3904 int parent_routing_id = parent ? GetRoutingIdForFrameOrProxy(parent) : -1; 3896 int parent_routing_id = parent ? GetRoutingIdForFrameOrProxy(parent) : -1;
3905 3897
3906 RequestExtraData* extra_data = new RequestExtraData(); 3898 RequestExtraData* extra_data = new RequestExtraData();
3907 extra_data->set_visibility_state(render_view_->visibilityState()); 3899 extra_data->set_visibility_state(visibilityState());
3908 extra_data->set_custom_user_agent(custom_user_agent); 3900 extra_data->set_custom_user_agent(custom_user_agent);
3909 extra_data->set_requested_with(requested_with); 3901 extra_data->set_requested_with(requested_with);
3910 extra_data->set_render_frame_id(routing_id_); 3902 extra_data->set_render_frame_id(routing_id_);
3911 extra_data->set_is_main_frame(!parent); 3903 extra_data->set_is_main_frame(!parent);
3912 extra_data->set_frame_origin( 3904 extra_data->set_frame_origin(
3913 blink::WebStringToGURL(frame->document().getSecurityOrigin().toString())); 3905 blink::WebStringToGURL(frame->document().getSecurityOrigin().toString()));
3914 extra_data->set_parent_is_main_frame(parent && !parent->parent()); 3906 extra_data->set_parent_is_main_frame(parent && !parent->parent());
3915 extra_data->set_parent_render_frame_id(parent_routing_id); 3907 extra_data->set_parent_render_frame_id(parent_routing_id);
3916 extra_data->set_allow_download( 3908 extra_data->set_allow_download(
3917 navigation_state->common_params().allow_download); 3909 navigation_state->common_params().allow_download);
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after
4372 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnStop()); 4364 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnStop());
4373 } 4365 }
4374 4366
4375 void RenderFrameImpl::WasHidden() { 4367 void RenderFrameImpl::WasHidden() {
4376 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WasHidden()); 4368 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WasHidden());
4377 4369
4378 #if defined(ENABLE_PLUGINS) 4370 #if defined(ENABLE_PLUGINS)
4379 for (auto* plugin : active_pepper_instances_) 4371 for (auto* plugin : active_pepper_instances_)
4380 plugin->PageVisibilityChanged(false); 4372 plugin->PageVisibilityChanged(false);
4381 #endif // ENABLE_PLUGINS 4373 #endif // ENABLE_PLUGINS
4374
4375 if (GetWebFrame()->frameWidget()) {
4376 static_cast<blink::WebFrameWidget*>(GetWebFrame()->frameWidget())
4377 ->setVisibilityState(visibilityState());
4378 }
4382 } 4379 }
4383 4380
4384 void RenderFrameImpl::WasShown() { 4381 void RenderFrameImpl::WasShown() {
4385 // TODO(kenrb): Need to figure out how to do this better. Should
4386 // VisibilityState remain a page-level concept or move to frames?
4387 // The semantics of 'Show' might have to change here.
4388 // TODO(avi): This DCHECK is to track cleanup for https://crbug.com/545684
4389 DCHECK(!IsMainFrame() || render_widget_.get() == render_view_.get())
4390 << "The main render frame is no longer reusing the RenderView as its "
4391 << "RenderWidget!";
4392 if (render_widget_ && render_widget_->webwidget() &&
4393 render_view_.get() != render_widget_.get()) {
4394 static_cast<blink::WebFrameWidget*>(render_widget_->webwidget())->
4395 setVisibilityState(blink::WebPageVisibilityStateVisible, false);
4396 }
4397 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WasShown()); 4382 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WasShown());
4398 4383
4399 #if defined(ENABLE_PLUGINS) 4384 #if defined(ENABLE_PLUGINS)
4400 for (auto* plugin : active_pepper_instances_) 4385 for (auto* plugin : active_pepper_instances_)
4401 plugin->PageVisibilityChanged(true); 4386 plugin->PageVisibilityChanged(true);
4402 #endif // ENABLE_PLUGINS 4387 #endif // ENABLE_PLUGINS
4388
4389 if (GetWebFrame()->frameWidget()) {
4390 static_cast<blink::WebFrameWidget*>(GetWebFrame()->frameWidget())
4391 ->setVisibilityState(visibilityState());
4392 }
4403 } 4393 }
4404 4394
4405 void RenderFrameImpl::WidgetWillClose() { 4395 void RenderFrameImpl::WidgetWillClose() {
4406 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WidgetWillClose()); 4396 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WidgetWillClose());
4407 } 4397 }
4408 4398
4409 bool RenderFrameImpl::IsMainFrame() { 4399 bool RenderFrameImpl::IsMainFrame() {
4410 return is_main_frame_; 4400 return is_main_frame_;
4411 } 4401 }
4412 4402
(...skipping 1672 matching lines...) Expand 10 before | Expand all | Expand 10 after
6085 media::ConvertToOutputDeviceStatusCB(web_callbacks); 6075 media::ConvertToOutputDeviceStatusCB(web_callbacks);
6086 callback.Run(AudioDeviceFactory::GetOutputDeviceInfo( 6076 callback.Run(AudioDeviceFactory::GetOutputDeviceInfo(
6087 routing_id_, 0, sink_id.utf8(), security_origin) 6077 routing_id_, 0, sink_id.utf8(), security_origin)
6088 .device_status()); 6078 .device_status());
6089 } 6079 }
6090 6080
6091 blink::ServiceRegistry* RenderFrameImpl::serviceRegistry() { 6081 blink::ServiceRegistry* RenderFrameImpl::serviceRegistry() {
6092 return &blink_service_registry_; 6082 return &blink_service_registry_;
6093 } 6083 }
6094 6084
6085 blink::WebPageVisibilityState RenderFrameImpl::visibilityState() const {
6086 RenderFrameImpl* local_root =
6087 RenderFrameImpl::FromWebFrame(frame_->localRoot());
6088 blink::WebPageVisibilityState current_state =
6089 local_root->render_widget_->is_hidden()
6090 ? blink::WebPageVisibilityStateHidden
6091 : blink::WebPageVisibilityStateVisible;
6092 blink::WebPageVisibilityState override_state = current_state;
6093 if (GetContentClient()->renderer()->ShouldOverridePageVisibilityState(
6094 this, &override_state))
6095 return override_state;
6096 return current_state;
6097 }
6098
6099 blink::WebPageVisibilityState RenderFrameImpl::GetVisibilityState() const {
6100 return visibilityState();
6101 }
6102
6095 blink::WebPlugin* RenderFrameImpl::GetWebPluginForFind() { 6103 blink::WebPlugin* RenderFrameImpl::GetWebPluginForFind() {
6096 if (!is_main_frame_) 6104 if (!is_main_frame_)
6097 return nullptr; 6105 return nullptr;
6098 6106
6099 if (frame_->document().isPluginDocument()) 6107 if (frame_->document().isPluginDocument())
6100 return frame_->document().to<WebPluginDocument>().plugin(); 6108 return frame_->document().to<WebPluginDocument>().plugin();
6101 6109
6102 #if defined(ENABLE_PLUGINS) 6110 #if defined(ENABLE_PLUGINS)
6103 if (plugin_find_handler_) 6111 if (plugin_find_handler_)
6104 return plugin_find_handler_->container()->plugin(); 6112 return plugin_find_handler_->container()->plugin();
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
6169 // event target. Potentially a Pepper plugin will receive the event. 6177 // event target. Potentially a Pepper plugin will receive the event.
6170 // In order to tell whether a plugin gets the last mouse event and which it 6178 // In order to tell whether a plugin gets the last mouse event and which it
6171 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets 6179 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets
6172 // the event, it will notify us via DidReceiveMouseEvent() and set itself as 6180 // the event, it will notify us via DidReceiveMouseEvent() and set itself as
6173 // |pepper_last_mouse_event_target_|. 6181 // |pepper_last_mouse_event_target_|.
6174 pepper_last_mouse_event_target_ = nullptr; 6182 pepper_last_mouse_event_target_ = nullptr;
6175 #endif 6183 #endif
6176 } 6184 }
6177 6185
6178 } // namespace content 6186 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698