1ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik<!DOCTYPE html>
2ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik<!--
3ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris CraikCopyright (c) 2012 The Chromium Authors. All rights reserved.
4ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris CraikUse of this source code is governed by a BSD-style license that can be
5ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craikfound in the LICENSE file.
6ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik-->
74a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair<link rel="import" href="/tracing/base/base.html">
8ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik<script>
9ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik'use strict';
10ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
11ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craiktr.exportTo('tr.c', function() {
12ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  function makeCaseInsensitiveRegex(pattern) {
13ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    // See https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/
14ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    // Regular_Expressions.
15ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    pattern = pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
16ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    return new RegExp(pattern, 'i');
17ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  }
18ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
19ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  /**
20ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   * @constructor The generic base class for filtering a Model based on
21ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   * various rules. The base class returns true for everything.
22ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   */
23ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  function Filter() { }
24ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
25ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  Filter.prototype = {
26ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    __proto__: Object.prototype,
27ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
28ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    matchCounter: function(counter) {
29ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      return true;
30ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    },
31ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
32ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    matchCpu: function(cpu) {
33ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      return true;
34ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    },
35ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
36ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    matchProcess: function(process) {
37ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      return true;
38ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    },
39ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
40ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    matchSlice: function(slice) {
41ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      return true;
42ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    },
43ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
44ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    matchThread: function(thread) {
45ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      return true;
46ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    }
47ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  };
48ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
49ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  /**
50ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   * @constructor A filter that matches objects by their name or category
51ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   * case insensitive.
52ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   * .findAllObjectsMatchingFilter
53ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   */
54ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  function TitleOrCategoryFilter(text) {
55ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    Filter.call(this);
56ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    this.regex_ = makeCaseInsensitiveRegex(text);
57ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
58ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    if (!text.length)
59ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      throw new Error('Filter text is empty.');
60ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  }
61ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  TitleOrCategoryFilter.prototype = {
62ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    __proto__: Filter.prototype,
63ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
64ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    matchSlice: function(slice) {
65ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      if (slice.title === undefined && slice.category === undefined)
66ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik        return false;
67ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
68ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      return this.regex_.test(slice.title) ||
69ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik          (!!slice.category && this.regex_.test(slice.category));
70ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    }
71ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  };
72ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
73ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  /**
74ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   * @constructor A filter that matches objects with the exact given title.
75ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   */
76ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  function ExactTitleFilter(text) {
77ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    Filter.call(this);
78ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    this.text_ = text;
79ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
80ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    if (!text.length)
81ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      throw new Error('Filter text is empty.');
82ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  }
83ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  ExactTitleFilter.prototype = {
84ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    __proto__: Filter.prototype,
85ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
86ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    matchSlice: function(slice) {
87ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      return slice.title === this.text_;
88ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    }
89ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  };
90ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
91ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  /**
92ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   * @constructor A filter that matches objects by their full text contents
93ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   * (title, category, args). Note that for performance this filter applies a
94ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   * regex against all the keys of the slice arguments instead of recursing
95ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   * through any embedded sub-objects.
96ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik   */
97ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  function FullTextFilter(text) {
98ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    Filter.call(this);
99ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    this.regex_ = makeCaseInsensitiveRegex(text);
100ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    this.titleOrCategoryFilter_ = new TitleOrCategoryFilter(text);
101ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  }
102ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  FullTextFilter.prototype = {
103ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    __proto__: Filter.prototype,
104ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
105ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    matchObject_: function(obj) {
106ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      for (var key in obj) {
107ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik        if (!obj.hasOwnProperty(key))
108ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik          continue;
109ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik        if (this.regex_.test(key))
110ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik          return true;
111ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik        if (this.regex_.test(obj[key]))
112ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik          return true;
113ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      }
114ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      return false;
115ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    },
116ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
117ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    matchSlice: function(slice) {
118ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      if (this.titleOrCategoryFilter_.matchSlice(slice))
119ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik        return true;
120ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik      return this.matchObject_(slice.args);
121ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    }
122ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  };
123ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik
124ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  return {
125ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    Filter: Filter,
126ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    TitleOrCategoryFilter: TitleOrCategoryFilter,
127ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    ExactTitleFilter: ExactTitleFilter,
128ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik    FullTextFilter: FullTextFilter
129ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik  };
130ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik});
131ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik</script>
132