15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/android/bookmark_model_sql_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_utils.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/history/core/browser/url_database.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The interesting columns of this handler. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const HistoryAndBookmarkRow::ColumnID kInterestingColumns[] = { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow::BOOKMARK, HistoryAndBookmarkRow::TITLE }; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkModelSQLHandler::Task::Task() { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkModelSQLHandler::Task::AddBookmarkToMobileFolder( 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* bookmark_model = GetBookmarkModel(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bookmark_model) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* mobile_node = bookmark_model->mobile_node(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mobile_node) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model->AddURL(mobile_node, 0, title, url); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkModelSQLHandler::Task::AddBookmark(const GURL& url, 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 parent_id) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* bookmark_model = GetBookmarkModel(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bookmark_model) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const BookmarkNode* parent = 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bookmarks::GetBookmarkNodeByID(bookmark_model, parent_id); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parent) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model->AddURL(parent, 0, title, url); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkModelSQLHandler::Task::RemoveBookmark(const GURL& url) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* bookmark_model = GetBookmarkModel(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bookmark_model) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<const BookmarkNode*> nodes; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model->GetNodesByURL(url, &nodes); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<const BookmarkNode*>::iterator i = nodes.begin(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != nodes.end(); ++i) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent_node = (*i)->parent(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model->Remove(parent_node, parent_node->GetIndexOf(*i)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void BookmarkModelSQLHandler::Task::UpdateBookmarkTitle( 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL& url, 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* bookmark_model = GetBookmarkModel(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bookmark_model) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<const BookmarkNode*> nodes; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model->GetNodesByURL(url, &nodes); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<const BookmarkNode*>::iterator i = nodes.begin(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != nodes.end(); ++i) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model->SetTitle(*i, title); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkModelSQLHandler::Task::~Task() { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkModel* BookmarkModelSQLHandler::Task::GetBookmarkModel() { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = ProfileManager::GetLastUsedProfile(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!profile) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BookmarkModelFactory::GetForProfile(profile); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkModelSQLHandler::BookmarkModelSQLHandler( 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLDatabase* url_database) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : SQLHandler(kInterestingColumns, arraysize(kInterestingColumns)), 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_database_(url_database) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkModelSQLHandler::~BookmarkModelSQLHandler() { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BookmarkModelSQLHandler::Update(const HistoryAndBookmarkRow& row, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TableIDRows& ids_set) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (TableIDRows::const_iterator i = ids_set.begin(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != ids_set.end(); ++i) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row.is_value_set_explicitly(HistoryAndBookmarkRow::BOOKMARK)) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row.is_bookmark()) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow url_row; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url_database_->GetURLRow(i->url_id, &url_row)) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row.is_value_set_explicitly(HistoryAndBookmarkRow::PARENT_ID)) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &BookmarkModelSQLHandler::Task::AddBookmark, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<BookmarkModelSQLHandler::Task>( 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BookmarkModelSQLHandler::Task()), 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->url, url_row.title(), row.parent_id())); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &BookmarkModelSQLHandler::Task::AddBookmarkToMobileFolder, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<BookmarkModelSQLHandler::Task>( 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BookmarkModelSQLHandler::Task()), 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->url, url_row.title())); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &BookmarkModelSQLHandler::Task::RemoveBookmark, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<BookmarkModelSQLHandler::Task>( 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BookmarkModelSQLHandler::Task()), 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->url)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (row.is_value_set_explicitly(HistoryAndBookmarkRow::TITLE)) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &BookmarkModelSQLHandler::Task::UpdateBookmarkTitle, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<BookmarkModelSQLHandler::Task>( 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BookmarkModelSQLHandler::Task()), 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->url, row.title())); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BookmarkModelSQLHandler::Delete(const TableIDRows& ids_set) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (TableIDRows::const_iterator i = ids_set.begin(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != ids_set.end(); ++i) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &BookmarkModelSQLHandler::Task::RemoveBookmark, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<BookmarkModelSQLHandler::Task>( 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BookmarkModelSQLHandler::Task()), 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->url)); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BookmarkModelSQLHandler::Insert(HistoryAndBookmarkRow* row) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(row->is_value_set_explicitly(HistoryAndBookmarkRow::URL)); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row->is_value_set_explicitly(HistoryAndBookmarkRow::BOOKMARK) || 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !row->is_bookmark()) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row->is_value_set_explicitly(HistoryAndBookmarkRow::PARENT_ID)) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &BookmarkModelSQLHandler::Task::AddBookmark, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<BookmarkModelSQLHandler::Task>( 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BookmarkModelSQLHandler::Task()), 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row->url(), row->title(), row->parent_id())); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &BookmarkModelSQLHandler::Task::AddBookmarkToMobileFolder, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<BookmarkModelSQLHandler::Task>( 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BookmarkModelSQLHandler::Task()), 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row->url(), row->title())); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace history 176