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