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