| 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/renderer/render_view_impl.h" | 5 #include "content/renderer/render_view_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 #if defined(OS_ANDROID) | 323 #if defined(OS_ANDROID) |
| 324 // Delay between tapping in content and launching the associated android intent. | 324 // Delay between tapping in content and launching the associated android intent. |
| 325 // Used to allow users see what has been recognized as content. | 325 // Used to allow users see what has been recognized as content. |
| 326 const size_t kContentIntentDelayMilliseconds = 700; | 326 const size_t kContentIntentDelayMilliseconds = 700; |
| 327 #endif | 327 #endif |
| 328 | 328 |
| 329 static RenderViewImpl* (*g_create_render_view_impl)(const ViewMsg_New_Params&) = | 329 static RenderViewImpl* (*g_create_render_view_impl)(const ViewMsg_New_Params&) = |
| 330 NULL; | 330 NULL; |
| 331 | 331 |
| 332 // static | 332 // static |
| 333 bool RenderViewImpl::IsReload(FrameMsg_Navigate_Type::Value navigation_type) { | |
| 334 return navigation_type == FrameMsg_Navigate_Type::RELOAD || | |
| 335 navigation_type == FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE || | |
| 336 navigation_type == FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL; | |
| 337 } | |
| 338 | |
| 339 // static | |
| 340 Referrer RenderViewImpl::GetReferrerFromRequest( | 333 Referrer RenderViewImpl::GetReferrerFromRequest( |
| 341 WebFrame* frame, | 334 WebFrame* frame, |
| 342 const WebURLRequest& request) { | 335 const WebURLRequest& request) { |
| 343 return Referrer(GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))), | 336 return Referrer(GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))), |
| 344 request.referrerPolicy()); | 337 request.referrerPolicy()); |
| 345 } | 338 } |
| 346 | 339 |
| 347 // static | 340 // static |
| 348 WindowOpenDisposition RenderViewImpl::NavigationPolicyToDisposition( | 341 WindowOpenDisposition RenderViewImpl::NavigationPolicyToDisposition( |
| 349 WebNavigationPolicy policy) { | 342 WebNavigationPolicy policy) { |
| (...skipping 1724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2074 &ssl_status.security_bits, | 2067 &ssl_status.security_bits, |
| 2075 &ssl_status.connection_status, | 2068 &ssl_status.connection_status, |
| 2076 &ssl_status.signed_certificate_timestamp_ids); | 2069 &ssl_status.signed_certificate_timestamp_ids); |
| 2077 return ssl_status; | 2070 return ssl_status; |
| 2078 } | 2071 } |
| 2079 | 2072 |
| 2080 const std::string& RenderViewImpl::GetAcceptLanguages() const { | 2073 const std::string& RenderViewImpl::GetAcceptLanguages() const { |
| 2081 return renderer_preferences_.accept_languages; | 2074 return renderer_preferences_.accept_languages; |
| 2082 } | 2075 } |
| 2083 | 2076 |
| 2084 void RenderViewImpl::didCreateDataSource(WebLocalFrame* frame, | |
| 2085 WebDataSource* ds) { | |
| 2086 bool content_initiated = !pending_navigation_params_.get(); | |
| 2087 | |
| 2088 // Make sure any previous redirect URLs end up in our new data source. | |
| 2089 if (pending_navigation_params_.get()) { | |
| 2090 for (std::vector<GURL>::const_iterator i = | |
| 2091 pending_navigation_params_->request_params.redirects.begin(); | |
| 2092 i != pending_navigation_params_->request_params.redirects.end(); ++i) { | |
| 2093 ds->appendRedirect(*i); | |
| 2094 } | |
| 2095 } | |
| 2096 | |
| 2097 DocumentState* document_state = DocumentState::FromDataSource(ds); | |
| 2098 if (!document_state) { | |
| 2099 document_state = new DocumentState; | |
| 2100 ds->setExtraData(document_state); | |
| 2101 if (!content_initiated) | |
| 2102 PopulateDocumentStateFromPending(document_state); | |
| 2103 } | |
| 2104 | |
| 2105 // Carry over the user agent override flag, if it exists. | |
| 2106 if (content_initiated && webview() && webview()->mainFrame() && | |
| 2107 webview()->mainFrame()->isWebLocalFrame() && | |
| 2108 webview()->mainFrame()->dataSource()) { | |
| 2109 DocumentState* old_document_state = | |
| 2110 DocumentState::FromDataSource(webview()->mainFrame()->dataSource()); | |
| 2111 if (old_document_state) { | |
| 2112 InternalDocumentStateData* internal_data = | |
| 2113 InternalDocumentStateData::FromDocumentState(document_state); | |
| 2114 InternalDocumentStateData* old_internal_data = | |
| 2115 InternalDocumentStateData::FromDocumentState(old_document_state); | |
| 2116 internal_data->set_is_overriding_user_agent( | |
| 2117 old_internal_data->is_overriding_user_agent()); | |
| 2118 } | |
| 2119 } | |
| 2120 | |
| 2121 // The rest of RenderView assumes that a WebDataSource will always have a | |
| 2122 // non-null NavigationState. | |
| 2123 if (content_initiated) { | |
| 2124 document_state->set_navigation_state( | |
| 2125 NavigationStateImpl::CreateContentInitiated()); | |
| 2126 } else { | |
| 2127 document_state->set_navigation_state(CreateNavigationStateFromPending()); | |
| 2128 pending_navigation_params_.reset(); | |
| 2129 } | |
| 2130 | |
| 2131 // DocumentState::referred_by_prefetcher_ is true if we are | |
| 2132 // navigating from a page that used prefetching using a link on that | |
| 2133 // page. We are early enough in the request process here that we | |
| 2134 // can still see the DocumentState of the previous page and set | |
| 2135 // this value appropriately. | |
| 2136 // TODO(gavinp): catch the important case of navigation in a new | |
| 2137 // renderer process. | |
| 2138 if (webview()) { | |
| 2139 if (WebFrame* old_frame = webview()->mainFrame()) { | |
| 2140 const WebURLRequest& original_request = ds->originalRequest(); | |
| 2141 const GURL referrer( | |
| 2142 original_request.httpHeaderField(WebString::fromUTF8("Referer"))); | |
| 2143 if (!referrer.is_empty() && old_frame->isWebLocalFrame() && | |
| 2144 DocumentState::FromDataSource(old_frame->dataSource()) | |
| 2145 ->was_prefetcher()) { | |
| 2146 for (; old_frame; old_frame = old_frame->traverseNext(false)) { | |
| 2147 WebDataSource* old_frame_ds = old_frame->dataSource(); | |
| 2148 if (old_frame_ds && referrer == GURL(old_frame_ds->request().url())) { | |
| 2149 document_state->set_was_referred_by_prefetcher(true); | |
| 2150 break; | |
| 2151 } | |
| 2152 } | |
| 2153 } | |
| 2154 } | |
| 2155 } | |
| 2156 | |
| 2157 if (content_initiated) { | |
| 2158 const WebURLRequest& request = ds->request(); | |
| 2159 switch (request.cachePolicy()) { | |
| 2160 case WebURLRequest::UseProtocolCachePolicy: // normal load. | |
| 2161 document_state->set_load_type(DocumentState::LINK_LOAD_NORMAL); | |
| 2162 break; | |
| 2163 case WebURLRequest::ReloadIgnoringCacheData: // reload. | |
| 2164 case WebURLRequest::ReloadBypassingCache: // end-to-end reload. | |
| 2165 document_state->set_load_type(DocumentState::LINK_LOAD_RELOAD); | |
| 2166 break; | |
| 2167 case WebURLRequest::ReturnCacheDataElseLoad: // allow stale data. | |
| 2168 document_state->set_load_type( | |
| 2169 DocumentState::LINK_LOAD_CACHE_STALE_OK); | |
| 2170 break; | |
| 2171 case WebURLRequest::ReturnCacheDataDontLoad: // Don't re-post. | |
| 2172 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY); | |
| 2173 break; | |
| 2174 default: | |
| 2175 NOTREACHED(); | |
| 2176 } | |
| 2177 } | |
| 2178 | |
| 2179 FOR_EACH_OBSERVER( | |
| 2180 RenderViewObserver, observers_, DidCreateDataSource(frame, ds)); | |
| 2181 } | |
| 2182 | |
| 2183 void RenderViewImpl::PopulateDocumentStateFromPending( | |
| 2184 DocumentState* document_state) { | |
| 2185 document_state->set_request_time( | |
| 2186 pending_navigation_params_->request_params.request_time); | |
| 2187 | |
| 2188 InternalDocumentStateData* internal_data = | |
| 2189 InternalDocumentStateData::FromDocumentState(document_state); | |
| 2190 | |
| 2191 if (!pending_navigation_params_->common_params.url.SchemeIs( | |
| 2192 url::kJavaScriptScheme) && | |
| 2193 pending_navigation_params_->common_params.navigation_type == | |
| 2194 FrameMsg_Navigate_Type::RESTORE) { | |
| 2195 // We're doing a load of a page that was restored from the last session. By | |
| 2196 // default this prefers the cache over loading (LOAD_PREFERRING_CACHE) which | |
| 2197 // can result in stale data for pages that are set to expire. We explicitly | |
| 2198 // override that by setting the policy here so that as necessary we load | |
| 2199 // from the network. | |
| 2200 // | |
| 2201 // TODO(davidben): Remove this in favor of passing a cache policy to the | |
| 2202 // loadHistoryItem call in OnNavigate. That requires not overloading | |
| 2203 // UseProtocolCachePolicy to mean both "normal load" and "determine cache | |
| 2204 // policy based on load type, etc". | |
| 2205 internal_data->set_cache_policy_override( | |
| 2206 WebURLRequest::UseProtocolCachePolicy); | |
| 2207 } | |
| 2208 | |
| 2209 if (IsReload(pending_navigation_params_->common_params.navigation_type)) | |
| 2210 document_state->set_load_type(DocumentState::RELOAD); | |
| 2211 else if (pending_navigation_params_->request_params.page_state.IsValid()) | |
| 2212 document_state->set_load_type(DocumentState::HISTORY_LOAD); | |
| 2213 else | |
| 2214 document_state->set_load_type(DocumentState::NORMAL_LOAD); | |
| 2215 | |
| 2216 internal_data->set_is_overriding_user_agent( | |
| 2217 pending_navigation_params_->request_params.is_overriding_user_agent); | |
| 2218 internal_data->set_must_reset_scroll_and_scale_state( | |
| 2219 pending_navigation_params_->common_params.navigation_type == | |
| 2220 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); | |
| 2221 document_state->set_can_load_local_resources( | |
| 2222 pending_navigation_params_->request_params.can_load_local_resources); | |
| 2223 } | |
| 2224 | |
| 2225 NavigationState* RenderViewImpl::CreateNavigationStateFromPending() { | |
| 2226 // A navigation resulting from loading a javascript URL should not be treated | |
| 2227 // as a browser initiated event. Instead, we want it to look as if the page | |
| 2228 // initiated any load resulting from JS execution. | |
| 2229 if (!pending_navigation_params_->common_params.url.SchemeIs( | |
| 2230 url::kJavaScriptScheme)) { | |
| 2231 return NavigationStateImpl::CreateBrowserInitiated( | |
| 2232 pending_navigation_params_->common_params, | |
| 2233 pending_navigation_params_->start_params, | |
| 2234 pending_navigation_params_->request_params); | |
| 2235 } | |
| 2236 return NavigationStateImpl::CreateContentInitiated(); | |
| 2237 } | |
| 2238 | |
| 2239 void RenderViewImpl::didChangeIcon(WebLocalFrame* frame, | 2077 void RenderViewImpl::didChangeIcon(WebLocalFrame* frame, |
| 2240 WebIconURL::Type icon_type) { | 2078 WebIconURL::Type icon_type) { |
| 2241 if (frame->parent()) | 2079 if (frame->parent()) |
| 2242 return; | 2080 return; |
| 2243 | 2081 |
| 2244 WebVector<WebIconURL> icon_urls = frame->iconURLs(icon_type); | 2082 WebVector<WebIconURL> icon_urls = frame->iconURLs(icon_type); |
| 2245 std::vector<FaviconURL> urls; | 2083 std::vector<FaviconURL> urls; |
| 2246 for (size_t i = 0; i < icon_urls.size(); i++) { | 2084 for (size_t i = 0; i < icon_urls.size(); i++) { |
| 2247 std::vector<gfx::Size> sizes; | 2085 std::vector<gfx::Size> sizes; |
| 2248 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes); | 2086 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes); |
| (...skipping 1714 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3963 std::vector<gfx::Size> sizes; | 3801 std::vector<gfx::Size> sizes; |
| 3964 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes); | 3802 ConvertToFaviconSizes(icon_urls[i].sizes(), &sizes); |
| 3965 if (!url.isEmpty()) | 3803 if (!url.isEmpty()) |
| 3966 urls.push_back( | 3804 urls.push_back( |
| 3967 FaviconURL(url, ToFaviconType(icon_urls[i].iconType()), sizes)); | 3805 FaviconURL(url, ToFaviconType(icon_urls[i].iconType()), sizes)); |
| 3968 } | 3806 } |
| 3969 SendUpdateFaviconURL(urls); | 3807 SendUpdateFaviconURL(urls); |
| 3970 } | 3808 } |
| 3971 | 3809 |
| 3972 } // namespace content | 3810 } // namespace content |
| OLD | NEW |