2 * (C) Copyright 2008 Eli Naeher
3 * (C) Copyright 2008 Jeremy Maitin-Shepard
4 * (C) Copyright 2011-2012 John J. Foerch
6 * Use, modification, and distribution are subject to the terms specified in the
10 function history_completions (completer
, root
) {
11 completions
.call(this, completer
);
13 this.root
.containerOpen
= true;
14 this.count
= this.root
.childCount
;
16 history_completions
.prototype = {
17 constructor: history_completions
,
18 __proto__
: completions
.prototype,
19 toString: function () "#<history_completions>",
21 destroy: function () { this.root
.containerOpen
= false; },
22 get_string: function (i
) this.root
.getChild(i
).uri
,
23 get_description: function (i
) this.root
.getChild(i
).title
,
24 get_value: function (i
) this.root
.getChild(i
),
28 define_keywords("$use_history", "$use_bookmarks", "$sort_order");
29 function history_completer () {
32 $use_bookmarks
= false,
33 $sort_order
= "visitcount_descending");
35 this.use_history
= arguments
.$use_history
;
36 this.use_bookmarks
= arguments
.$use_bookmarks
;
37 this.sort_order
= arguments
.$sort_order
;
39 history_completer
.prototype = {
40 constructor: history_completer
,
41 __proto__
: completer
.prototype,
42 toString: function () "#<history_completer>",
46 complete: function (input
, pos
) {
47 var query
= nav_history_service
.getNewQuery();
48 query
.searchTerms
= input
;
49 if (! this.use_history
)
50 query
.onlyBookmarked
= true;
51 var options
= nav_history_service
.getNewQueryOptions();
52 options
.sortingMode
= Ci
.nsINavHistoryQueryOptions
[
53 "SORT_BY_" + this.sort_order
.toUpperCase()];
54 if (this.use_bookmarks
&& ! this.use_history
)
55 options
.queryType
= options
.QUERY_TYPE_BOOKMARKS
;
56 else if (this.use_history
&& ! this.use_bookmarks
)
57 options
.queryType
= options
.QUERY_TYPE_HISTORY
;
59 options
.queryType
= options
.QUERY_TYPE_UNIFIED
; //XXX: not implemented yet
60 var root
= nav_history_service
.executeQuery(query
, options
).root
;
61 return new history_completions(this, root
);
65 define_keywords("$use_webjumps");
66 function url_completer () {
67 keywords(arguments
, $sort_order
= "visitcount_descending");
68 var sort_order
= arguments
.$sort_order
;
70 completers
.push(new file_path_completer());
71 if (arguments
.$use_webjumps
)
72 completers
.push(new webjump_completer());
73 // Do queries separately (which can lead to duplicates). The queries
74 // can be combined when QUERY_TYPE_UNIFIED is implemented.
75 if (arguments
.$use_bookmarks
)
76 completers
.push(new history_completer($use_bookmarks
= true,
77 $sort_order
= sort_order
));
78 if (arguments
.$use_history
)
79 completers
.push(new history_completer($use_history
= true,
80 $sort_order
= sort_order
));
81 merged_completer
.call(this, completers
);
83 url_completer
.prototype = {
84 constructor: url_completer
,
85 __proto__
: merged_completer
.prototype,
86 toString: function () "#<url_completer>"
90 function add_bookmark (url
, title
) {
91 nav_bookmarks_service
.insertBookmark(nav_bookmarks_service
.unfiledBookmarksFolder
,
92 make_uri(url
), -1, title
);
96 // http://mxr.mozilla.org/mozilla-central/source/browser/base/content/sanitize.js
97 // for the Firefox implementation for clearing various history information.
99 function clear_form_history () {
100 var FormHistory
= Cu
.import("resource://gre/modules/FormHistory.jsm", null).FormHistory
;
101 // This is asynchronous, but we don't care about waiting for it to finish.
102 FormHistory
.update( { op
: "remove" } );
104 interactive("clear-form-history",
105 "Permanently delete all form autocomplete history.",
107 clear_form_history();
108 I
.minibuffer
.message("Form history cleared.");
111 function clear_history () {
112 var PlacesUtils
= Cu
.import("resource://gre/modules/PlacesUtils.jsm").PlacesUtils
;
113 var xulrunner_version
= get_mozilla_version();
114 if (version_compare(xulrunner_version
, "45.0") < 0) {
115 PlacesUtils
.history
.removeAllPages();
117 PlacesUtils
.history
.clear();
120 interactive("clear-history",
121 "Permanently delete all location history.",
124 I
.minibuffer
.message("Location history cleared.");
129 * history_clean takes a predicate or an array of predicates, iterates
130 * through the browser history, and removes all items for which any of the
131 * given predicates return true. Predicates are called with three
132 * arguments: string URI, age in days of the entry, and access count of
133 * the entry. Age is a decimal number, so smaller divisions that days can
134 * be obtained by dividing appropriately.
136 * It accepts the keywords $dry_run and $verbose. When $dry_run is given,
137 * entries will not be deleted. When $verbose is given, overall and
138 * itemized deletion counts will be reported in the terminal.
140 define_keywords("$dry_run", "$verbose");
141 function history_clean (predicates
) {
142 keywords(arguments
, $verbose
= false, $dry_run
= false);
143 predicates
= make_array(predicates
);
144 var npred
= predicates
.length
;
146 var verbose
= arguments
.$verbose
;
147 var dry_run
= arguments
.$dry_run
;
148 var query
= nav_history_service
.getNewQuery();
149 query
.searchTerms
= "";
150 var options
= nav_history_service
.getNewQueryOptions();
151 options
.queryType
= options
.QUERY_TYPE_HISTORY
;
152 options
.includeHidden
= true;
153 var root
= nav_history_service
.executeQuery(query
, options
).root
;
154 root
.containerOpen
= true;
155 var count
= root
.childCount
;
156 var now
= Date
.now() / 86400000; // now in days
157 var history
= Cc
["@mozilla.org/browser/nav-history-service;1"]
158 .getService(Ci
.nsIBrowserHistory
);
160 var remove_count
= 0;
162 for (var i
= count
- 1; i
>= 0; --i
) {
163 var o
= root
.getChild(i
); // nsINavHistoryResultNode
164 var age
= now
- o
.time
/ 86400000000; // age in days
165 for (var j
= 0; j
< npred
; ++j
) {
166 var p
= predicates
[j
];
167 if (p(o
.uri
, age
, o
.accessCount
)) {
168 predhits
[j
] = (predhits
[j
] || 0) + 1;
169 to_remove
.push(make_uri(o
.uri
));
175 if (! dry_run
&& remove_count
> 0)
176 history
.removePages(to_remove
, remove_count
);
178 dumpln("[history_clean] "+
179 (dry_run
? "(DRY_RUN) " : "")+
180 "count: "+count
+" -> "+
181 (count
- predhits
.reduce(function (a
, b
) a
+ b
, 0)));
182 for (j
= 0; j
< npred
; ++j
) {
183 var name
= predicates
[j
].name
;
185 name
= pretty_print_function(predicates
[j
]);
186 var hits
= predhits
[j
] || 0;
187 dumpln("[history_clean] " + name
+ ": " + hits
);