OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/browser/tab_contents/web_contents.h" | 5 #include "chrome/browser/tab_contents/web_contents.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/file_version_info.h" | 9 #include "base/file_version_info.h" |
10 #include "base/process_util.h" | 10 #include "base/process_util.h" |
11 #include "chrome/app/locales/locale_settings.h" | 11 #include "chrome/app/locales/locale_settings.h" |
12 #include "chrome/browser/autofill_manager.h" | 12 #include "chrome/browser/autofill_manager.h" |
13 #include "chrome/browser/bookmarks/bookmark_model.h" | 13 #include "chrome/browser/bookmarks/bookmark_model.h" |
14 #include "chrome/browser/browser.h" | 14 #include "chrome/browser/browser.h" |
15 #include "chrome/browser/cache_manager_host.h" | 15 #include "chrome/browser/cache_manager_host.h" |
16 #include "chrome/browser/character_encoding.h" | 16 #include "chrome/browser/character_encoding.h" |
17 #include "chrome/browser/dom_operation_notification_details.h" | 17 #include "chrome/browser/dom_operation_notification_details.h" |
18 #include "chrome/browser/download/download_manager.h" | 18 #include "chrome/browser/download/download_manager.h" |
19 #include "chrome/browser/download/download_request_manager.h" | 19 #include "chrome/browser/download/download_request_manager.h" |
| 20 #include "chrome/browser/gears_integration.h" |
20 #include "chrome/browser/google_util.h" | 21 #include "chrome/browser/google_util.h" |
21 #include "chrome/browser/js_before_unload_handler.h" | 22 #include "chrome/browser/js_before_unload_handler.h" |
22 #include "chrome/browser/jsmessage_box_handler.h" | 23 #include "chrome/browser/jsmessage_box_handler.h" |
23 #include "chrome/browser/load_from_memory_cache_details.h" | 24 #include "chrome/browser/load_from_memory_cache_details.h" |
24 #include "chrome/browser/load_notification_details.h" | 25 #include "chrome/browser/load_notification_details.h" |
25 #include "chrome/browser/modal_html_dialog_delegate.h" | 26 #include "chrome/browser/modal_html_dialog_delegate.h" |
26 #include "chrome/browser/password_manager/password_manager.h" | 27 #include "chrome/browser/password_manager/password_manager.h" |
27 #include "chrome/browser/plugin_installer.h" | 28 #include "chrome/browser/plugin_installer.h" |
28 #include "chrome/browser/plugin_service.h" | 29 #include "chrome/browser/plugin_service.h" |
29 #include "chrome/browser/printing/print_job.h" | 30 #include "chrome/browser/printing/print_job.h" |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 this, NotificationType::URLS_STARRED, NotificationService::AllSources()); | 209 this, NotificationType::URLS_STARRED, NotificationService::AllSources()); |
209 NotificationService::current()->AddObserver( | 210 NotificationService::current()->AddObserver( |
210 this, NotificationType::BOOKMARK_MODEL_LOADED, | 211 this, NotificationType::BOOKMARK_MODEL_LOADED, |
211 NotificationService::AllSources()); | 212 NotificationService::AllSources()); |
212 NotificationService::current()->AddObserver( | 213 NotificationService::current()->AddObserver( |
213 this, NotificationType::RENDER_WIDGET_HOST_DESTROYED, | 214 this, NotificationType::RENDER_WIDGET_HOST_DESTROYED, |
214 NotificationService::AllSources()); | 215 NotificationService::AllSources()); |
215 } | 216 } |
216 | 217 |
217 WebContents::~WebContents() { | 218 WebContents::~WebContents() { |
218 if (web_app_.get()) | |
219 web_app_->RemoveObserver(this); | |
220 if (pending_install_.callback_functor) | 219 if (pending_install_.callback_functor) |
221 pending_install_.callback_functor->Cancel(); | 220 pending_install_.callback_functor->Cancel(); |
222 NotificationService::current()->RemoveObserver( | 221 NotificationService::current()->RemoveObserver( |
223 this, NotificationType::RENDER_WIDGET_HOST_DESTROYED, | 222 this, NotificationType::RENDER_WIDGET_HOST_DESTROYED, |
224 NotificationService::AllSources()); | 223 NotificationService::AllSources()); |
225 } | 224 } |
226 | 225 |
227 // static | 226 // static |
228 void WebContents::RegisterUserPrefs(PrefService* prefs) { | 227 void WebContents::RegisterUserPrefs(PrefService* prefs) { |
229 prefs->RegisterBooleanPref(prefs::kAlternateErrorPagesEnabled, true); | 228 prefs->RegisterBooleanPref(prefs::kAlternateErrorPagesEnabled, true); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 NotifyDisconnected(); | 321 NotifyDisconnected(); |
323 HungRendererWarning::HideForWebContents(this); | 322 HungRendererWarning::HideForWebContents(this); |
324 render_manager_.Shutdown(); | 323 render_manager_.Shutdown(); |
325 TabContents::Destroy(); | 324 TabContents::Destroy(); |
326 } | 325 } |
327 | 326 |
328 SiteInstance* WebContents::GetSiteInstance() const { | 327 SiteInstance* WebContents::GetSiteInstance() const { |
329 return render_manager_.current_host()->site_instance(); | 328 return render_manager_.current_host()->site_instance(); |
330 } | 329 } |
331 | 330 |
332 SkBitmap WebContents::GetFavIcon() { | |
333 if (web_app_.get() && IsWebApplicationActive()) { | |
334 SkBitmap app_icon = web_app_->GetFavIcon(); | |
335 if (!app_icon.isNull()) | |
336 return app_icon; | |
337 } | |
338 return TabContents::GetFavIcon(); | |
339 } | |
340 | |
341 std::wstring WebContents::GetStatusText() const { | 331 std::wstring WebContents::GetStatusText() const { |
342 if (!is_loading() || load_state_ == net::LOAD_STATE_IDLE) | 332 if (!is_loading() || load_state_ == net::LOAD_STATE_IDLE) |
343 return std::wstring(); | 333 return std::wstring(); |
344 | 334 |
345 switch (load_state_) { | 335 switch (load_state_) { |
346 case net::LOAD_STATE_WAITING_FOR_CACHE: | 336 case net::LOAD_STATE_WAITING_FOR_CACHE: |
347 return l10n_util::GetString(IDS_LOAD_STATE_WAITING_FOR_CACHE); | 337 return l10n_util::GetString(IDS_LOAD_STATE_WAITING_FOR_CACHE); |
348 case net::LOAD_STATE_RESOLVING_PROXY_FOR_URL: | 338 case net::LOAD_STATE_RESOLVING_PROXY_FOR_URL: |
349 return l10n_util::GetString(IDS_LOAD_STATE_RESOLVING_PROXY_FOR_URL); | 339 return l10n_util::GetString(IDS_LOAD_STATE_RESOLVING_PROXY_FOR_URL); |
350 case net::LOAD_STATE_RESOLVING_HOST: | 340 case net::LOAD_STATE_RESOLVING_HOST: |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 HWND WebContents::GetContainerHWND() const { | 482 HWND WebContents::GetContainerHWND() const { |
493 return view_->GetNativeView(); | 483 return view_->GetNativeView(); |
494 } | 484 } |
495 HWND WebContents::GetContentHWND() { | 485 HWND WebContents::GetContentHWND() { |
496 return view_->GetContentNativeView(); | 486 return view_->GetContentNativeView(); |
497 } | 487 } |
498 void WebContents::GetContainerBounds(gfx::Rect *out) const { | 488 void WebContents::GetContainerBounds(gfx::Rect *out) const { |
499 view_->GetContainerBounds(out); | 489 view_->GetContainerBounds(out); |
500 } | 490 } |
501 | 491 |
502 void WebContents::SetWebApp(WebApp* web_app) { | |
503 if (web_app_.get()) { | |
504 web_app_->RemoveObserver(this); | |
505 web_app_->SetWebContents(NULL); | |
506 } | |
507 | |
508 web_app_ = web_app; | |
509 if (web_app) { | |
510 web_app->AddObserver(this); | |
511 web_app_->SetWebContents(this); | |
512 } | |
513 } | |
514 | |
515 bool WebContents::IsWebApplication() const { | |
516 return (web_app_.get() != NULL); | |
517 } | |
518 | |
519 void WebContents::CreateShortcut() { | 492 void WebContents::CreateShortcut() { |
520 NavigationEntry* entry = controller()->GetLastCommittedEntry(); | 493 NavigationEntry* entry = controller()->GetLastCommittedEntry(); |
521 if (!entry) | 494 if (!entry) |
522 return; | 495 return; |
523 | 496 |
524 // We only allow one pending install request. By resetting the page id we | 497 // We only allow one pending install request. By resetting the page id we |
525 // effectively cancel the pending install request. | 498 // effectively cancel the pending install request. |
526 pending_install_.page_id = entry->page_id(); | 499 pending_install_.page_id = entry->page_id(); |
527 pending_install_.icon = GetFavIcon(); | 500 pending_install_.icon = GetFavIcon(); |
528 pending_install_.title = GetTitle(); | 501 pending_install_.title = GetTitle(); |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
934 bool errored, | 907 bool errored, |
935 const SkBitmap& image) { | 908 const SkBitmap& image) { |
936 // A notification for downloading would be more flexible, but for now I'm | 909 // A notification for downloading would be more flexible, but for now I'm |
937 // forwarding to the two places that could possibly have initiated the | 910 // forwarding to the two places that could possibly have initiated the |
938 // request. If we end up with another place invoking DownloadImage, probably | 911 // request. If we end up with another place invoking DownloadImage, probably |
939 // best to refactor out into notification service, or something similar. | 912 // best to refactor out into notification service, or something similar. |
940 if (errored) | 913 if (errored) |
941 fav_icon_helper_.FavIconDownloadFailed(id); | 914 fav_icon_helper_.FavIconDownloadFailed(id); |
942 else | 915 else |
943 fav_icon_helper_.SetFavIcon(id, image_url, image); | 916 fav_icon_helper_.SetFavIcon(id, image_url, image); |
944 if (web_app_.get() && !errored) | |
945 web_app_->SetImage(image_url, image); | |
946 } | 917 } |
947 | 918 |
948 void WebContents::RequestOpenURL(const GURL& url, const GURL& referrer, | 919 void WebContents::RequestOpenURL(const GURL& url, const GURL& referrer, |
949 WindowOpenDisposition disposition) { | 920 WindowOpenDisposition disposition) { |
950 OpenURL(url, referrer, disposition, PageTransition::LINK); | 921 OpenURL(url, referrer, disposition, PageTransition::LINK); |
951 } | 922 } |
952 | 923 |
953 void WebContents::DomOperationResponse(const std::string& json_string, | 924 void WebContents::DomOperationResponse(const std::string& json_string, |
954 int automation_id) { | 925 int automation_id) { |
955 DomOperationNotificationDetails details(json_string, automation_id); | 926 DomOperationNotificationDetails details(json_string, automation_id); |
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1537 | 1508 |
1538 void WebContents::UpdateAlternateErrorPageURL() { | 1509 void WebContents::UpdateAlternateErrorPageURL() { |
1539 GURL url = GetAlternateErrorPageURL(); | 1510 GURL url = GetAlternateErrorPageURL(); |
1540 render_view_host()->SetAlternateErrorPageURL(url); | 1511 render_view_host()->SetAlternateErrorPageURL(url); |
1541 } | 1512 } |
1542 | 1513 |
1543 void WebContents::UpdateWebPreferences() { | 1514 void WebContents::UpdateWebPreferences() { |
1544 render_view_host()->UpdateWebPreferences(GetWebkitPrefs()); | 1515 render_view_host()->UpdateWebPreferences(GetWebkitPrefs()); |
1545 } | 1516 } |
1546 | 1517 |
1547 bool WebContents::IsWebApplicationActive() const { | |
1548 if (!web_app_.get()) | |
1549 return false; | |
1550 | |
1551 // If we are inside an application, the application is always active. For | |
1552 // example, this allows us to display the GMail icon even when we are bounced | |
1553 // the login page. | |
1554 if (delegate() && delegate()->IsApplication()) | |
1555 return true; | |
1556 | |
1557 return (GetURL() == web_app_->url()); | |
1558 } | |
1559 | |
1560 void WebContents::WebAppImagesChanged(WebApp* web_app) { | |
1561 DCHECK(web_app == web_app_.get()); | |
1562 if (delegate() && IsWebApplicationActive()) | |
1563 delegate()->NavigationStateChanged(this, TabContents::INVALIDATE_FAVICON); | |
1564 } | |
1565 | |
1566 void WebContents::OnGearsCreateShortcutDone( | 1518 void WebContents::OnGearsCreateShortcutDone( |
1567 const GearsShortcutData& shortcut_data, bool success) { | 1519 const GearsShortcutData& shortcut_data, bool success) { |
1568 NavigationEntry* current_entry = controller()->GetLastCommittedEntry(); | 1520 NavigationEntry* current_entry = controller()->GetLastCommittedEntry(); |
1569 bool same_page = | 1521 bool same_page = |
1570 current_entry && pending_install_.page_id == current_entry->page_id(); | 1522 current_entry && pending_install_.page_id == current_entry->page_id(); |
1571 | 1523 |
1572 if (success && same_page) { | 1524 if (success && same_page) { |
1573 // Only switch to app mode if the user chose to create a shortcut and | 1525 // Only switch to app mode if the user chose to create a shortcut and |
1574 // we're still on the same page that it corresponded to. | 1526 // we're still on the same page that it corresponded to. |
1575 SetWebApp(new WebApp(profile(), shortcut_data)); | |
1576 if (delegate()) | 1527 if (delegate()) |
1577 delegate()->ConvertContentsToApplication(this); | 1528 delegate()->ConvertContentsToApplication(this); |
1578 } | 1529 } |
1579 | 1530 |
1580 // Reset the page id to indicate no requests are pending. | 1531 // Reset the page id to indicate no requests are pending. |
1581 pending_install_.page_id = 0; | 1532 pending_install_.page_id = 0; |
1582 pending_install_.callback_functor = NULL; | 1533 pending_install_.callback_functor = NULL; |
1583 } | 1534 } |
1584 | 1535 |
1585 void WebContents::UpdateMaxPageIDIfNecessary(SiteInstance* site_instance, | 1536 void WebContents::UpdateMaxPageIDIfNecessary(SiteInstance* site_instance, |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1769 // The favicon url isn't valid. This means there really isn't a favicon, | 1720 // The favicon url isn't valid. This means there really isn't a favicon, |
1770 // or the favicon url wasn't obtained before the load started. This assumes | 1721 // or the favicon url wasn't obtained before the load started. This assumes |
1771 // the later. | 1722 // the later. |
1772 // TODO(sky): Need a way to set the favicon that doesn't involve generating | 1723 // TODO(sky): Need a way to set the favicon that doesn't involve generating |
1773 // its url. | 1724 // its url. |
1774 new_url->SetFavIconURL(TemplateURL::GenerateFaviconURL(params.referrer)); | 1725 new_url->SetFavIconURL(TemplateURL::GenerateFaviconURL(params.referrer)); |
1775 } | 1726 } |
1776 new_url->set_safe_for_autoreplace(true); | 1727 new_url->set_safe_for_autoreplace(true); |
1777 url_model->Add(new_url); | 1728 url_model->Add(new_url); |
1778 } | 1729 } |
OLD | NEW |