OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/chrome_content_renderer_client.h" | 5 #include "chrome/renderer/chrome_content_renderer_client.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 #include "content/renderer/render_view.h" | 65 #include "content/renderer/render_view.h" |
66 #include "grit/generated_resources.h" | 66 #include "grit/generated_resources.h" |
67 #include "grit/locale_settings.h" | 67 #include "grit/locale_settings.h" |
68 #include "grit/renderer_resources.h" | 68 #include "grit/renderer_resources.h" |
69 #include "net/base/net_errors.h" | 69 #include "net/base/net_errors.h" |
70 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCache.h" | 70 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCache.h" |
71 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h" | 71 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h" |
72 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" | 72 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
73 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 73 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
74 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginParams.h" | 74 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginParams.h" |
| 75 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" |
75 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityPolicy.h" | 76 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityPolicy.h" |
76 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h" | 77 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h" |
77 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLError.h" | 78 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLError.h" |
78 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" | 79 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" |
79 #include "ui/base/l10n/l10n_util.h" | 80 #include "ui/base/l10n/l10n_util.h" |
80 #include "ui/base/resource/resource_bundle.h" | 81 #include "ui/base/resource/resource_bundle.h" |
81 #include "webkit/plugins/npapi/plugin_list.h" | 82 #include "webkit/plugins/npapi/plugin_list.h" |
82 #include "webkit/plugins/ppapi/plugin_module.h" | 83 #include "webkit/plugins/ppapi/plugin_module.h" |
83 | 84 |
84 using autofill::AutofillAgent; | 85 using autofill::AutofillAgent; |
85 using autofill::FormManager; | 86 using autofill::FormManager; |
86 using autofill::PasswordAutofillManager; | 87 using autofill::PasswordAutofillManager; |
87 using WebKit::WebCache; | 88 using WebKit::WebCache; |
88 using WebKit::WebDataSource; | 89 using WebKit::WebDataSource; |
89 using WebKit::WebFrame; | 90 using WebKit::WebFrame; |
90 using WebKit::WebPlugin; | 91 using WebKit::WebPlugin; |
91 using WebKit::WebPluginParams; | 92 using WebKit::WebPluginParams; |
| 93 using WebKit::WebSecurityOrigin; |
92 using WebKit::WebSecurityPolicy; | 94 using WebKit::WebSecurityPolicy; |
93 using WebKit::WebString; | 95 using WebKit::WebString; |
| 96 using WebKit::WebURL; |
94 using WebKit::WebURLError; | 97 using WebKit::WebURLError; |
95 using WebKit::WebURLRequest; | 98 using WebKit::WebURLRequest; |
96 using WebKit::WebURLResponse; | 99 using WebKit::WebURLResponse; |
97 using WebKit::WebVector; | 100 using WebKit::WebVector; |
98 | 101 |
99 namespace { | 102 namespace { |
100 | 103 |
101 const char* kNaClPluginMimeType = "application/x-nacl"; | 104 const char* kNaClPluginMimeType = "application/x-nacl"; |
102 const char* kNaClPluginManifestAttribute = "nacl"; | 105 const char* kNaClPluginManifestAttribute = "nacl"; |
103 | 106 |
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
566 bool ChromeContentRendererClient::AllowPopup(const GURL& creator) { | 569 bool ChromeContentRendererClient::AllowPopup(const GURL& creator) { |
567 // Extensions and apps always allowed to create unrequested popups. The second | 570 // Extensions and apps always allowed to create unrequested popups. The second |
568 // check is necessary to include content scripts. | 571 // check is necessary to include content scripts. |
569 return extension_dispatcher_->extensions()->GetByURL(creator) || | 572 return extension_dispatcher_->extensions()->GetByURL(creator) || |
570 bindings_utils::GetInfoForCurrentContext(); | 573 bindings_utils::GetInfoForCurrentContext(); |
571 } | 574 } |
572 | 575 |
573 bool ChromeContentRendererClient::ShouldFork(WebFrame* frame, | 576 bool ChromeContentRendererClient::ShouldFork(WebFrame* frame, |
574 const GURL& url, | 577 const GURL& url, |
575 bool is_content_initiated, | 578 bool is_content_initiated, |
| 579 bool is_initial_navigation, |
576 bool* send_referrer) { | 580 bool* send_referrer) { |
577 // If the navigation would cross an app extent boundary, we also need | 581 // If the navigation would cross an app extent boundary, we also need |
578 // to defer to the browser to ensure process isolation. | 582 // to defer to the browser to ensure process isolation. |
579 // TODO(erikkay) This is happening inside of a check to is_content_initiated | 583 // TODO(erikkay) This is happening inside of a check to is_content_initiated |
580 // which means that things like the back button won't trigger it. Is that | 584 // which means that things like the back button won't trigger it. Is that |
581 // OK? | 585 // OK? |
582 if (!CrossesExtensionExtents(frame, url)) | 586 if (!CrossesExtensionExtents(frame, url, is_initial_navigation)) |
583 return false; | 587 return false; |
584 | 588 |
585 // Include the referrer in this case since we're going from a hosted web | 589 // Include the referrer in this case since we're going from a hosted web |
586 // page. (the packaged case is handled previously by the extension | 590 // page. (the packaged case is handled previously by the extension |
587 // navigation test) | 591 // navigation test) |
588 *send_referrer = true; | 592 *send_referrer = true; |
589 | 593 |
590 if (is_content_initiated) { | 594 if (is_content_initiated) { |
591 const Extension* extension = | 595 const Extension* extension = |
592 extension_dispatcher_->extensions()->GetByURL(url); | 596 extension_dispatcher_->extensions()->GetByURL(url); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
664 | 668 |
665 *override_state = WebKit::WebPageVisibilityStatePrerender; | 669 *override_state = WebKit::WebPageVisibilityStatePrerender; |
666 return true; | 670 return true; |
667 } | 671 } |
668 | 672 |
669 void ChromeContentRendererClient::SetExtensionDispatcher( | 673 void ChromeContentRendererClient::SetExtensionDispatcher( |
670 ExtensionDispatcher* extension_dispatcher) { | 674 ExtensionDispatcher* extension_dispatcher) { |
671 extension_dispatcher_.reset(extension_dispatcher); | 675 extension_dispatcher_.reset(extension_dispatcher); |
672 } | 676 } |
673 | 677 |
674 bool ChromeContentRendererClient::CrossesExtensionExtents(WebFrame* frame, | 678 bool ChromeContentRendererClient::CrossesExtensionExtents( |
675 const GURL& new_url) { | 679 WebFrame* frame, |
| 680 const GURL& new_url, |
| 681 bool is_initial_navigation) { |
676 const ExtensionSet* extensions = extension_dispatcher_->extensions(); | 682 const ExtensionSet* extensions = extension_dispatcher_->extensions(); |
677 // If the URL is still empty, this is a window.open navigation. Check the | 683 bool is_extension_url = !!extensions->GetByURL(new_url); |
678 // opener's URL. In all cases we use the top frame's URL (as opposed to our | |
679 // frame's) since that's what determines the type of process. | |
680 // TODO(abarth): This code is super sketchy! Are you sure looking at the | |
681 // opener is correct here? This appears to let me steal my opener's | |
682 // privileges if I can make my URL be "empty." | |
683 GURL old_url(frame->top()->document().url()); | 684 GURL old_url(frame->top()->document().url()); |
684 if (old_url.is_empty() && frame->opener()) | 685 |
| 686 // If old_url is still empty and this is an initial navigation, then this is |
| 687 // a window.open operation. We should look at the opener URL. |
| 688 if (is_initial_navigation && old_url.is_empty() && frame->opener()) { |
| 689 // If we're about to open a normal web page from a same-origin opener stuck |
| 690 // in an extension process, we want to keep it in process to allow the |
| 691 // opener to script it. |
| 692 GURL opener_url = frame->opener()->document().url(); |
| 693 bool opener_is_extension_url = !!extensions->GetByURL(opener_url); |
| 694 WebSecurityOrigin opener = frame->opener()->document().securityOrigin(); |
| 695 if (!is_extension_url && |
| 696 !opener_is_extension_url && |
| 697 extension_dispatcher_->is_extension_process() && |
| 698 opener.canRequest(WebURL(new_url))) |
| 699 return false; |
| 700 |
| 701 // In all other cases, we want to compare against the top frame's URL (as |
| 702 // opposed to the opener frame's), since that's what determines the type of |
| 703 // process. This allows iframes outside an app to open a popup in the app. |
685 old_url = frame->top()->opener()->top()->document().url(); | 704 old_url = frame->top()->opener()->top()->document().url(); |
| 705 } |
686 | 706 |
687 // If this is a reload, check whether it has the wrong process type. We | 707 // If this is a reload, check whether it has the wrong process type. We |
688 // should send it to the browser if it's an extension URL (e.g., hosted app) | 708 // should send it to the browser if it's an extension URL (e.g., hosted app) |
689 // in a normal process, or if it's a process for an extension that has been | 709 // in a normal process, or if it's a process for an extension that has been |
690 // uninstalled. | 710 // uninstalled. |
691 if (old_url == new_url) { | 711 if (old_url == new_url) { |
692 bool is_extension_url = !!extensions->GetByURL(new_url); | |
693 if (is_extension_url != extension_dispatcher_->is_extension_process()) | 712 if (is_extension_url != extension_dispatcher_->is_extension_process()) |
694 return true; | 713 return true; |
695 } | 714 } |
696 | 715 |
697 return !extensions->InSameExtent(old_url, new_url); | 716 return !extensions->InSameExtent(old_url, new_url); |
698 } | 717 } |
699 | 718 |
700 void ChromeContentRendererClient::OnPurgeMemory() { | 719 void ChromeContentRendererClient::OnPurgeMemory() { |
701 DVLOG(1) << "Resetting spellcheck in renderer client"; | 720 DVLOG(1) << "Resetting spellcheck in renderer client"; |
702 RenderThread* thread = RenderThread::current(); | 721 RenderThread* thread = RenderThread::current(); |
703 if (spellcheck_.get()) | 722 if (spellcheck_.get()) |
704 thread->RemoveObserver(spellcheck_.get()); | 723 thread->RemoveObserver(spellcheck_.get()); |
705 SpellCheck* new_spellcheck = new SpellCheck(); | 724 SpellCheck* new_spellcheck = new SpellCheck(); |
706 if (spellcheck_provider_) | 725 if (spellcheck_provider_) |
707 spellcheck_provider_->SetSpellCheck(new_spellcheck); | 726 spellcheck_provider_->SetSpellCheck(new_spellcheck); |
708 spellcheck_.reset(new_spellcheck); | 727 spellcheck_.reset(new_spellcheck); |
709 thread->AddObserver(new_spellcheck); | 728 thread->AddObserver(new_spellcheck); |
710 } | 729 } |
711 | 730 |
712 } // namespace chrome | 731 } // namespace chrome |
OLD | NEW |