File: cookies_tree_controller_bridge.mm

package info (click to toggle)
chromium-browser 41.0.2272.118-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 2,189,132 kB
  • sloc: cpp: 9,691,462; ansic: 3,341,451; python: 712,689; asm: 518,779; xml: 208,926; java: 169,820; sh: 119,353; perl: 68,907; makefile: 28,311; yacc: 13,305; objc: 11,385; tcl: 3,186; cs: 2,225; sql: 2,217; lex: 2,215; lisp: 1,349; pascal: 1,256; awk: 407; ruby: 155; sed: 53; php: 14; exp: 11
file content (101 lines) | stat: -rw-r--r-- 3,908 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Copyright 2014 The Chromium Authors. All rights reserved.
// 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/content_settings/cookies_tree_controller_bridge.h"

CookiesTreeControllerBridge::CookiesTreeControllerBridge(
    CookiesTreeModel* model)
    : model_(model),
      cocoa_model_([CocoaNodeFromTreeNode(model_->GetRoot()) retain]) {
  model_->AddObserver(this);
}

CookiesTreeControllerBridge::~CookiesTreeControllerBridge() {
  model_->RemoveObserver(this);
}

// Notification that nodes were added to the specified parent.
void CookiesTreeControllerBridge::TreeNodesAdded(ui::TreeModel* model,
                                                 ui::TreeModelNode* parent,
                                                 int start,
                                                 int count) {
  CocoaCookieTreeNode* cocoa_parent = FindCocoaNode(parent, nil);
  NSMutableArray* cocoa_children = [cocoa_parent mutableChildren];

  [cocoa_model_ willChangeValueForKey:@"children"];
  CookieTreeNode* cookie_parent = static_cast<CookieTreeNode*>(parent);
  for (int i = 0; i < count; ++i) {
    CookieTreeNode* cookie_child = cookie_parent->GetChild(start + i);
    CocoaCookieTreeNode* new_child = CocoaNodeFromTreeNode(cookie_child);
    [cocoa_children addObject:new_child];
  }
  [cocoa_model_ didChangeValueForKey:@"children"];
}

// Notification that nodes were removed from the specified parent.
void CookiesTreeControllerBridge::TreeNodesRemoved(ui::TreeModel* model,
                                                   ui::TreeModelNode* parent,
                                                   int start,
                                                   int count) {
  CocoaCookieTreeNode* cocoa_parent = FindCocoaNode(parent, nil);
  NSMutableArray* cocoa_children = [cocoa_parent mutableChildren];
  [cocoa_model_ willChangeValueForKey:@"children"];
  for (int i = start + count - 1; i >= start; --i) {
    [cocoa_children removeObjectAtIndex:i];
  }
  [cocoa_model_ didChangeValueForKey:@"children"];
}

// Notification that the contents of a node has changed.
void CookiesTreeControllerBridge::TreeNodeChanged(ui::TreeModel* model,
                                                  ui::TreeModelNode* node) {
  [cocoa_model_ willChangeValueForKey:@"children"];
  CocoaCookieTreeNode* changed_node = FindCocoaNode(node, nil);
  [changed_node rebuild];
  [cocoa_model_ didChangeValueForKey:@"children"];
}

CocoaCookieTreeNode* CookiesTreeControllerBridge::CocoaNodeFromTreeNode(
    ui::TreeModelNode* node) {
  CookieTreeNode* cookie_node = static_cast<CookieTreeNode*>(node);
  return [[[CocoaCookieTreeNode alloc] initWithNode:cookie_node] autorelease];
}

// Does breadth-first search on the tree to find |node|. This method is most
// commonly used to find origin/folder nodes, which are at the first level off
// the root (hence breadth-first search).
CocoaCookieTreeNode* CookiesTreeControllerBridge::FindCocoaNode(
    ui::TreeModelNode* target, CocoaCookieTreeNode* start) {
  if (!start) {
    start = cocoa_model_.get();
  }
  if ([start treeNode] == target) {
    return start;
  }

  // Enqueue the root node of the search (sub-)tree.
  std::queue<CocoaCookieTreeNode*> horizon;
  horizon.push(start);

  // Loop until we've looked at every node or we found the target.
  while (!horizon.empty()) {
    // Dequeue the item at the front.
    CocoaCookieTreeNode* node = horizon.front();
    horizon.pop();

    // If this is the target node, report it up.
    if ([node treeNode] == target)
      return node;

    // Add all child nodes to the queue for searching.
    if (![node isLeaf]) {
      NSArray* children = [node children];
      for (CocoaCookieTreeNode* child in children) {
        horizon.push(child);
      }
    }
  }

  return nil;  // The node could not be found.
}