OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/browser/web_contents/web_contents_impl.h" | 5 #include "content/browser/web_contents/web_contents_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <cmath> | 9 #include <cmath> |
10 #include <utility> | 10 #include <utility> |
(...skipping 2026 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2037 } | 2037 } |
2038 | 2038 |
2039 void WebContentsImpl::OnRenderFrameProxyVisibilityChanged(bool visible) { | 2039 void WebContentsImpl::OnRenderFrameProxyVisibilityChanged(bool visible) { |
2040 if (visible && !GetOuterWebContents()->IsHidden()) | 2040 if (visible && !GetOuterWebContents()->IsHidden()) |
2041 WasShown(); | 2041 WasShown(); |
2042 else if (!visible) | 2042 else if (!visible) |
2043 WasHidden(); | 2043 WasHidden(); |
2044 } | 2044 } |
2045 | 2045 |
2046 void WebContentsImpl::CreateNewWindow( | 2046 void WebContentsImpl::CreateNewWindow( |
2047 SiteInstance* source_site_instance, | 2047 RenderFrameHost* opener, |
2048 int32_t render_view_route_id, | 2048 int32_t render_view_route_id, |
2049 int32_t main_frame_route_id, | 2049 int32_t main_frame_route_id, |
2050 int32_t main_frame_widget_route_id, | 2050 int32_t main_frame_widget_route_id, |
2051 const mojom::CreateNewWindowParams& params, | 2051 const mojom::CreateNewWindowParams& params, |
2052 SessionStorageNamespace* session_storage_namespace) { | 2052 SessionStorageNamespace* session_storage_namespace) { |
2053 // We should have zero valid routing ids, or three valid routing IDs. | 2053 // We should have zero valid routing ids, or three valid routing IDs. |
2054 DCHECK_EQ((render_view_route_id == MSG_ROUTING_NONE), | 2054 DCHECK_EQ((render_view_route_id == MSG_ROUTING_NONE), |
2055 (main_frame_route_id == MSG_ROUTING_NONE)); | 2055 (main_frame_route_id == MSG_ROUTING_NONE)); |
2056 DCHECK_EQ((render_view_route_id == MSG_ROUTING_NONE), | 2056 DCHECK_EQ((render_view_route_id == MSG_ROUTING_NONE), |
2057 (main_frame_widget_route_id == MSG_ROUTING_NONE)); | 2057 (main_frame_widget_route_id == MSG_ROUTING_NONE)); |
| 2058 DCHECK(opener); |
2058 | 2059 |
2059 int render_process_id = source_site_instance->GetProcess()->GetID(); | 2060 int render_process_id = opener->GetProcess()->GetID(); |
2060 // The route IDs passed into this function can be trusted not to already be in | 2061 SiteInstance* source_site_instance = opener->GetSiteInstance(); |
2061 // use; they were allocated by the RenderWidgetHelper on the IO thread. | 2062 |
| 2063 // The route IDs passed into this function can be trusted not to already |
| 2064 // be in use; they were allocated by the RenderWidgetHelper by the caller. |
2062 DCHECK(!RenderFrameHostImpl::FromID(render_process_id, main_frame_route_id)); | 2065 DCHECK(!RenderFrameHostImpl::FromID(render_process_id, main_frame_route_id)); |
2063 | 2066 |
2064 // We usually create the new window in the same BrowsingInstance (group of | 2067 // We usually create the new window in the same BrowsingInstance (group of |
2065 // script-related windows), by passing in the current SiteInstance. However, | 2068 // script-related windows), by passing in the current SiteInstance. However, |
2066 // if the opener is being suppressed (in a non-guest), we create a new | 2069 // if the opener is being suppressed (in a non-guest), we create a new |
2067 // SiteInstance in its own BrowsingInstance. | 2070 // SiteInstance in its own BrowsingInstance. |
2068 bool is_guest = BrowserPluginGuest::IsGuest(this); | 2071 bool is_guest = BrowserPluginGuest::IsGuest(this); |
2069 | 2072 |
2070 // If the opener is to be suppressed, the new window can be in any process. | 2073 // If the opener is to be suppressed, the new window can be in any process. |
2071 // Since routing ids are process specific, we must not have one passed in | 2074 // Since routing ids are process specific, we must not have one passed in |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2113 } | 2116 } |
2114 | 2117 |
2115 // Create the new web contents. This will automatically create the new | 2118 // Create the new web contents. This will automatically create the new |
2116 // WebContentsView. In the future, we may want to create the view separately. | 2119 // WebContentsView. In the future, we may want to create the view separately. |
2117 CreateParams create_params(GetBrowserContext(), site_instance.get()); | 2120 CreateParams create_params(GetBrowserContext(), site_instance.get()); |
2118 create_params.routing_id = render_view_route_id; | 2121 create_params.routing_id = render_view_route_id; |
2119 create_params.main_frame_routing_id = main_frame_route_id; | 2122 create_params.main_frame_routing_id = main_frame_route_id; |
2120 create_params.main_frame_widget_routing_id = main_frame_widget_route_id; | 2123 create_params.main_frame_widget_routing_id = main_frame_widget_route_id; |
2121 create_params.main_frame_name = params.frame_name; | 2124 create_params.main_frame_name = params.frame_name; |
2122 create_params.opener_render_process_id = render_process_id; | 2125 create_params.opener_render_process_id = render_process_id; |
2123 create_params.opener_render_frame_id = params.opener_render_frame_id; | 2126 create_params.opener_render_frame_id = opener->GetRoutingID(); |
2124 create_params.opener_suppressed = params.opener_suppressed; | 2127 create_params.opener_suppressed = params.opener_suppressed; |
2125 if (params.disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB) | 2128 if (params.disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB) |
2126 create_params.initially_hidden = true; | 2129 create_params.initially_hidden = true; |
2127 create_params.renderer_initiated_creation = | 2130 create_params.renderer_initiated_creation = |
2128 main_frame_route_id != MSG_ROUTING_NONE; | 2131 main_frame_route_id != MSG_ROUTING_NONE; |
2129 | 2132 |
2130 WebContentsImpl* new_contents = NULL; | 2133 WebContentsImpl* new_contents = NULL; |
2131 if (!is_guest) { | 2134 if (!is_guest) { |
2132 create_params.context = view_->GetNativeView(); | 2135 create_params.context = view_->GetNativeView(); |
2133 create_params.initial_size = GetContainerBounds().size(); | 2136 create_params.initial_size = GetContainerBounds().size(); |
(...skipping 26 matching lines...) Expand all Loading... |
2160 } | 2163 } |
2161 // Save the created window associated with the route so we can show it | 2164 // Save the created window associated with the route so we can show it |
2162 // later. | 2165 // later. |
2163 DCHECK_NE(MSG_ROUTING_NONE, main_frame_widget_route_id); | 2166 DCHECK_NE(MSG_ROUTING_NONE, main_frame_widget_route_id); |
2164 pending_contents_[std::make_pair( | 2167 pending_contents_[std::make_pair( |
2165 render_process_id, main_frame_widget_route_id)] = new_contents; | 2168 render_process_id, main_frame_widget_route_id)] = new_contents; |
2166 AddDestructionObserver(new_contents); | 2169 AddDestructionObserver(new_contents); |
2167 } | 2170 } |
2168 | 2171 |
2169 if (delegate_) { | 2172 if (delegate_) { |
2170 delegate_->WebContentsCreated( | 2173 delegate_->WebContentsCreated(this, render_process_id, |
2171 this, render_process_id, params.opener_render_frame_id, | 2174 opener->GetRoutingID(), params.frame_name, |
2172 params.frame_name, params.target_url, new_contents); | 2175 params.target_url, new_contents); |
2173 } | 2176 } |
2174 | 2177 |
2175 RenderFrameHost* source_render_frame_host = | 2178 if (opener) { |
2176 RenderFrameHost::FromID(render_process_id, params.opener_render_frame_id); | |
2177 | |
2178 if (source_render_frame_host) { | |
2179 for (auto& observer : observers_) { | 2179 for (auto& observer : observers_) { |
2180 observer.DidOpenRequestedURL(new_contents, source_render_frame_host, | 2180 observer.DidOpenRequestedURL(new_contents, opener, params.target_url, |
2181 params.target_url, params.referrer, | 2181 params.referrer, params.disposition, |
2182 params.disposition, ui::PAGE_TRANSITION_LINK, | 2182 ui::PAGE_TRANSITION_LINK, |
2183 false, // started_from_context_menu | 2183 false, // started_from_context_menu |
2184 true); // renderer_initiated | 2184 true); // renderer_initiated |
2185 } | 2185 } |
2186 } | 2186 } |
2187 | 2187 |
2188 if (params.opener_suppressed) { | 2188 if (params.opener_suppressed) { |
2189 // When the opener is suppressed, the original renderer cannot access the | 2189 // When the opener is suppressed, the original renderer cannot access the |
2190 // new window. As a result, we need to show and navigate the window here. | 2190 // new window. As a result, we need to show and navigate the window here. |
2191 bool was_blocked = false; | 2191 bool was_blocked = false; |
2192 if (delegate_) { | 2192 if (delegate_) { |
(...skipping 3279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5472 RenderViewHost* render_view_host = RenderViewHost::From(render_widget_host); | 5472 RenderViewHost* render_view_host = RenderViewHost::From(render_widget_host); |
5473 if (!render_view_host) | 5473 if (!render_view_host) |
5474 continue; | 5474 continue; |
5475 render_view_host_set.insert(render_view_host); | 5475 render_view_host_set.insert(render_view_host); |
5476 } | 5476 } |
5477 for (RenderViewHost* render_view_host : render_view_host_set) | 5477 for (RenderViewHost* render_view_host : render_view_host_set) |
5478 render_view_host->OnWebkitPreferencesChanged(); | 5478 render_view_host->OnWebkitPreferencesChanged(); |
5479 } | 5479 } |
5480 | 5480 |
5481 } // namespace content | 5481 } // namespace content |
OLD | NEW |