| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "chrome/renderer/render_view.h" | 5 #include "chrome/renderer/render_view.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 enabled_bindings_(0), | 444 enabled_bindings_(0), |
| 445 send_preferred_size_changes_(false), | 445 send_preferred_size_changes_(false), |
| 446 script_can_close_(true), | 446 script_can_close_(true), |
| 447 is_loading_(false), | 447 is_loading_(false), |
| 448 navigation_gesture_(NavigationGestureUnknown), | 448 navigation_gesture_(NavigationGestureUnknown), |
| 449 opened_by_user_gesture_(true), | 449 opened_by_user_gesture_(true), |
| 450 opener_suppressed_(false), | 450 opener_suppressed_(false), |
| 451 page_id_(-1), | 451 page_id_(-1), |
| 452 last_page_id_sent_to_browser_(-1), | 452 last_page_id_sent_to_browser_(-1), |
| 453 last_indexed_page_id_(-1), | 453 last_indexed_page_id_(-1), |
| 454 last_top_level_navigation_page_id_(-1), | |
| 455 history_list_offset_(-1), | 454 history_list_offset_(-1), |
| 456 history_list_length_(0), | 455 history_list_length_(0), |
| 457 has_unload_listener_(false), | 456 has_unload_listener_(false), |
| 458 #if defined(OS_MACOSX) | 457 #if defined(OS_MACOSX) |
| 459 has_document_tag_(false), | 458 has_document_tag_(false), |
| 460 #endif | 459 #endif |
| 461 document_tag_(0), | 460 document_tag_(0), |
| 462 cross_origin_access_count_(0), | 461 cross_origin_access_count_(0), |
| 463 same_origin_access_count_(0), | 462 same_origin_access_count_(0), |
| 464 target_url_status_(TARGET_NONE), | 463 target_url_status_(TARGET_NONE), |
| (...skipping 2052 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2517 const WebNode&, WebNavigationPolicy default_policy, bool is_redirect) { | 2516 const WebNode&, WebNavigationPolicy default_policy, bool is_redirect) { |
| 2518 // Webkit is asking whether to navigate to a new URL. | 2517 // Webkit is asking whether to navigate to a new URL. |
| 2519 // This is fine normally, except if we're showing UI from one security | 2518 // This is fine normally, except if we're showing UI from one security |
| 2520 // context and they're trying to navigate to a different context. | 2519 // context and they're trying to navigate to a different context. |
| 2521 const GURL& url = request.url(); | 2520 const GURL& url = request.url(); |
| 2522 | 2521 |
| 2523 // If the browser is interested, then give it a chance to look at top level | 2522 // If the browser is interested, then give it a chance to look at top level |
| 2524 // navigations. | 2523 // navigations. |
| 2525 if (renderer_preferences_.browser_handles_top_level_requests && | 2524 if (renderer_preferences_.browser_handles_top_level_requests && |
| 2526 IsNonLocalTopLevelNavigation(url, frame, type)) { | 2525 IsNonLocalTopLevelNavigation(url, frame, type)) { |
| 2527 last_top_level_navigation_page_id_ = page_id_; | |
| 2528 GURL referrer(request.httpHeaderField(WebString::fromUTF8("Referer"))); | 2526 GURL referrer(request.httpHeaderField(WebString::fromUTF8("Referer"))); |
| 2529 OpenURL(url, referrer, default_policy); | 2527 OpenURL(url, referrer, default_policy); |
| 2530 return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. | 2528 return WebKit::WebNavigationPolicyIgnore; // Suppress the load here. |
| 2531 } | 2529 } |
| 2532 | 2530 |
| 2533 // A content initiated navigation may have originated from a link-click, | 2531 // A content initiated navigation may have originated from a link-click, |
| 2534 // script, drag-n-drop operation, etc. | 2532 // script, drag-n-drop operation, etc. |
| 2535 bool is_content_initiated = | 2533 bool is_content_initiated = |
| 2536 NavigationState::FromDataSource(frame->provisionalDataSource())-> | 2534 NavigationState::FromDataSource(frame->provisionalDataSource())-> |
| 2537 is_content_initiated(); | 2535 is_content_initiated(); |
| (...skipping 2953 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5491 } | 5489 } |
| 5492 | 5490 |
| 5493 bool RenderView::IsNonLocalTopLevelNavigation( | 5491 bool RenderView::IsNonLocalTopLevelNavigation( |
| 5494 const GURL& url, WebKit::WebFrame* frame, WebKit::WebNavigationType type) { | 5492 const GURL& url, WebKit::WebFrame* frame, WebKit::WebNavigationType type) { |
| 5495 // Must be a top level frame. | 5493 // Must be a top level frame. |
| 5496 if (frame->parent() != NULL) | 5494 if (frame->parent() != NULL) |
| 5497 return false; | 5495 return false; |
| 5498 | 5496 |
| 5499 // Navigations initiated within Webkit are not sent out to the external host | 5497 // Navigations initiated within Webkit are not sent out to the external host |
| 5500 // in the following cases. | 5498 // in the following cases. |
| 5501 // 1. The url scheme or the frame url scheme is not http/https | 5499 // 1. The url scheme is not http/https |
| 5502 // 2. The origin of the url and the frame is the same in which case the | 5500 // 2. There is no opener and this is not the first url being opened by this |
| 5501 // RenderView. |
| 5502 // 3. The origin of the url and the opener is the same in which case the |
| 5503 // opener relationship is maintained. | 5503 // opener relationship is maintained. |
| 5504 // 3. Anchor navigation within the same page. | |
| 5505 // 4. Reloads/form submits/back forward navigations | 5504 // 4. Reloads/form submits/back forward navigations |
| 5506 if (!url.SchemeIs("http") && !url.SchemeIs("https")) | 5505 if (!url.SchemeIs("http") && !url.SchemeIs("https")) |
| 5507 return false; | 5506 return false; |
| 5508 | 5507 |
| 5509 GURL frame_url(frame->url()); | |
| 5510 if (!frame_url.SchemeIs("http") && !frame_url.SchemeIs("https")) | |
| 5511 return false; | |
| 5512 | |
| 5513 // Skip if navigation is on the same page (using '#'). | |
| 5514 GURL frame_origin = frame_url.GetOrigin(); | |
| 5515 if (url.GetOrigin() != frame_origin || url.ref().empty()) { | |
| 5516 // The link click could stay on the same page, in cases where it sends some | |
| 5517 // parameters to the same URL. | |
| 5518 if (type == WebKit::WebNavigationTypeLinkClicked) | |
| 5519 return true; | |
| 5520 | |
| 5521 if (last_top_level_navigation_page_id_ != page_id_ && | |
| 5522 // Not interested in reloads. | |
| 5523 type != WebKit::WebNavigationTypeReload && | |
| 5524 type != WebKit::WebNavigationTypeFormSubmitted && | |
| 5525 type != WebKit::WebNavigationTypeBackForward) { | |
| 5526 return true; | |
| 5527 } | |
| 5528 } | |
| 5529 // Not interested in reloads. | 5508 // Not interested in reloads. |
| 5530 if (type != WebKit::WebNavigationTypeReload && | 5509 if (type != WebKit::WebNavigationTypeReload && |
| 5531 type != WebKit::WebNavigationTypeFormSubmitted && | 5510 type != WebKit::WebNavigationTypeFormSubmitted && |
| 5532 type != WebKit::WebNavigationTypeBackForward) { | 5511 type != WebKit::WebNavigationTypeBackForward) { |
| 5533 // The opener relationship between the new window and the parent allows the | 5512 // The opener relationship between the new window and the parent allows the |
| 5534 // new window to script the parent and vice versa. This is not allowed if | 5513 // new window to script the parent and vice versa. This is not allowed if |
| 5535 // the origins of the two domains are different. This can be treated as a | 5514 // the origins of the two domains are different. This can be treated as a |
| 5536 // top level navigation and routed back to the host. | 5515 // top level navigation and routed back to the host. |
| 5537 WebKit::WebFrame* opener = frame->opener(); | 5516 WebKit::WebFrame* opener = frame->opener(); |
| 5538 if (opener) { | 5517 if (!opener) { |
| 5539 if (url.GetOrigin() != GURL(opener->url()).GetOrigin()) | 5518 // If this is the first page being loaded by this RenderView instance then |
| 5519 // it should stay here. |
| 5520 if (page_id_ == -1) { |
| 5521 return false; |
| 5522 } else { |
| 5540 return true; | 5523 return true; |
| 5524 } |
| 5541 } | 5525 } |
| 5526 |
| 5527 if (url.GetOrigin() != GURL(opener->url()).GetOrigin()) |
| 5528 return true; |
| 5542 } | 5529 } |
| 5543 return false; | 5530 return false; |
| 5544 } | 5531 } |
| 5545 | 5532 |
| 5546 void RenderView::OnOpenFileSystemRequestComplete( | 5533 void RenderView::OnOpenFileSystemRequestComplete( |
| 5547 int request_id, bool accepted, const string16& name, | 5534 int request_id, bool accepted, const string16& name, |
| 5548 const string16& root_path) { | 5535 const string16& root_path) { |
| 5549 PendingOpenFileSystem* request = pending_file_system_requests_.Lookup( | 5536 PendingOpenFileSystem* request = pending_file_system_requests_.Lookup( |
| 5550 request_id); | 5537 request_id); |
| 5551 DCHECK(request); | 5538 DCHECK(request); |
| 5552 if (accepted) | 5539 if (accepted) |
| 5553 request->callbacks->didOpenFileSystem(name, root_path); | 5540 request->callbacks->didOpenFileSystem(name, root_path); |
| 5554 else | 5541 else |
| 5555 request->callbacks->didFail(WebKit::WebFileErrorSecurity); | 5542 request->callbacks->didFail(WebKit::WebFileErrorSecurity); |
| 5556 request->callbacks = NULL; | 5543 request->callbacks = NULL; |
| 5557 pending_file_system_requests_.Remove(request_id); | 5544 pending_file_system_requests_.Remove(request_id); |
| 5558 } | 5545 } |
| OLD | NEW |