Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Side by Side Diff: extensions/browser/guest_view/web_view/web_view_guest.cc

Issue 618823002: GuestView: Move lifetime management out of content (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed browser_pluign_browsertest + fixed lifetime issue (brittle) Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "extensions/browser/guest_view/web_view/web_view_guest.h" 5 #include "extensions/browser/guest_view/web_view/web_view_guest.h"
6 6
7 #include "base/message_loop/message_loop.h" 7 #include "base/message_loop/message_loop.h"
8 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "content/public/browser/browser_context.h" 10 #include "content/public/browser/browser_context.h"
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 std::string user_agent_override; 266 std::string user_agent_override;
267 if (attach_params()->GetString(webview::kParameterUserAgentOverride, 267 if (attach_params()->GetString(webview::kParameterUserAgentOverride,
268 &user_agent_override)) { 268 &user_agent_override)) {
269 SetUserAgentOverride(user_agent_override); 269 SetUserAgentOverride(user_agent_override);
270 } else { 270 } else {
271 SetUserAgentOverride(""); 271 SetUserAgentOverride("");
272 } 272 }
273 273
274 std::string src; 274 std::string src;
275 if (attach_params()->GetString(webview::kAttributeSrc, &src) && !src.empty()) 275 if (attach_params()->GetString(webview::kAttributeSrc, &src) && !src.empty())
276 NavigateGuest(src); 276 NavigateGuest(src, false /* force_navigation */);
277 277
278 if (GetOpener()) { 278 if (GetOpener()) {
279 // We need to do a navigation here if the target URL has changed between 279 // We need to do a navigation here if the target URL has changed between
280 // the time the WebContents was created and the time it was attached. 280 // the time the WebContents was created and the time it was attached.
281 // We also need to do an initial navigation if a RenderView was never 281 // We also need to do an initial navigation if a RenderView was never
282 // created for the new window in cases where there is no referrer. 282 // created for the new window in cases where there is no referrer.
283 PendingWindowMap::iterator it = 283 PendingWindowMap::iterator it =
284 GetOpener()->pending_new_windows_.find(this); 284 GetOpener()->pending_new_windows_.find(this);
285 if (it != GetOpener()->pending_new_windows_.end()) { 285 if (it != GetOpener()->pending_new_windows_.end()) {
286 const NewWindowInfo& new_window_info = it->second; 286 const NewWindowInfo& new_window_info = it->second;
287 if (new_window_info.changed || !web_contents()->HasOpener()) 287 if (new_window_info.changed || !web_contents()->HasOpener())
288 NavigateGuest(new_window_info.url.spec()); 288 NavigateGuest(new_window_info.url.spec(), false /* force_navigation */);
289 } else { 289 } else {
290 NOTREACHED(); 290 NOTREACHED();
291 } 291 }
292 292
293 // Once a new guest is attached to the DOM of the embedder page, then the 293 // Once a new guest is attached to the DOM of the embedder page, then the
294 // lifetime of the new guest is no longer managed by the opener guest. 294 // lifetime of the new guest is no longer managed by the opener guest.
295 GetOpener()->pending_new_windows_.erase(this); 295 GetOpener()->pending_new_windows_.erase(this);
296 } 296 }
297 297
298 bool allow_transparency = false; 298 bool allow_transparency = false;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 } 376 }
377 377
378 bool WebViewGuest::IsDragAndDropEnabled() const { 378 bool WebViewGuest::IsDragAndDropEnabled() const {
379 return true; 379 return true;
380 } 380 }
381 381
382 void WebViewGuest::WillDestroy() { 382 void WebViewGuest::WillDestroy() {
383 if (!attached() && GetOpener()) 383 if (!attached() && GetOpener())
384 GetOpener()->pending_new_windows_.erase(this); 384 GetOpener()->pending_new_windows_.erase(this);
385 DestroyUnattachedWindows(); 385 DestroyUnattachedWindows();
386
387 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
388 DispatchEventToEmbedder(
389 new GuestViewBase::Event(webview::kEventPluginDestroyed, args.Pass()));
390 } 386 }
391 387
392 bool WebViewGuest::AddMessageToConsole(WebContents* source, 388 bool WebViewGuest::AddMessageToConsole(WebContents* source,
393 int32 level, 389 int32 level,
394 const base::string16& message, 390 const base::string16& message,
395 int32 line_no, 391 int32 line_no,
396 const base::string16& source_id) { 392 const base::string16& source_id) {
397 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); 393 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
398 // Log levels are from base/logging.h: LogSeverity. 394 // Log levels are from base/logging.h: LogSeverity.
399 args->SetInteger(webview::kLevel, level); 395 args->SetInteger(webview::kLevel, level);
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 ExtensionsAPIClient::Get()->CreateWebViewGuestDelegate(this)); 647 ExtensionsAPIClient::Get()->CreateWebViewGuestDelegate(this));
652 } 648 }
653 649
654 WebViewGuest::~WebViewGuest() { 650 WebViewGuest::~WebViewGuest() {
655 } 651 }
656 652
657 void WebViewGuest::DidCommitProvisionalLoadForFrame( 653 void WebViewGuest::DidCommitProvisionalLoadForFrame(
658 content::RenderFrameHost* render_frame_host, 654 content::RenderFrameHost* render_frame_host,
659 const GURL& url, 655 const GURL& url,
660 ui::PageTransition transition_type) { 656 ui::PageTransition transition_type) {
657 if (!render_frame_host->GetParent())
658 src_ = url;
661 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); 659 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
662 args->SetString(guestview::kUrl, url.spec()); 660 args->SetString(guestview::kUrl, url.spec());
663 args->SetBoolean(guestview::kIsTopLevel, !render_frame_host->GetParent()); 661 args->SetBoolean(guestview::kIsTopLevel, !render_frame_host->GetParent());
664 args->SetString(webview::kInternalBaseURLForDataURL, 662 args->SetString(webview::kInternalBaseURLForDataURL,
665 web_contents() 663 web_contents()
666 ->GetController() 664 ->GetController()
667 .GetLastCommittedEntry() 665 .GetLastCommittedEntry()
668 ->GetBaseURLForDataURL() 666 ->GetBaseURLForDataURL()
669 .spec()); 667 .spec());
670 args->SetInteger(webview::kInternalCurrentEntryIndex, 668 args->SetInteger(webview::kInternalCurrentEntryIndex,
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
870 content::ColorChooser* WebViewGuest::OpenColorChooser( 868 content::ColorChooser* WebViewGuest::OpenColorChooser(
871 WebContents* web_contents, 869 WebContents* web_contents,
872 SkColor color, 870 SkColor color,
873 const std::vector<content::ColorSuggestion>& suggestions) { 871 const std::vector<content::ColorSuggestion>& suggestions) {
874 if (!attached() || !embedder_web_contents()->GetDelegate()) 872 if (!attached() || !embedder_web_contents()->GetDelegate())
875 return NULL; 873 return NULL;
876 return embedder_web_contents()->GetDelegate()->OpenColorChooser( 874 return embedder_web_contents()->GetDelegate()->OpenColorChooser(
877 web_contents, color, suggestions); 875 web_contents, color, suggestions);
878 } 876 }
879 877
880 void WebViewGuest::NavigateGuest(const std::string& src) { 878 void WebViewGuest::NavigateGuest(const std::string& src,
879 bool force_navigation) {
880 if (src.empty())
881 return;
882
881 GURL url = ResolveURL(src); 883 GURL url = ResolveURL(src);
882 884
883 // Do not allow navigating a guest to schemes other than known safe schemes. 885 // Do not allow navigating a guest to schemes other than known safe schemes.
884 // This will block the embedder trying to load unwanted schemes, e.g. 886 // This will block the embedder trying to load unwanted schemes, e.g.
885 // chrome://settings. 887 // chrome://settings.
886 bool scheme_is_blocked = 888 bool scheme_is_blocked =
887 (!content::ChildProcessSecurityPolicy::GetInstance()->IsWebSafeScheme( 889 (!content::ChildProcessSecurityPolicy::GetInstance()->IsWebSafeScheme(
888 url.scheme()) && 890 url.scheme()) &&
889 !url.SchemeIs(url::kAboutScheme)) || 891 !url.SchemeIs(url::kAboutScheme)) ||
890 url.SchemeIs(url::kJavaScriptScheme); 892 url.SchemeIs(url::kJavaScriptScheme);
891 if (scheme_is_blocked || !url.is_valid()) { 893 if (scheme_is_blocked || !url.is_valid()) {
892 LoadAbort(true /* is_top_level */, url, 894 LoadAbort(true /* is_top_level */, url,
893 net::ErrorToShortString(net::ERR_ABORTED)); 895 net::ErrorToShortString(net::ERR_ABORTED));
894 return; 896 return;
895 } 897 }
898 if (!force_navigation && (src_ == url))
899 return;
896 900
897 GURL validated_url(url); 901 GURL validated_url(url);
898 web_contents()->GetRenderProcessHost()->FilterURL(false, &validated_url); 902 web_contents()->GetRenderProcessHost()->FilterURL(false, &validated_url);
899 // As guests do not swap processes on navigation, only navigations to 903 // As guests do not swap processes on navigation, only navigations to
900 // normal web URLs are supported. No protocol handlers are installed for 904 // normal web URLs are supported. No protocol handlers are installed for
901 // other schemes (e.g., WebUI or extensions), and no permissions or bindings 905 // other schemes (e.g., WebUI or extensions), and no permissions or bindings
902 // can be granted to the guest process. 906 // can be granted to the guest process.
903 LoadURLWithParams(validated_url, 907 LoadURLWithParams(validated_url,
904 content::Referrer(), 908 content::Referrer(),
905 ui::PAGE_TRANSITION_AUTO_TOPLEVEL, 909 ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
1189 WebViewGuest* guest = 1193 WebViewGuest* guest =
1190 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id); 1194 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id);
1191 if (!guest) 1195 if (!guest)
1192 return; 1196 return;
1193 1197
1194 if (!allow) 1198 if (!allow)
1195 guest->Destroy(); 1199 guest->Destroy();
1196 } 1200 }
1197 1201
1198 } // namespace extensions 1202 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698