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
102
103
104
105
106
107
108
109
110
111
|
/*
Copyright (C) 2018-2019 Christian Dywan <christian@twotoats.de>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
See the file COPYING for the full license text.
*/
namespace Midori {
public interface ClearPrivateDataActivatable : Object {
public abstract Gtk.Box box { owned get; set; }
public abstract void activate ();
public async abstract void clear (TimeSpan timespan);
}
[GtkTemplate (ui = "/ui/clear-private-data.ui")]
public class ClearPrivateData : Gtk.Dialog {
[GtkChild]
Gtk.ComboBoxText timerange;
[GtkChild]
Gtk.CheckButton history;
[GtkChild]
Gtk.CheckButton websitedata;
[GtkChild]
Gtk.CheckButton cache;
Cancellable? show_cancellable = null;
Peas.ExtensionSet extensions;
public ClearPrivateData (Gtk.Window parent) {
Object (transient_for: parent);
}
construct {
if (get_settings ().gtk_dialogs_use_header) {
title = null;
// "for technical reasons, this property is declared as an integer"
use_header_bar = 1;
}
}
public override void show () {
show_cancellable = new Cancellable ();
try {
var database = HistoryDatabase.get_default ();
ulong handler = 0;
handler = database.items_changed.connect ((position, added, removed) => {
history.sensitive = database.get_n_items () > 0;
SignalHandler.disconnect (database, handler);
});
history.sensitive = database.get_n_items () > 0;
} catch (DatabaseError error) {
debug ("Failed to check history: %s", error.message);
}
extensions = Plugins.get_default ().plug<ClearPrivateDataActivatable> ("box", history.parent);
extensions.extension_added.connect ((info, extension) => { ((ClearPrivateDataActivatable)extension).activate (); });
extensions.foreach ((extensions, info, extension) => { extensions.extension_added (info, extension); });
base.show ();
}
public override void response (int response_id) {
show_cancellable.cancel ();
response_async.begin (response_id);
}
async void response_async (int response_id) {
if (response_id == Gtk.ResponseType.OK) {
// The ID is the number of days as a string; 0 means everything
var timespan = timerange.active_id.to_int () * TimeSpan.DAY;
WebKit.WebsiteDataTypes types = 0;
if (websitedata.active) {
types |= WebKit.WebsiteDataTypes.COOKIES;
types |= WebKit.WebsiteDataTypes.LOCAL_STORAGE;
types |= WebKit.WebsiteDataTypes.WEBSQL_DATABASES;
types |= WebKit.WebsiteDataTypes.INDEXEDDB_DATABASES;
}
if (cache.active) {
types |= WebKit.WebsiteDataTypes.DISK_CACHE;
}
if (types != 0) {
var manager = WebKit.WebContext.get_default ().website_data_manager;
try {
yield manager.clear (types, timespan, null);
} catch (Error error) {
critical ("Failed to clear website data: %s", error.message);
}
}
if (history.active) {
try {
yield HistoryDatabase.get_default ().clear (timespan);
} catch (DatabaseError error) {
critical ("Failed to clear history: %s", error.message);
}
}
var active_extensions = new List<Peas.Extension> ();
extensions.foreach ((extensions, info, extension) => { active_extensions.append (extension); });
foreach (var extension in active_extensions) {
yield ((ClearPrivateDataActivatable)extension).clear (timespan);
}
}
close ();
}
}
}
|