summaryrefslogtreecommitdiffstats
path: root/ios
diff options
context:
space:
mode:
authorolivierrobin <olivierrobin@chromium.org>2016-03-09 01:57:09 -0800
committerCommit bot <commit-bot@chromium.org>2016-03-09 09:58:00 +0000
commit6dcdc792ef43d576cdaa203f8aa34d0e02497f73 (patch)
treea1f60e951b400d60075f1c46436baef1b5e2ee01 /ios
parentcb93e6798bc326215322975d9875540142e9a134 (diff)
downloadchromium_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')
-rw-r--r--ios/chrome/browser/share_extension/share_extension_item_receiver.h13
-rw-r--r--ios/chrome/browser/share_extension/share_extension_item_receiver.mm39
-rw-r--r--ios/chrome/browser/share_extension/share_extension_service.h18
-rw-r--r--ios/chrome/browser/share_extension/share_extension_service.mm39
-rw-r--r--ios/chrome/browser/share_extension/share_extension_service_factory.cc3
-rw-r--r--ios/chrome/common/app_group/app_group_constants.h13
-rw-r--r--ios/chrome/common/app_group/app_group_constants.mm1
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];