1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/cookies_tree_model_adapter.h" 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/string_number_conversions.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/values.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/cookies_tree_model_util.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/webui/web_ui.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/generated_resources.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/l10n/l10n_util.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace { 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Returns a unique callback name for |adapter|'s requestChildren. 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::string GetRequestChildrenCallbackName(CookiesTreeModelAdapter* adapter) { 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static const char kPrefixLoadCookie[] = "requestChildren"; 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return std::string(kPrefixLoadCookie) + 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::HexEncode(&adapter, sizeof(adapter)); 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenCookiesTreeModelAdapter::CookiesTreeModelAdapter() 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : web_ui_(NULL), 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen model_(NULL), 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen batch_update_(false) { 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenCookiesTreeModelAdapter::~CookiesTreeModelAdapter() { 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (model_) 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen model_->RemoveCookiesTreeObserver(this); 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CookiesTreeModelAdapter::Init(WebUI* web_ui) { 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_ = web_ui; 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->RegisterMessageCallback(GetRequestChildrenCallbackName(this), 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewCallback(this, &CookiesTreeModelAdapter::RequestChildren)); 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CookiesTreeModelAdapter::Bind(const std::string& tree_id, 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CookiesTreeModel* model) { 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(web_ui_); // We should have been initialized. 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(tree_id_.empty() && !model_); // No existing bindings. 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tree_id_ = tree_id; 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen model_ = model; 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen model_->AddCookiesTreeObserver(this); 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen StringValue tree_id_value(tree_id_); 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen StringValue message_name(GetRequestChildrenCallbackName(this)); 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("ui.CookiesTree.setCallback", 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tree_id_value, message_name); 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SendChildren(model_->GetRoot()); 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CookiesTreeModelAdapter::TreeNodesAdded(ui::TreeModel* model, 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui::TreeModelNode* parent, 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int start, 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int count) { 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Skip if there is a batch update in progress. 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (batch_update_) 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CookieTreeNode* parent_node = model_->AsNode(parent); 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen StringValue tree_id(tree_id_); 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<Value> parend_id(GetTreeNodeId(parent_node)); 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FundamentalValue start_value(start); 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ListValue children; 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cookies_tree_model_util::GetChildNodeList(parent_node, start, count, 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &children); 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("ui.CookiesTree.onTreeItemAdded", 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tree_id, *parend_id.get(), start_value, children); 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CookiesTreeModelAdapter::TreeNodesRemoved(ui::TreeModel* model, 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui::TreeModelNode* parent, 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int start, 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int count) { 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Skip if there is a batch update in progress. 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (batch_update_) 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen StringValue tree_id(tree_id_); 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<Value> parend_id(GetTreeNodeId(model_->AsNode(parent))); 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FundamentalValue start_value(start); 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FundamentalValue count_value(count); 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("ui.CookiesTree.onTreeItemRemoved", 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tree_id, *parend_id.get(), start_value, count_value); 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CookiesTreeModelAdapter::TreeModelBeginBatch(CookiesTreeModel* model) { 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(!batch_update_); // There should be no nested batch begin. 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen batch_update_ = true; 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CookiesTreeModelAdapter::TreeModelEndBatch(CookiesTreeModel* model) { 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(batch_update_); 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen batch_update_ = false; 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SendChildren(model_->GetRoot()); 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CookiesTreeModelAdapter::RequestChildren(const ListValue* args) { 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string node_path; 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CHECK(args->GetString(0, &node_path)); 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CookieTreeNode* node = cookies_tree_model_util::GetTreeNodeFromPath( 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen model_->GetRoot(), node_path); 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (node) 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SendChildren(node); 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CookiesTreeModelAdapter::SendChildren(CookieTreeNode* parent) { 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen StringValue tree_id(tree_id_); 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<Value> parend_id(GetTreeNodeId(model_->AsNode(parent))); 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ListValue children; 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cookies_tree_model_util::GetChildNodeList(parent, 0, parent->child_count(), 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &children); 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("ui.CookiesTree.setChildren", 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tree_id, *parend_id.get(), children); 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenValue* CookiesTreeModelAdapter::GetTreeNodeId(CookieTreeNode* node) { 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (node == model_->GetRoot()) 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return Value::CreateNullValue(); 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return Value::CreateStringValue( 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cookies_tree_model_util::GetTreeNodeId(node)); 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 136