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

Side by Side Diff: chrome/browser/ui/intents/web_intent_picker_controller.cc

Issue 11137024: Factoring out of FaviconLoader (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 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 | Annotate | Revision Log
OLDNEW
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 "chrome/browser/ui/intents/web_intent_picker_controller.h" 5 #include "chrome/browser/ui/intents/web_intent_picker_controller.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
11 #include "base/md5.h" 11 #include "base/md5.h"
12 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "base/time.h" 13 #include "base/time.h"
14 #include "base/utf_string_conversions.h" 14 #include "base/utf_string_conversions.h"
15 #include "chrome/browser/download/download_util.h" 15 #include "chrome/browser/download/download_util.h"
16 #include "chrome/browser/extensions/extension_service.h" 16 #include "chrome/browser/extensions/extension_service.h"
17 #include "chrome/browser/extensions/platform_app_launcher.h" 17 #include "chrome/browser/extensions/platform_app_launcher.h"
18 #include "chrome/browser/extensions/webstore_installer.h" 18 #include "chrome/browser/extensions/webstore_installer.h"
19 #include "chrome/browser/favicon/favicon_service.h"
20 #include "chrome/browser/favicon/favicon_service_factory.h"
21 #include "chrome/browser/intents/cws_intents_registry_factory.h" 19 #include "chrome/browser/intents/cws_intents_registry_factory.h"
22 #include "chrome/browser/intents/default_web_intent_service.h" 20 #include "chrome/browser/intents/default_web_intent_service.h"
23 #include "chrome/browser/intents/intent_service_host.h" 21 #include "chrome/browser/intents/intent_service_host.h"
24 #include "chrome/browser/intents/native_services.h" 22 #include "chrome/browser/intents/native_services.h"
25 #include "chrome/browser/intents/web_intents_registry_factory.h" 23 #include "chrome/browser/intents/web_intents_registry_factory.h"
26 #include "chrome/browser/intents/web_intents_reporting.h" 24 #include "chrome/browser/intents/web_intents_reporting.h"
27 #include "chrome/browser/profiles/profile.h" 25 #include "chrome/browser/profiles/profile.h"
28 #include "chrome/browser/tab_contents/tab_util.h" 26 #include "chrome/browser/tab_contents/tab_util.h"
29 #include "chrome/browser/ui/browser.h" 27 #include "chrome/browser/ui/browser.h"
30 #include "chrome/browser/ui/browser_finder.h" 28 #include "chrome/browser/ui/browser_finder.h"
31 #include "chrome/browser/ui/browser_list.h" 29 #include "chrome/browser/ui/browser_list.h"
32 #include "chrome/browser/ui/browser_navigator.h" 30 #include "chrome/browser/ui/browser_navigator.h"
33 #include "chrome/browser/ui/browser_tabstrip.h" 31 #include "chrome/browser/ui/browser_tabstrip.h"
34 #include "chrome/browser/ui/browser_window.h" 32 #include "chrome/browser/ui/browser_window.h"
35 #include "chrome/browser/ui/constrained_window_tab_helper.h" 33 #include "chrome/browser/ui/constrained_window_tab_helper.h"
34 #include "chrome/browser/ui/intents/web_intent_icon_loader.h"
36 #include "chrome/browser/ui/intents/web_intent_picker.h" 35 #include "chrome/browser/ui/intents/web_intent_picker.h"
37 #include "chrome/browser/ui/intents/web_intent_picker_model.h" 36 #include "chrome/browser/ui/intents/web_intent_picker_model.h"
38 #include "chrome/browser/ui/tab_contents/tab_contents.h" 37 #include "chrome/browser/ui/tab_contents/tab_contents.h"
39 #include "chrome/browser/ui/tabs/tab_strip_model.h" 38 #include "chrome/browser/ui/tabs/tab_strip_model.h"
40 #include "chrome/browser/webdata/web_data_service.h" 39 #include "chrome/browser/webdata/web_data_service.h"
41 #include "chrome/common/url_constants.h" 40 #include "chrome/common/url_constants.h"
42 #include "content/public/browser/browser_thread.h" 41 #include "content/public/browser/browser_thread.h"
43 #include "content/public/browser/download_manager.h" 42 #include "content/public/browser/download_manager.h"
44 #include "content/public/browser/web_contents.h" 43 #include "content/public/browser/web_contents.h"
45 #include "content/public/browser/web_contents_observer.h" 44 #include "content/public/browser/web_contents_observer.h"
(...skipping 12 matching lines...) Expand all
58 DEFINE_WEB_CONTENTS_USER_DATA_KEY(WebIntentPickerController) 57 DEFINE_WEB_CONTENTS_USER_DATA_KEY(WebIntentPickerController)
59 58
60 namespace { 59 namespace {
61 60
62 // Maximum amount of time to delay displaying dialog while waiting for data. 61 // Maximum amount of time to delay displaying dialog while waiting for data.
63 const int kMaxHiddenSetupTimeMs = 200; 62 const int kMaxHiddenSetupTimeMs = 200;
64 63
65 // Minimum amount of time to show waiting dialog, if it is shown. 64 // Minimum amount of time to show waiting dialog, if it is shown.
66 const int kMinThrobberDisplayTimeMs = 800; 65 const int kMinThrobberDisplayTimeMs = 800;
67 66
68
69 // Gets the favicon service for the specified profile.
70 FaviconService* GetFaviconService(Profile* profile) {
71 return FaviconServiceFactory::GetForProfile(profile,
72 Profile::EXPLICIT_ACCESS);
73 }
74
75 // Gets the web intents registry for the specified profile. 67 // Gets the web intents registry for the specified profile.
76 WebIntentsRegistry* GetWebIntentsRegistry(Profile* profile) { 68 WebIntentsRegistry* GetWebIntentsRegistry(Profile* profile) {
77 return WebIntentsRegistryFactory::GetForProfile(profile); 69 return WebIntentsRegistryFactory::GetForProfile(profile);
78 } 70 }
79 71
80 // Gets the Chrome web store intents registry for the specified profile. 72 // Gets the Chrome web store intents registry for the specified profile.
81 CWSIntentsRegistry* GetCWSIntentsRegistry(Profile* profile) { 73 CWSIntentsRegistry* GetCWSIntentsRegistry(Profile* profile) {
82 return CWSIntentsRegistryFactory::GetForProfile(profile); 74 return CWSIntentsRegistryFactory::GetForProfile(profile);
83 } 75 }
84 76
(...skipping 21 matching lines...) Expand all
106 URLFetcherTrampoline::~URLFetcherTrampoline() { 98 URLFetcherTrampoline::~URLFetcherTrampoline() {
107 } 99 }
108 100
109 void URLFetcherTrampoline::OnURLFetchComplete( 101 void URLFetcherTrampoline::OnURLFetchComplete(
110 const net::URLFetcher* source) { 102 const net::URLFetcher* source) {
111 DCHECK(!callback_.is_null()); 103 DCHECK(!callback_.is_null());
112 callback_.Run(source); 104 callback_.Run(source);
113 delete source; 105 delete source;
114 delete this; 106 delete this;
115 } 107 }
116
117 class SourceWindowObserver : content::WebContentsObserver { 108 class SourceWindowObserver : content::WebContentsObserver {
118 public: 109 public:
119 SourceWindowObserver(content::WebContents* web_contents, 110 SourceWindowObserver(content::WebContents* web_contents,
120 base::WeakPtr<WebIntentPickerController> controller) 111 base::WeakPtr<WebIntentPickerController> controller)
121 : content::WebContentsObserver(web_contents), 112 : content::WebContentsObserver(web_contents),
122 controller_(controller) {} 113 controller_(controller) {}
123 virtual ~SourceWindowObserver() {} 114 virtual ~SourceWindowObserver() {}
124 115
125 // Implement WebContentsObserver 116 // Implement WebContentsObserver
126 virtual void WebContentsDestroyed(content::WebContents* web_contents) { 117 virtual void WebContentsDestroyed(content::WebContents* web_contents) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 picker_model_(new WebIntentPickerModel()), 171 picker_model_(new WebIntentPickerModel()),
181 uma_reporter_(new UMAReporter()), 172 uma_reporter_(new UMAReporter()),
182 pending_async_count_(0), 173 pending_async_count_(0),
183 pending_registry_calls_count_(0), 174 pending_registry_calls_count_(0),
184 pending_cws_request_(false), 175 pending_cws_request_(false),
185 picker_shown_(false), 176 picker_shown_(false),
186 window_disposition_source_(NULL), 177 window_disposition_source_(NULL),
187 source_intents_dispatcher_(NULL), 178 source_intents_dispatcher_(NULL),
188 intents_dispatcher_(NULL), 179 intents_dispatcher_(NULL),
189 service_tab_(NULL), 180 service_tab_(NULL),
181 icon_loader_(NULL),
190 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)), 182 ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)),
191 ALLOW_THIS_IN_INITIALIZER_LIST(timer_factory_(this)), 183 ALLOW_THIS_IN_INITIALIZER_LIST(timer_factory_(this)),
192 ALLOW_THIS_IN_INITIALIZER_LIST(dispatcher_factory_(this)) { 184 ALLOW_THIS_IN_INITIALIZER_LIST(dispatcher_factory_(this)) {
193 native_services_.reset(new web_intents::NativeServiceFactory()); 185 native_services_.reset(new web_intents::NativeServiceFactory());
194 #if defined(TOOLKIT_VIEWS) 186 #if defined(TOOLKIT_VIEWS)
195 cancelled_ = true; 187 cancelled_ = true;
196 #endif 188 #endif
189 icon_loader_.reset(
190 new web_intents::IconLoader(profile_, picker_model_.get()));
197 } 191 }
198 192
199 WebIntentPickerController::~WebIntentPickerController() { 193 WebIntentPickerController::~WebIntentPickerController() {
200 } 194 }
201 195
202 // TODO(gbillock): combine this with ShowDialog. 196 // TODO(gbillock): combine this with ShowDialog.
203 void WebIntentPickerController::SetIntentsDispatcher( 197 void WebIntentPickerController::SetIntentsDispatcher(
204 content::WebIntentsDispatcher* intents_dispatcher) { 198 content::WebIntentsDispatcher* intents_dispatcher) {
205 // TODO(gbillock): This is to account for multiple dispatches in the same tab. 199 // TODO(gbillock): This is to account for multiple dispatches in the same tab.
206 // That is currently not a well-handled case, and this is a band-aid. 200 // That is currently not a well-handled case, and this is a band-aid.
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 } 600 }
607 } 601 }
608 service_tab_ = NULL; 602 service_tab_ = NULL;
609 } 603 }
610 604
611 intents_dispatcher_ = NULL; 605 intents_dispatcher_ = NULL;
612 } 606 }
613 607
614 void WebIntentPickerController::AddServiceToModel( 608 void WebIntentPickerController::AddServiceToModel(
615 const webkit_glue::WebIntentServiceData& service) { 609 const webkit_glue::WebIntentServiceData& service) {
616 FaviconService* favicon_service = GetFaviconService(profile_);
617 610
618 picker_model_->AddInstalledService( 611 picker_model_->AddInstalledService(
619 service.title, 612 service.title,
620 service.service_url, 613 service.service_url,
621 service.disposition); 614 service.disposition);
622 615
623 pending_async_count_++; 616 icon_loader_->LoadFavicon(service.service_url);
624 FaviconService::Handle handle = favicon_service->GetFaviconImageForURL(
625 FaviconService::FaviconForURLParams(
626 profile_,
627 service.service_url,
628 history::FAVICON,
629 gfx::kFaviconSize,
630 &favicon_consumer_),
631 base::Bind(
632 &WebIntentPickerController::OnFaviconDataAvailable,
633 weak_ptr_factory_.GetWeakPtr()));
634 favicon_consumer_.SetClientData(
635 favicon_service, handle, picker_model_->GetInstalledServiceCount() - 1);
636 } 617 }
637 618
638 void WebIntentPickerController::OnWebIntentServicesAvailable( 619 void WebIntentPickerController::OnWebIntentServicesAvailable(
639 const std::vector<webkit_glue::WebIntentServiceData>& services) { 620 const std::vector<webkit_glue::WebIntentServiceData>& services) {
640 for (size_t i = 0; i < services.size(); ++i) 621 for (size_t i = 0; i < services.size(); ++i)
641 AddServiceToModel(services[i]); 622 AddServiceToModel(services[i]);
642 623
643 RegistryCallsCompleted(); 624 RegistryCallsCompleted();
644 AsyncOperationFinished(); 625 AsyncOperationFinished();
645 } 626 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 if (default_service != NULL) { 671 if (default_service != NULL) {
691 InvokeService(*default_service); 672 InvokeService(*default_service);
692 return; 673 return;
693 } 674 }
694 } 675 }
695 676
696 OnPickerEvent(kPickerEventRegistryDataComplete); 677 OnPickerEvent(kPickerEventRegistryDataComplete);
697 OnIntentDataArrived(); 678 OnIntentDataArrived();
698 } 679 }
699 680
700 void WebIntentPickerController::OnFaviconDataAvailable(
701 FaviconService::Handle handle,
702 const history::FaviconImageResult& image_result) {
703 size_t index = favicon_consumer_.GetClientDataForCurrentRequest();
704 if (!image_result.image.IsEmpty()) {
705 picker_model_->UpdateFaviconAt(index, image_result.image);
706 return;
707 }
708
709 AsyncOperationFinished();
710 }
711
712 void WebIntentPickerController::OnCWSIntentServicesAvailable( 681 void WebIntentPickerController::OnCWSIntentServicesAvailable(
713 const CWSIntentsRegistry::IntentExtensionList& extensions) { 682 const CWSIntentsRegistry::IntentExtensionList& extensions) {
714 ExtensionServiceInterface* extension_service = 683 ExtensionServiceInterface* extension_service =
715 profile_->GetExtensionService(); 684 profile_->GetExtensionService();
716 685
717 std::vector<WebIntentPickerModel::SuggestedExtension> suggestions; 686 std::vector<WebIntentPickerModel::SuggestedExtension> suggestions;
718 for (size_t i = 0; i < extensions.size(); ++i) { 687 for (size_t i = 0; i < extensions.size(); ++i) {
719 const CWSIntentsRegistry::IntentExtensionInfo& info = extensions[i]; 688 const CWSIntentsRegistry::IntentExtensionInfo& info = extensions[i];
720 689
721 // Do not include suggestions for already installed extensions. 690 // Do not include suggestions for already installed extensions.
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 // Abandon all callbacks. 774 // Abandon all callbacks.
806 weak_ptr_factory_.InvalidateWeakPtrs(); 775 weak_ptr_factory_.InvalidateWeakPtrs();
807 timer_factory_.InvalidateWeakPtrs(); 776 timer_factory_.InvalidateWeakPtrs();
808 777
809 // Reset state associated with callbacks. 778 // Reset state associated with callbacks.
810 pending_async_count_ = 0; 779 pending_async_count_ = 0;
811 pending_registry_calls_count_ = 0; 780 pending_registry_calls_count_ = 0;
812 pending_cws_request_ = false; 781 pending_cws_request_ = false;
813 782
814 // Reset picker. 783 // Reset picker.
784 icon_loader_.reset();
815 picker_model_.reset(new WebIntentPickerModel()); 785 picker_model_.reset(new WebIntentPickerModel());
786 icon_loader_.reset(
787 new web_intents::IconLoader(profile_, picker_model_.get()));
788
816 picker_shown_ = false; 789 picker_shown_ = false;
817 790
818 DCHECK(web_contents_); 791 DCHECK(web_contents_);
819 ConstrainedWindowTabHelper* constrained_window_tab_helper = 792 ConstrainedWindowTabHelper* constrained_window_tab_helper =
820 ConstrainedWindowTabHelper::FromWebContents(web_contents_); 793 ConstrainedWindowTabHelper::FromWebContents(web_contents_);
821 constrained_window_tab_helper->BlockTabContent(false); 794 constrained_window_tab_helper->BlockTabContent(false);
822 } 795 }
823 796
824 // static 797 // static
825 void WebIntentPickerController::DecodeExtensionIconAndResize( 798 void WebIntentPickerController::DecodeExtensionIconAndResize(
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
1112 content::DownloadManager* download_manager = 1085 content::DownloadManager* download_manager =
1113 content::BrowserContext::GetDownloadManager(profile); 1086 content::BrowserContext::GetDownloadManager(profile);
1114 if (!download_manager) 1087 if (!download_manager)
1115 return; 1088 return;
1116 content::DownloadItem* item = 1089 content::DownloadItem* item =
1117 download_manager->GetDownload(download_id_.local()); 1090 download_manager->GetDownload(download_id_.local());
1118 if (item) 1091 if (item)
1119 item->Cancel(true); 1092 item->Cancel(true);
1120 download_id_ = content::DownloadId(); 1093 download_id_ = content::DownloadId();
1121 } 1094 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698