| // Copyright 2012 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import "chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.h" |
| |
| #import "base/apple/foundation_util.h" |
| #include "base/check.h" |
| #include "base/check_op.h" |
| #include "base/strings/sys_string_conversions.h" |
| #include "base/uuid.h" |
| #import "chrome/browser/app_controller_mac.h" |
| #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
| #import "chrome/browser/chrome_browser_application_mac.h" |
| #include "chrome/browser/profiles/profile.h" |
| #import "chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.h" |
| #import "chrome/browser/ui/cocoa/applescript/error_applescript.h" |
| #include "components/bookmarks/browser/bookmark_model.h" |
| #include "components/bookmarks/browser/bookmark_node.h" |
| #include "components/bookmarks/browser/bookmark_utils.h" |
| #import "components/bookmarks/common/bookmark_metrics.h" |
| |
| using bookmarks::BookmarkModel; |
| using bookmarks::BookmarkNode; |
| |
| @interface BookmarkNodeAppleScript () |
| |
| // Contains the temporary title when a user creates a new item with the title |
| // specified like: |
| // |
| // make new bookmark folder with properties {title:"foo"} |
| @property (nonatomic, copy) NSString* tempTitle; |
| |
| @end |
| |
| @implementation BookmarkNodeAppleScript { |
| base::Uuid _bookmarkGUID; |
| } |
| |
| @synthesize tempTitle = _tempTitle; |
| |
| - (instancetype)init { |
| if ((self = [super init])) { |
| _bookmarkGUID = base::Uuid::GenerateRandomV4(); |
| self.uniqueID = [NSString |
| stringWithFormat:@"%s", _bookmarkGUID.AsLowercaseString().c_str()]; |
| self.tempTitle = @""; |
| } |
| return self; |
| } |
| |
| - (instancetype)initWithBookmarkNode:(const BookmarkNode*)bookmarkNode { |
| if (!bookmarkNode) { |
| self = nil; |
| return nil; |
| } |
| |
| if ((self = [super init])) { |
| _bookmarkGUID = bookmarkNode->uuid(); |
| self.uniqueID = [NSString |
| stringWithFormat:@"%s", _bookmarkGUID.AsLowercaseString().c_str()]; |
| } |
| return self; |
| } |
| |
| - (base::Uuid)bookmarkGUID { |
| return _bookmarkGUID; |
| } |
| |
| - (void)didCreateBookmarkNode:(const bookmarks::BookmarkNode*)bookmarkNode { |
| CHECK(bookmarkNode); |
| CHECK_EQ(bookmarkNode->uuid(), _bookmarkGUID); |
| |
| self.title = self.tempTitle; |
| } |
| |
| - (const bookmarks::BookmarkNode*)bookmarkNode { |
| return bookmarks::GetBookmarkNodeByUuid(self.bookmarkModel, _bookmarkGUID); |
| } |
| |
| - (NSString*)title { |
| const BookmarkNode* bookmarkNode = self.bookmarkNode; |
| if (!bookmarkNode) { |
| return self.tempTitle; |
| } |
| |
| return base::SysUTF16ToNSString(bookmarkNode->GetTitle()); |
| } |
| |
| - (void)setTitle:(NSString*)title { |
| // If the scripter enters: |
| // |
| // make new bookmarks folder with properties {title:"foo"} |
| // |
| // the node has not yet been created so title is stored in the temp title. |
| const BookmarkNode* bookmarkNode = self.bookmarkNode; |
| if (!bookmarkNode) { |
| self.tempTitle = title; |
| return; |
| } |
| |
| BookmarkModel* model = self.bookmarkModel; |
| if (!model) { |
| return; |
| } |
| |
| model->SetTitle(bookmarkNode, base::SysNSStringToUTF16(title), |
| bookmarks::metrics::BookmarkEditSource::kOther); |
| } |
| |
| - (NSNumber*)index { |
| const BookmarkNode* bookmarkNode = self.bookmarkNode; |
| if (!bookmarkNode) { |
| return nil; |
| } |
| |
| const BookmarkNode* parent = bookmarkNode->parent(); |
| if (!parent) { |
| return nil; |
| } |
| |
| size_t index = parent->GetIndexOf(bookmarkNode).value(); |
| // NOTE: AppleScript is 1-Based. |
| return @(index + 1); |
| } |
| |
| - (BookmarkModel*)bookmarkModel { |
| Profile* lastProfile = AppController.sharedController.lastProfile; |
| if (!lastProfile) { |
| AppleScript::SetError(AppleScript::Error::kGetProfile); |
| return nullptr; |
| } |
| |
| BookmarkModel* model = |
| BookmarkModelFactory::GetForBrowserContext(lastProfile); |
| if (!model->loaded()) { |
| AppleScript::SetError(AppleScript::Error::kBookmarkModelLoad); |
| return nullptr; |
| } |
| |
| return model; |
| } |
| |
| @end |