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 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 base::KillProcess(base::GetCurrentProcessHandle(), 1, false); | 382 base::KillProcess(base::GetCurrentProcessHandle(), 1, false); |
383 } else if (url == GURL(chrome::kChromeUIHangURL)) { | 383 } else if (url == GURL(chrome::kChromeUIHangURL)) { |
384 for (;;) { | 384 for (;;) { |
385 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); | 385 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); |
386 } | 386 } |
387 } else if (url == GURL(chrome::kChromeUIShorthangURL)) { | 387 } else if (url == GURL(chrome::kChromeUIShorthangURL)) { |
388 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(20)); | 388 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(20)); |
389 } | 389 } |
390 } | 390 } |
391 | 391 |
| 392 // Returns false unless this is a top-level navigation. |
| 393 static bool IsTopLevelNavigation(WebFrame* frame) { |
| 394 return frame->parent() == NULL; |
| 395 } |
| 396 |
| 397 // Returns false unless this is a top-level navigation that crosses origins. |
| 398 static bool IsNonLocalTopLevelNavigation(const GURL& url, |
| 399 WebFrame* frame, |
| 400 WebNavigationType type) { |
| 401 if (!IsTopLevelNavigation(frame)) |
| 402 return false; |
| 403 |
| 404 // Navigations initiated within Webkit are not sent out to the external host |
| 405 // in the following cases. |
| 406 // 1. The url scheme is not http/https |
| 407 // 2. The origin of the url and the opener is the same in which case the |
| 408 // opener relationship is maintained. |
| 409 // 3. Reloads/form submits/back forward navigations |
| 410 if (!url.SchemeIs(chrome::kHttpScheme) && !url.SchemeIs(chrome::kHttpsScheme)) |
| 411 return false; |
| 412 |
| 413 // Not interested in reloads/form submits/resubmits/back forward navigations. |
| 414 if (type != WebKit::WebNavigationTypeReload && |
| 415 type != WebKit::WebNavigationTypeFormSubmitted && |
| 416 type != WebKit::WebNavigationTypeFormResubmitted && |
| 417 type != WebKit::WebNavigationTypeBackForward) { |
| 418 // The opener relationship between the new window and the parent allows the |
| 419 // new window to script the parent and vice versa. This is not allowed if |
| 420 // the origins of the two domains are different. This can be treated as a |
| 421 // top level navigation and routed back to the host. |
| 422 WebKit::WebFrame* opener = frame->opener(); |
| 423 if (!opener) { |
| 424 return true; |
| 425 } |
| 426 |
| 427 if (url.GetOrigin() != GURL(opener->document().url()).GetOrigin()) |
| 428 return true; |
| 429 } |
| 430 return false; |
| 431 } |
| 432 |
392 /////////////////////////////////////////////////////////////////////////////// | 433 /////////////////////////////////////////////////////////////////////////////// |
393 | 434 |
394 struct RenderViewImpl::PendingFileChooser { | 435 struct RenderViewImpl::PendingFileChooser { |
395 PendingFileChooser(const content::FileChooserParams& p, | 436 PendingFileChooser(const content::FileChooserParams& p, |
396 WebFileChooserCompletion* c) | 437 WebFileChooserCompletion* c) |
397 : params(p), | 438 : params(p), |
398 completion(c) { | 439 completion(c) { |
399 } | 440 } |
400 content::FileChooserParams params; | 441 content::FileChooserParams params; |
401 WebFileChooserCompletion* completion; // MAY BE NULL to skip callback. | 442 WebFileChooserCompletion* completion; // MAY BE NULL to skip callback. |
(...skipping 1966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2368 WebString origin_str = frame->document().securityOrigin().toString(); | 2409 WebString origin_str = frame->document().securityOrigin().toString(); |
2369 GURL frame_url(origin_str.utf8().data()); | 2410 GURL frame_url(origin_str.utf8().data()); |
2370 // TODO(cevans): revisit whether this origin check is still necessary once | 2411 // TODO(cevans): revisit whether this origin check is still necessary once |
2371 // crbug.com/101395 is fixed. | 2412 // crbug.com/101395 is fixed. |
2372 if (frame_url.GetOrigin() != url.GetOrigin()) { | 2413 if (frame_url.GetOrigin() != url.GetOrigin()) { |
2373 OpenURL(frame, url, referrer, default_policy); | 2414 OpenURL(frame, url, referrer, default_policy); |
2374 return WebKit::WebNavigationPolicyIgnore; | 2415 return WebKit::WebNavigationPolicyIgnore; |
2375 } | 2416 } |
2376 } | 2417 } |
2377 | 2418 |
2378 // If the browser is interested, then give it a chance to look at top level | 2419 // If the browser is interested, then give it a chance to look at the request. |
2379 // navigations. | |
2380 if (is_content_initiated) { | 2420 if (is_content_initiated) { |
2381 bool browser_handles_top_level_requests = | 2421 bool browser_handles_request = |
2382 renderer_preferences_.browser_handles_top_level_requests && | 2422 renderer_preferences_.browser_handles_non_local_top_level_requests && |
2383 IsNonLocalTopLevelNavigation(url, frame, type); | 2423 IsNonLocalTopLevelNavigation(url, frame, type); |
2384 if (browser_handles_top_level_requests || | 2424 if (!browser_handles_request) { |
2385 renderer_preferences_.browser_handles_all_requests) { | 2425 browser_handles_request = |
| 2426 renderer_preferences_.browser_handles_all_top_level_requests && |
| 2427 IsTopLevelNavigation(frame); |
| 2428 } |
| 2429 |
| 2430 if (browser_handles_request) { |
2386 // Reset these counters as the RenderView could be reused for the next | 2431 // Reset these counters as the RenderView could be reused for the next |
2387 // navigation. | 2432 // navigation. |
2388 page_id_ = -1; | 2433 page_id_ = -1; |
2389 last_page_id_sent_to_browser_ = -1; | 2434 last_page_id_sent_to_browser_ = -1; |
2390 OpenURL(frame, url, referrer, default_policy); | 2435 OpenURL(frame, url, referrer, default_policy); |
2391 return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. | 2436 return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. |
2392 } | 2437 } |
2393 } | 2438 } |
2394 | 2439 |
2395 // Detect when we're crossing a permission-based boundary (e.g. into or out of | 2440 // Detect when we're crossing a permission-based boundary (e.g. into or out of |
(...skipping 2935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5331 &override_state)) | 5376 &override_state)) |
5332 return override_state; | 5377 return override_state; |
5333 return current_state; | 5378 return current_state; |
5334 } | 5379 } |
5335 | 5380 |
5336 WebKit::WebUserMediaClient* RenderViewImpl::userMediaClient() { | 5381 WebKit::WebUserMediaClient* RenderViewImpl::userMediaClient() { |
5337 EnsureMediaStreamImpl(); | 5382 EnsureMediaStreamImpl(); |
5338 return media_stream_impl_; | 5383 return media_stream_impl_; |
5339 } | 5384 } |
5340 | 5385 |
5341 bool RenderViewImpl::IsNonLocalTopLevelNavigation( | |
5342 const GURL& url, WebKit::WebFrame* frame, WebKit::WebNavigationType type) { | |
5343 // Must be a top level frame. | |
5344 if (frame->parent() != NULL) | |
5345 return false; | |
5346 | |
5347 // Navigations initiated within Webkit are not sent out to the external host | |
5348 // in the following cases. | |
5349 // 1. The url scheme is not http/https | |
5350 // 2. The origin of the url and the opener is the same in which case the | |
5351 // opener relationship is maintained. | |
5352 // 3. Reloads/form submits/back forward navigations | |
5353 if (!url.SchemeIs(chrome::kHttpScheme) && !url.SchemeIs(chrome::kHttpsScheme)) | |
5354 return false; | |
5355 | |
5356 // Not interested in reloads/form submits/resubmits/back forward navigations. | |
5357 if (type != WebKit::WebNavigationTypeReload && | |
5358 type != WebKit::WebNavigationTypeFormSubmitted && | |
5359 type != WebKit::WebNavigationTypeFormResubmitted && | |
5360 type != WebKit::WebNavigationTypeBackForward) { | |
5361 // The opener relationship between the new window and the parent allows the | |
5362 // new window to script the parent and vice versa. This is not allowed if | |
5363 // the origins of the two domains are different. This can be treated as a | |
5364 // top level navigation and routed back to the host. | |
5365 WebKit::WebFrame* opener = frame->opener(); | |
5366 if (!opener) { | |
5367 return true; | |
5368 } else { | |
5369 if (url.GetOrigin() != GURL(opener->document().url()).GetOrigin()) | |
5370 return true; | |
5371 } | |
5372 } | |
5373 return false; | |
5374 } | |
5375 | |
5376 void RenderViewImpl::OnAsyncFileOpened( | 5386 void RenderViewImpl::OnAsyncFileOpened( |
5377 base::PlatformFileError error_code, | 5387 base::PlatformFileError error_code, |
5378 IPC::PlatformFileForTransit file_for_transit, | 5388 IPC::PlatformFileForTransit file_for_transit, |
5379 int message_id) { | 5389 int message_id) { |
5380 pepper_delegate_.OnAsyncFileOpened( | 5390 pepper_delegate_.OnAsyncFileOpened( |
5381 error_code, | 5391 error_code, |
5382 IPC::PlatformFileForTransitToPlatformFile(file_for_transit), | 5392 IPC::PlatformFileForTransitToPlatformFile(file_for_transit), |
5383 message_id); | 5393 message_id); |
5384 } | 5394 } |
5385 | 5395 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5425 bool RenderViewImpl::WebWidgetHandlesCompositorScheduling() const { | 5435 bool RenderViewImpl::WebWidgetHandlesCompositorScheduling() const { |
5426 return !!RenderThreadImpl::current()->compositor_thread(); | 5436 return !!RenderThreadImpl::current()->compositor_thread(); |
5427 } | 5437 } |
5428 | 5438 |
5429 void RenderViewImpl::OnJavaBridgeInit() { | 5439 void RenderViewImpl::OnJavaBridgeInit() { |
5430 DCHECK(!java_bridge_dispatcher_); | 5440 DCHECK(!java_bridge_dispatcher_); |
5431 #if defined(ENABLE_JAVA_BRIDGE) | 5441 #if defined(ENABLE_JAVA_BRIDGE) |
5432 java_bridge_dispatcher_ = new JavaBridgeDispatcher(this); | 5442 java_bridge_dispatcher_ = new JavaBridgeDispatcher(this); |
5433 #endif | 5443 #endif |
5434 } | 5444 } |
OLD | NEW |