OLD | NEW |
---|---|
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 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
240 if (urls[i] != GURL(kSwappedOutURL)) | 240 if (urls[i] != GURL(kSwappedOutURL)) |
241 result->push_back(urls[i]); | 241 result->push_back(urls[i]); |
242 else | 242 else |
243 result->push_back(blank_url); | 243 result->push_back(blank_url); |
244 } | 244 } |
245 } | 245 } |
246 | 246 |
247 // Returns the original request url. If there is no redirect, the original | 247 // Returns the original request url. If there is no redirect, the original |
248 // url is the same as ds->request()->url(). If the WebDataSource belongs to a | 248 // url is the same as ds->request()->url(). If the WebDataSource belongs to a |
249 // frame was loaded by loadData, the original url will be ds->unreachableURL() | 249 // frame was loaded by loadData, the original url will be ds->unreachableURL() |
250 static GURL GetOriginalRequestURL(WebDataSource* ds) { | 250 GURL GetOriginalRequestURL(WebDataSource* ds) { |
251 // WebDataSource has unreachable URL means that the frame is loaded through | 251 // WebDataSource has unreachable URL means that the frame is loaded through |
252 // blink::WebFrame::loadData(), and the base URL will be in the redirect | 252 // blink::WebFrame::loadData(), and the base URL will be in the redirect |
253 // chain. However, we never visited the baseURL. So in this case, we should | 253 // chain. However, we never visited the baseURL. So in this case, we should |
254 // use the unreachable URL as the original URL. | 254 // use the unreachable URL as the original URL. |
255 if (ds->hasUnreachableURL()) | 255 if (ds->hasUnreachableURL()) |
256 return ds->unreachableURL(); | 256 return ds->unreachableURL(); |
257 | 257 |
258 std::vector<GURL> redirects; | 258 std::vector<GURL> redirects; |
259 GetRedirectChain(ds, &redirects); | 259 GetRedirectChain(ds, &redirects); |
260 if (!redirects.empty()) | 260 if (!redirects.empty()) |
261 return redirects.at(0); | 261 return redirects.at(0); |
262 | 262 |
263 return ds->originalRequest().url(); | 263 return ds->originalRequest().url(); |
264 } | 264 } |
265 | 265 |
266 NOINLINE static void CrashIntentionally() { | 266 NOINLINE void CrashIntentionally() { |
267 // NOTE(shess): Crash directly rather than using NOTREACHED() so | 267 // NOTE(shess): Crash directly rather than using NOTREACHED() so |
268 // that the signature is easier to triage in crash reports. | 268 // that the signature is easier to triage in crash reports. |
269 volatile int* zero = NULL; | 269 volatile int* zero = NULL; |
270 *zero = 0; | 270 *zero = 0; |
271 } | 271 } |
272 | 272 |
273 #if defined(ADDRESS_SANITIZER) || defined(SYZYASAN) | 273 #if defined(ADDRESS_SANITIZER) || defined(SYZYASAN) |
274 NOINLINE static void MaybeTriggerAsanError(const GURL& url) { | 274 NOINLINE void MaybeTriggerAsanError(const GURL& url) { |
275 // NOTE(rogerm): We intentionally perform an invalid heap access here in | 275 // NOTE(rogerm): We intentionally perform an invalid heap access here in |
276 // order to trigger an Address Sanitizer (ASAN) error report. | 276 // order to trigger an Address Sanitizer (ASAN) error report. |
277 const char kCrashDomain[] = "crash"; | 277 const char kCrashDomain[] = "crash"; |
278 const char kHeapOverflow[] = "/heap-overflow"; | 278 const char kHeapOverflow[] = "/heap-overflow"; |
279 const char kHeapUnderflow[] = "/heap-underflow"; | 279 const char kHeapUnderflow[] = "/heap-underflow"; |
280 const char kUseAfterFree[] = "/use-after-free"; | 280 const char kUseAfterFree[] = "/use-after-free"; |
281 #if defined(SYZYASAN) | 281 #if defined(SYZYASAN) |
282 const char kCorruptHeapBlock[] = "/corrupt-heap-block"; | 282 const char kCorruptHeapBlock[] = "/corrupt-heap-block"; |
283 const char kCorruptHeap[] = "/corrupt-heap"; | 283 const char kCorruptHeap[] = "/corrupt-heap"; |
284 #endif | 284 #endif |
(...skipping 14 matching lines...) Expand all Loading... | |
299 #if defined(SYZYASAN) | 299 #if defined(SYZYASAN) |
300 } else if (crash_type == kCorruptHeapBlock) { | 300 } else if (crash_type == kCorruptHeapBlock) { |
301 base::debug::AsanCorruptHeapBlock(); | 301 base::debug::AsanCorruptHeapBlock(); |
302 } else if (crash_type == kCorruptHeap) { | 302 } else if (crash_type == kCorruptHeap) { |
303 base::debug::AsanCorruptHeap(); | 303 base::debug::AsanCorruptHeap(); |
304 #endif | 304 #endif |
305 } | 305 } |
306 } | 306 } |
307 #endif // ADDRESS_SANITIZER || SYZYASAN | 307 #endif // ADDRESS_SANITIZER || SYZYASAN |
308 | 308 |
309 static void MaybeHandleDebugURL(const GURL& url) { | 309 void MaybeHandleDebugURL(const GURL& url) { |
310 if (!url.SchemeIs(kChromeUIScheme)) | 310 if (!url.SchemeIs(kChromeUIScheme)) |
311 return; | 311 return; |
312 if (url == GURL(kChromeUICrashURL)) { | 312 if (url == GURL(kChromeUICrashURL)) { |
313 CrashIntentionally(); | 313 CrashIntentionally(); |
314 } else if (url == GURL(kChromeUIDumpURL)) { | 314 } else if (url == GURL(kChromeUIDumpURL)) { |
315 // This URL will only correctly create a crash dump file if content is | 315 // This URL will only correctly create a crash dump file if content is |
316 // hosted in a process that has correctly called | 316 // hosted in a process that has correctly called |
317 // base::debug::SetDumpWithoutCrashingFunction. Refer to the documentation | 317 // base::debug::SetDumpWithoutCrashingFunction. Refer to the documentation |
318 // of base::debug::DumpWithoutCrashing for more details. | 318 // of base::debug::DumpWithoutCrashing for more details. |
319 base::debug::DumpWithoutCrashing(); | 319 base::debug::DumpWithoutCrashing(); |
320 } else if (url == GURL(kChromeUIKillURL)) { | 320 } else if (url == GURL(kChromeUIKillURL)) { |
321 base::KillProcess(base::GetCurrentProcessHandle(), 1, false); | 321 base::KillProcess(base::GetCurrentProcessHandle(), 1, false); |
322 } else if (url == GURL(kChromeUIHangURL)) { | 322 } else if (url == GURL(kChromeUIHangURL)) { |
323 for (;;) { | 323 for (;;) { |
324 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); | 324 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); |
325 } | 325 } |
326 } else if (url == GURL(kChromeUIShorthangURL)) { | 326 } else if (url == GURL(kChromeUIShorthangURL)) { |
327 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(20)); | 327 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(20)); |
328 } | 328 } |
329 | 329 |
330 #if defined(ADDRESS_SANITIZER) || defined(SYZYASAN) | 330 #if defined(ADDRESS_SANITIZER) || defined(SYZYASAN) |
331 MaybeTriggerAsanError(url); | 331 MaybeTriggerAsanError(url); |
332 #endif // ADDRESS_SANITIZER || SYZYASAN | 332 #endif // ADDRESS_SANITIZER || SYZYASAN |
333 } | 333 } |
334 | 334 |
335 // Returns false unless this is a top-level navigation. | 335 // Returns false unless this is a top-level navigation. |
336 static bool IsTopLevelNavigation(WebFrame* frame) { | 336 bool IsTopLevelNavigation(WebFrame* frame) { |
337 return frame->parent() == NULL; | 337 return frame->parent() == NULL; |
338 } | 338 } |
339 | 339 |
340 // Returns false unless this is a top-level navigation that crosses origins. | 340 // Returns false unless this is a top-level navigation that crosses origins. |
341 static bool IsNonLocalTopLevelNavigation(const GURL& url, | 341 bool IsNonLocalTopLevelNavigation(const GURL& url, |
342 WebFrame* frame, | 342 WebFrame* frame, |
343 WebNavigationType type, | 343 WebNavigationType type, |
344 bool is_form_post) { | 344 bool is_form_post) { |
345 if (!IsTopLevelNavigation(frame)) | 345 if (!IsTopLevelNavigation(frame)) |
346 return false; | 346 return false; |
347 | 347 |
348 // Navigations initiated within Webkit are not sent out to the external host | 348 // Navigations initiated within Webkit are not sent out to the external host |
349 // in the following cases. | 349 // in the following cases. |
350 // 1. The url scheme is not http/https | 350 // 1. The url scheme is not http/https |
351 // 2. The origin of the url and the opener is the same in which case the | 351 // 2. The origin of the url and the opener is the same in which case the |
352 // opener relationship is maintained. | 352 // opener relationship is maintained. |
353 // 3. Reloads/form submits/back forward navigations | 353 // 3. Reloads/form submits/back forward navigations |
354 if (!url.SchemeIs(url::kHttpScheme) && !url.SchemeIs(url::kHttpsScheme)) | 354 if (!url.SchemeIs(url::kHttpScheme) && !url.SchemeIs(url::kHttpsScheme)) |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
466 extra_data = &kEmptyData; | 466 extra_data = &kEmptyData; |
467 CommonNavigationParams params; | 467 CommonNavigationParams params; |
468 params.url = request->url(); | 468 params.url = request->url(); |
469 params.referrer = Referrer( | 469 params.referrer = Referrer( |
470 GURL(request->httpHeaderField(WebString::fromUTF8("Referer")).latin1()), | 470 GURL(request->httpHeaderField(WebString::fromUTF8("Referer")).latin1()), |
471 request->referrerPolicy()); | 471 request->referrerPolicy()); |
472 params.transition = extra_data->transition_type(); | 472 params.transition = extra_data->transition_type(); |
473 return params; | 473 return params; |
474 } | 474 } |
475 | 475 |
476 using CreateRenderFrameImpl = RenderFrameImpl* (*)(RenderViewImpl*, int32); | |
mlamouri (slow - plz ping)
2014/12/10 09:50:03
nit: I would pick a clearer name like CreateRender
dshwang
2014/12/10 10:08:31
I rename it to CreateRenderFrameImplFunction.
Jame
| |
477 CreateRenderFrameImpl g_create_render_frame_impl = nullptr; | |
478 | |
476 } // namespace | 479 } // namespace |
477 | 480 |
478 static RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) = | |
479 NULL; | |
480 | 481 |
481 // static | 482 // static |
482 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, | 483 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, |
483 int32 routing_id) { | 484 int32 routing_id) { |
484 DCHECK(routing_id != MSG_ROUTING_NONE); | 485 DCHECK(routing_id != MSG_ROUTING_NONE); |
485 | 486 |
486 if (g_create_render_frame_impl) | 487 if (g_create_render_frame_impl) |
487 return g_create_render_frame_impl(render_view, routing_id); | 488 return g_create_render_frame_impl(render_view, routing_id); |
488 else | 489 else |
489 return new RenderFrameImpl(render_view, routing_id); | 490 return new RenderFrameImpl(render_view, routing_id); |
(...skipping 3779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4269 | 4270 |
4270 #if defined(ENABLE_BROWSER_CDMS) | 4271 #if defined(ENABLE_BROWSER_CDMS) |
4271 RendererCdmManager* RenderFrameImpl::GetCdmManager() { | 4272 RendererCdmManager* RenderFrameImpl::GetCdmManager() { |
4272 if (!cdm_manager_) | 4273 if (!cdm_manager_) |
4273 cdm_manager_ = new RendererCdmManager(this); | 4274 cdm_manager_ = new RendererCdmManager(this); |
4274 return cdm_manager_; | 4275 return cdm_manager_; |
4275 } | 4276 } |
4276 #endif // defined(ENABLE_BROWSER_CDMS) | 4277 #endif // defined(ENABLE_BROWSER_CDMS) |
4277 | 4278 |
4278 } // namespace content | 4279 } // namespace content |
OLD | NEW |