diff options
author | olivierrobin <olivierrobin@chromium.org> | 2016-03-09 01:57:09 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-09 09:58:00 +0000 |
commit | 6dcdc792ef43d576cdaa203f8aa34d0e02497f73 (patch) | |
tree | a1f60e951b400d60075f1c46436baef1b5e2ee01 /ios | |
parent | cb93e6798bc326215322975d9875540142e9a134 (diff) | |
download | chromium_src-6dcdc792ef43d576cdaa203f8aa34d0e02497f73.zip chromium_src-6dcdc792ef43d576cdaa203f8aa34d0e02497f73.tar.gz chromium_src-6dcdc792ef43d576cdaa203f8aa34d0e02497f73.tar.bz2 |
Create Bookmarks from Share Extension
Review URL: https://codereview.chromium.org/1776083002
Cr-Commit-Position: refs/heads/master@{#380110}
Diffstat (limited to 'ios')
7 files changed, 104 insertions, 22 deletions
diff --git a/ios/chrome/browser/share_extension/share_extension_item_receiver.h b/ios/chrome/browser/share_extension/share_extension_item_receiver.h index 748f57f..5cdd2fd 100644 --- a/ios/chrome/browser/share_extension/share_extension_item_receiver.h +++ b/ios/chrome/browser/share_extension/share_extension_item_receiver.h @@ -7,6 +7,10 @@ #import <Foundation/Foundation.h> +namespace bookmarks { +class BookmarkModel; +} + class ReadingListModel; // This class observes the Application group folder @@ -16,11 +20,12 @@ class ReadingListModel; + (instancetype)sharedInstance; -// Sets the reading list model to use. |shutdown| must be called before another -// |model| is set. +// Sets the bookmark and reading list models to use. |shutdown| must be called +// before other models are set. // The receiver will start observe the share extension folder and send items to -// |model|. -- (void)setReadingListModel:(ReadingListModel*)model; +// these models. +- (void)setBookmarkModel:(bookmarks::BookmarkModel*)bookmarkModel + readingListModel:(ReadingListModel*)readingListModel; // Stops observers and pending operations. - (void)shutdown; diff --git a/ios/chrome/browser/share_extension/share_extension_item_receiver.mm b/ios/chrome/browser/share_extension/share_extension_item_receiver.mm index 563f892..03cfd52 100644 --- a/ios/chrome/browser/share_extension/share_extension_item_receiver.mm +++ b/ios/chrome/browser/share_extension/share_extension_item_receiver.mm @@ -13,6 +13,8 @@ #include "base/metrics/histogram.h" #include "base/metrics/user_metrics_action.h" #include "base/strings/sys_string_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "components/bookmarks/browser/bookmark_model.h" #include "ios/chrome/browser/experimental_flags.h" #include "ios/chrome/browser/reading_list/reading_list_model.h" #include "ios/chrome/browser/reading_list/reading_list_model_observer.h" @@ -28,6 +30,7 @@ enum ShareExtensionItemReceived { INVALID_ENTRY = 0, CANCELLED_ENTRY, READINGLIST_ENTRY, + BOOKMARK_ENTRY, SHARE_EXTENSION_ITEM_RECEIVED_COUNT }; @@ -42,6 +45,7 @@ void LogHistogramReceivedItem(ShareExtensionItemReceived type) { BOOL _isObservingFolder; BOOL _folderCreated; ReadingListModel* _readingListModel; // Not owned. + bookmarks::BookmarkModel* _bookmarkModel; // Not owned. } // Checks if the reading list folder is already created and if not, create it. @@ -84,10 +88,13 @@ void LogHistogramReceivedItem(ShareExtensionItemReceived type) { return instance; } -- (void)setReadingListModel:(ReadingListModel*)model { +- (void)setBookmarkModel:(bookmarks::BookmarkModel*)bookmarkModel + readingListModel:(ReadingListModel*)readingListModel { DCHECK_CURRENTLY_ON(web::WebThread::UI); DCHECK(!_readingListModel); - _readingListModel = model; + DCHECK(!_bookmarkModel); + _readingListModel = readingListModel; + _bookmarkModel = bookmarkModel; web::WebThread::PostTask(web::WebThread::FILE, FROM_HERE, base::BindBlock(^() { @@ -171,27 +178,41 @@ void LogHistogramReceivedItem(ShareExtensionItemReceived type) { base::SysNSStringToUTF8([entry objectForKey:app_group::kShareItemTitle]); NSDate* entryDate = base::mac::ObjCCast<NSDate>( [entry objectForKey:app_group::kShareItemDate]); - if (!entryURL.is_valid() || !entryDate) { + NSNumber* entryType = base::mac::ObjCCast<NSNumber>( + [entry objectForKey:app_group::kShareItemType]); + + if (!entryURL.is_valid() || !entryDate || !entryType) { if (completion) { completion(); } return NO; } - LogHistogramReceivedItem(READINGLIST_ENTRY); UMA_HISTOGRAM_TIMES("IOS.ShareExtension.ReceivedEntryDelay", base::TimeDelta::FromSecondsD( [[NSDate date] timeIntervalSinceDate:entryDate])); // Entry is valid. Add it to the reading list model. web::WebThread::PostTask(web::WebThread::UI, FROM_HERE, base::BindBlock(^() { - if (!_readingListModel) { - // Reading list model may have been deleted after - // the file processing - // started. + if (!_readingListModel || !_bookmarkModel) { + // Models may have been deleted after the file + // processing started. return; } - _readingListModel->AddEntry(entryURL, entryTitle); + app_group::ShareExtensionItemType type = + static_cast<app_group::ShareExtensionItemType>( + [entryType integerValue]); + if (type == app_group::READING_LIST_ITEM) { + LogHistogramReceivedItem(READINGLIST_ENTRY); + _readingListModel->AddEntry(entryURL, + entryTitle); + } + if (type == app_group::BOOKMARK_ITEM) { + LogHistogramReceivedItem(BOOKMARK_ENTRY); + _bookmarkModel->AddURL( + _bookmarkModel->mobile_node(), 0, + base::ASCIIToUTF16(entryTitle), entryURL); + } if (completion) { web::WebThread::PostTask(web::WebThread::FILE, FROM_HERE, diff --git a/ios/chrome/browser/share_extension/share_extension_service.h b/ios/chrome/browser/share_extension/share_extension_service.h index bd5bda4..df62907 100644 --- a/ios/chrome/browser/share_extension/share_extension_service.h +++ b/ios/chrome/browser/share_extension/share_extension_service.h @@ -6,9 +6,14 @@ #define IOS_INTERNAL_CHROME_BROWSER_SHARE_EXTENSION_SHARE_EXTENSION_SERVICE_H_ #include "base/memory/scoped_ptr.h" +#include "components/bookmarks/browser/base_bookmark_model_observer.h" #include "components/keyed_service/core/keyed_service.h" #include "ios/chrome/browser/reading_list/reading_list_model_observer.h" +namespace bookmarks { +class BookmarkModel; +} + namespace ios { class ChromeBrowserState; } @@ -18,17 +23,28 @@ class ReadingListModel; // AuthenticationService is the Chrome interface to the iOS shared // authentication library. class ShareExtensionService : public KeyedService, + public bookmarks::BaseBookmarkModelObserver, public ReadingListModelObserver { public: - explicit ShareExtensionService(ReadingListModel* reading_list_model); + explicit ShareExtensionService(bookmarks::BookmarkModel* bookmark_model, + ReadingListModel* reading_list_model); ~ShareExtensionService() override; void Initialize(); void Shutdown() override; void ReadingListModelLoaded(const ReadingListModel* model) override; + void BookmarkModelLoaded(bookmarks::BookmarkModel* model, + bool ids_reassigned) override; + + void BookmarkModelChanged() override {} private: + void AnyModelLoaded(); + ReadingListModel* reading_list_model_; // not owned. + bool reading_list_model_loaded_; + bookmarks::BookmarkModel* bookmark_model_; // not owned; + bool bookmark_model_loaded_; DISALLOW_COPY_AND_ASSIGN(ShareExtensionService); }; diff --git a/ios/chrome/browser/share_extension/share_extension_service.mm b/ios/chrome/browser/share_extension/share_extension_service.mm index d2940c3..976ceb0f 100644 --- a/ios/chrome/browser/share_extension/share_extension_service.mm +++ b/ios/chrome/browser/share_extension/share_extension_service.mm @@ -3,28 +3,57 @@ // found in the LICENSE file. #include "base/mac/scoped_nsobject.h" +#include "components/bookmarks/browser/bookmark_model.h" #include "ios/chrome/browser/reading_list/reading_list_model.h" #include "ios/chrome/browser/share_extension/share_extension_item_receiver.h" #include "ios/chrome/browser/share_extension/share_extension_service.h" -ShareExtensionService::ShareExtensionService(ReadingListModel* model) - : reading_list_model_(model) { - DCHECK(model); +ShareExtensionService::ShareExtensionService( + bookmarks::BookmarkModel* bookmark_model, + ReadingListModel* reading_list_model) + : reading_list_model_(reading_list_model), + reading_list_model_loaded_(false), + bookmark_model_(bookmark_model), + bookmark_model_loaded_(false) { + DCHECK(bookmark_model); + DCHECK(reading_list_model); } ShareExtensionService::~ShareExtensionService() {} void ShareExtensionService::Initialize() { + bookmark_model_->AddObserver(this); + if (bookmark_model_->loaded()) { + bookmark_model_loaded_ = true; + this->AnyModelLoaded(); + } reading_list_model_->AddObserver(this); } void ShareExtensionService::Shutdown() { [[ShareExtensionItemReceiver sharedInstance] shutdown]; reading_list_model_->RemoveObserver(this); + reading_list_model_loaded_ = false; + bookmark_model_->RemoveObserver(this); + bookmark_model_loaded_ = false; } void ShareExtensionService::ReadingListModelLoaded( const ReadingListModel* model) { - [[ShareExtensionItemReceiver sharedInstance] - setReadingListModel:reading_list_model_]; + reading_list_model_loaded_ = true; + this->AnyModelLoaded(); +} + +void ShareExtensionService::BookmarkModelLoaded(bookmarks::BookmarkModel* model, + bool ids_reassigned) { + bookmark_model_loaded_ = true; + this->AnyModelLoaded(); +} + +void ShareExtensionService::AnyModelLoaded() { + if (reading_list_model_loaded_ && bookmark_model_loaded_) { + [[ShareExtensionItemReceiver sharedInstance] + setBookmarkModel:bookmark_model_ + readingListModel:reading_list_model_]; + } } diff --git a/ios/chrome/browser/share_extension/share_extension_service_factory.cc b/ios/chrome/browser/share_extension/share_extension_service_factory.cc index 63f14c8..04f155b 100644 --- a/ios/chrome/browser/share_extension/share_extension_service_factory.cc +++ b/ios/chrome/browser/share_extension/share_extension_service_factory.cc @@ -6,6 +6,7 @@ #include "base/memory/singleton.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" +#include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/reading_list/reading_list_model_factory.h" @@ -34,6 +35,7 @@ ShareExtensionServiceFactory::ShareExtensionServiceFactory() : BrowserStateKeyedServiceFactory( "ShareExtensionService", BrowserStateDependencyManager::GetInstance()) { + DependsOn(ios::BookmarkModelFactory::GetInstance()); DependsOn(ReadingListModelFactory::GetInstance()); } @@ -45,6 +47,7 @@ scoped_ptr<KeyedService> ShareExtensionServiceFactory::BuildServiceInstanceFor( ios::ChromeBrowserState::FromBrowserState(context); scoped_ptr<ShareExtensionService> share_extension_service( new ShareExtensionService( + ios::BookmarkModelFactory::GetForBrowserState(chrome_browser_state), ReadingListModelFactory::GetForBrowserState(chrome_browser_state))); return std::move(share_extension_service); } diff --git a/ios/chrome/common/app_group/app_group_constants.h b/ios/chrome/common/app_group/app_group_constants.h index c9217df..a82b95b 100644 --- a/ios/chrome/common/app_group/app_group_constants.h +++ b/ios/chrome/common/app_group/app_group_constants.h @@ -14,11 +14,17 @@ namespace app_group { // An enum of the different application member of the Chrome app group. // To ensure continuity in metrics log, applications can only be added at the // end. +// Applications directly sending metrics must be added to this enum. enum AppGroupApplications { - APP_GROUP_CHROME, + APP_GROUP_CHROME = 0, APP_GROUP_TODAY_EXTENSION, }; +enum ShareExtensionItemType { + READING_LIST_ITEM = 0, + BOOKMARK_ITEM, +}; + // The x-callback-url indicating that an application in the group requires a // command. extern const char kChromeAppGroupXCallbackCommand[]; @@ -61,12 +67,13 @@ extern const char kChromeAppClientID[]; // metrics reporting. extern const char kUserMetricsEnabledDate[]; -// The four keys of the items sent by the share extension to Chrome (URL, -// title, date, cancel). +// The five keys of the items sent by the share extension to Chrome (URL, +// title, date, cancel, type). extern NSString* const kShareItemURL; extern NSString* const kShareItemTitle; extern NSString* const kShareItemDate; extern NSString* const kShareItemCancel; +extern NSString* const kShareItemType; // The current epoch time, on the first run of chrome on this machine. It is set // once and must be attached to metrics reports forever thereafter. diff --git a/ios/chrome/common/app_group/app_group_constants.mm b/ios/chrome/common/app_group/app_group_constants.mm index f66bf31..ba9cee7 100644 --- a/ios/chrome/common/app_group/app_group_constants.mm +++ b/ios/chrome/common/app_group/app_group_constants.mm @@ -40,6 +40,7 @@ NSString* const kShareItemURL = @"URL"; NSString* const kShareItemTitle = @"Title"; NSString* const kShareItemDate = @"Date"; NSString* const kShareItemCancel = @"Cancel"; +NSString* const kShareItemType = @"Type"; NSString* ApplicationGroup() { NSBundle* bundle = [NSBundle mainBundle]; |