Chromium Code Reviews| 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/browser/web_contents/web_contents_impl.h" | 5 #include "content/browser/web_contents/web_contents_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 873 | 873 |
| 874 std::set<GURL> WebContentsImpl::GetSitesInTab() const { | 874 std::set<GURL> WebContentsImpl::GetSitesInTab() const { |
| 875 std::set<GURL> sites; | 875 std::set<GURL> sites; |
| 876 frame_tree_.ForEach(base::Bind(&CollectSites, | 876 frame_tree_.ForEach(base::Bind(&CollectSites, |
| 877 base::Unretained(GetBrowserContext()), | 877 base::Unretained(GetBrowserContext()), |
| 878 base::Unretained(&sites))); | 878 base::Unretained(&sites))); |
| 879 return sites; | 879 return sites; |
| 880 } | 880 } |
| 881 | 881 |
| 882 const std::string& WebContentsImpl::GetEncoding() const { | 882 const std::string& WebContentsImpl::GetEncoding() const { |
| 883 return encoding_; | 883 return canonical_encoding_; |
| 884 } | 884 } |
| 885 | 885 |
| 886 bool WebContentsImpl::DisplayedInsecureContent() const { | 886 bool WebContentsImpl::DisplayedInsecureContent() const { |
| 887 return displayed_insecure_content_; | 887 return displayed_insecure_content_; |
| 888 } | 888 } |
| 889 | 889 |
| 890 void WebContentsImpl::IncrementCapturerCount(const gfx::Size& capture_size) { | 890 void WebContentsImpl::IncrementCapturerCount(const gfx::Size& capture_size) { |
| 891 DCHECK(!is_being_destroyed_); | 891 DCHECK(!is_being_destroyed_); |
| 892 ++capturer_count_; | 892 ++capturer_count_; |
| 893 DVLOG(1) << "There are now " << capturer_count_ | 893 DVLOG(1) << "There are now " << capturer_count_ |
| (...skipping 1198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2092 bool WebContentsImpl::WillNotifyDisconnection() const { | 2092 bool WebContentsImpl::WillNotifyDisconnection() const { |
| 2093 return notify_disconnection_; | 2093 return notify_disconnection_; |
| 2094 } | 2094 } |
| 2095 | 2095 |
| 2096 void WebContentsImpl::SetOverrideEncoding(const std::string& encoding) { | 2096 void WebContentsImpl::SetOverrideEncoding(const std::string& encoding) { |
| 2097 SetEncoding(encoding); | 2097 SetEncoding(encoding); |
| 2098 Send(new ViewMsg_SetPageEncoding(GetRoutingID(), encoding)); | 2098 Send(new ViewMsg_SetPageEncoding(GetRoutingID(), encoding)); |
| 2099 } | 2099 } |
| 2100 | 2100 |
| 2101 void WebContentsImpl::ResetOverrideEncoding() { | 2101 void WebContentsImpl::ResetOverrideEncoding() { |
| 2102 encoding_.clear(); | 2102 canonical_encoding_.clear(); |
| 2103 Send(new ViewMsg_ResetPageEncodingToDefault(GetRoutingID())); | 2103 Send(new ViewMsg_ResetPageEncodingToDefault(GetRoutingID())); |
| 2104 } | 2104 } |
| 2105 | 2105 |
| 2106 RendererPreferences* WebContentsImpl::GetMutableRendererPrefs() { | 2106 RendererPreferences* WebContentsImpl::GetMutableRendererPrefs() { |
| 2107 return &renderer_preferences_; | 2107 return &renderer_preferences_; |
| 2108 } | 2108 } |
| 2109 | 2109 |
| 2110 void WebContentsImpl::Close() { | 2110 void WebContentsImpl::Close() { |
| 2111 Close(GetRenderViewHost()); | 2111 Close(GetRenderViewHost()); |
| 2112 } | 2112 } |
| (...skipping 1225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3338 if (entry_index < 0) | 3338 if (entry_index < 0) |
| 3339 return; | 3339 return; |
| 3340 NavigationEntry* entry = controller_.GetEntryAtIndex(entry_index); | 3340 NavigationEntry* entry = controller_.GetEntryAtIndex(entry_index); |
| 3341 | 3341 |
| 3342 if (page_state == entry->GetPageState()) | 3342 if (page_state == entry->GetPageState()) |
| 3343 return; // Nothing to update. | 3343 return; // Nothing to update. |
| 3344 entry->SetPageState(page_state); | 3344 entry->SetPageState(page_state); |
| 3345 controller_.NotifyEntryChanged(entry, entry_index); | 3345 controller_.NotifyEntryChanged(entry, entry_index); |
| 3346 } | 3346 } |
| 3347 | 3347 |
| 3348 void WebContentsImpl::UpdateTitle(RenderViewHost* rvh, | |
| 3349 int32 page_id, | |
| 3350 const base::string16& title, | |
| 3351 base::i18n::TextDirection title_direction) { | |
| 3352 // If we have a title, that's a pretty good indication that we've started | |
| 3353 // getting useful data. | |
| 3354 SetNotWaitingForResponse(); | |
| 3355 | |
| 3356 // Try to find the navigation entry, which might not be the current one. | |
| 3357 // For example, it might be from a pending RVH for the pending entry. | |
| 3358 NavigationEntryImpl* entry = controller_.GetEntryWithPageID( | |
| 3359 rvh->GetSiteInstance(), page_id); | |
| 3360 | |
| 3361 // We can handle title updates when we don't have an entry in | |
| 3362 // UpdateTitleForEntry, but only if the update is from the current RVH. | |
| 3363 if (!entry && rvh != GetRenderViewHost()) | |
| 3364 return; | |
| 3365 | |
| 3366 // TODO(evan): make use of title_direction. | |
| 3367 // http://code.google.com/p/chromium/issues/detail?id=27094 | |
| 3368 if (!UpdateTitleForEntry(entry, title)) | |
| 3369 return; | |
| 3370 | |
| 3371 // Broadcast notifications when the UI should be updated. | |
| 3372 if (entry == controller_.GetEntryAtOffset(0)) | |
| 3373 NotifyNavigationStateChanged(INVALIDATE_TYPE_TITLE); | |
| 3374 } | |
| 3375 | |
| 3376 void WebContentsImpl::UpdateEncoding(RenderViewHost* render_view_host, | |
| 3377 const std::string& encoding) { | |
| 3378 SetEncoding(encoding); | |
| 3379 } | |
| 3380 | |
| 3381 void WebContentsImpl::UpdateTargetURL(int32 page_id, const GURL& url) { | 3348 void WebContentsImpl::UpdateTargetURL(int32 page_id, const GURL& url) { |
| 3382 if (delegate_) | 3349 if (delegate_) |
| 3383 delegate_->UpdateTargetURL(this, page_id, url); | 3350 delegate_->UpdateTargetURL(this, page_id, url); |
| 3384 } | 3351 } |
| 3385 | 3352 |
| 3386 void WebContentsImpl::Close(RenderViewHost* rvh) { | 3353 void WebContentsImpl::Close(RenderViewHost* rvh) { |
| 3387 #if defined(OS_MACOSX) | 3354 #if defined(OS_MACOSX) |
| 3388 // The UI may be in an event-tracking loop, such as between the | 3355 // The UI may be in an event-tracking loop, such as between the |
| 3389 // mouse-down and mouse-up in text selection or a button click. | 3356 // mouse-down and mouse-up in text selection or a button click. |
| 3390 // Defer the close until after tracking is complete, so that we | 3357 // Defer the close until after tracking is complete, so that we |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3489 FOR_EACH_OBSERVER(WebContentsObserver, observers_, | 3456 FOR_EACH_OBSERVER(WebContentsObserver, observers_, |
| 3490 DocumentOnLoadCompletedInMainFrame()); | 3457 DocumentOnLoadCompletedInMainFrame()); |
| 3491 | 3458 |
| 3492 // TODO(avi): Remove. http://crbug.com/170921 | 3459 // TODO(avi): Remove. http://crbug.com/170921 |
| 3493 NotificationService::current()->Notify( | 3460 NotificationService::current()->Notify( |
| 3494 NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, | 3461 NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, |
| 3495 Source<WebContents>(this), | 3462 Source<WebContents>(this), |
| 3496 NotificationService::NoDetails()); | 3463 NotificationService::NoDetails()); |
| 3497 } | 3464 } |
| 3498 | 3465 |
| 3466 void WebContentsImpl::UpdateTitle(RenderFrameHost* render_frame_host, | |
| 3467 int32 page_id, | |
| 3468 const base::string16& title, | |
| 3469 base::i18n::TextDirection title_direction) { | |
| 3470 RenderViewHost* rvh = render_frame_host->GetRenderViewHost(); | |
| 3471 | |
| 3472 // If we have a title, that's a pretty good indication that we've started | |
| 3473 // getting useful data. | |
| 3474 SetNotWaitingForResponse(); | |
| 3475 | |
| 3476 // Try to find the navigation entry, which might not be the current one. | |
| 3477 // For example, it might be from a pending RVH for the pending entry. | |
| 3478 NavigationEntryImpl* entry = controller_.GetEntryWithPageID( | |
| 3479 rvh->GetSiteInstance(), page_id); | |
| 3480 | |
| 3481 // We can handle title updates when we don't have an entry in | |
| 3482 // UpdateTitleForEntry, but only if the update is from the current RVH. | |
| 3483 if (!entry && rvh != GetRenderViewHost()) | |
|
nasko
2014/05/09 16:39:29
Shouldn't this change to check the RFH?
Avi (use Gerrit)
2014/05/09 16:44:07
I'm not good at understanding the current vs pendi
| |
| 3484 return; | |
| 3485 | |
| 3486 // TODO(evan): make use of title_direction. | |
| 3487 // http://code.google.com/p/chromium/issues/detail?id=27094 | |
| 3488 if (!UpdateTitleForEntry(entry, title)) | |
| 3489 return; | |
| 3490 | |
| 3491 // Broadcast notifications when the UI should be updated. | |
| 3492 if (entry == controller_.GetEntryAtOffset(0)) | |
| 3493 NotifyNavigationStateChanged(INVALIDATE_TYPE_TITLE); | |
| 3494 } | |
| 3495 | |
| 3496 void WebContentsImpl::UpdateEncoding(RenderFrameHost* render_frame_host, | |
| 3497 const std::string& encoding) { | |
| 3498 SetEncoding(encoding); | |
| 3499 } | |
| 3500 | |
| 3499 void WebContentsImpl::DocumentAvailableInMainFrame( | 3501 void WebContentsImpl::DocumentAvailableInMainFrame( |
| 3500 RenderViewHost* render_view_host) { | 3502 RenderViewHost* render_view_host) { |
| 3501 FOR_EACH_OBSERVER(WebContentsObserver, observers_, | 3503 FOR_EACH_OBSERVER(WebContentsObserver, observers_, |
| 3502 DocumentAvailableInMainFrame()); | 3504 DocumentAvailableInMainFrame()); |
| 3503 } | 3505 } |
| 3504 void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) { | 3506 void WebContentsImpl::RouteCloseEvent(RenderViewHost* rvh) { |
| 3505 // Tell the active RenderViewHost to run unload handlers and close, as long | 3507 // Tell the active RenderViewHost to run unload handlers and close, as long |
| 3506 // as the request came from a RenderViewHost in the same BrowsingInstance. | 3508 // as the request came from a RenderViewHost in the same BrowsingInstance. |
| 3507 // In most cases, we receive this from a swapped out RenderViewHost. | 3509 // In most cases, we receive this from a swapped out RenderViewHost. |
| 3508 // It is possible to receive it from one that has just been swapped in, | 3510 // It is possible to receive it from one that has just been swapped in, |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3901 if (rfh) { | 3903 if (rfh) { |
| 3902 rfh->JavaScriptDialogClosed(reply_msg, success, user_input, | 3904 rfh->JavaScriptDialogClosed(reply_msg, success, user_input, |
| 3903 dialog_was_suppressed); | 3905 dialog_was_suppressed); |
| 3904 } else { | 3906 } else { |
| 3905 // Don't leak the sync IPC reply if the RFH or process is gone. | 3907 // Don't leak the sync IPC reply if the RFH or process is gone. |
| 3906 delete reply_msg; | 3908 delete reply_msg; |
| 3907 } | 3909 } |
| 3908 } | 3910 } |
| 3909 | 3911 |
| 3910 void WebContentsImpl::SetEncoding(const std::string& encoding) { | 3912 void WebContentsImpl::SetEncoding(const std::string& encoding) { |
| 3911 encoding_ = GetContentClient()->browser()-> | 3913 if (encoding == last_reported_encoding_) |
| 3914 return; | |
| 3915 last_reported_encoding_ = encoding; | |
| 3916 | |
| 3917 canonical_encoding_ = GetContentClient()->browser()-> | |
| 3912 GetCanonicalEncodingNameByAliasName(encoding); | 3918 GetCanonicalEncodingNameByAliasName(encoding); |
| 3913 } | 3919 } |
| 3914 | 3920 |
| 3915 void WebContentsImpl::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) { | 3921 void WebContentsImpl::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) { |
| 3916 RenderWidgetHostViewBase* rwh_view = view_->CreateViewForWidget(rvh); | 3922 RenderWidgetHostViewBase* rwh_view = view_->CreateViewForWidget(rvh); |
| 3917 // Can be NULL during tests. | 3923 // Can be NULL during tests. |
| 3918 if (rwh_view) | 3924 if (rwh_view) |
| 3919 rwh_view->SetSize(GetContainerBounds().size()); | 3925 rwh_view->SetSize(GetContainerBounds().size()); |
| 3920 } | 3926 } |
| 3921 | 3927 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3975 | 3981 |
| 3976 void WebContentsImpl::OnPreferredSizeChanged(const gfx::Size& old_size) { | 3982 void WebContentsImpl::OnPreferredSizeChanged(const gfx::Size& old_size) { |
| 3977 if (!delegate_) | 3983 if (!delegate_) |
| 3978 return; | 3984 return; |
| 3979 const gfx::Size new_size = GetPreferredSize(); | 3985 const gfx::Size new_size = GetPreferredSize(); |
| 3980 if (new_size != old_size) | 3986 if (new_size != old_size) |
| 3981 delegate_->UpdatePreferredSize(this, new_size); | 3987 delegate_->UpdatePreferredSize(this, new_size); |
| 3982 } | 3988 } |
| 3983 | 3989 |
| 3984 } // namespace content | 3990 } // namespace content |
| OLD | NEW |