Compare commits
2955 commits
Author | SHA1 | Date | |
---|---|---|---|
Sergio Durigan Junior | 7a890f5dad | ||
Sergio Durigan Junior | 2826d650dc | ||
Sergio Durigan Junior | 732e898e6e | ||
Sergio Durigan Junior | 7e2916f0ea | ||
Sergio Durigan Junior | 91090b3e92 | ||
Sergio Durigan Junior | 7fa139b241 | ||
Sergio Durigan Junior | a84927af41 | ||
Sergio Durigan Junior | bb954d02ba | ||
Sergio Durigan Junior | ccd28b22eb | ||
Sergio Durigan Junior | a5c70e7b08 | ||
Sergio Durigan Junior | 6121e4d3ef | ||
597a50019b | |||
ab72120436 | |||
2d27f4a46f | |||
a92607d4fb | |||
cd6899f136 | |||
3c395daddb | |||
5aa73dea25 | |||
f5a8cd23ac | |||
50549da7c3 | |||
7509079965 | |||
f5457c8c6a | |||
14564ce6cc | |||
a9def3c602 | |||
405f565df8 | |||
60d455a553 | |||
fae7cfdb3d | |||
fd240475ed | |||
de4fca9402 | |||
147acdcaef | |||
4e786f10be | |||
5f8cd5c12d | |||
b8f2e25698 | |||
035c2a386b | |||
f2e4e162c5 | |||
01b36c5fc4 | |||
7e39d05a17 | |||
b4b795e156 | |||
2e3882db4b | |||
55c11850bb | |||
00bd3f0818 | |||
d88b9776f2 | |||
13b735e382 | |||
dd39dab307 | |||
b3984ab252 | |||
09432b2d12 | |||
7d5fd0d319 | |||
5f18e39221 | |||
0da919f4d9 | |||
616633d502 | |||
5bb5b17986 | |||
cd21f66217 | |||
a902248bae | |||
5db5a0b6cb | |||
ddc1bec3fe | |||
29716305b5 | |||
5fdd9bdee0 | |||
1929c51d9d | |||
ec04a1a274 | |||
7124e36dd5 | |||
ad4e075051 | |||
00cb292b80 | |||
13c884b5cb | |||
55c06a4285 | |||
5f43dceef0 | |||
55e4823c30 | |||
f185bcb42d | |||
ca07fe3cec | |||
4b533d2f51 | |||
886ad1b765 | |||
2bdaf5057e | |||
bae360e3f8 | |||
f29318af7c | |||
9af985e7e8 | |||
419d4c1ae5 | |||
82242a8c2e | |||
8de05bc07d | |||
fefc3b2cbe | |||
1ad675e24e | |||
f715e11ebf | |||
33efb94666 | |||
dd90c2b65b | |||
49da17badd | |||
c8b6e07f27 | |||
ad99fb1ebb | |||
fe2a5c048c | |||
e3a71596bc | |||
b3e604881b | |||
b62602d28a | |||
dd0607316b | |||
3ff4483736 | |||
3bb03bfc56 | |||
ccd5b5ac99 | |||
a6744f64ee | |||
3717185834 | |||
3f4b0da5a0 | |||
646b41b256 | |||
e75348c463 | |||
e2c9660b3a | |||
6210c59e31 | |||
f2960a910d | |||
fec04dd1b0 | |||
be6ea33642 | |||
de47f61360 | |||
407c46d2f4 | |||
0e7cf9eb6d | |||
2b134da7d9 | |||
81179e175b | |||
d426a4df9e | |||
414a5f07ae | |||
c1d387f958 | |||
fee43b8be6 | |||
5555b88959 | |||
7e1f2655bc | |||
be61f96bc2 | |||
c49fb82e87 | |||
64c9517459 | |||
373ddd5d0b | |||
253a11d7ef | |||
acd116361b | |||
14abefcea9 | |||
bc1ff81410 | |||
9b09760839 | |||
db0ae6ab60 | |||
287fc53da9 | |||
b955713b4e | |||
aa5d387cc7 | |||
fd49037ae6 | |||
f4a3e69096 | |||
ebd0847a39 | |||
a0d9517053 | |||
1ce2b96680 | |||
58d1436d4e | |||
1c1fd1740e | |||
f5d0c3ad5d | |||
0668aba7cc | |||
194aab3473 | |||
3fbd36f3f5 | |||
fdff73182e | |||
0f1f26480d | |||
36c3a4925a | |||
de771db75d | |||
915955c0da | |||
3fb42ef2d7 | |||
503f1be5c5 | |||
8bf93fcad0 | |||
910e2d4842 | |||
a6606a9cee | |||
cc4fbca8e3 | |||
7f37162fe0 | |||
49dae87d36 | |||
cfb0db3b60 | |||
f41498e16c | |||
b5ff08c4c0 | |||
6226d9847b | |||
78eaf31e30 | |||
6757898c95 | |||
879d6c41a7 | |||
52c8b4aea9 | |||
d641a52de1 | |||
944e9107ff | |||
4e996d1824 | |||
de1e603eb3 | |||
bf20c2b7ab | |||
fd5daab3e2 | |||
f6595ea15e | |||
06341b8ecf | |||
57777d402f | |||
43d3a6b07e | |||
06b3a3a1ad | |||
373769cffd | |||
544dc08760 | |||
2e94548d70 | |||
c4693a5084 | |||
8c39b1f341 | |||
8f015c6340 | |||
78a317d42f | |||
870ecca738 | |||
21e7464226 | |||
1dcf70bd9d | |||
9b59026233 | |||
50f38f4b91 | |||
6f3eb6fd62 | |||
3fbcc93bac | |||
605953ebe6 | |||
b5cd9766f1 | |||
af47197ed5 | |||
a544de436e | |||
a3a46be77f | |||
b97140d3fd | |||
5c26087e62 | |||
cb7e28b11f | |||
35dfebd1c6 | |||
e5da45a40e | |||
2e17639201 | |||
3c159386c8 | |||
da4c27f673 | |||
60f93f157a | |||
f145efaabc | |||
364345f57f | |||
db37fbcc74 | |||
b45222111b | |||
75345d5047 | |||
2fa42e0a33 | |||
90f22c7a28 | |||
457c89f829 | |||
3d7b28567d | |||
324263d3a6 | |||
9fb173ba69 | |||
b925dbca33 | |||
4cd88d5746 | |||
eb0238328e | |||
9ab7b07377 | |||
4ddab57690 | |||
6bf77b45d8 | |||
fa3ab67cef | |||
242a1baf0b | |||
8cfebb7dcc | |||
3ecdcf0826 | |||
bf026bd905 | |||
acd6ef7eac | |||
42ec8e205b | |||
81cca6c586 | |||
2ecb48893a | |||
290a53ab6d | |||
43303dffbf | |||
270b57deac | |||
5d7aae4942 | |||
ea89eb4ff7 | |||
21387841d2 | |||
6c0e9c43f6 | |||
a87f881149 | |||
2bdd3be8ed | |||
0f525a99fd | |||
dfec166691 | |||
96f616a237 | |||
5bed5082ed | |||
92e21d50ad | |||
7f91e0985f | |||
1e6793330f | |||
917b62e91b | |||
0f98a0579d | |||
5d03d030f3 | |||
1673f0218f | |||
c71aae37a8 | |||
daebca32c0 | |||
3e38c0bb69 | |||
381ae720ed | |||
de4ea9b3bf | |||
75d7a7024c | |||
16a0f666da | |||
6809231e54 | |||
94a997a289 | |||
29fdd92fe1 | |||
cc0d81345b | |||
21d95c62f4 | |||
d95513226d | |||
dce8096593 | |||
5425f1c3ad | |||
e02a90d844 | |||
04417c37c0 | |||
f82a06afa5 | |||
d49d314c0b | |||
2adb54ae8d | |||
f74a210c48 | |||
21c8fb6d84 | |||
00db3195a8 | |||
0ed991b170 | |||
f67822736f | |||
100f45a9db | |||
4eef6a4534 | |||
2ee0065e34 | |||
e6ee98b8db | |||
8e1b6d23c2 | |||
da0ecd928e | |||
1ea3c81643 | |||
3ec314c7f8 | |||
6597f1f0b4 | |||
6b1abeed69 | |||
7461925615 | |||
2cf8d9323e | |||
d057ab4ddb | |||
4daaa98232 | |||
ae18206f7b | |||
91befb0ccc | |||
b8b0bc341d | |||
b7f438589f | |||
27f5cbfb25 | |||
218a6d0b2e | |||
2c77e2d1dd | |||
5998b6b0ea | |||
d8de8285ef | |||
03045fdf53 | |||
32da4d8f0c | |||
7c5410468f | |||
31fe130f87 | |||
d549cfd203 | |||
3d14faf9be | |||
3259ab1be2 | |||
7eb4aa78aa | |||
7bcc270b05 | |||
760f4895a3 | |||
2f2b33abee | |||
65844ecf4c | |||
96ad359d34 | |||
05d58f8287 | |||
c096b46ff3 | |||
301bb89dd3 | |||
19f291d2be | |||
ed2a7fea6f | |||
20d70d2ac7 | |||
8c85d0f08c | |||
4995e6fd6f | |||
4eb8553012 | |||
015c6e8428 | |||
83609a1a88 | |||
377a01948f | |||
8c54bd5d38 | |||
7d293b5c19 | |||
9ac0175899 | |||
3627c75e0b | |||
49957c95d1 | |||
81543161df | |||
e28ccf12ac | |||
649d079b04 | |||
612d22bbe3 | |||
d2ebd4797d | |||
c13da3b1b3 | |||
00ca0c4687 | |||
23f9fa606a | |||
470b666d6c | |||
cd377bb7a8 | |||
93ef102c23 | |||
9ca795eec2 | |||
125bec6974 | |||
68a4ed6c99 | |||
d260e71a23 | |||
6f47ae75fc | |||
28c5af1458 | |||
c236e4da9e | |||
33cede91a7 | |||
7a6bc50d0a | |||
7f7668048e | |||
831a185621 | |||
846853f2db | |||
0dcf146b1f | |||
d089634f6c | |||
41dda877ba | |||
6a4a506f24 | |||
3bdf2e7b73 | |||
57397ee229 | |||
c4791e4a9a | |||
f9005c63a7 | |||
a0b2020550 | |||
4073c14546 | |||
0c201ca2b8 | |||
8ad44b86c3 | |||
184c1133e6 | |||
1d366e4913 | |||
ec0591ab8b | |||
fcaba281fc | |||
043e786572 | |||
6e466f3083 | |||
14dd9c645d | |||
e4c1e6ec7f | |||
75657d1fb4 | |||
db30c9a3d7 | |||
8679a5b19e | |||
6411603058 | |||
66a47613b0 | |||
d319d40416 | |||
21b643c825 | |||
e1fe41f3d7 | |||
e8cbe34aeb | |||
120f7440f6 | |||
74d711d2bd | |||
f598f91208 | |||
f1db28a6ce | |||
64d9533f7b | |||
ec2a7446e4 | |||
f9d32072f4 | |||
d5bf30ec03 | |||
708d74038f | |||
225e13c06b | |||
ef4ee2f634 | |||
4e51fa1f00 | |||
264582f557 | |||
aa1ffbf1d0 | |||
262ded5222 | |||
103664a8f0 | |||
7eac618c5b | |||
3e80912a03 | |||
c3a7e53c0c | |||
616fc49048 | |||
0592f19446 | |||
1be88cee24 | |||
b6081086bd | |||
f44a09d6ad | |||
5e5f68c8b3 | |||
36f451fd97 | |||
860f85eeaa | |||
2ac581519c | |||
6cdc67a21e | |||
fd7171298d | |||
8dccae9303 | |||
d100604bba | |||
627f367837 | |||
8ddc7ac787 | |||
611ca5b43d | |||
46ed599c19 | |||
a6fd514030 | |||
b18667220c | |||
2cec07a6ea | |||
6a58d790b8 | |||
82741b139b | |||
d455382a22 | |||
959fc712bd | |||
ebd0ef2a46 | |||
3effb9a4ce | |||
fb00824541 | |||
a15d4009c2 | |||
12708f535c | |||
5ad8d5b85a | |||
e62894c3ed | |||
e840a52a0e | |||
ab7358c460 | |||
50fea06389 | |||
448905015c | |||
0ece556d7a | |||
28aefc59ec | |||
5b8b2f4b28 | |||
b295462e06 | |||
f840f0508c | |||
bc37926516 | |||
2496ae13e1 | |||
ddd7a887e2 | |||
d40b3ed233 | |||
3a2afa8d65 | |||
aa51909f69 | |||
cb0d99484e | |||
af67397456 | |||
803a8451b3 | |||
a96d21213f | |||
cef295aae9 | |||
0ecfd696ba | |||
8e3d770e09 | |||
eafbc37f0b | |||
bc3ce47d7d | |||
fa364f5e71 | |||
b9b6f512ce | |||
0b14449f68 | |||
4a1e547cdb | |||
f71ebb53a9 | |||
9650dd3779 | |||
aef1d06ffc | |||
290c424bb5 | |||
5f8f6ad0a4 | |||
f1e7036406 | |||
5b40b6d238 | |||
f38715efb2 | |||
25d8b8ddfc | |||
c6f81c62e0 | |||
4a4887b511 | |||
af315513a8 | |||
0fc322f393 | |||
066d592c9f | |||
fdc6151ac3 | |||
a0a0325db4 | |||
85153f3b49 | |||
cece70cc68 | |||
117b057edc | |||
8f0950bc5a | |||
80572b0480 | |||
982687646e | |||
a131388af1 | |||
11bedd68d5 | |||
6934d8dafd | |||
01541da48f | |||
b854931cfc | |||
d0ca6467cd | |||
96843dadbf | |||
94f729f6b3 | |||
7a172fff27 | |||
5cd78ae297 | |||
7fad1fedf7 | |||
41fcbcd4a1 | |||
7dd4b5c88a | |||
f7a7f06b84 | |||
e6d75db8d5 | |||
dda3058776 | |||
650efa2aea | |||
9ee6612f62 | |||
be0dc79448 | |||
fe72235e83 | |||
9fe40ad850 | |||
2c89501bf4 | |||
e6e6fe4363 | |||
6dda0afa77 | |||
bcff2fb07b | |||
e9f8a7efd6 | |||
13dcb271ea | |||
9b1cba045f | |||
d26b1fb745 | |||
218255bd95 | |||
0ec2d92573 | |||
e549a6fb6c | |||
a21ebb3b74 | |||
d139f1bac8 | |||
db2869f0a2 | |||
2429c10752 | |||
4fb6292bb4 | |||
81d2567226 | |||
8ba3053b41 | |||
3d720c5303 | |||
369261a299 | |||
cd9bb96c44 | |||
cd238fa46e | |||
f5dd1f9ab5 | |||
109ed3cd92 | |||
b4d9cd7acc | |||
678ef8a5c6 | |||
fb6b01759d | |||
184a664731 | |||
564ac17d73 | |||
654950f254 | |||
23d51753fd | |||
89bae74a32 | |||
cf1321fe21 | |||
94c6fca20f | |||
cb40b36c0e | |||
a230b497b8 | |||
1ad1517368 | |||
32a480e80c | |||
cb8b27f14e | |||
986a7acad6 | |||
45ac40d614 | |||
66abde2db9 | |||
bc967c5563 | |||
b29e1278f9 | |||
5b4759c045 | |||
e3e15973cc | |||
ee57ca1056 | |||
c8106ee0ec | |||
2e498992df | |||
b91182cb30 | |||
5319ce19a3 | |||
374aa30390 | |||
317f32fd89 | |||
2d5762dcaf | |||
80a6fd3a8f | |||
b09446e0f5 | |||
1ba786edf1 | |||
c71a531f85 | |||
63039722f2 | |||
832afc13da | |||
76d6d8fb85 | |||
2e1da00ab4 | |||
48f28a7081 | |||
934ba363c5 | |||
f567143e29 | |||
6748db48f2 | |||
dc225e6ec0 | |||
8d08e47746 | |||
de5eb758d2 | |||
da52b65fea | |||
a0b614f9ce | |||
1ce2a57f4b | |||
e29af0b634 | |||
1a5f96013d | |||
6bcf3d9912 | |||
1f2f7ca05b | |||
81a0fa1a48 | |||
9fc17a11b8 | |||
81c942e082 | |||
a61bc0bca9 | |||
4d2836f858 | |||
fd5d3ee02c | |||
7e04c76bce | |||
0b8a080695 | |||
6cbf8031bf | |||
d2059fcec1 | |||
410eabea40 | |||
c7c172f7ff | |||
fc7e30f516 | |||
2a540a0878 | |||
a489245d13 | |||
d80c050119 | |||
21c047a9b3 | |||
e88b69be02 | |||
73c6fc5068 | |||
da4f15e9bb | |||
c75861ca5f | |||
182268a82b | |||
57d2362a8d | |||
3f795a62cb | |||
da5f257314 | |||
53b9923108 | |||
a006013cb4 | |||
8d0d2554ca | |||
08d890e20e | |||
ee4fb4f7ef | |||
f7d0e29c41 | |||
3428fbb586 | |||
e5a793c9e7 | |||
13b7e0114f | |||
e6240e0ee4 | |||
2d9f3bbfcf | |||
7400114eac | |||
afd6b652c9 | |||
12d49e36c2 | |||
89dbbcc1b0 | |||
f76d538564 | |||
e0c021de3d | |||
3d00303230 | |||
acfe263ce1 | |||
3a833296b0 | |||
3d4ee81ee4 | |||
2d921d4416 | |||
24a50fbb78 | |||
461c3ad440 | |||
f62964264e | |||
a01c0fd224 | |||
2377ee3c94 | |||
c4d1a96ca4 | |||
b5d5c17396 | |||
8bba8f9aad | |||
d0ef9c6575 | |||
a32cc0908e | |||
f8ab9eaec0 | |||
b272a2cdd5 | |||
d9318f9ee5 | |||
4d311a9d4b | |||
cbec9bcb74 | |||
d7aafda6db | |||
1f56e0af6f | |||
2d07cbfe45 | |||
f9d56a9a98 | |||
dde5014956 | |||
9790d0016f | |||
b838023289 | |||
79942f24aa | |||
3e0dc32017 | |||
4c4c849441 | |||
a6f9bea939 | |||
63ac08c6a3 | |||
eccc0eb5d8 | |||
1de28a8a7a | |||
ebf2c2d1d9 | |||
dc19951a21 | |||
19f6fefe9b | |||
f7d85602f8 | |||
5cb1c04481 | |||
7789bafc68 | |||
76be3b9aea | |||
a371ef99ef | |||
70e0223212 | |||
7e6dcd5df0 | |||
a695a91410 | |||
357187e264 | |||
90eaea3dca | |||
532335702a | |||
ae7a09a087 | |||
9751a60dbc | |||
70a894a9fc | |||
0b16c9c95c | |||
d98edca5f2 | |||
edc88b7b47 | |||
5aa526d106 | |||
7e64370a8e | |||
e75b814432 | |||
f3af1983ed | |||
a3d8a5aa94 | |||
ee8824b93b | |||
bf2ca1c370 | |||
e18a39d88c | |||
f92fa1a33f | |||
d93c96daf3 | |||
f4697742af | |||
2fa5059cc4 | |||
7d4cdfe462 | |||
50c091f43d | |||
23b89cca6b | |||
37c0e0270f | |||
efa634d939 | |||
9f6c4d3e03 | |||
7d61f1b897 | |||
09c041f740 | |||
48368e9951 | |||
4391693cdd | |||
4d9eb6cfc7 | |||
c1238bd82b | |||
9c2a17b4a5 | |||
5aebcd7b30 | |||
d94da1f69d | |||
2612267e4d | |||
2c9f219b7a | |||
1edfd88d2f | |||
ecbc8d0772 | |||
3184b5226e | |||
7b2c87a573 | |||
5e2b7fdca7 | |||
c6bdd62f67 | |||
7066679bcf | |||
0cd1c158d7 | |||
9742511800 | |||
9b0f7203ae | |||
1b64505d9d | |||
3f1c59ac82 | |||
8446a0a426 | |||
09fb0e2fd1 | |||
91a784574a | |||
e4bc034389 | |||
e4a2f732c2 | |||
85c2f4a8e1 | |||
b104b685da | |||
ca25b39213 | |||
794c71685c | |||
bf2d83aba2 | |||
6ae8631809 | |||
5588a05c8a | |||
8c8f985a5c | |||
472cbfa5b1 | |||
8b78ae5491 | |||
7940a02ae8 | |||
11aa4f437a | |||
d47806bc12 | |||
5e0ac8ebbf | |||
323177c429 | |||
f9aa8aed9c | |||
6e6faabad9 | |||
6c57f7db42 | |||
537d002a6f | |||
f3a5d49434 | |||
1309a77aae | |||
0c1716447b | |||
81cdb802fc | |||
3757852ae7 | |||
c7dfd851b0 | |||
1145c7417e | |||
7faa9d54c4 | |||
2837494ade | |||
fa22841ec9 | |||
a83cea4964 | |||
1e7ee7db5c | |||
4f180216a1 | |||
66d4e4c531 | |||
bf07220bc3 | |||
ba51341786 | |||
4beffc57e9 | |||
2bc867054a | |||
c669cef230 | |||
782271d47c | |||
f060b6ed1f | |||
387b782760 | |||
7361a80e24 | |||
7e61fce9ca | |||
df8284f650 | |||
cbe84b6820 | |||
079403a806 | |||
70b85bf600 | |||
271cdf670b | |||
17cccfb672 | |||
74bf490880 | |||
f3de5b1112 | |||
4fa5bcf721 | |||
24884ccafb | |||
82991c695c | |||
3c3836f485 | |||
970d50726d | |||
c19c5bdee8 | |||
63f2690265 | |||
61af413407 | |||
7c7be5644d | |||
6fd666aa9f | |||
4c142e7688 | |||
307c79274d | |||
d3a60802ac | |||
81526df6d6 | |||
95a7e7f3b8 | |||
d23ad7374a | |||
eefc27b2b2 | |||
85948e8c19 | |||
4d96182f73 | |||
127595f527 | |||
1488301535 | |||
18b6b48ef5 | |||
9275a6cd24 | |||
569b8e4779 | |||
a2ebb7e671 | |||
198aaeffa1 | |||
799d983eac | |||
b0c36f318b | |||
77d095f6ef | |||
f25b677d0c | |||
973e481068 | |||
403d17400b | |||
bcc6711f27 | |||
8ad470caf5 | |||
90ee1384a7 | |||
5c0255f7cb | |||
5176b38120 | |||
ffb86ce7ff | |||
f586c3004b | |||
599de9cb74 | |||
51e3e8e495 | |||
55c6dd38d0 | |||
7af5019d86 | |||
79b29a9362 | |||
f3a4bd4b6a | |||
a064a5f120 | |||
8960da4c2f | |||
af9ec62b25 | |||
5643728994 | |||
b20a1e7efd | |||
f549824b66 | |||
bbbfa0d677 | |||
d2fe0791e1 | |||
c6b15ff4dc | |||
63d7df5a0a | |||
d2aa1919aa | |||
62f0ef746c | |||
69c319d62a | |||
29d6de3c6e | |||
69f7e176ab | |||
cd4928ebd7 | |||
57afee2b9b | |||
05427d6967 | |||
4e2f69cc40 | |||
71c2a52cb7 | |||
a517a02d02 | |||
99cd9b00af | |||
1ce879e6f6 | |||
83143c4e5a | |||
a4f2854217 | |||
f1603202ac | |||
e5ffa134a2 | |||
f9af2ae05d | |||
9050091b93 | |||
fd63447c9c | |||
94236e1a9f | |||
cc7cf39150 | |||
e268ffecfc | |||
51462b0748 | |||
35b11cad17 | |||
c05f2a86b4 | |||
e20ec3fb74 | |||
961ed90a01 | |||
b68b092c51 | |||
d152163957 | |||
523afa1014 | |||
7bf5005617 | |||
669167eb9e | |||
93bec3142f | |||
6c87ccc3b3 | |||
3aa37f7953 | |||
cad539dfed | |||
62ed57bde3 | |||
1e941210db | |||
66484a7e02 | |||
5e052422f5 | |||
8b766ca2a8 | |||
50a4cda60c | |||
15fd840a9d | |||
f1289721b6 | |||
01f6279a92 | |||
a1cb33c046 | |||
63e68a63e3 | |||
1d700e4ca4 | |||
e582924a99 | |||
6ff166f3ba | |||
ef1928ad16 | |||
f387f9c29b | |||
93b352aa34 | |||
5bb1c5025f | |||
b6f86b0ca6 | |||
9c323ff149 | |||
f045fb2a5b | |||
4479a23319 | |||
a5c29d05f2 | |||
974a09ff6a | |||
515123c0c7 | |||
9a1113dc42 | |||
cc5566105d | |||
e264342ea3 | |||
52c4114639 | |||
15b0cc2f23 | |||
57e3264d66 | |||
1f2fce9fd5 | |||
dbc0eac7dc | |||
ca56282b75 | |||
32bd432e2d | |||
49f945b421 | |||
3ab5811c07 | |||
8e997590bd | |||
eecfd42ca4 | |||
53d27052aa | |||
f0c4b3d538 | |||
e16e1d14d4 | |||
fa12a3fc52 | |||
955cf0b132 | |||
0a96a24fa3 | |||
062c19d0d5 | |||
43bbbbd7f3 | |||
0effcd3b19 | |||
1647ff9638 | |||
edcd8e1ae4 | |||
fe1b21a73f | |||
ce527689c6 | |||
f1e168b569 | |||
32eb583cb5 | |||
d3863a0abf | |||
3f8784213d | |||
e4475b4c49 | |||
3464afd167 | |||
ab720a177d | |||
fb44d46db0 | |||
7fd1c2e5e1 | |||
0bd341496b | |||
9ef72e562f | |||
1ef7182e95 | |||
26485b9be2 | |||
41a0ab4bc7 | |||
82f13bab12 | |||
0ae34774a6 | |||
381a78dc08 | |||
ce7c34d724 | |||
d0a5c58ece | |||
7ff89970b2 | |||
fe131576a1 | |||
590ecc9c3b | |||
1b086f5e87 | |||
9d900815f9 | |||
9f044ee5e4 | |||
fb2e4eea77 | |||
c0e0bee467 | |||
ff95e17f6f | |||
b045c01d06 | |||
c9f982633d | |||
8eaada95d0 | |||
dc1a39f93d | |||
d25cc1b132 | |||
055224a73e | |||
713c7b5080 | |||
f500a36903 | |||
6385a32b99 | |||
e791f3dce0 | |||
7fb7c27db3 | |||
b20abf8a28 | |||
057bb5dc5a | |||
9236ffb4bb | |||
c3eb4e4403 | |||
164f016924 | |||
976eda9157 | |||
1c6980ddda | |||
aede773fb7 | |||
4600ea19e6 | |||
74ae33e232 | |||
274cf6f9d8 | |||
95c15f28e7 | |||
fd03ff56b4 | |||
3d5d2f4766 | |||
696b377b32 | |||
835f808115 | |||
729e960cd6 | |||
3d774d2d09 | |||
9445539c48 | |||
43952508eb | |||
bf4ddd3358 | |||
556546320b | |||
e61743db9c | |||
a87321d01c | |||
fb22998273 | |||
25498f30e2 | |||
519b51a85c | |||
e13a55981b | |||
6ed99e4e88 | |||
fe6acc509a | |||
b850dd3da2 | |||
1bff3b12a3 | |||
20228cfdd6 | |||
618fa82077 | |||
4de2048f85 | |||
6f40fbc0a4 | |||
451cd1fbea | |||
64d21c2120 | |||
2cc8beba41 | |||
fe0f451865 | |||
129da98bf5 | |||
57b093293a | |||
5396456ec2 | |||
bf7cfa902c | |||
c3efa0cd7b | |||
3a2ad2d242 | |||
98c87e7ca9 | |||
81250720de | |||
5261fdcf87 | |||
6d68f52b8e | |||
c242639558 | |||
fad246350e | |||
a14be44ce2 | |||
05a14dc273 | |||
5fe2fc3a02 | |||
aaa803d2b4 | |||
9cbeffc696 | |||
01615716d0 | |||
af2adeaf08 | |||
b284fe9fbb | |||
df95876508 | |||
34c7d601c6 | |||
a87b4cd7d8 | |||
ee055334ce | |||
b72e75d32c | |||
d20f05f9a6 | |||
46f94eddf5 | |||
11cfe7db2b | |||
d3a065c259 | |||
a19d798049 | |||
568461c6c5 | |||
e2816612c5 | |||
cd8cb17b9e | |||
1126ec1088 | |||
de26c19a01 | |||
849351554e | |||
ecac5fdce2 | |||
330a782c1c | |||
1984c69d07 | |||
9e5fb1ef27 | |||
b32d0d86dc | |||
1966875e98 | |||
98bb257554 | |||
4af93301e3 | |||
9a45f8976e | |||
7e50bb18f8 | |||
00d8621fe7 | |||
c522706d63 | |||
0cde623901 | |||
353093f7de | |||
b874009e00 | |||
c8b19b2eeb | |||
622628b9c3 | |||
c4cf5affc5 | |||
8bd9045ce7 | |||
1b86c1d913 | |||
566794a67e | |||
35757c2842 | |||
9ba0c2806e | |||
1845d0bcbc | |||
5d9a8d73f3 | |||
b41367b735 | |||
a57850e533 | |||
9c11fb1219 | |||
3d96749b93 | |||
cd05d0a351 | |||
d81c80edb2 | |||
1df4edab1d | |||
ce3a95360d | |||
652e392192 | |||
c44f76abb9 | |||
64f9028eea | |||
bd3c1b50fb | |||
9888ad610d | |||
ef9e5b6e6c | |||
e698ba3380 | |||
6143654279 | |||
98f2e3b572 | |||
42387e9b8b | |||
312d321ff9 | |||
6e32883b68 | |||
6a068b458b | |||
5e784e9bcb | |||
e2a2f96cf8 | |||
f50ec92a81 | |||
d0db33711d | |||
339e18aa03 | |||
9bb89daee1 | |||
4958fa2e58 | |||
169fa72063 | |||
c2cda76dd0 | |||
d82e3d8957 | |||
0b668e14b9 | |||
ee054703e7 | |||
4b2d2e6a64 | |||
d7363a55f2 | |||
112747d8a0 | |||
0c17508dda | |||
18b89c7bec | |||
10c80ffdda | |||
173f2d85dc | |||
5613d265dd | |||
8e74115261 | |||
e2f9340b7e | |||
a6dc35a37a | |||
c35cabca23 | |||
840d1813d1 | |||
df812b27d2 | |||
09d0c87505 | |||
77aa9beaac | |||
b89f4b38ca | |||
6bc8c7e784 | |||
8c3834cb4c | |||
e7f1e17a11 | |||
621a86518a | |||
ff21c222d8 | |||
de89a988f0 | |||
0e93695979 | |||
b3344bf6f7 | |||
668689fd17 | |||
5c08872066 | |||
760270832a | |||
ffd3026baf | |||
249619a631 | |||
f8b6792756 | |||
75c5f57f91 | |||
47445f8c94 | |||
da39524c6d | |||
817807f34f | |||
9e7d56d07d | |||
e6d97efa43 | |||
e20a92e6ce | |||
d76b209f68 | |||
fff54e27d6 | |||
defbe30ecc | |||
e4963aa324 | |||
6ff2109adb | |||
da8983b09f | |||
24310fd4e9 | |||
25d714d3a2 | |||
a1f4eeaeba | |||
641af71829 | |||
340142c391 | |||
59b3d9319c | |||
c60a9d220a | |||
0d2a6cd72f | |||
1cd86c32f4 | |||
bfe8f9b879 | |||
1dc6e23b9e | |||
8021df8646 | |||
82323c43a0 | |||
963747523e | |||
1515b1e8d9 | |||
e0168e5a94 | |||
bcc4373857 | |||
4c2fd067ff | |||
532fa299d4 | |||
975c244622 | |||
583c5be7ef | |||
c956b6cb75 | |||
5eb229c9fb | |||
a260fdce12 | |||
9fca252512 | |||
e52288cdd2 | |||
040a1670e4 | |||
d809cd6040 | |||
9e02157c6a | |||
464fa71992 | |||
5d617f22c3 | |||
897ca14aec | |||
ed5561567b | |||
7cf7dea9ee | |||
acc556e384 | |||
e8472c8381 | |||
be7c663424 | |||
ccd0562d7d | |||
524a4bb0a7 | |||
5eda5a3faa | |||
8ecfdd701e | |||
52ae8c90e8 | |||
069ade42d0 | |||
49758e4dd8 | |||
77796803c5 | |||
8c14613673 | |||
ea12e9290a | |||
4067754ef0 | |||
4db20c930e | |||
adb6a6a703 | |||
f604ffd388 | |||
a1103aa20b | |||
3b491354fc | |||
73ccdc38b8 | |||
f0f2da8927 | |||
a9f6f25c95 | |||
97ead6f466 | |||
9572ff99cc | |||
5a353d0ecd | |||
0f79f4f61f | |||
a762ba5a16 | |||
db51b7d575 | |||
6f6a57a623 | |||
37d14e16b7 | |||
b5ce439a6f | |||
ac6e23680c | |||
56818ca944 | |||
191339ec9e | |||
d9c4bb15c0 | |||
c12d8f1f25 | |||
a121d24d35 | |||
179e33d054 | |||
bcb0fa2569 | |||
262e5c3304 | |||
5a786354b5 | |||
26658711be | |||
543a3207ab | |||
a00906f010 | |||
e085a8787c | |||
dde6770fb2 | |||
23f90e821a | |||
fc2bac2e01 | |||
58066e7dcc | |||
4e30586f4c | |||
eb205d53d4 | |||
4cb498940d | |||
eed822dc8b | |||
75b9f809ae | |||
107bb2a58a | |||
c5e6b7a020 | |||
2b6ccad3f8 | |||
aa5aeaf23c | |||
49317da35c | |||
0c611f8d6a | |||
e3962444ed | |||
e8ba05e72e | |||
4ea6769f0c | |||
5724428069 | |||
0bcb8433c4 | |||
0e6f72cc8b | |||
310ce80d1d | |||
ba86f67cba | |||
0010c98e04 | |||
90410efa5d | |||
686fee50b7 | |||
8dd92c59a7 | |||
8fff7d8fd3 | |||
2bc0490bf0 | |||
42c1b70c7d | |||
55227d2a3b | |||
6ea98c6569 | |||
ea15198b34 | |||
34e0c98cb7 | |||
e4601778c2 | |||
7dee11c0b7 | |||
0c69e6ff64 | |||
b2257bd19d | |||
20e84c53c9 | |||
dab4e52474 | |||
6bb66ed111 | |||
ff569e8328 | |||
a25c34e280 | |||
b8a8272398 | |||
d39b62c73e | |||
cebf09e804 | |||
4d872505fb | |||
5244bda781 | |||
cd8cb11ea2 | |||
f6d3c29be5 | |||
be04be8303 | |||
8f540b3d86 | |||
2976f6ebb2 | |||
6bceb5a10a | |||
b0dafa8511 | |||
b517eacb7b | |||
948301f086 | |||
0e5cb28e09 | |||
3a49943d10 | |||
6f41311242 | |||
dc103bf017 | |||
9f37c58013 | |||
4440d25e11 | |||
9937abe3fc | |||
2a03ba5b5b | |||
6a22d6ec44 | |||
42565a40ee | |||
19b22b9ae2 | |||
4854e2e2d7 | |||
968c967592 | |||
0388f2fa39 | |||
beb4ed15e2 | |||
7cb16405f8 | |||
3b2d95c0e4 | |||
4b33fd2c7d | |||
9738f07429 | |||
5ddcfa7be6 | |||
21529a9154 | |||
1a8be39e6f | |||
423bc0259d | |||
20f21ce80e | |||
9769dcb752 | |||
d9dc25e28d | |||
7472eba384 | |||
2cc0341bf0 | |||
9159e72b58 | |||
3c116eab7e | |||
b359341801 | |||
d707a8758d | |||
990b6b77bd | |||
501a883a11 | |||
cabc6c57a6 | |||
76cbe8fe64 | |||
1ed184ba1c | |||
1d4f129d6c | |||
33cd9d57a4 | |||
8aa2d2afd9 | |||
17e583d2fb | |||
1d3f3267b1 | |||
d452b46ddc | |||
61ba892eaf | |||
85eeb6d8d1 | |||
b360541552 | |||
c2af8376eb | |||
77428fe44c | |||
3f77b9f300 | |||
b29ee13da6 | |||
8f421d6cfc | |||
ee85789fc4 | |||
52de747198 | |||
c06fbee023 | |||
a12a8e26d6 | |||
06620d014b | |||
2e203e746b | |||
8521d98ed0 | |||
50ddc4f85c | |||
32f942fb37 | |||
ac5eb28d49 | |||
b6469de5e6 | |||
30f4225cd9 | |||
2bb7fe3c2d | |||
6494269ab9 | |||
e420c36860 | |||
a023dc5471 | |||
7b4f2254ff | |||
3fa294d100 | |||
eb45219936 | |||
a8bf171c62 | |||
85b1b8509a | |||
756830f6e4 | |||
bf8b1d9375 | |||
910f07e466 | |||
b639067520 | |||
bd5c317ad9 | |||
eda8ac68f9 | |||
edb01a11f6 | |||
bb7c900144 | |||
fd643d72e9 | |||
2f40eee0a5 | |||
19a8002eee | |||
7bd92bc67c | |||
a5ea7607d4 | |||
8a8e59b598 | |||
f5447b921f | |||
eeb4b7b391 | |||
be6d6932f8 | |||
d013cc85a9 | |||
3071da6711 | |||
cb6a4290d6 | |||
2219399440 | |||
9bd775b2d3 | |||
bfc7c9ddb1 | |||
377c67bbeb | |||
c47e9b14cf | |||
f1443cd760 | |||
d72521fd63 | |||
b7592032c4 | |||
d3e42c12f8 | |||
23af38a149 | |||
5eb5663cf6 | |||
d3dbd33911 | |||
ac272d2f48 | |||
b378554df2 | |||
73354dbbab | |||
89ba05924e | |||
8bcd2e8987 | |||
0c5b24a4ff | |||
a0b2ce34d6 | |||
09d1950029 | |||
3e60f4424b | |||
76a9bc38ff | |||
b5aad2d176 | |||
b46db9b170 | |||
bd5a85fb9f | |||
f303736ad0 | |||
441191b4a1 | |||
76a8f160f2 | |||
ae56fbf818 | |||
daa6fa0ee7 | |||
b8c707f1cb | |||
a49c6e8ad7 | |||
648d869e4f | |||
24604a3db6 | |||
e4d03290d3 | |||
bac3dc1842 | |||
fc21488881 | |||
98bcbdfbae | |||
1deed9804f | |||
6e51e7014c | |||
ec92c64dff | |||
6a8b4ae60c | |||
043581547b | |||
4cdc347287 | |||
602d0e1366 | |||
b574501978 | |||
cc2699f1b1 | |||
e55a0a91cb | |||
18a0d1da03 | |||
c1321b0072 | |||
f748a9b8a4 | |||
b557233290 | |||
91c69458fa | |||
feb83ea3a5 | |||
3237e1460d | |||
1251affc57 | |||
360af57d2f | |||
d228937eee | |||
89abdbe5e4 | |||
24b0937703 | |||
ec52fe39e7 | |||
bd8492b5c0 | |||
1b3bda9a17 | |||
a568b29c38 | |||
54251cc368 | |||
6da6b133f5 | |||
1290dfa5ad | |||
e474a1bbaf | |||
68eeb9902c | |||
519257172a | |||
28c9a22252 | |||
695d1baaeb | |||
ffad484af4 | |||
d2ffc98eff | |||
9060012b0d | |||
9ea24d4340 | |||
8ff9aaf1a4 | |||
1f14e21619 | |||
2e6670887c | |||
55faf91cbd | |||
16d64a68a3 | |||
597ca48410 | |||
b8512f2532 | |||
0b829401ae | |||
dc11bb4a57 | |||
a51f70e33a | |||
59a6438d52 | |||
49f15f741e | |||
74a1e66879 | |||
1e8ca187c3 | |||
fedd36ac91 | |||
42dae31bf3 | |||
3382ee0f0f | |||
3e2e8906fb | |||
8bca83572a | |||
c5151ff09a | |||
32f71ef5e0 | |||
2e532f1895 | |||
2b6bf42ae0 | |||
7a64728ea0 | |||
9b4f945a26 | |||
5f97728b5e | |||
2f459a6a07 | |||
e025aea0d6 | |||
e8cf193e2e | |||
84544fe434 | |||
b2c7aceb0b | |||
e5331acf79 | |||
a2794889d0 | |||
7b97c133dc | |||
5c08872db0 | |||
5a0e6099c3 | |||
aeef4e4ee3 | |||
1cdda41b59 | |||
5774aa9e81 | |||
6de282bf44 | |||
efbd780a2e | |||
c8b5547d61 | |||
9c1769f83f | |||
ab22866cff | |||
a3ab258819 | |||
761ef8c4e6 | |||
e6ecd20be4 | |||
49d7ae1fad | |||
8175e36e7f | |||
edf6192978 | |||
689f982102 | |||
2aa47a2154 | |||
d3f27e54f8 | |||
8c7f255c7e | |||
b7fae5ebe9 | |||
f1362e4d15 | |||
af43580b61 | |||
459dd9dffe | |||
889dcabc33 | |||
d82bae1dd1 | |||
504188151e | |||
630e23412a | |||
ca1891765a | |||
3d60bd1a42 | |||
b33755f019 | |||
1e4909b6c5 | |||
5b7bdcb5f5 | |||
712d1f85bc | |||
6fae4e54db | |||
b307801744 | |||
e4d4ec26fb | |||
5f9497358c | |||
053dcb98ca | |||
6a3c3d155a | |||
0b880b8a9b | |||
abe60b164b | |||
32286215d6 | |||
25cdc7161b | |||
218c69880e | |||
3fc44b6fdc | |||
f2d1959e73 | |||
26ee3c60c0 | |||
71a9bd4a1d | |||
9a4dc3ecab | |||
520adfe8c9 | |||
03ec536618 | |||
e281269063 | |||
338ddf8ea7 | |||
22a7862654 | |||
c277857ea4 | |||
bfc6a034ab | |||
cf4499f54b | |||
9f99771db1 | |||
6c95ea19db | |||
f33644ed5b | |||
4e6d666efa | |||
35abe8d739 | |||
9bc26e97fe | |||
92e23d9d4e | |||
868dd3abf0 | |||
09f4af3be7 | |||
3331921cfc | |||
eb7245c30a | |||
142c8184ee | |||
7c987dc938 | |||
913ce7d233 | |||
cd6c58b21f | |||
af14e373e9 | |||
1ae284018f | |||
7f891d61b8 | |||
580fb3cde4 | |||
7843145340 | |||
b878020a90 | |||
ac78646f83 | |||
3db46d2297 | |||
aafd5bc0a0 | |||
e1c79b3a60 | |||
df47a2b8d4 | |||
4f84917e53 | |||
cd6c4c95a4 | |||
902d6204f0 | |||
4f79c4ddbb | |||
cc0436a6ee | |||
8db282087c | |||
1137e80a44 | |||
50bfbdc243 | |||
76573c86a5 | |||
90064105c2 | |||
93fc7f427d | |||
9e8f6e17ed | |||
1fe39afee1 | |||
03ac072550 | |||
907d5723d4 | |||
12aed6c566 | |||
15a06bbfe1 | |||
4d7424adc4 | |||
60cb44c846 | |||
bd10649982 | |||
f093e55f85 | |||
ebf892e2de | |||
0ecd54b1df | |||
43111db54c | |||
0796a707e3 | |||
16b63b9508 | |||
01c353366d | |||
e228e00090 | |||
8bac897a88 | |||
f0d39ad3aa | |||
4761949397 | |||
783bed774a | |||
b8e5b77609 | |||
144661a680 | |||
fcdd4ab6b6 | |||
746c40371e | |||
6f55f1737d | |||
cc5183de3f | |||
a5cddf64df | |||
619b3596f8 | |||
d4baa36d4b | |||
fe2aeab4ae | |||
5767e9b927 | |||
3cc1397a7e | |||
a305e0d707 | |||
bfd478bb3f | |||
46de9f7767 | |||
38da85ee43 | |||
3a51aafd7f | |||
0dbee646b7 | |||
f681ac9ef1 | |||
b49de2ab26 | |||
fa970c076b | |||
037db65a38 | |||
092834f65e | |||
c71f3b37e4 | |||
f46f3f0be0 | |||
5f1cd907ad | |||
4e656cc127 | |||
6120fa1e49 | |||
7da0e14b2a | |||
a637acdd74 | |||
963bdf2376 | |||
89f3caca4a | |||
90885576af | |||
e2dbf47a43 | |||
9f71b65675 | |||
8c5c4f8bb5 | |||
11dd3d758f | |||
1b8bf1cd2b | |||
15a65b6166 | |||
fc842d9751 | |||
243f93b70d | |||
4bfbe5b30e | |||
3db6445e54 | |||
66475da5a9 | |||
cfc94d5595 | |||
ac162e11d2 | |||
e73fa8d24c | |||
84c5e08515 | |||
b8cbfe2fce | |||
c586fbe9ad | |||
10d23ed543 | |||
6a8af04718 | |||
ce48ac41b1 | |||
4969071cc2 | |||
6d67b0350d | |||
75d682cc22 | |||
2a39442e1b | |||
1abe43e4ce | |||
5f1d114907 | |||
875a1c969a | |||
803db886b1 | |||
149cc910f4 | |||
dfe0e0abf3 | |||
6314d85a59 | |||
b993c63d3c | |||
90b8b93b79 | |||
5ab09ee552 | |||
b48817f04c | |||
6fbea0b677 | |||
dfb7225af5 | |||
8353a15524 | |||
aa0e707d84 | |||
ce62db9967 | |||
ddc94ca169 | |||
b007d703e3 | |||
f14ba8c721 | |||
92c49777ae | |||
309097c976 | |||
f424ee1d71 | |||
084e0d970d | |||
cd7522ef7f | |||
6cc4c9db4e | |||
a95f2f0f7f | |||
03254c22af | |||
95a84ff84d | |||
f723b22532 | |||
ac8a46c788 | |||
eaf1dac531 | |||
3a8ce008ad | |||
7f549b89a9 | |||
ad229121f0 | |||
10dc693be4 | |||
4cdec118ac | |||
5b492c150a | |||
5a58565f43 | |||
6cc566d4b7 | |||
4197025e51 | |||
01ca9d432e | |||
83194abe8f | |||
951885c1f5 | |||
8bcf5dae1a | |||
71ae50ac4d | |||
3d7e23ec05 | |||
fae52d36d3 | |||
84aee759d2 | |||
0f4193f9e1 | |||
7dff32225e | |||
0bc09103de | |||
8f749b5dad | |||
c5f7a13c1c | |||
33e8c038e7 | |||
caaa9e04c7 | |||
b8befff93d | |||
20d47ffac4 | |||
98da02a5fd | |||
38850f7444 | |||
7d0c949a0c | |||
2df03cfa28 | |||
721fdd4378 | |||
e469e4315b | |||
e66ea168c2 | |||
a1855abf67 | |||
f97395dab1 | |||
6756f35763 | |||
6885c35886 | |||
0a9420ec32 | |||
f0bd717ac6 | |||
b6de48d342 | |||
63eef7993a | |||
4560cd35e8 | |||
fdf73ce98d | |||
f2fa49f342 | |||
476c20aae4 | |||
fad55dc8a1 | |||
16573234e5 | |||
64bb60afd8 | |||
93e4b17e4f | |||
2184fd39e3 | |||
1f99c1fe9d | |||
9ff5114b76 | |||
023c64fa97 | |||
910196fb1a | |||
f22772bf21 | |||
414997b236 | |||
c7fbe84181 | |||
c728cc01a9 | |||
f88e31c44a | |||
7f45ce2ce2 | |||
b74d00abe6 | |||
41a7a21683 | |||
8cd4cc270c | |||
96d522ca8e | |||
aaae9c3c0c | |||
9e70d24e58 | |||
aa77cf6ae1 | |||
17148cc455 | |||
2b2df20dd0 | |||
c7e70f6808 | |||
c370c0ab41 | |||
2afb97122e | |||
ab9a1aa9ff | |||
aa5a6903a6 | |||
6985d6c4fa | |||
1cfb0d745e | |||
1ac274ab45 | |||
1c1ee39431 | |||
f6008fcf38 | |||
a539ce7352 | |||
a298565e46 | |||
2db18052d2 | |||
28dd9a5810 | |||
be8af17f3e | |||
99e573caac | |||
00213ccdc9 | |||
8154c82b36 | |||
07394c0337 | |||
4fc181a170 | |||
a1afb2f891 | |||
880a880976 | |||
c5ed6e0815 | |||
e75ddfd49b | |||
6711bf33f0 | |||
812ba0aee0 | |||
99c1af8cf7 | |||
9e1fd81ff9 | |||
2a9282df75 | |||
85fd237f28 | |||
4bab11061c | |||
1636644829 | |||
ff9c7ccc83 | |||
636c408d41 | |||
3f10d0bfb8 | |||
7033129aff | |||
8e632a44b3 | |||
6f39acb62f | |||
003b866e17 | |||
eb0ee9ca73 | |||
47437114c7 | |||
ad99d10433 | |||
ee39b5c87b | |||
96dda85b81 | |||
6de7c26c53 | |||
12f353f8ea | |||
fbbaf576f3 | |||
1d043194da | |||
ed0024390b | |||
34da7c8090 | |||
7dec022471 | |||
d8a3ef40f6 | |||
e6d8e10606 | |||
4435b8fcef | |||
bbfa7f6030 | |||
3ec724c3dc | |||
4b272c0459 | |||
82e6fa3808 | |||
0a6a8853a6 | |||
6d9ec0ca02 | |||
e8780576a6 | |||
eeed4a99f5 | |||
ed1386a1da | |||
012d115679 | |||
f66f3d181a | |||
ac11c64fe7 | |||
4c85a3b2b7 | |||
d36e12f21d | |||
366ca3f7da | |||
f0647ee95a | |||
1011d5c5b5 | |||
00f848b27c | |||
0eaedf4afa | |||
8adc200bba | |||
bab4db6ca2 | |||
bb2f6fbf2e | |||
feee6cff1f | |||
7bc832365d | |||
cd4cd3f52e | |||
f4ae255f9a | |||
e83eb1f844 | |||
32252b15ee | |||
4b17aa293e | |||
6a433dbf34 | |||
bf3757a154 | |||
4933137d79 | |||
17d458b0ca | |||
7614e319ce | |||
3eb3481812 | |||
28035567db | |||
d6c2be8042 | |||
474358d972 | |||
a9a220f96c | |||
a2fc8f405c | |||
7152189d82 | |||
683c9d3d32 | |||
db6febd62e | |||
97e8045ac9 | |||
908081813e | |||
857bbfb02b | |||
feb69e8fd9 | |||
3bd4c04ac9 | |||
5d372c116d | |||
7c08b7cce5 | |||
7691130cc3 | |||
201808f9df | |||
10c5ac4597 | |||
ea264c31f6 | |||
dc5f579d98 | |||
7dc01d70ef | |||
0925d31985 | |||
08b756b0a6 | |||
afd5dd5710 | |||
57d5509fd6 | |||
1d1d9b2d12 | |||
6f461077ee | |||
ca8b6d9583 | |||
9ac8433e6d | |||
e18a2c8001 | |||
b06d7192e6 | |||
547f0764b4 | |||
ed6ed71239 | |||
f01c4a472a | |||
9ab1349c54 | |||
5107d35fe7 | |||
e53c36e32d | |||
4a8b55400b | |||
28e269365d | |||
42d4ebfdae | |||
c2e0342bb3 | |||
09a92c16bb | |||
30d14ca320 | |||
dcc8742fb4 | |||
026fdd982e | |||
59cf9d5708 | |||
ca2e4be40b | |||
74cd52e044 | |||
1fd4f31dce | |||
624259991e | |||
94ee681f07 | |||
42fa621cd9 | |||
e449ce87e2 | |||
cf07acf53a | |||
1ccdf3b350 | |||
3d4f288ba0 | |||
ee7dd822a0 | |||
c397c589f5 | |||
e314892818 | |||
f179d41cff | |||
70f7d060d7 | |||
58c9393d70 | |||
2b2dc5e736 | |||
867d8ce87e | |||
2460c161dd | |||
850438daee | |||
6931025617 | |||
b2092cc64b | |||
2ffd780bb6 | |||
f97d82c559 | |||
aa401634ed | |||
d1d5ea9b77 | |||
8134789973 | |||
b299608352 | |||
728ed8570f | |||
61d6da99ed | |||
2771eee995 | |||
ae1a3aafb9 | |||
ac875f73de | |||
6719943d1c | |||
493936adcb | |||
706fc6d063 | |||
1e5e1710ee | |||
b8eb9c50f7 | |||
c660aafe64 | |||
c6de1aa714 | |||
7cafd62552 | |||
599bd748df | |||
4cc6ec5b67 | |||
07659a468f | |||
216d76446a | |||
67f4fc0675 | |||
ee84976b97 | |||
8bde85a15b | |||
39f1d8d802 | |||
9721396683 | |||
325f33b35b | |||
912fdf7f30 | |||
e222a12c68 | |||
e13bebf4de | |||
0efdd74c77 | |||
6721c0592d | |||
a9a5b38c29 | |||
6e2d9fdcc2 | |||
77a8e57cd9 | |||
d4cc81a6c2 | |||
c1f9d6f796 | |||
0163806daa | |||
d31ba63447 | |||
d3edddea90 | |||
34ef20ce4e | |||
616f49605b | |||
a89ef70bee | |||
648610ef66 | |||
a8ce104d86 | |||
9c48997a26 | |||
733e3cfab6 | |||
b6ffbff40e | |||
ee9ce9bddf | |||
b472c10c97 | |||
e517bbda82 | |||
c047e96722 | |||
156a7fafab | |||
4c727c8834 | |||
241a7ffb06 | |||
7871d26c09 | |||
afc37a0c85 | |||
bbf351bf08 | |||
b6d933e364 | |||
3eb9643270 | |||
89e78f1e46 | |||
91a130cf75 | |||
201bab15c0 | |||
56311e55b9 | |||
f4bf3dd84c | |||
f904ec1ca1 | |||
ef88658853 | |||
7ac71b6bba | |||
f17751b91a | |||
a9872adf08 | |||
11b9f915f0 | |||
32825e713f | |||
4842406f27 | |||
f2b5e82ce4 | |||
fb681fac09 | |||
2722694639 | |||
b312c40456 | |||
9e52fa93d4 | |||
ab04194ee4 | |||
e06c2052a0 | |||
b1dee99409 | |||
0d35f97d01 | |||
3d15c22b0b | |||
d02b234626 | |||
1bedc8a76c | |||
9ca1271020 | |||
a9b771ab5c | |||
02d095cae0 | |||
1e15abe27c | |||
a6c9b73442 | |||
c4f68aeba4 | |||
b65d7189c7 | |||
c1303a46a9 | |||
050352e6ac | |||
3e8ee0d14c | |||
c7e102992c | |||
88f7b72526 | |||
e643cc8c10 | |||
d16b32e6c8 | |||
f237c30e06 | |||
e1f5c6cf95 | |||
1a70735e92 | |||
6f1c14891b | |||
f1e6430233 | |||
302c1b364d | |||
67b706b550 | |||
9698612edb | |||
21faa34589 | |||
fb9629c1aa | |||
de0ede905f | |||
663e7e9285 | |||
bbc6bdea30 | |||
7dd4fe8ac4 | |||
c48e7b869b | |||
7d8b3c25d4 | |||
d903505ee6 | |||
fc8d0a1179 | |||
150082a6df | |||
ab813e5c55 | |||
7e8b0bf229 | |||
353924a117 | |||
3e47ac9e3f | |||
8541ba7ba2 | |||
66a1462d14 | |||
0cdcae487a | |||
256b351090 | |||
fef78cea4d | |||
0e30ea3779 | |||
312821b016 | |||
5c8a0c53c0 | |||
9baf84dd3f | |||
ddd660b45a | |||
3eba817d50 | |||
66544898fa | |||
667c94389a | |||
215a5c1ca2 | |||
c5178d52f4 | |||
ac7ce0f792 | |||
3ec44384f3 | |||
0f7bd8f094 | |||
b47184778a | |||
43b2d39c1e | |||
2ad962552f | |||
8df3d31718 | |||
829db8abc0 | |||
8286459fec | |||
6674930742 | |||
997db05a9e | |||
b7f8281f77 | |||
857551fe61 | |||
90ef19d0dc | |||
ea8b9ee7fe | |||
bb34927092 | |||
c1f592bb75 | |||
a205df3970 | |||
6844f5294d | |||
b82950b705 | |||
a250a973f3 | |||
912637025c | |||
d5f06c23ad | |||
c1fad44a43 | |||
4557f086ef | |||
5509d79702 | |||
1e19674485 | |||
99655c6cc4 | |||
71f89a3d8a | |||
0ee21d254a | |||
3a887802c5 | |||
ce106b0d7f | |||
85e78eab9a | |||
8310abdf44 | |||
b6ea3c2732 | |||
85bdfac81a | |||
846a7f7088 | |||
663a82d873 | |||
00b116a940 | |||
d19396a065 | |||
74549eff9d | |||
2c4015ab94 | |||
e272fc04f2 | |||
503ed3ac94 | |||
40a6743e78 | |||
f4875ceb7c | |||
af86a781f6 | |||
09ceb21e95 | |||
97d0d1ad4f | |||
b63444f3cb | |||
296ede80f7 | |||
24b39d2885 | |||
04bb752634 | |||
94c66c21ad | |||
b55ab3afa9 | |||
5fd3c3b334 | |||
d0d4c9f777 | |||
3ff376b43b | |||
cea9c3f426 | |||
9bebcf32cc | |||
75a1d90233 | |||
5cdbf5e814 | |||
b8c322fd50 | |||
0bfcf34450 | |||
4eb874f044 | |||
27bba3c318 | |||
42bf6f5c61 | |||
3dab3ac1a0 | |||
18776c59b2 | |||
2aa4657a78 | |||
c0f8cda7c6 | |||
28fbf66459 | |||
dba9bb4780 | |||
7939dc1bf1 | |||
6b48f9c639 | |||
a48ee35125 | |||
6c0395b65e | |||
6642c1ad97 | |||
f0cbb288df | |||
4a99377fb1 | |||
15d0de8568 | |||
2dba7f7f99 | |||
e825b43a13 | |||
9ab46a3daa | |||
7504edaa11 | |||
3b5a505257 | |||
46f6082efd | |||
0d4930ff5b | |||
5b7fa0d438 | |||
41bc26c145 | |||
adfedc4197 | |||
6ebcc4e21c | |||
1add09e5ea | |||
2d4afde696 | |||
e8d2dc3ee7 | |||
d925935b56 | |||
90e11d3713 | |||
2d3aab8d8a | |||
ab7b069769 | |||
e29562ddcb | |||
82f583451c | |||
570a371f4b | |||
266405628e | |||
ec8fefb3f1 | |||
7eb429993e | |||
85e27c6782 | |||
11dcc0e9ea | |||
2d8df1af08 | |||
e51eca351f | |||
43f1e55411 | |||
26873b0f97 | |||
5acdb5516d | |||
adf1f3c25b | |||
2e35f1718b | |||
aeccc9e9ac | |||
07ffc279b2 | |||
1f08629a4f | |||
57d529d309 | |||
7368ca00c1 | |||
1efabca2b1 | |||
11ac3fe157 | |||
74bb09b8c7 | |||
1b5d01241c | |||
4ed49d001f | |||
567d5a7d14 | |||
072ea586cd | |||
e516901aa4 | |||
f9c38fda6f | |||
7a0d04ac52 | |||
2e8d6558d0 | |||
59e924fb9a | |||
84beea9108 | |||
f0d2c49355 | |||
2f2e368b8a | |||
30cc8b0694 | |||
535053a3e6 | |||
9a806a8ca2 | |||
03b146386e | |||
650aa8c102 | |||
f5927ec5d4 | |||
355ae063a6 | |||
919b0ab0fd | |||
cb52ab4fb4 | |||
75c81f21f0 | |||
2cb0f654a2 | |||
3277cf6662 | |||
c9c37e1c84 | |||
13228eac35 | |||
6ffae90de9 | |||
be625c9efd | |||
3f49128cc7 | |||
a1b1e8c6a6 | |||
0d8c4b4205 | |||
a408d9609d | |||
39e915bbbf | |||
8f489ca872 | |||
b38824ff94 | |||
ad2f0066ce | |||
7e00e760ba | |||
c712758ed3 | |||
6582ae6d10 | |||
d597136748 | |||
e606b72aa1 | |||
1f15d17c5f | |||
9b3d90ec73 | |||
6780ed8be3 | |||
6b38ed85cf | |||
e96ac0fabc | |||
47ae7b475b | |||
15687c3ec0 | |||
69c229b7a7 | |||
448e119b0b | |||
7b9781666a | |||
46ba04278f | |||
f74a84cd96 | |||
aaa5835a69 | |||
1371bb5fb3 | |||
414c59bc1a | |||
055a0f720c | |||
a49fc77b30 | |||
fcb4a3c3e0 | |||
b34714cbe4 | |||
b4e94b4f19 | |||
d46eb5ef99 | |||
5244d624d8 | |||
0a8cd6a361 | |||
4c5b4ba2ed | |||
94fa9318f8 | |||
1d09019b38 | |||
6a15af722c | |||
54971fd8ae | |||
e0c5bbedb3 | |||
1d9d52b59a | |||
f3bde6eb58 | |||
745506c965 | |||
2bb67fa9c5 | |||
aadfd1e289 | |||
613e78a951 | |||
5b37de2075 | |||
7bd0683869 | |||
a38338b165 | |||
b604b177bb | |||
566985bb8b | |||
40d25a4e10 | |||
a5c0b8539b | |||
ecb9de246c | |||
1207c39df9 | |||
dbac0b56a5 | |||
51c1d36b60 | |||
1581c13460 | |||
b7c8ef9c4e | |||
57c30ff319 | |||
f9b2a75ae4 | |||
593bb41637 | |||
0727b38d36 | |||
d5439e2f14 | |||
e2be27e7d3 | |||
abde262c60 | |||
7ab1b55079 | |||
8cfc7c654f | |||
d69e92b76a | |||
5da6ef2a5d | |||
765cdfeb27 | |||
cb5bdb8646 | |||
97a7ae9955 | |||
f81e76f595 | |||
302b5d8c27 | |||
5f90c91a24 | |||
8ad224c9a8 | |||
93c483c904 | |||
6246987ba8 | |||
31cce0dc65 | |||
70de71d6a3 | |||
2f3a016b21 | |||
cb83843a28 | |||
1ac006804b | |||
211e5314fb | |||
4d422777f7 | |||
03d4656a62 | |||
5e31ab3abe | |||
727660f566 | |||
329b32c260 | |||
2cbb2f0988 | |||
f3831c5157 | |||
8e60b836f6 | |||
d8f1dbe2b7 | |||
97e1e301e6 | |||
b26df3af22 | |||
cfb086e503 | |||
2feb127e4b | |||
d4644a67f1 | |||
3301684ee4 | |||
17c3f015f1 | |||
9e1c179984 | |||
3142cd1861 | |||
33a2b931e6 | |||
91390db88c | |||
651d594121 | |||
96a276219a | |||
156374ded7 | |||
34a3c307b5 | |||
422239f0c5 | |||
53a205be4d | |||
cd69cdedb9 | |||
61e51ea1d2 | |||
d1c967c055 | |||
b41a2b618f | |||
1236c3caeb | |||
436f1b1b23 | |||
a63f1fd6a9 | |||
32d80dcfad | |||
eae7ec4ac3 | |||
10222bffd2 | |||
a9244ad817 | |||
ed6d44df5f | |||
6ea63d2f70 | |||
54cd4afa77 | |||
914d5e38f1 | |||
f2ca461638 | |||
a4715ad4c7 | |||
b28c828f02 | |||
f470d26692 | |||
d20f0c3b89 | |||
f9559b7d27 | |||
560ad66d48 | |||
985912a9cd | |||
a0c0207133 | |||
2578d031a7 | |||
cbcf314f47 | |||
73b888f683 | |||
ef144f9454 | |||
064ac4418b | |||
949f38fb58 | |||
5f0a9676b8 | |||
bcd1ffaf09 | |||
80bd531d58 | |||
95f2278542 | |||
ad6905db4d | |||
8b7640731d | |||
844bb5aa05 | |||
959f0fdc8d | |||
39253b94c5 | |||
691f6c7bbd | |||
7a993b9f19 | |||
7805bf88ab | |||
27b33264c5 | |||
ba161aeeae | |||
cbb9189e7c | |||
d9d979d917 | |||
14e46a2fb7 | |||
6606a1f331 | |||
21a82db268 | |||
b86b5056f8 | |||
b915e45332 | |||
6cdc0261e9 | |||
6b77d140ea | |||
bcde0df374 | |||
1e12cb208b | |||
22e24e97bd | |||
a6dee052bb | |||
3597bfd3ca | |||
23db2145ad | |||
ed0440cd9f | |||
f6ad3b1c21 | |||
c78c982613 | |||
031929e773 | |||
03f69c0b51 | |||
a908d8a9f1 | |||
68c12e950e | |||
45ebf4dcdb | |||
9f30695ca3 | |||
936758afdc | |||
01d5b09190 | |||
63210d28a1 | |||
b25f27cd66 | |||
30f3dc0461 | |||
fc23eac478 | |||
6bc27b9cd5 | |||
26081c67f6 | |||
558bf01898 | |||
27d6980746 | |||
b2a13c96d0 | |||
ae1932ea9e | |||
f267b575d4 | |||
7eb0e43302 | |||
42299f7fe3 | |||
fc166214b0 | |||
32988e55af | |||
f079d9c48a | |||
80d494ca91 | |||
5082f60093 | |||
66303e6c95 | |||
068ff32a72 | |||
6e2463d126 | |||
8ec827eb89 | |||
2bc7fbac24 | |||
ce64fd3e25 | |||
6480329bbf | |||
d73b471ec4 | |||
384e2f5afd | |||
d3b278231f | |||
52d7a43e28 | |||
fb3fb594a9 | |||
ca2582c5e3 | |||
5d7bbe6eb1 | |||
18946b10b2 | |||
54d037f689 | |||
8302cfe004 | |||
72be5942f7 | |||
0c48667704 | |||
cdb108ffa3 | |||
b5430eeead | |||
89c0975e66 | |||
2dbce1e327 | |||
bcc622c456 | |||
80ff8ac0f0 | |||
f3c519d715 | |||
324d3c3d6a | |||
6331573a2c | |||
48c2681115 | |||
717bc948b0 | |||
38fa5551ab | |||
ab414bc251 | |||
eb0848e42b | |||
010b35eb50 | |||
da3255888d | |||
9d8c819521 | |||
4d2968a0cc | |||
31dabca224 | |||
e74f89f8c2 | |||
120c5bf40f | |||
0344792c2f | |||
8f4827a382 | |||
392fa7fc85 | |||
cf18d418de | |||
579108e4e6 | |||
a9406ab0ec | |||
1e49e9f95c | |||
2cf3c2f5b0 | |||
dec42c00a8 | |||
343badcc58 | |||
0b3cf4810f | |||
4a49016f8c | |||
06b1d45870 | |||
41f96167d1 | |||
5a0fc37d2f | |||
d141086b24 | |||
20aa562de5 | |||
80e1c4149c | |||
cd783acee0 | |||
c539fab8ee | |||
5436ced5b7 | |||
e7ca5cecdc | |||
3e5a3e59ae | |||
1669964892 | |||
b6247e3314 | |||
9a0e2bffef | |||
bfa8709900 | |||
a37c1df18d | |||
28eb039ec0 | |||
3c7d4800bc | |||
a70ceebd50 | |||
bba6cb76ad | |||
3bb34f9f9b | |||
08691b7745 | |||
1a404c50b1 | |||
769a1dce17 | |||
430e754ae0 | |||
4c90286e09 | |||
eabf14a6ce | |||
74fa1fabd4 | |||
94e2fffacc | |||
a4d9158f14 | |||
896622c0cb | |||
b2511a2711 | |||
e1ae60627e | |||
5b3deec628 | |||
f29eec46e1 | |||
5bdf376487 | |||
16ce2e9516 | |||
edcc4f09a7 | |||
aeae2420c6 | |||
2c10312ce2 | |||
d0635b4fb2 | |||
016b6a6306 | |||
d0e2433f86 | |||
304d99903a | |||
648befe7ca | |||
5806cdb884 | |||
b66902ef7a | |||
dd585da0b0 | |||
d39148f230 | |||
34ddb8c2f0 | |||
b80b97b787 | |||
edf3f95c8b | |||
e2e5ae154b | |||
b7e88574c5 | |||
d34da1c500 | |||
db6e5954e8 | |||
195c5191ef | |||
b07fe09de8 | |||
40dc38fd21 | |||
db2c204b08 | |||
793d5e6edf | |||
0536826d54 | |||
9228246b32 | |||
7ac801799f | |||
1b80f16bf4 | |||
38d75adc28 | |||
d8b4eaa566 | |||
1856912fd1 | |||
c4d0f3e730 | |||
802c1eb462 | |||
be1a66349f | |||
0cc46d6285 | |||
879938393f | |||
5a42b37797 | |||
65931c3f91 | |||
28bdabd928 | |||
91328aef2e | |||
ea319f531b | |||
de91b26ba0 | |||
e6b577df47 | |||
3b4ae37664 | |||
c808e9ce43 | |||
f7a6011d1b | |||
8448eabd26 | |||
65338e5ab0 | |||
7820e209f8 | |||
e25516a58b | |||
24c4185a4c | |||
5a2c0193a2 | |||
f5e1a383ef | |||
60d8bca6e0 | |||
e627bca564 | |||
661852e573 | |||
03ac06565f | |||
d7b68b9d94 | |||
ce56f60ccd | |||
1640aedd44 | |||
20125dfc51 | |||
b9b11286df | |||
ff5f875f0e | |||
e6a739e639 | |||
bc2293df74 | |||
f57458a63f | |||
dc90ad18e9 | |||
eee7cbcff9 | |||
49d249e6e1 | |||
7d3fa2a478 | |||
a079235183 | |||
672b7ab70a | |||
a888a802ec | |||
7d049555a5 | |||
5a86115a9a | |||
99a9cfc34c | |||
233ff2602d | |||
50af9f272e | |||
6ffff501a9 | |||
10fab99090 | |||
f8e5e8f7e0 | |||
0de4e9fa08 | |||
ac1ba277e4 | |||
8bea9b586d | |||
cf880abf0c | |||
c65ca763fb | |||
9c8fb0c5e3 | |||
ae2ff0472a | |||
bd81b2ab42 | |||
63e4892274 | |||
2baae7a31e | |||
3d8e093bfe | |||
88cfcfb08e | |||
a72caddd02 | |||
025334fb8f | |||
b563479014 | |||
9a78cc6f6e | |||
bae41b45a8 | |||
9c84a2c407 | |||
a7452bd0b5 | |||
71549af089 | |||
8015f39fe6 | |||
aac70d52b5 | |||
0870196942 | |||
05065e521d | |||
13ffa17f2b | |||
2d1d19de23 | |||
34d7a8033b | |||
60eca91b74 | |||
5b640c7f46 | |||
1550c9d9f2 | |||
6b54f9e8b5 | |||
a724d883b1 | |||
2350fc0834 | |||
1dac2e6d9f | |||
51196b05f1 | |||
e2ac49a76d | |||
fd48f850a3 | |||
9e3e3fc491 | |||
5e250cc70d | |||
1339dc671b | |||
d78efc0863 | |||
f8bf87ecf9 | |||
a770a1b488 | |||
7086111024 | |||
f7cd519b7f | |||
46c80ad2d1 | |||
87ac721127 | |||
74278e6449 | |||
3aa48c34b5 | |||
44a2351b72 | |||
46b63639f6 | |||
58f3444ba1 | |||
ca9010acd5 | |||
cac6571371 | |||
64fb6e8ee8 | |||
5859bbe2ab | |||
f77eaf6d9b | |||
9763a1225f | |||
f764f25747 | |||
9a098e2656 | |||
687de063f9 | |||
b944ce0c83 | |||
7dffde361c | |||
94fbf158f6 | |||
57683d45b1 | |||
3bfb452e69 | |||
0fcc460312 | |||
b5a4023a7d | |||
1b933a5da6 | |||
7fbc8b2f88 | |||
f6be9c4972 | |||
5a082100c8 | |||
df1f754a56 | |||
68c866325b | |||
74df2a583c | |||
e794fe798a | |||
880587a055 | |||
cfd00f7fe4 | |||
922a94fc98 | |||
b4a21723fc | |||
ec2d1e21c9 | |||
c94e12e41c | |||
f92ce0b790 | |||
30819851dd | |||
62930be082 | |||
e70bc2cb75 | |||
76ea968e20 | |||
7f4c4ad287 | |||
8c784e7486 | |||
d6d1cd21a9 | |||
fefd9fd850 | |||
9ed9cebe92 | |||
aaa831d0c3 | |||
809a94c34b | |||
3728accefc | |||
9d587ff3a2 | |||
bba875c634 | |||
c3e145f540 | |||
9aebc6d374 | |||
67f4f7d977 | |||
78cfcb64d9 | |||
2caaed659c | |||
9230c299e9 | |||
b170dd688a | |||
067eb6c3ec | |||
659b7c351e | |||
dbcc8e2054 | |||
1e8e6f4652 | |||
ad5066a43f | |||
4e0c1396a0 | |||
8306424277 | |||
93b0b9029b | |||
8c6a8abe5f | |||
e1fbfb6bde | |||
f907128904 | |||
73376c0ea1 | |||
60593b27d1 | |||
6fb35107a0 | |||
3c4896f94f | |||
bd97f069d4 | |||
a49f1f7814 | |||
32299da6c1 | |||
4f9615167e | |||
94b6cf4e17 | |||
6822969aac | |||
fb634e19b9 | |||
090a16f664 | |||
791c38ae3e | |||
62f5a1c974 | |||
b0191b69b0 | |||
a04bf24b5e | |||
07053d49a0 | |||
28aa06366c | |||
01f568b8ab | |||
d1694c6d5f | |||
e7e2181858 | |||
f759fe921a | |||
3d972f11e4 | |||
0d5a18b69c | |||
896cc75f57 | |||
d6addb595b | |||
f2e4a93c72 | |||
3336938418 | |||
7821d61b5c | |||
7e015f88a9 | |||
2f09df75b0 | |||
bf589d7001 | |||
b428de12a6 | |||
d241fc081b | |||
316b324be2 | |||
2ffc24977d | |||
a25553edba | |||
07659cc57f | |||
dc9cb532d9 | |||
6e878c2881 | |||
0bc4933c17 | |||
6d7e1838ea | |||
3b55b7ab7b | |||
b2d0d0af8e | |||
08dab16bc2 | |||
3eea7c933d | |||
2ec272eb96 | |||
7c4263ebca | |||
a84a077ac8 | |||
63fce62664 | |||
facd02f1f2 | |||
516ce0425e | |||
005b243f01 | |||
f14152fe17 | |||
eec5359cf5 | |||
72756ed3f1 | |||
6c496fab54 | |||
bcb867042c | |||
8551c16f84 | |||
6ac4bba4d0 | |||
e200f2cb3e | |||
00f417b710 | |||
bc6849494d | |||
63f7549480 | |||
111fb25a93 | |||
f5604f290c | |||
2e7307b014 | |||
09af931756 | |||
91ed4b7bc8 | |||
053048d05e | |||
633b7ed294 | |||
0d665e2d00 | |||
22cd35be6f | |||
bc024f86f2 | |||
05c7622aeb | |||
6556d71273 | |||
89e72b73d3 | |||
8cbdd61c97 | |||
ff9ef6aeae | |||
5d4ba964d4 | |||
fa08c4d1f9 | |||
0fdef5d825 | |||
9f904b93d7 | |||
6d3672a433 | |||
f55377e7f3 | |||
09d9615964 | |||
0b99bbdd4e | |||
954939fdd1 | |||
5af37f6c92 | |||
6f415c4e6e | |||
9bff58199a | |||
3b46d80161 | |||
87ac3ae563 | |||
1676fcc217 | |||
61add83eeb | |||
b747f00e26 | |||
61c5514c1c | |||
ff6fec6367 | |||
5333845ba4 | |||
e327b6fa8f | |||
bce8268b27 | |||
fd2e0b7aed | |||
4aebdad671 | |||
52a346c06f | |||
dcf1bb5356 | |||
31885fe2be | |||
5f790a7217 | |||
44296a6d36 | |||
d3f60cd835 | |||
5897b112db | |||
67d5758283 | |||
f2fe44b49f | |||
b8283b8fbf | |||
fb25c74ece | |||
997d8df49c | |||
fc88d4bed3 | |||
a2330c57f6 | |||
57b05a458e | |||
7a1c84d96e | |||
1c330e33bf | |||
fc7d3473e4 | |||
c5603adca9 | |||
d7b7f74053 | |||
75913f8fd9 | |||
1acb888a29 | |||
45380ddfe3 | |||
4422f640cb | |||
fa4de7b723 | |||
0aa24037bd | |||
a2e22b4341 | |||
481e33f0d7 | |||
da30135ed0 | |||
f3de346642 | |||
ea7e627e3b | |||
6f6684855b | |||
6bdd00a074 | |||
28a0361cff | |||
10304fd6e2 | |||
27b478b42f | |||
3da004630c | |||
0d9b7a1f02 | |||
22d823ba3d | |||
74133ade4f | |||
8bb363ff33 | |||
8c2cf594c8 | |||
f4a8563399 | |||
fbc1c51fdc | |||
d57bb45a3f | |||
901a54ed97 | |||
7c8636017f | |||
c2be3d67cf | |||
5f8e9da610 | |||
dc047272d7 | |||
07b3eaab7d | |||
c571a6394f | |||
76c7319ddb | |||
59926ad492 | |||
efc5344777 | |||
a8ee99b265 | |||
8701722f30 | |||
63598e8e51 | |||
462d8d5f4b | |||
5fab25b2e6 | |||
83a737e386 | |||
8d3d61035b | |||
07e3f686f9 | |||
bf70878903 | |||
94bbfa5cae | |||
d03da50412 | |||
cc554248db | |||
a9ce85cc35 | |||
cc0e6d0f3d | |||
fd445571c7 | |||
a41111ceb1 | |||
e022e48451 | |||
bbdaf4723d | |||
8cb761239f | |||
533db989d3 | |||
203e65ed87 | |||
91395c2565 | |||
361ca87623 | |||
6eed68e5ee | |||
db2a120cc3 | |||
27620f2aff | |||
6c4d94942f | |||
62cafb87b2 | |||
2a43689175 | |||
7753db46e0 | |||
f04c7ef76d | |||
4ec0309662 | |||
0e4658b6bd | |||
046dbda868 | |||
84d4865e22 | |||
2f5a65947f | |||
01548549a8 | |||
a69ba674b1 | |||
9ef1b0bf87 | |||
e2abe26ce8 | |||
24006e6b45 | |||
8e04cf6503 | |||
8ca7335783 | |||
a1b136a39c | |||
4a8facd115 | |||
3eebf9402b | |||
c7172231f2 | |||
c4431b0d2b | |||
2a147075b1 | |||
89842b421e | |||
4435df3d8d | |||
9eaa210044 | |||
7b7da78355 | |||
591f964719 | |||
193bbff0d8 | |||
916277f38a | |||
9f5259592d | |||
c8c273404d | |||
2ddea89df7 | |||
c900c3ebcd | |||
b0735da374 | |||
06c08854d8 | |||
299246f190 | |||
67e400912e | |||
648e6657e0 | |||
dfd1a3c08e | |||
dbfa0c82a0 | |||
26c5952948 | |||
d7d292be03 | |||
75748c9919 | |||
5e28c11b1e | |||
79bb58a7fe | |||
2daa56ae5a | |||
ec165bf89d | |||
3148a775dc | |||
36e0a93152 | |||
d1b6382dbd | |||
3aa165bda2 | |||
afc34381c4 | |||
a3ba822314 | |||
a2fa835516 | |||
67d9660e98 | |||
c5c1453508 | |||
145b318601 | |||
a98d3363b7 | |||
c816ee622e | |||
437102059b | |||
ec64b98001 | |||
00d09911ca | |||
91d0f1291f | |||
a8fb1078e1 | |||
67eb553228 | |||
746a1ce65f | |||
f5736f8f1e | |||
3ec6c90a6b | |||
4a22dbf524 | |||
ace30a9234 | |||
646f964fae | |||
b3ff8a0ae5 | |||
8978b33bb0 | |||
2f629fa0e7 | |||
b3825cd75a | |||
3a9b59077d | |||
875cc6da53 | |||
381b908542 | |||
ca9bfe2cb9 | |||
f253051c44 | |||
774bce013e | |||
c0c754e7f2 | |||
73942d7b17 | |||
18b572faab | |||
90842f34dc | |||
c11bf52e8c | |||
a37501867f | |||
eb943a778a | |||
4ab76d4a18 | |||
12cc3454d1 | |||
de80a87a3d | |||
96c6e3008d | |||
add65b5191 | |||
024dbf82b2 | |||
d593a9e3d1 | |||
159bcbb8c2 | |||
527f3145ef | |||
b3106bf819 | |||
e75ec240d6 | |||
8f8da67485 | |||
a6e6928157 | |||
de4e9a8439 |
14
.gitignore
vendored
14
.gitignore
vendored
|
@ -1,14 +0,0 @@
|
|||
Makefile
|
||||
|
||||
.waf-*
|
||||
.lock-wscript
|
||||
_build_
|
||||
|
||||
po/.intltool-merge-cache
|
||||
po/LINGUAS
|
||||
po/POTFILES
|
||||
po/midori.pot
|
||||
po/stamp-it
|
||||
po/*.gmo
|
||||
|
||||
midori.desktop
|
294
CMakeLists.txt
Normal file
294
CMakeLists.txt
Normal file
|
@ -0,0 +1,294 @@
|
|||
# Copyright (C) 2013 Christian Dywan <christian@twotoasts.de>
|
||||
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_policy(VERSION 2.6)
|
||||
# Work-around a bug in the included FindGettext fixed with 2.8.8
|
||||
# See http://www.cmake.org/pipermail/cmake-commits/2012-February/012117.html
|
||||
if ("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}" VERSION_LESS "2.8.8")
|
||||
cmake_policy(SET CMP0002 OLD)
|
||||
endif ()
|
||||
project(midori C)
|
||||
add_definitions("-DPACKAGE_NAME=\"${CMAKE_PROJECT_NAME}\"")
|
||||
add_definitions("-DPACKAGE_BUGREPORT=\"https://bugs.launchpad.net/midori\"")
|
||||
|
||||
set(VERSION 0.5.11)
|
||||
add_definitions("-DMIDORI_VERSION_SUFFIX=\"${VERSION}\"")
|
||||
|
||||
string(REPLACE "." ";" VERSION_LIST ${VERSION})
|
||||
LIST(GET VERSION_LIST 0 MIDORI_MAJOR_VERSION)
|
||||
add_definitions("-DMIDORI_MAJOR_VERSION=${MIDORI_MAJOR_VERSION}")
|
||||
LIST(GET VERSION_LIST 1 MIDORI_MINOR_VERSION)
|
||||
add_definitions("-DMIDORI_MINOR_VERSION=${MIDORI_MINOR_VERSION}")
|
||||
LIST(GET VERSION_LIST 2 MIDORI_MICRO_VERSION)
|
||||
add_definitions("-DMIDORI_MICRO_VERSION=${MIDORI_MICRO_VERSION}")
|
||||
|
||||
execute_process(COMMAND "bzr" "revno"
|
||||
OUTPUT_VARIABLE REVISION
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
if (REVISION)
|
||||
set(VERSION "${VERSION}~r${REVISION}")
|
||||
# All warnings are errors in development builds
|
||||
set(VALAFLAGS ${VALAFLAGS} --fatal-warnings)
|
||||
set(CFLAGS "${CFLAGS}")
|
||||
endif ()
|
||||
add_definitions("-DPACKAGE_VERSION=\"${VERSION}\"")
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
|
||||
# Disallow building during install to avoid permission problems
|
||||
set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY 1)
|
||||
|
||||
find_package(Vala REQUIRED)
|
||||
vala_require("0.16.0")
|
||||
set(VALAFLAGS ${VALAFLAGS}
|
||||
--enable-deprecated
|
||||
--debug
|
||||
)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
set(DATADIR ${CMAKE_INSTALL_FULL_DATADIR})
|
||||
add_definitions("-DMDATADIR=\"${DATADIR}\"")
|
||||
add_definitions("-DSYSCONFDIR=\"${CMAKE_INSTALL_FULL_SYSCONFDIR}\"")
|
||||
add_definitions("-DLIBDIR=\"${CMAKE_INSTALL_FULL_LIBDIR}\"")
|
||||
add_definitions("-DDOCDIR=\"${CMAKE_INSTALL_FULL_DOCDIR}\"")
|
||||
|
||||
add_definitions("-DENABLE_NLS=1")
|
||||
add_definitions("-DLOCALEDIR=\"${CMAKE_INSTALL_FULL_LOCALEDIR}\"")
|
||||
|
||||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/config.h" "/* # generated file (stub) */")
|
||||
add_definitions("-DHAVE_CONFIG_H=1")
|
||||
|
||||
find_file (UNISTD unistd.h)
|
||||
if (UNISTD)
|
||||
add_definitions("-DHAVE_UNISTD_H")
|
||||
endif ()
|
||||
|
||||
if (UNIX)
|
||||
find_file (SIGNAL signal.h)
|
||||
if (SIGNAL)
|
||||
add_definitions("-DHAVE_SIGNAL_H")
|
||||
endif ()
|
||||
|
||||
find_file (EXEC_INFO execinfo.h)
|
||||
if (EXEC_INFO)
|
||||
set(VALAFLAGS ${VALAFLAGS} -D HAVE_EXECINFO_H)
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
find_library (X11 X11)
|
||||
if (X11)
|
||||
# Pass /usr/X11R6/include for OpenBSD
|
||||
find_file (SCRNSAVER X11/extensions/scrnsaver.h /usr/X11R6/include)
|
||||
find_library (XSS Xss /usr/lib/X11R6/lib)
|
||||
if (SCRNSAVER AND XSS)
|
||||
add_definitions("-DHAVE_X11_EXTENSIONS_SCRNSAVER_H")
|
||||
set(OPTS_LIBRARIES "${OPTS_LIBRARIES};${XSS};${X11}")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
if (WIN32)
|
||||
set(VALAFLAGS ${VALAFLAGS} -D HAVE_WIN32)
|
||||
endif ()
|
||||
|
||||
if (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
|
||||
set(VALAFLAGS ${VALAFLAGS} -D HAVE_FREEBSD)
|
||||
endif ()
|
||||
|
||||
if (${CMAKE_SYSTEM_NAME} MATCHES "DragonFly")
|
||||
set(VALAFLAGS ${VALAFLAGS} -D HAVE_DRAGONFLY)
|
||||
set(DFLY 1)
|
||||
endif ()
|
||||
|
||||
if (APPLE)
|
||||
add_definitions("-DHAVE_OSX=1")
|
||||
set(VALAFLAGS ${VALAFLAGS} -D HAVE_OSX)
|
||||
else ()
|
||||
add_definitions("-DHAVE_OSX=0")
|
||||
endif ()
|
||||
|
||||
find_package(PkgConfig)
|
||||
pkg_check_modules(DEPS REQUIRED
|
||||
libxml-2.0>=2.6
|
||||
sqlite3>=3.6.19
|
||||
gmodule-2.0
|
||||
gio-2.0>=2.32.3
|
||||
libsoup-gnome-2.4>=2.37.1
|
||||
)
|
||||
add_definitions("-DHAVE_LIBXML")
|
||||
add_definitions("-DGIO_VERSION=\"${DEPS_gio-2.0_VERSION}\"")
|
||||
add_definitions("-DLIBSOUP_VERSION=\"${DEPS_libsoup-gnome-2.4_VERSION}\"")
|
||||
set(PKGS posix linux libxml-2.0 sqlite3 gmodule-2.0 gio-2.0 libsoup-2.4)
|
||||
if (${DEPS_libsoup-gnome-2.4_VERSION} VERSION_GREATER "2.40.0")
|
||||
# valac 0.16 didn't have the bindings yet
|
||||
# For consistency we need to ensure C code makes the same assumptions
|
||||
if (${VALA_VERSION} VERSION_GREATER "0.17.0")
|
||||
add_definitions("-DHAVE_LIBSOUP_2_40_0")
|
||||
set(VALAFLAGS ${VALAFLAGS} -D HAVE_LIBSOUP_2_40_0)
|
||||
endif ()
|
||||
endif ()
|
||||
if (${DEPS_libsoup-gnome-2.4_VERSION} VERSION_GREATER "2.48.0")
|
||||
add_definitions("-DHAVE_LIBSOUP_2_48_0")
|
||||
set(VALAFLAGS ${VALAFLAGS} -D HAVE_LIBSOUP_2_48_0)
|
||||
endif ()
|
||||
|
||||
if (${DEPS_gio-2.0_VERSION} VERSION_GREATER "2.40.0" OR WIN32)
|
||||
add_definitions("-DLIBNOTIFY_VERSION=\"No\"")
|
||||
else ()
|
||||
pkg_check_modules(NOTIFY REQUIRED libnotify)
|
||||
add_definitions("-DLIBNOTIFY_VERSION=\"${NOTIFY_VERSION}\"")
|
||||
add_definitions("-DHAVE_LIBNOTIFY")
|
||||
set(OPTS_INCLUDE_DIRS "${OPTS_INCLUDE_DIRS};${NOTIFY_INCLUDE_DIRS}")
|
||||
set(OPTS_LIBRARIES "${OPTS_LIBRARIES};${NOTIFY_LIBRARIES}")
|
||||
set(PKGS ${PKGS} libnotify)
|
||||
endif ()
|
||||
|
||||
option(USE_GTK3 "Use GTK+3" OFF)
|
||||
option(HALF_BRO_INCOM_WEBKIT2 "Serve as a guniea pig" OFF)
|
||||
option(USE_ZEITGEIST "Zeitgeist history integration" ON)
|
||||
option(USE_GRANITE "Fancy notebook and pop-overs" OFF)
|
||||
option(USE_APIDOCS "API documentation" OFF)
|
||||
option(USE_GIR "Generate GObject Introspection bindings" OFF)
|
||||
option(EXTRA_WARNINGS "Additional compiler warnings" OFF)
|
||||
|
||||
# GTK+3 is implied here, whether set or not
|
||||
if (USE_GRANITE OR HALF_BRO_INCOM_WEBKIT2)
|
||||
set(USE_GTK3 ON)
|
||||
endif ()
|
||||
|
||||
if (USE_GRANITE)
|
||||
pkg_check_modules(GRANITE granite>=0.2)
|
||||
set(OPTS_INCLUDE_DIRS "${OPTS_INCLUDE_DIRS};${GRANITE_INCLUDE_DIRS}")
|
||||
set(OPTS_LIBRARIES "${OPTS_LIBRARIES};${GRANITE_LIBRARIES}")
|
||||
add_definitions("-DHAVE_GRANITE")
|
||||
add_definitions("-DGRANITE_VERSION=\"${GRANITE_VERSION}\"")
|
||||
set(VALAFLAGS ${VALAFLAGS} -D HAVE_GRANITE)
|
||||
set(PKGS ${PKGS} granite)
|
||||
else ()
|
||||
add_definitions("-DGRANITE_VERSION=\"No\"")
|
||||
endif()
|
||||
|
||||
if (USE_ZEITGEIST)
|
||||
pkg_check_modules(ZEITGEIST zeitgeist-2.0>=0.3.14)
|
||||
set(OPTS_INCLUDE_DIRS "${OPTS_INCLUDE_DIRS};${ZEITGEIST_INCLUDE_DIRS}")
|
||||
set(OPTS_LIBRARIES "${OPTS_LIBRARIES};${ZEITGEIST_LIBRARIES}")
|
||||
add_definitions("-DHAVE_ZEITGEIST")
|
||||
set(PKGS ${PKGS} zeitgeist-2.0)
|
||||
endif()
|
||||
|
||||
if (WIN32)
|
||||
add_definitions("-DGCR_VERSION=\"No\"")
|
||||
else ()
|
||||
if (USE_GTK3)
|
||||
pkg_check_modules(GCR REQUIRED gcr-3>=2.32)
|
||||
else ()
|
||||
pkg_check_modules(GCR REQUIRED gcr-base-3>=2.32)
|
||||
endif ()
|
||||
add_definitions("-DGCR_VERSION=\"${GCR_VERSION}\"")
|
||||
add_definitions("-DHAVE_GCR")
|
||||
set(OPTS_INCLUDE_DIRS ${OPTS_INCLUDE_DIRS} ${GCR_INCLUDE_DIRS})
|
||||
set(OPTS_LIBRARIES ${OPTS_LIBRARIES} ${GCR_LIBRARIES})
|
||||
endif ()
|
||||
|
||||
if (HALF_BRO_INCOM_WEBKIT2)
|
||||
pkg_check_modules(DEPS_GTK REQUIRED
|
||||
gtk+-3.0>=3.10.0
|
||||
webkit2gtk-4.0>=2.3.91
|
||||
)
|
||||
add_definitions("-DHAVE_WEBKIT2")
|
||||
add_definitions("-DGTK_VERSION=\"${DEPS_GTK_gtk+-3.0_VERSION}\"")
|
||||
add_definitions("-DWEBKIT_VERSION=\"${DEPS_GTK_webkit2gtk-4.0_VERSION}\"")
|
||||
set(PKGS ${PKGS} gtk+-3.0)
|
||||
# set(EXTRA_VAPIS ${EXTRA_VAPIS} "${CMAKE_SOURCE_DIR}/midori/webkit2gtk-web-extension-4.0.vapi")
|
||||
set(EXTRA_VAPIS ${EXTRA_VAPIS} "${CMAKE_SOURCE_DIR}/midori/webkit2gtk-4.0.vapi")
|
||||
set(VALAFLAGS ${VALAFLAGS} -D HAVE_GTK3)
|
||||
set(VALAFLAGS ${VALAFLAGS} -D HAVE_WEBKIT2)
|
||||
set(VALAFLAGS ${VALAFLAGS} -D HAVE_WEBKIT2_3_91)
|
||||
elseif (USE_GTK3)
|
||||
pkg_check_modules(DEPS_GTK REQUIRED
|
||||
gtk+-3.0>=3.10.0
|
||||
webkitgtk-3.0>=1.8.1
|
||||
javascriptcoregtk-3.0
|
||||
)
|
||||
add_definitions("-DGTK_VERSION=\"${DEPS_GTK_gtk+-3.0_VERSION}\"")
|
||||
add_definitions("-DWEBKIT_VERSION=\"${DEPS_GTK_webkitgtk-3.0_VERSION}\"")
|
||||
set(PKGS ${PKGS} gtk+-3.0)
|
||||
set(EXTRA_VAPIS ${EXTRA_VAPIS} "${CMAKE_SOURCE_DIR}/midori/webkitgtk-3.0.vapi")
|
||||
set(VALAFLAGS ${VALAFLAGS} -D HAVE_GTK3)
|
||||
else ()
|
||||
pkg_check_modules(DEPS_GTK REQUIRED
|
||||
gtk+-2.0>=2.24.0
|
||||
webkit-1.0>=1.8.1
|
||||
javascriptcoregtk-1.0
|
||||
)
|
||||
add_definitions("-DGTK_VERSION=\"${DEPS_GTK_gtk+-2.0_VERSION}\"")
|
||||
add_definitions("-DWEBKIT_VERSION=\"${DEPS_GTK_webkit-1.0_VERSION}\"")
|
||||
set(PKGS ${PKGS} gtk+-2.0)
|
||||
set(EXTRA_VAPIS ${EXTRA_VAPIS} "${CMAKE_SOURCE_DIR}/midori/webkitgtk-3.0.vapi")
|
||||
endif ()
|
||||
set(EXTRA_VAPIS ${EXTRA_VAPIS} "${CMAKE_SOURCE_DIR}/katze/katze.vapi")
|
||||
|
||||
# dh_translations detects this if there's no variable used
|
||||
set (GETTEXT_PACKAGE "midori")
|
||||
add_definitions("-DGETTEXT_PACKAGE=\"${GETTEXT_PACKAGE}\"")
|
||||
|
||||
set(CFLAGS "${CFLAGS} -Wall -Wundef -Wno-deprecated-declarations -g")
|
||||
|
||||
if (EXTRA_WARNINGS)
|
||||
LIST(APPEND EXTRA_CFLAGS_LIST
|
||||
-Wextra
|
||||
-Wno-unused-parameter
|
||||
-Wno-missing-field-initializers
|
||||
-Wno-comment
|
||||
-Waggregate-return
|
||||
-Wredundant-decls
|
||||
-Wshadow -Wpointer-arith -Wcast-align
|
||||
-Winline -Wformat-security -fno-common
|
||||
-Winit-self -Wundef
|
||||
-Wnested-externs
|
||||
)
|
||||
string(REPLACE ";" " " EXTRA_CFLAGS "${EXTRA_CFLAGS_LIST}")
|
||||
set(CFLAGS "${CFLAGS} ${EXTRA_CFLAGS}")
|
||||
else ()
|
||||
if (REVISION)
|
||||
set(CFLAGS "${CFLAGS} -Werror")
|
||||
endif()
|
||||
endif ()
|
||||
|
||||
# Explicitly add -fPIC for older toolchains
|
||||
set(VALA_CFLAGS "-g -fPIC")
|
||||
|
||||
# With compiler versions that can, enable exactly the non-spurious warnings
|
||||
# in Vala-generated C, otherwise disable warnings
|
||||
if ((CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER "5.0.0")
|
||||
OR (CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER "3.0.0"))
|
||||
set(VALA_CFLAGS "${VALA_CFLAGS} -Werror=implicit-function-declaration")
|
||||
set(VALA_CFLAGS "${VALA_CFLAGS} -Wno-incompatible-pointer-types")
|
||||
set(VALA_CFLAGS "${VALA_CFLAGS} -Wno-discarded-qualifiers")
|
||||
set(VALA_CFLAGS "${VALA_CFLAGS} -Wno-deprecated-declarations")
|
||||
else ()
|
||||
set(VALA_CFLAGS "${VALA_CFLAGS} -w")
|
||||
endif ()
|
||||
|
||||
set(LIBMIDORI "${CMAKE_PROJECT_NAME}-core")
|
||||
|
||||
# CMake provides no uninstall target by design
|
||||
add_custom_target (uninstall
|
||||
COMMAND "xargs" "rm" "-v" "<" "install_manifest.txt")
|
||||
|
||||
install(FILES AUTHORS COPYING ChangeLog EXPAT README DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
||||
|
||||
add_subdirectory (midori)
|
||||
add_subdirectory (extensions)
|
||||
enable_testing()
|
||||
add_subdirectory (tests)
|
||||
add_subdirectory (po)
|
||||
add_subdirectory (icons)
|
||||
add_subdirectory (data)
|
||||
add_subdirectory (config)
|
||||
|
||||
if (USE_APIDOCS)
|
||||
add_subdirectory (docs/api)
|
||||
endif ()
|
||||
if (USE_GIR)
|
||||
add_subdirectory (gir)
|
||||
endif ()
|
904
ChangeLog
904
ChangeLog
|
@ -1,5 +1,909 @@
|
|||
This file is licensed under the terms of the expat license, see the file EXPAT.
|
||||
|
||||
v0.5.11
|
||||
Add fake theme for built-in icons
|
||||
* Don't truncate long speed dial titles if there's room to display them
|
||||
Fix warnings for -Wformat-security
|
||||
Ensure vala knows the prototypes of functions it calls, fixing pointer truncation in tests
|
||||
Add unit test to check appmenu/menubar visibility
|
||||
Fix last known GTK2 entry placeholder text bugs
|
||||
Make sure that only one of appmenu and menubar are visible *initially* as well as when changed
|
||||
Move adblock icons to hicolor
|
||||
Limit bookmarks panel callbacks to the lifetime of the panel to fix a crash
|
||||
Fix fallout (broken bookmarks and history panel search) from tweaks to GTK2 entry placeholder
|
||||
fix property binding to ensure that exactly one of appmenu button and menubar is always visible
|
||||
Skip open-with codepath with abp links, they are internal
|
||||
Use find_file to locate execinfo.h
|
||||
Fix middle/ctrl/normal clicking bookmarks (not folders) in the bookmarkbar.
|
||||
Add copright header to sanitize_bar.sh
|
||||
Adblock fixup: Escape . in filter with \
|
||||
Don't shadow variable uri in midori_browser_save_uri
|
||||
Switch Adblock icons to 24px color
|
||||
Always include app menu in toolbar
|
||||
Fix various mis[sing ]annotations and style issues in GIR
|
||||
Compile typelib from gir
|
||||
Fix assert when resetting webapp state after inactivity reset
|
||||
clean up handling of double-valued db column in Tabby
|
||||
Add a comment to explain MidoriBrowser popup callback
|
||||
fix warnings printed when right-clicking resize grip between location and search entries
|
||||
Win32: Use Dr. MinGW if present to preserve crash info
|
||||
Fix menubar warning caused by direct cast instead of `as`
|
||||
Helper script for setting up bzr with some usefull plugins and settings
|
||||
Stop using Gtk.Entry.max_width_chars
|
||||
avoid deprecated SoupServer API with libsoup 2.48
|
||||
Use unowned in foreach loops in Midori.Window
|
||||
Use unowned in foreach loops in Midori.Completion
|
||||
Use unowned with Adblock.Subscription and Element in foreach loops
|
||||
Use unowned strings in foreach loops
|
||||
Enable openWith in app mode and make it work with view-new
|
||||
Implement Midori.Window class with toolbar/ headerbar
|
||||
Drop support for libsoup-gnome-2.4 < 2.37.1
|
||||
Make search icons for engines work correctly
|
||||
Move to WebKit2 4.0 which broke ABI
|
||||
Port to zeitgeist-2.0
|
||||
win32: Bump shipped GrayBird theme version to fix some rendering issues
|
||||
avoid deprecated GtkDialog API with GTK+2 >= 2.22
|
||||
Title case for "Export Certificate" button
|
||||
fix incorrect type of MAX(sorting) in Tabby
|
||||
|
||||
v0.5.10
|
||||
use exit instead of return in license script
|
||||
Fix HAVE_GCR guards after GtkPopover port
|
||||
Remove example app and .desktop before creating it in the unit test
|
||||
Fix cache dir path in Adblock and always mkdir tmp
|
||||
Port location action from Granite.PopOver to Gtk.Popover
|
||||
Match https site when user-style is using domain syntax
|
||||
Always disable developer tools on Win32
|
||||
Reimplement Midori.URI.unescape and add various tests
|
||||
Make the inspector resizable with GTK3 by packing into a GtkScrolledWindow
|
||||
Don't build tabs2one in release builds
|
||||
Don't assume GNotification works on Win32
|
||||
update copyright date in About dialog
|
||||
Don't entity-escape history and bookmark results in location completion
|
||||
Only set tabs' error state if errors come from the main frame
|
||||
Implement Paste and Proceed as an action
|
||||
No Gcr on Win for the moment
|
||||
Yet another Speed Dial CSS update:
|
||||
Port bookmark popover from Granite to Gtk.Popover
|
||||
Make application choosers resizable with a sane default size
|
||||
Use GNotification >= 2.40 and use Midori.App API in webmedia
|
||||
Rework mouse button handling in KatzeArrayAction
|
||||
Don't bind :day in HistoryDatabase.query
|
||||
Make GCR mandatory for all builds
|
||||
Update coub support in mediaHerald
|
||||
history-list: Fix gtk+3 build caused by dropping "using Gtk;"
|
||||
Drop all remaining usages of "using *;"
|
||||
Don't open search engines menu when clearing search action
|
||||
Only remove apps in the sidepanel when left-clicking the delete icon
|
||||
Improve robustness of GTK3-compatibility placeholder text fallback
|
||||
Clean up vapi dependency
|
||||
tls_flags from webkit_web_view_get_tls_info need to be 0
|
||||
Don't add failed pages to history
|
||||
Throw error for wrong paramter in Statement.bind
|
||||
Replace NoJS "allow all pages" setting with "allow local pages"
|
||||
Avoid bugs due to race condition in addons delete dialog
|
||||
Calculate transfer progress at regular intervals to fix 0B/s bug and recalcitrant progess bars
|
||||
Fix warnings occurring with EXTRA_WARNINGS
|
||||
Escape parentheses in adblock_fixup_regexp()
|
||||
Use File.query_exist() on win32 when checking for db to attach
|
||||
Handle _NEW_WINDOW_ACTION explicitly to make _blank targets work
|
||||
Fix undefined behavior uint in mouse gestures
|
||||
fix JavaScript keyup event by calling inherited key-release-event handler in MidoriBrowser
|
||||
Inline renaming of speed dials
|
||||
Handle current_size and last_size of Download being equal
|
||||
Add proper copyright headers to element_hider and autosuggestcontrol
|
||||
Add X-GNOME-UsesNotifications to indicate the use of notifications
|
||||
Fix typo in Bookmarks menu UI definition
|
||||
|
||||
v0.5.9
|
||||
Remove dead code from browser and preferences
|
||||
Build-fix: Make PanedAction's Child.widget public
|
||||
fixes tab history undo
|
||||
Set a placeholder text on the URL entry
|
||||
Add "Add Bookmark" to menu
|
||||
Show search menu upon left icon click in location bar
|
||||
Fix crash when saving with associated resources
|
||||
Fix webkit2 downloads based on older branch
|
||||
don't hide window decorations for Midori-Granite
|
||||
Connect bookmarks-db singleton correctly to fix menus
|
||||
Fix some symbol names and transfer annotations in doc comments
|
||||
Use correct signature for window-state-event handler
|
||||
Do not overescape page titles in view completion
|
||||
Make adblock skip non-standard last update metadata strings
|
||||
Drop deprecated Granite LightWindow used for the Clear Private Data dialog
|
||||
Keep storing the last web media tab played.
|
||||
Allocate CookiePermissionManagerModalInfobar correctly
|
||||
Make middle clicking reload button duplicate the current tab, similar to other browsers
|
||||
Use network-changed of GNetworkMonitor to reload all tabs if network becomes available
|
||||
Show different messages based on network connectivity.
|
||||
Fix crash when activating the edit menu
|
||||
Fix "open all in tabs" for bookmarks
|
||||
Fix a few simple leaks
|
||||
Don't focus the locationaction when leaving blank pages
|
||||
Fix leaks of two references to the MidoriApp in Tabby
|
||||
Compile with valac 0.16 again
|
||||
Never display about:new in the urlbar
|
||||
fix crash right-clicking forms on local pages
|
||||
Share 'youtube, vimeo, dailymotion' that you are playing in Midori using org.midori.mediaHerald
|
||||
Give the SoupURI a path when checking cookie relevance
|
||||
Resolve ellipsis and title stripping in completion
|
||||
Add www. and .com/.country_domain and proceed with Ctrl+Enter/Shift+Enter with (readable code)
|
||||
Clean up browser tab/ uri/ title notify
|
||||
Drop pseudo Granite distinction in completion layout
|
||||
Fix visibility of SpeedDial, Toolbar, Bookmarkbar context menu items
|
||||
Distinguish between desc file missing and other parsing issues
|
||||
Use dependencies to clear test folders before execution
|
||||
win32: Drop dropbox usage from win release script, rename resulting output files
|
||||
|
||||
v0.5.8
|
||||
Use png icon instead of svg in set_status
|
||||
We must not pass a Cancellable to FaviconDatabase.get_favicon_pixbuf
|
||||
Retain spelling suggestion menu items from WebKit
|
||||
Properly guard usage of gtk3 get_style_context
|
||||
Mimic the look of Granite.DynamicNotebook when compiled with --enable-granite.
|
||||
Fix X11 lib underlink in midori-core
|
||||
Fix bookmarkbar bookmark click not opening links
|
||||
Use sanitized app URI as wm_classname/ StartupWMClass
|
||||
Make trunk build with WebKit2 again
|
||||
Fix for incorrect tstamp for background tabs
|
||||
Don't declare sorting doubles are nullable and print values when database tracing is enabled
|
||||
Correctly apply saved entry state and treat urlbar as a regular editable item
|
||||
Add missing conditional includes for granite flavoured build
|
||||
Open URIs dragged on tab label or new tab button
|
||||
Small adblock bugfixes
|
||||
Work around GTK3's hard-coded minimum stackswitcher button width
|
||||
Fix building with mingw packages from fedora 18
|
||||
Set page title as basis for print filename
|
||||
Rename notes inline
|
||||
Use EXTRA_WARNINGS option when building for windows
|
||||
Drop forgotten clutter init and obsolete header declarations
|
||||
Rework history-step handling and make it work again
|
||||
Port Tabby to DatabaseStatement API
|
||||
Replace bookmark stracing with generic profiling in Midori.Database
|
||||
Port autocompleter test to async job
|
||||
Finishing touches for Adblock
|
||||
Add filters and defaults
|
||||
Implement and use ContextAction.escaped
|
||||
printf URI in show_message_dialog for download error
|
||||
Improve docs and GIR annotations for KatzeItem, KatzeArray, and MidoriWebSettings
|
||||
Drop redundant TabNew from compact menu and put button in Tab Panel
|
||||
Fix loading file:// pages
|
||||
Implement Send Page Link by Email
|
||||
Use GtkStackSwitcher with GTK+ >= 3.10
|
||||
Implements context popup menu on menu entries of bookmark bar and bookmark menu.
|
||||
Fix building with newer mingw versions
|
||||
Display locationbar suggestions in the correct order
|
||||
Don't bother adblocking internal pages and favicons
|
||||
Don't use trailing comma on last list element in Adblock tests
|
||||
Rewrite Adblock more modularly, add Whitelist support
|
||||
Add support of DragonFlyBSD
|
||||
Change tooltips of Reload and ReloadStop actions while shift modifier is pressed
|
||||
Implement Midori.Database.attach method
|
||||
Allow :memory: as folder to make schema detection work
|
||||
More robust app/ profile creation
|
||||
Add helper callbacks to modify bookmark's tree store with unneded access to bookmarks db
|
||||
Implement more flexible fallback behavior for Cookie Permissions
|
||||
|
||||
v0.5.7:
|
||||
Modify actions and internal items in browser without changing settings
|
||||
Delay tab loading after Midori crashed
|
||||
Uncomment failing assertions about view_source in tab test
|
||||
Fallback to about:home if startup is anything but blank
|
||||
Don't try to create formhistory database if config_dir is NULL
|
||||
Handle url arguments for blank sessions
|
||||
Execute commands given at start time
|
||||
Introduce high-level prepare/ DatabaseStatement API
|
||||
Drop unused GraniteClutter-based animation support
|
||||
Drop uncommented contractor support
|
||||
Drop deprecated StaticNotebook used in KatzePreferences
|
||||
Introduce notebook class converging separate implementations
|
||||
Work around symbol relocation issue old version of gcc present on Ubuntu LTS
|
||||
NULL-check treeview in midori_search_action_get_editor
|
||||
Adjust CMakeList .ico check to not skip nojs icons
|
||||
Enable sidepanel in private mode
|
||||
Move Preferences menu entry above About
|
||||
Set minimum value of 0 on spin button for maximum cache size
|
||||
Give NextForward its own label for toolbar editor
|
||||
Correctly disable favicon database in app and private mode
|
||||
Change preferences to refer to proxy address as a "URI" (not "hostname")
|
||||
Add close tabs to right feature
|
||||
Allow printing without confirmation dialog on kiosk setups
|
||||
|
||||
v0.5.6:
|
||||
instead of creating devpet status icon on extension load, create it only to show new messages
|
||||
Open speed dial or homepage according to preference
|
||||
handle tab duplication
|
||||
Add copyright note to appdata file
|
||||
Tweak searching for resources when running from build folder
|
||||
Swap NULL-check with main frame check
|
||||
Use correct signal when clearing the trash
|
||||
Hide WEbGL preference if it is unavailable
|
||||
Remove stored popup sessions from the database
|
||||
Check all browsers for opened sessions and whether they're popups
|
||||
removed unused preference dialog and related code
|
||||
Fix check for found valac and mention VALAC variable
|
||||
Fix autoscrolling if page contains a frame with our custom error page
|
||||
Don't use context-menu signal in WebKitGTK+ < 1.10.0
|
||||
Fix building on Ubuntu 12.04
|
||||
Reset item ids when re-importing bookmarks
|
||||
Check path being NULL in export before trying to inspect it
|
||||
restore the last closed sessions if no session is opened
|
||||
Cast WebKitDOMHtmlElement for getting source content
|
||||
Use font-set signal and font family for GTK+ 3.2 font chooser
|
||||
add function to view dom source
|
||||
remove unused variable
|
||||
Resolve compiler warnings in current trunk
|
||||
Update win32-release script for cmake, move unused docs/scripts to old folder
|
||||
Try to handle previous runs of cmake in configure wrapper
|
||||
Correct view source assertions in tab unit test
|
||||
Build fix: found undeclared in midori_bookmarks_db_remove_item_recursive
|
||||
Cache bookmark items to avoid their recreation on database reads
|
||||
allow "view source" on about pages
|
||||
Enable old target policy on cmake < 2.8.8
|
||||
Re-arrange data file installing to be more explicit
|
||||
option to modify the number of tabs which will be restored in each idle callback
|
||||
Implement MidoriBookmarksDatabase class by inheritence from MidoriDatabase
|
||||
Ensure tab spinners update as often as the menubar spinner to avoid desync
|
||||
Use tabby sorting increment when importing session.xbel tabs
|
||||
Only install config files to /etc if prefix equals /usr
|
||||
handle urls as argument when starting midori
|
||||
Make tabby compile with Webkit2
|
||||
Drop waf build system and provide cmake-based "configure" script
|
||||
midori_panel_action_activate_cb forgot to update the action group
|
||||
Fixes bug where certificate Security overlay failed to close
|
||||
handle tab movement
|
||||
add tab sorting
|
||||
Untangle implicit GTK+3 for Granite and WebKit2
|
||||
Allow running test under debug tools with cmake
|
||||
Install config files to /etc when install prefix is /usr
|
||||
Add missing PO_FILES argument to GETTEXT_PROCESS_PO_FILES
|
||||
Add USE_APIDOCS to build API docs with CMake
|
||||
Rasterize SVG to PNG with rsvg-convert
|
||||
fix bookmarks test regression after fix-1179200-4
|
||||
Add CMakeLists.txt for config directory
|
||||
Install mo files in locale dir
|
||||
don't change uri/title if the tab isn't loaded
|
||||
use a separate signal to store the tab title
|
||||
Check if execinfo.h header exists on BSD
|
||||
fix endless loop in Midori.Database.init
|
||||
Use destructive-action style class in ClearPrivateData
|
||||
Initialize priv->element to avoid crash when freeing
|
||||
Introduces KatzeArray::update-item to handle metadata changes
|
||||
Refactor excuting schema from file into a function
|
||||
Use stock as string in liststore
|
||||
Drop needless (and wrong) HAVE_LIBNOTIFY in preferences
|
||||
Flip horizontal position of the overlay when hit by the mouse
|
||||
Add Midori.URI.get_base_domain and use it in NoJS
|
||||
Introduce Midori.Database and use for history and tabby
|
||||
ctrl+shift+w should trigger a delete-event
|
||||
Implement dialog windows opened via javascript
|
||||
Make get_res_filename work with different hierarchies
|
||||
fix check for new database
|
||||
Speed up session import
|
||||
Import tab title from old sessions
|
||||
Separate CFLAGS for C and add missing HAVE_
|
||||
Install top-level text files and FAQ html/ css to doc dir
|
||||
Provide and install .appdata.xml file for app stores
|
||||
Move bookmarks db handling to midori-bookmarks-db
|
||||
Add XSS to OPTS_LIBRARIES
|
||||
Update condition for UBUNTU_MENUPROXY to work on Saucy
|
||||
Introduce tabby, the new session manager
|
||||
Fix typo in katze_item_set_meta_integer call
|
||||
Allow bookmark bar update on additions resulting from imports
|
||||
Re-work midori_array_query_recursive to not include folder items twice
|
||||
Fix syntax of icon sizes passed to foreach
|
||||
Add bzr revision number to version if available
|
||||
Unify nojs and cookie policy dialogs, make policy changeable within the list
|
||||
Drop all G_ENABLE_DEBUG guards
|
||||
Add -g to CFLAGS to enable debugging symbols
|
||||
Adjust cmake build for Win32
|
||||
Implement CMake build setup
|
||||
Port MidoriApp from Unique/ sockets to GApplication
|
||||
New signal about-content to provide content for about uris
|
||||
Check if browser is NULL in midori_view_get_tab_menu to prevent a crash. Fixes bug #1215652.
|
||||
Ensure proxy setting widgets callbacks don't outlive the widgets themselves
|
||||
Fix webkit2 build error
|
||||
Show the bookmarks import location combobox.
|
||||
Rename internal completion URLs to avoid confusion
|
||||
|
||||
v0.5.5:
|
||||
Fix name and text fields inversion in XBEL folder import
|
||||
Correct packing of cookie and nojs permission dialog.
|
||||
Don't set tab title/special when a non-main frame displays an error
|
||||
Revise "cookies" debug output, merge expiry check and disallow revival of old cookies
|
||||
Drop now unused cgit module.xml file
|
||||
Use SoupProxyResolverGnome unconditionally and disable prefetching if proxy is active
|
||||
win32: Hide gui for profiles in webapp manager, as they are currently broken on Windows
|
||||
win32: support additional mouse buttons for going back/forward in history
|
||||
Enrich app error messages with filenames
|
||||
Fix segfault if url contains " %00"
|
||||
Replace 'Run as app' in bookmark dialog with 'Create launcher'
|
||||
Split config files and install from folders recursively
|
||||
Implement GTK+ theme switching via Preferences (Win32)
|
||||
Enable set_disk_cache_directory with WebKit2
|
||||
Introduce Midori.ContextAction and refactor page menu from scratch
|
||||
Define large dialog icon size relative to dialog icon size
|
||||
Extension Devpet which shows error messages and backtraces in systray
|
||||
WebKit2 cookie support
|
||||
Check the hit test result for editable to see if , should search
|
||||
Use SoupCookieJarSqlite and drop KatzeHttpCookies(Sqlite)
|
||||
Show folder tree when editing bookmarks
|
||||
Handle double value in _midori_browser_activate_action
|
||||
Add privacy preferences in web app mode
|
||||
Escape parentheses in adblock_fixup_regexp
|
||||
Introduce object oriented API for access to History Database
|
||||
Allow rss feeds with version 0.92
|
||||
Rename History completion to Bookmarks and History
|
||||
Don't show rss feed icon on twitter, underlying API was retired
|
||||
Read apps/ profiles from folder, leave launchers separate
|
||||
Fill in bookmark folder attributes in bookmarkbar populate
|
||||
|
||||
v0.5.4:
|
||||
Refactor history step and allow multiple title updates
|
||||
Call midori_browser_connect_tab with correct type
|
||||
Don't add HistoryCompletion if there's no history
|
||||
Restore reload button icon in error pages
|
||||
Don't insert folders into the log
|
||||
If an url is specified the fallback url should not be loaded
|
||||
Fixed crashes when closing a loading tab + granite's tab moving
|
||||
Test if plugins are redundant instead of skipping them all
|
||||
Avoid selecting bookmark uris that begin by 'javascript:' for completion
|
||||
Set FOREIGN_KEYS pragma on db initialization
|
||||
Implement a default zoom level preference
|
||||
Fix tautological use of G_MAXINT with enum
|
||||
Take current selection into account for bookmark folders when adding/editing bookmark
|
||||
Improve error page visuals, show suggestions on network errors
|
||||
Bump vala to 0.16.0
|
||||
Downgrade glib requirement to 2.32.3 to re-enable building under Ubuntu 12.04 (LTS)
|
||||
Bump glib2 version to 2.32.4
|
||||
Improve and unify thumbnail generation
|
||||
Omit speed dial and blank pages from view completion
|
||||
Makes the elements of the speed dial non-selectable
|
||||
Use NULL-safe comparison in katze_item_icon_loaded_cb
|
||||
Drop non-DOM style sheet injection code path
|
||||
Clean small leftovers from GTK and WebKit version bumps
|
||||
Bump GTK+ requirement to 2.24 and drop support for earlier versions
|
||||
Check for app mode to set browser icon instead of readonly
|
||||
Escape square brackets in adblock_fixup_regexp
|
||||
Fix showing (sub)folders in bookmarkbar
|
||||
Bump WebKit requirement to 1.8.3 and drop support for earlier versions
|
||||
Set menu on dynamic notebook tab
|
||||
Do not run toolbar editor's GtkDialog in its own main loop by prevent calling gtk_dialog_run(). Instead just set the GtkDialog modal and show it.
|
||||
Remove unnecesary harmful code from tab_switched_cb
|
||||
Fix segfault when deleteing tabs with history list
|
||||
Specify int64 id item as a string in bookmark remove/update queries
|
||||
Distinguish between box and event box in the tab label when colouring tabs
|
||||
Show visual feedback when hovering over items in bookmark panel
|
||||
Replace INSTALL/ HACKING with exported Contribute wiki page
|
||||
Delete tabs from history list with Del
|
||||
Check brightness of backgroung color when deciding foreground color of given tab
|
||||
Clean launcher filenames, double-click to open and delete button
|
||||
Avoid declaring browser twice within the same function
|
||||
Add ./waf --update-pot
|
||||
Fix memory leak introduced in r6184
|
||||
Use old function name g_dbus_generate_guid for old valac
|
||||
Move Import and Export into menu Bookmarks
|
||||
Collect multiple download notifications within a minute
|
||||
Fix segfault when right clicking on a web view.
|
||||
Make libnotify mandatory except on Windows
|
||||
Remove the rather unnecessary ./waf --run feature
|
||||
Send a notification after creating a launcher
|
||||
Ambiguous 'Open as App' context menu item was removed
|
||||
Apply label color to label rather than event box
|
||||
Store data of app mode based on URL in ~/.local/share/midori/apps
|
||||
Split colorful tabs code into helper functions and add unit tests
|
||||
Fix History List memory leak when closing Midori window.
|
||||
Replace .gitignore with a .bzrignore
|
||||
Always define GCR_VERSION in GTK+2 build
|
||||
Fix bookmarks dialog rename regression introduced in r6167.
|
||||
Drop check for gcr-3-gtk2 which isn't being maintained.
|
||||
Scrap unneeded background variables in location renderer callbacks
|
||||
Title case and proper packing in bookmark dialog
|
||||
Delete PO files Launchpad spewed into root directory when it couldn't find po/*.pot file.
|
||||
Issue a warning when trying to use MIDORI_DEBUG while running
|
||||
Update dates to 2013 to fix bug #1167075.
|
||||
|
||||
v0.5.2:
|
||||
Re-release with a proper version number and changelog
|
||||
|
||||
v0.5.1:
|
||||
Fix mouse gesture regression breaking context menu
|
||||
Fix --run command line switch by midori_paths_init
|
||||
Fix bug in size calculation for the history list popup
|
||||
Handle diagnostic dialog argument in running instance
|
||||
Fix feed panel default value crash
|
||||
Ensure existence of the applications directory
|
||||
Fix download tooltip crash and extend test case
|
||||
Integrate user interaction exploit demo in about:
|
||||
Don't convey loading or progress on special pages
|
||||
Address missing NULL checks and dead code found by clang
|
||||
No security window for blank pages, but a search icon
|
||||
Introduce UI for created apps/ launchers: Web App Manager
|
||||
Add custom-title setting to override browser title
|
||||
Add a Gtk.Entry to --plain mode for entering URLs
|
||||
Deprecate middle_click_opens_selection in favour of gtk-enable-primary-paste
|
||||
|
||||
Webkit2:
|
||||
Require 1.11.91 aka 2.0.0 for WebKit2
|
||||
Delayed load, clear favicons, clear HTTP cache, tab favicons
|
||||
Navigation policy, mouse buttons, security details
|
||||
basic cookies, download dialog, res://, stock://, print
|
||||
Zoom, default-charset, view-source, spell-check, prefetch
|
||||
Back/ forward, enable-java, plugin listing, web inspector
|
||||
v0.5.0:
|
||||
Store --execute arguments in string array
|
||||
Prevent overlay frame from being caught by show_all
|
||||
Unconditionally show Toolbar Style preference
|
||||
Duplicate current URI when reloading Midori.View
|
||||
Update tabs being closable on setting change in Granite
|
||||
Check default_search before setting SearchAction default
|
||||
Populate application chooser button in idle
|
||||
Bail out of completion resizing if cell height is 0
|
||||
Pass proxy to bookmark dialog when editing via menu
|
||||
Tweak bookmark dialog, button to buttons, toggles side by side
|
||||
Move 'Flash windows' option into History List
|
||||
Use light window for Clear Private Data with Granite
|
||||
Use GtkFontButton with filter func with GTK+ 3.2
|
||||
Implement 'Run in debugger' button in diagnostic dialog
|
||||
Add Win32 work-around to History List for modifiers
|
||||
Make toolbar drag/ drop work in GTK+3
|
||||
Check if active form element is input before getting search text
|
||||
Implement direction-based mouse gesture configuration
|
||||
Implement mouse movement, load-failed, crashed, search in WebKit2
|
||||
Add 'Show last crash log' button to diagnostic dialog
|
||||
Make invalid actions fail; exit on error in new process only
|
||||
Accept setting=value and extension=true/ false in --execute
|
||||
Merged cookie permissions as of 2013-03-08
|
||||
Gray out webGL preference if context is unavailable
|
||||
Use browser API to Close Other in view menu item
|
||||
Fix periods to ellipsis in Custom/ Customize Shortcuts
|
||||
Support Colorful Tabs in History List
|
||||
Add Midori.Tab.fg/ bg_color and Midori.View.set_colors
|
||||
Fix word-wrap, #decription and #message in about.css
|
||||
Set view scroll policy to Never to avoid flickering
|
||||
Use XDG_RUNTIME_DIR for temporary files
|
||||
Build Vala and C parts of core separately
|
||||
Don't provide default value for enable-scripts
|
||||
Respect Open new pages: window for Web Search and Open Image
|
||||
enable-javascript in WebKit1/ 2, macro for (Web)Settings
|
||||
Fix MIDORI_*_VERSION to be integers
|
||||
Fix .desktop file validation unit test and fix errors
|
||||
'New tab behavior' preference: about:dial/ new/ search/ home alias URLs
|
||||
Use stripped down XBEL variant for session and trash
|
||||
Allow any proxies supported by libproxy; list supported types in preferences
|
||||
|
||||
v0.4.9:
|
||||
Let non-Granite security window behave like a window
|
||||
Disable Contractor support in Granite for now
|
||||
Use cache_dir_for_reading in about:paths
|
||||
Strip LRE to prevent it from begin saved to disk
|
||||
Enable stripping 'referer' by default
|
||||
Fix crash on closing Adlock preferences dialog
|
||||
Bail on unset title in completion, fixing strchr urlbar crash
|
||||
Manage cookies accept policy per domain - not installed by default
|
||||
Don't store/ load stock:// icons for special pages
|
||||
Drop KatzeScrolled in favour of GTK+ 3.4 touchscreen support
|
||||
Write XBEL safely to prevent loss on eg. full disk
|
||||
Omit nspluginwrapper Netscape plugins from extensions
|
||||
Add --debug/ -g switch to run Midori in gdb
|
||||
List versions from about:version in --version
|
||||
Work in progress --enable-webkit2 option enabling WebKit2/ GTK+3
|
||||
Rename menu _Window to _Tabs
|
||||
Update Easylist subscription URL for Adblock
|
||||
Stop redundant tab numbering when adding
|
||||
Allow feed panel webview widget to shrink.
|
||||
Don't search for place holder text on cookie list rebuild
|
||||
Add 'Google Translate (gt)' as a search engine
|
||||
Default external Download Manager to "fetch" on FreeBSD
|
||||
Drop GCC-version specific -Wno-unused-but-set-variable
|
||||
Change X-Ayatana-Desktop-Shortcuts to Actions
|
||||
|
||||
v0.4.8:
|
||||
Fix un-delaying of tabs
|
||||
Support downloads with FlashGet on Win32
|
||||
Fix compilation with GLib 2.30
|
||||
Fix error handling in extensions
|
||||
Retain selection in urlbar when switching tabs
|
||||
Fix missing right-click menu on NextForward button
|
||||
Hide error page button if buttons have no images
|
||||
Rework URL completion: suggest open tabs
|
||||
Always highlight matches in inline search
|
||||
Pantheon: Only show private launcher in search
|
||||
Granite: Fix notebook, require 0.2, drop _about_dialog_new
|
||||
Don't include http(s), file or www. in page title
|
||||
Autodetect Twitter RSS feeds
|
||||
Adblock: Improve date parsing
|
||||
Unit test rework: backtraces, regardless of debugging, wine
|
||||
More accurate version numbers in about:version
|
||||
Drop obsolete --log-file command line switch
|
||||
Emit inspector attach-window with correct signature
|
||||
Fix Netscape plugins opening download dialogs
|
||||
Rework path handling and setup in different modes (fix segfaults)
|
||||
Manage Netscape plugins are individual extensions
|
||||
Address gtk_icon_set_render_icon_pixbuf assertions
|
||||
Fix renaming in speed dial with spaces in title
|
||||
Render completion title/ URL side by side with Granite
|
||||
Transparently use Favicon-/ IconDatabase/ file store per WebKit
|
||||
Add TabMoveFirst/ Last hotkeys (without defaults)
|
||||
Drop Hildon support
|
||||
Show URI in 'not responding' dialog
|
||||
Query search engine icons when loading, rather than stupid guesses
|
||||
|
||||
v0.4.7:
|
||||
Unify download behavior: link fingerprints, space check, clearing, tooltips
|
||||
GIO-based check for enough space and permissions, GIO-based themed icons
|
||||
Show opener/ tab domain in download dialog:
|
||||
http://lcamtuf.coredump.cx/fldl/ http://lcamtuf.coredump.cx/switch/
|
||||
Extension to download with a specific command line
|
||||
Size in download dialog and fallback filename heuristic
|
||||
|
||||
Windows: GTK+3, Faenza icons, gdb helper, Netscape plugins,
|
||||
ship CA bundle, fix View source, --portable/ -P on Windows
|
||||
Granite (Beta): about dialog, static notebook, no "New Tab" in toolbar, Print → Share
|
||||
Support building with Wayland-enabled GTK+3
|
||||
Theming: content view, secondary toolbar class, drop old icon names, bigger error icon
|
||||
Introduce --plain mode equivalent to GtkLauncher, lazy URLs for --snapshot/ -s
|
||||
Log bookmarks, history and downloads to zeitgeist
|
||||
|
||||
Show security details and export certificates with GCR, error out instead of colored urlbar
|
||||
Only allow data: URLs in urlbar for images
|
||||
Recognize and cache HSTS, system-wide /etc/xdg/midori/hsts
|
||||
Strip HTTP Host to outsmart some filter proxies
|
||||
|
||||
Completion: Fix PageUp/Down, Shift+Tab and wrap: This is consistent with GTK+ (excluding Tab) and Firefox
|
||||
Change Focus Current Tab to Ctrl+Alt+Home
|
||||
Fix Shift+Space for scrolling upwards
|
||||
Control+Alt+R: Readable mode
|
||||
Handle access key in link hints
|
||||
Drop speed dial keyboard access in favour of "." link hints
|
||||
|
||||
No Open, Bookmark bar, Customize toolbar, Inspect page in app menu; split panel menu
|
||||
Use ellipsises instead of period thresomes
|
||||
Hinted text in bookmarks, history and cookie manager
|
||||
Ellipsize panels (except for Transfers)
|
||||
Add icon to bookmark dialog and remove labels
|
||||
Validate proxy server IP and render invalid URLs in GTK+3
|
||||
Rename "Toplevel" folder to "Bookmarks"
|
||||
|
||||
Chrome identification option; "Automatic" user agent is Chrome-based
|
||||
Search: Create engines from search forms, remove "icon" field
|
||||
Copy Image s/Address// always copy both URL and data
|
||||
Rework debugging by introducing MIDORI_DEBUG; about:paths
|
||||
Adblock: Refresh filters based on file time and meta data, abp: links
|
||||
Optionally save website including resources
|
||||
Merged NextForward akin to StopReload
|
||||
PanedAction, Viewable, SpeedDial, (most of) Settings, Paths in Vala
|
||||
Improved database: requires sqlite 3.6.19 and 0.2.6 in import dialog
|
||||
|
||||
Confirm Caret Browsing before enabling it
|
||||
Support for custom items in Statusbar Features (see FAQ)
|
||||
Draggable favicon as URL or text, URL icon for URL entries
|
||||
Remember if inspector was attached
|
||||
Open tabs in the background by default
|
||||
RTL support in special/ error pages
|
||||
Fix progressbar text with GTK+3
|
||||
Build fix: More robust GTK+2 version check
|
||||
Ensure progress in urlbar and tab match
|
||||
Zoom text and images by default
|
||||
Don't mixup tokens starting with the same letters
|
||||
Seemless running out of build folder
|
||||
No speed dial in --app/ --private, fix layout with many tiles
|
||||
Add X-GNOME-Fullname to .desktop and translate desktop shortcuts
|
||||
Delayed Load extension
|
||||
|
||||
v0.4.6:
|
||||
+ Fix crasher in geolocation infobar
|
||||
+ Fix crasher in about:version on some systems
|
||||
+ Fix crasher opening bookmarks from Unity global menu
|
||||
+ Use WebKitFaviconDatabase as of WebKit 1.8.0
|
||||
+ Use midori-prefixed temp folder in midori_view_save_source
|
||||
+ Fix cancelling downloads with SteadyFlow or Aria2
|
||||
+ Fix crash dialog instead of opening tab in a running window
|
||||
+ Fix page icons in multi-frame sites (gmail, tumbler)
|
||||
+ Distinguish Simplified and Traditional Chinese
|
||||
+ Support go-jump-symbolic
|
||||
+ Handle empty tabs due to download links with a target
|
||||
+ Handle frame load interrupted in the unholy trinity
|
||||
+ Fix libsoup version check and wrong SSL status in location
|
||||
|
||||
v0.4.5:
|
||||
+ Work around black border around widgets on Win32
|
||||
+ Whitelist direct/ re-directed navigation requests in adblock
|
||||
+ Require Vala 0.14
|
||||
+ Provide geolocation diagnostics in about:geolocation
|
||||
+ List available about: URLs and app instance name in about:version
|
||||
+ Replace illegal characters in download filenames
|
||||
+ Tweak app options on Win32 and use ShellExecuteEx in sokoke_show_uri
|
||||
+ Use sokoke_show_uri in midori_browser_download_status_cb
|
||||
+ External Download manager Steadyflow and Aria2 (with cookies)
|
||||
+ Ensure adblock config folder when blocking images
|
||||
+ Use sqlite WAL mode for history if available
|
||||
+ Allow relative -c/ --config path
|
||||
+ Context menus on Back and Forward toolbar items
|
||||
+ Always show the tabbar by default
|
||||
+ Use ubuntu-bug if it exists
|
||||
+ Show inline find while typing and statusbar text in overlay with GTK+ 3.2
|
||||
+ Esc/ closing "downloads still active" should cancel, not continue
|
||||
+ Optional Granite support for notebook and bookmark dialog as pop-over
|
||||
+ Ctrl+j to toggle statusbar aka downloads
|
||||
+ Show at most 3 search engines in completion
|
||||
+ Don't replace existing onclick/ blur with autosuggest
|
||||
+ Implement low_memory_profile for FreeBSD and Win32
|
||||
+ Use var in internal javascript, to fix Google apps
|
||||
+ Handle download requests in frames
|
||||
|
||||
v0.4.4:
|
||||
+ Disable page cache with < 352 MB RAM
|
||||
+ Display filename in download dialog
|
||||
+ Fix box packing in GTK+3 (in most cases)
|
||||
+ Enable experimental HTML5 fullscreen API
|
||||
+ Harden IPv6 address recognition in location
|
||||
+ Experimental site data policy support (see FAQ)
|
||||
+ Close tabs by middle clicking close button
|
||||
+ Merge cookies and other data in Clear Private Data
|
||||
+ Improve KatzeArrayAction for Unity menuproxy compatibility
|
||||
+ Use GDateTime for history to avoid broken C runtimes
|
||||
+ Add Midori tag to DuckDuckGo default URI
|
||||
+ Rewrite completion popup resizing
|
||||
+ Streamline page icon loading stages and fallbacks
|
||||
+ Disable clipboard work-around for WebKit >= 1.4.3
|
||||
+ Re-word .desktop entry as an action
|
||||
+ Display informative text in private browsing
|
||||
+ Consistent clear icons in entries
|
||||
+ Revised download filename generation
|
||||
+ Add 'Open in Image Viewer' menu item
|
||||
+ Formhistory 2.0 with GDOM support
|
||||
+ Handle javascript: and mailto: links better
|
||||
+ Handle = key in Ukrainian layout better
|
||||
+ Fix bookmark export and deletion of bookmark folders
|
||||
+ Speed dial shortcut re-reordering by DND
|
||||
|
||||
v0.4.3:
|
||||
+ Implement about:widgets to test rendering
|
||||
+ Fix resizing of inspector by applying a minimum size
|
||||
+ Use dark theme with GTK+ 3 in private browsing
|
||||
+ Use channel-(in)secure-symbolic icons if available
|
||||
+ Use .security-(un)trusted classes with GTK+
|
||||
+ Improve notebook resizing peformance
|
||||
+ Fix tab icons in GTK+3 and don't look for GTK+ jscore
|
||||
+ Use system-wide CA file with libSoup 2.37.1
|
||||
+ Improve cookie manager performance
|
||||
+ Action and tab creation for faster startup
|
||||
+ Fix number of items in trash in private browsing
|
||||
+ Add Cairo version to about:version
|
||||
+ Add X-GNOME-Keywords and X-AppInstall-Keywords to .desktop
|
||||
+ Add easy privacy list to default Adblock filters
|
||||
+ Fully implement speed dial for GTK+3
|
||||
+ Disable box shadows with WebKitGTK+ 1.2.7
|
||||
+ Fine-grained monospace font overriding
|
||||
+ Implement resizing of Location and Search in toolbar
|
||||
+ Don't show empty speed dial shortcuts in-between
|
||||
+ Use Midori's name in midori-private.desktop
|
||||
+ Hide all bars in fullscreen and a menu to Unfullscreen
|
||||
|
||||
v0.4.2:
|
||||
+ Improve -moz-document parsing in user stylesheets
|
||||
+ Render verified secure sites in green, not yellow
|
||||
+ Version details for extensions built against a different release
|
||||
+ More detailed and more condensed about:version output
|
||||
+ Refresh missing speed dial thumbnails automatically
|
||||
+ Use faster global CSS mechanism for adblock and addons
|
||||
+ Show crash dialog only if there's a session
|
||||
+ Don't complete on a leading space or search token
|
||||
+ Support user stylesheets on about: and file:// locations
|
||||
+ Implement 'Always use my font choices' preferences
|
||||
+ Allow smaller tabs when close buttons are disabled
|
||||
+ Merge 'Closed Tabs' with 'History' in Clear Private Data
|
||||
+ Correctly use user-home and bookmark-new icon names
|
||||
+ Use versioned file speeddial-head-0.4.2.html
|
||||
+ Split proxy server preference into host and port
|
||||
+ Support localized 'next' and 'previous' links
|
||||
+ Implement 'Only accept cookies cookies from sites you visit'
|
||||
+ Fix crash in Add/ Import Bookmark feature
|
||||
+ Fix size of tabs with GTK+ 3
|
||||
+ Detect existing Firefox profiles for bookmark import
|
||||
+ Work-around "omg!" in local directory browsing
|
||||
+ Rework '--run' feature to allow window.open() and console.info()
|
||||
+ Automatically clear finnished downloads from the transferbar
|
||||
+ Add 'Create desktop shortcut' to the app menu
|
||||
+ Require GLib 2.22 and libSoup 2.27.90
|
||||
+ Don't register recent files in private browsing mode
|
||||
+ Findbar and speed dial honor close button position
|
||||
+ Use sqlite3-based backend for cookie storage
|
||||
+ Make '--snapshot' create png images with GTK+ 2.20
|
||||
+ Automatically resizing, embossed speed dial, close on hover
|
||||
|
||||
v0.4.1:
|
||||
+ Experimental, unfinnished GTK+ 3 support
|
||||
+ 'Automatic' identification with quirks
|
||||
+ Build fix for WebKitGTK+ >= 1.4.3
|
||||
+ Register downloaded files as recent files
|
||||
+ Fix Flash window on background tabs
|
||||
+ Fix regression with clearing cookies on quit
|
||||
+ Fix opening tabs from toolbar buttons
|
||||
+ Use symbolic find and clear icons
|
||||
+ Drop usage of mootools
|
||||
+ Install separate Private Browsing shortcut
|
||||
+ Support dragging tabs out of the window
|
||||
+ Use feed: to support Thunderbird news reader
|
||||
+ Re-open closed tabs in private browsing
|
||||
+ Compare link-fingerprints caselessly
|
||||
|
||||
v0.4.0:
|
||||
+ Provide buttons to choose how to startup after crash
|
||||
+ Fix crash on corrupted datbase
|
||||
+ Never delay URIs given as command line arguments
|
||||
+ Space at the bottom of the page: Go to next page
|
||||
+ Initialize session in app/ private before adding URIs
|
||||
+ Add 'Last open tabs' option to Clear Private Data
|
||||
+ Show kinetic scrolling option regardless of Hildon
|
||||
+ Interpret Shift+Backspace as going forward
|
||||
+ Advertise SVG images as a supported MIME type
|
||||
+ Zoom in steps of 10% and support Ctr+=
|
||||
+ Fix a crasher on invalid geo: links
|
||||
+ Integrate Adblock and History List options in list
|
||||
+ Skip empty lines, ignore subdocument rules in Adblock
|
||||
+ Respect VALAC at configuration time
|
||||
+ URL cache, faster JS generator, inline parsing in Adblock
|
||||
+ Reuse source of webview instead of redownloading
|
||||
+ Remove the description field from bookmark dialog
|
||||
+ Add --log-file/ -l switch to log to a file
|
||||
+ Pass through javascript: URIS from the command line
|
||||
+ Tab and Window items in Unity Quicklist
|
||||
+ Adjust the preferences dialog
|
||||
+ Require WebKitGTK+ 1.1.17 and Vala 0.10
|
||||
|
||||
v0.3.6:
|
||||
+ Track selected search engine per window
|
||||
+ Improve preference dialogue size and alignments
|
||||
+ Validate URIs in Adblock, homepage and bookmarks
|
||||
+ Fix loading of Adblock lists from https
|
||||
+ Support Backspace as Go Back and F5 as Reload
|
||||
+ Show 'Private Browsing' in Unity Quicklist
|
||||
+ Ignore Network Cancelled errors
|
||||
+ Reduce allocations when preparing speed dial
|
||||
+ Fix icon sie of scalable stock icons
|
||||
+ Implement geo URI support as per RFC 5870
|
||||
+ Fix crash after clearing cookies
|
||||
+ Faster javascript-based JSON import
|
||||
+ Improve speed dial markup, without scripts
|
||||
+ Allow Escape to cancel History List
|
||||
+ Fix crashes in completion
|
||||
|
||||
v0.3.5:
|
||||
+ Remove frame titles from preference dialogue
|
||||
+ Show search engine icons in completion
|
||||
+ Add Liferea news aggregator workaround
|
||||
+ Support libSoup cache + size with WebKitGTK+ 1.3.11
|
||||
+ No language, no encryption but Mozilla in user agent
|
||||
+ Support F6, F7, Ctrl+(Shift)+Tab and Tab to complete
|
||||
+ Strip scheme and www. in completion
|
||||
+ Render filename as title of patch files
|
||||
+ Turn location into a plain entry
|
||||
+ Fix tab panel foreground colours
|
||||
+ Mask timezone, language and plugins in private mode
|
||||
+ Add 'Strip referrer details' preference
|
||||
+ Embed extension list in preferences
|
||||
+ Remove the Page Holder and Download Manager option
|
||||
+ Disable prefetching and HTML5 storage in private mode
|
||||
+ Handle 'Plugin will handle load' error
|
||||
+ Show access keys next to numbers in link search
|
||||
+ Introduce --private/ -p command line switch
|
||||
+ Don't show toolbar preferences if running a DE
|
||||
+ Show script alerts as infobars
|
||||
+ Improve URI handling with addon installer
|
||||
+ Change Ctrl+Q for Quit to Ctrl+Shift+Q
|
||||
+ Make speed dial faster and mandatory
|
||||
+ Load speed dial in private browsing mode
|
||||
+ Show video formats in about:(version)
|
||||
+ Move speed dial to key file instead of JSON
|
||||
+ Add Offline Application Cache to Clear Private Data
|
||||
|
||||
v0.3.3:
|
||||
+ Use 60 connections and 6 per host
|
||||
+ Allow re-ordering of search engines
|
||||
+ Resurrect right-click button on the panel
|
||||
+ Page Next finds a and link tags again
|
||||
+ Always save state when quitting
|
||||
+ Support MD5 and SHA1 Link Fingerprints
|
||||
+ Use lock-secure and lock-insecure icons
|
||||
+ Replace unmaintained docs with FAQ
|
||||
+ Work around copying bug in WebKitGTK+
|
||||
+ In doubt always focus page on key press
|
||||
+ Show transfer speed in tooltips
|
||||
+ Support x-scheme-handler for GLib < 2.28
|
||||
+ Improve link search, always require Return
|
||||
+ Re-order tabs with Ctrl+Shift-PageUp/Down
|
||||
+ Improve fragment (#) handling
|
||||
+ Show Netscape plugins in about:version
|
||||
+ Add Zoom Level combobox to Statusbar Features
|
||||
+ Improve handling of cookie updates
|
||||
+ Always show a minimum visible progress
|
||||
+ Don't limit search engines in completion popup
|
||||
|
||||
v0.3.2
|
||||
+ Fix opening address with Go button
|
||||
+ Fix automigration of existing bookmarks
|
||||
+ Fix crash on opening autocompletion
|
||||
+ Fix adblock handling of frames
|
||||
+ Reflect tab order in the saved session
|
||||
+ Don't show multiple user addon infobars
|
||||
+ Provide distribution setting for close on left
|
||||
+ Export to Netscape HTML format
|
||||
+ Avoid config update on state changes
|
||||
+ Always show progress and search engines in location
|
||||
+ Default to app menu and no menubar
|
||||
+ Fix GTK+ 2.14 build problems
|
||||
+ Show 'Private Browsing' in window title
|
||||
+ Uncached reload with Ctrl+Shift+R
|
||||
|
||||
v0.3.0
|
||||
+ Support libnotify 0.7
|
||||
+ Copy-friendly URIs with %20
|
||||
+ No blocking of typed URLs with adblock
|
||||
+ Import from Netscape HTML
|
||||
+ Bookmark im- and export fixes
|
||||
+ Unit tests cleaned up and updated
|
||||
+ Correct bookmark and search icon names
|
||||
+ Better link menu handling
|
||||
+ Certificate location on FreeBSD
|
||||
+ Fix Russian keyboard issues
|
||||
+ Stylesheet parsing improvements
|
||||
+ Simplify language and panel options
|
||||
+ Default to DuckDuckGo search
|
||||
+ No Netscape plugins in extension panel
|
||||
+ Easy user addon install infobar
|
||||
|
||||
v0.2.9
|
||||
+ Add 'Identify As' to Statusbar Features
|
||||
+ Don't restrict length of HTTP login passwords
|
||||
+ Implement Find Links by number with '.'
|
||||
+ Reflect security in icon tooltip
|
||||
+ Use GIO to determine special URI schemes
|
||||
+ Upgrade waf (addresses threading issues)
|
||||
+ Allow clearing HTML5 databases and form history
|
||||
+ Add --help-execute command line switch
|
||||
+ Improve private mode, with search and hotkeys
|
||||
+ Support no-desktop-files and internal Open With
|
||||
+ Support x-scheme-handler spec
|
||||
+ Infobar for location and HTML5 database
|
||||
+ Optimise cookie storing, reduce wakeups
|
||||
+ Avoid deprecated GTK+ interfaces
|
||||
+ Remove console in favour of Inspector
|
||||
+ Simplify and explain cookie preferences
|
||||
+ Fix Google Reader incompatibility
|
||||
|
||||
v0.2.8
|
||||
+ Re-implement Bookmarks menu and toolbar button
|
||||
+ Show transferbar even if statusbar is hidden
|
||||
+ Smart case for inline search while typing
|
||||
+ Use Alt+Shift+Right instead of Ctrl+Right for Next Page
|
||||
+ Adding, edit and delete buttons for user scripts/ styles
|
||||
+ Rename 'Minimize Tab' to 'Show Tab Icon Only'
|
||||
+ Delete key in completion deletes items
|
||||
+ Don't show homepage in bookmarkbar
|
||||
+ Fix crash when using location arrow button
|
||||
|
||||
v0.2.7
|
||||
+ Multiple word completion in location
|
||||
+ Database backed bookmarks
|
||||
+ Search bookmark panel and drag bookmarks
|
||||
+ Bookmarks in address completion
|
||||
+ Removed bookmarks and history from menubar
|
||||
+ Add 'Minimize New Tabs' and 'Copy Addresses of Tabs'
|
||||
+ Refactorings and optimisations in the core
|
||||
+ Adblock compatibility improvements and speedup
|
||||
+ Changeable speed dial size
|
||||
+ Delayed pages at startup, or after a crash
|
||||
|
||||
v0.2.6
|
||||
+ Show a dialogue when quitting while downloading
|
||||
+ Render icons in errors/ speed dial properly
|
||||
+ Fix a build error with API documentation
|
||||
+ Fix error pages in frames, and a related crash
|
||||
+ Allow more shortcuts or columns in speed dial
|
||||
+ Add 'Copy All' button to Console panel
|
||||
|
||||
v0.2.5
|
||||
+ Keyboard access in speed dial
|
||||
+ Panels adapt to system icon style
|
||||
|
|
27
GNUmakefile.in
Normal file
27
GNUmakefile.in
Normal file
|
@ -0,0 +1,27 @@
|
|||
# Based on "http://iany.me/wiki/Makefile/" by "Ian Yang" licensed under "CC by 3.0"
|
||||
|
||||
BUILD_FOLDER := _build
|
||||
|
||||
CUSTOM_TARGETS := cmake
|
||||
|
||||
# Do not try to use custom target when invoking external makefile
|
||||
EXTERNAL_TARGETS := $(filter-out $(CUSTOM_TARGETS), $(MAKECMDGOALS))
|
||||
|
||||
# Call all targets using `Makefile` in build directory in one `make` command.
|
||||
$(or $(lastword $(EXTERNAL_TARGETS)),all):
|
||||
$(MAKE) -C $(BUILD_FOLDER) $(EXTERNAL_TARGETS)
|
||||
|
||||
# If no targets are specified, use the dummy `all` target
|
||||
.PHONY: $(EXTERNAL_TARGETS) all
|
||||
|
||||
# Do nothing for all targets but last. Also quiet the message "Noting to be done on xxx"
|
||||
$(filter-out $(lastword $(EXTERNAL_TARGETS)), $(EXTERNAL_TARGETS)):
|
||||
@cd .
|
||||
|
||||
cmake: $(BUILD_FOLDER)
|
||||
cd $(BUILD_FOLDER) && cmake ..
|
||||
|
||||
$(BUILD_FOLDER):
|
||||
mkdir $(BUILD_FOLDER)
|
||||
|
||||
.PHONY: cmake
|
476
HACKING
476
HACKING
|
@ -1,169 +1,383 @@
|
|||
This file is licensed under the terms of the expat license, see the file EXPAT.
|
||||
====== Midori - Contribute ======
|
||||
|
||||
+ Hacking guide for Midori +
|
||||
**This document is licensed under the LGPL 2.1.**
|
||||
|
||||
- How to contribute
|
||||
- Coding style
|
||||
- Source files in the project
|
||||
- Examplary source code
|
||||
====== Check out the sources ======
|
||||
|
||||
+++ How to contribute +++
|
||||
bzr branch lp:midori
|
||||
|
||||
There are several ways to contribute to the project:
|
||||
The development **trunk** (master, tip) is the latest iteration of the next release. Browse it online and look for other branches at http://code.launchpad.net/midori or http://bazaar.launchpad.net/~midori/midori/trunk/tarball download a tarball of the latest revision.
|
||||
|
||||
For translating, have a look at the file TRANSLATE.
|
||||
//The code used to be hosted in git.xfce.org/apps/midori.//
|
||||
|
||||
For helping with testing and triaging bug reports, you should registers with the bug tracker at http://www.twotoasts.de/bugs and join #midori on irc.freenode.net where a lot of problems are discussed. You can start right away by trying to reproduce bug reports and comment with your findings.
|
||||
Keep your copy updated:
|
||||
|
||||
If you are interested in contributing code, there are a few options. You can join #midori to discuss a particular problem you would like to look into, or a feature you would want to implement. Opening a bug report or feature request if there isn't already one is the next step. To attract some attention, if you attached a patch or have questions, ask in #midori.
|
||||
bzr merge --pull
|
||||
====== Join IRC chat rooms ======
|
||||
|
||||
+++ Coding style +++
|
||||
Join irc://irc.freenode.net/midori #midori on Freenode https://kiwiirc.com/client/irc.freenode.net/midori or use webchat to talk about Midori, discuss bugs and new ideas.
|
||||
====== Contribute other than touching code ======
|
||||
|
||||
Indentation is 4 spaces, no tabs, preferrably at 80 to 120 columns per line to
|
||||
avoid automated line-breaks. Trailing whitespace is not desirable.
|
||||
* http://bugs.launchpad.net/midori Go through problem reports and check Unconfirmed bugs or those lacking information and mark any duplicates you spot
|
||||
* https://www.bountysource.com/#trackers/130181-midori Add a bounty for a feature or bug you'd like to support
|
||||
* https://translations.launchpad.net/midori/trunk/+pots/trunk Translate to your own language
|
||||
* https://github.com/eustasy/midori-browser.org/issues Report website bugs
|
||||
* Write http://wiki.xfce.org/midori/tutorial your own extension - granted that's code, too, but maybe a little easier than hacking the core.
|
||||
|
||||
Declarations go to the beginning of a block, not inline. Variables of one plain
|
||||
type may be grouped in one declaration, pointer types may not be grouped. The
|
||||
asterisk goes next to the type.
|
||||
Variables should be ordered in the order they are used.
|
||||
====== Documentation resources ======
|
||||
|
||||
Comments explain functionality, they should not state facts. The appropriate
|
||||
style is always C style /* */, not C++ style.
|
||||
* https://wiki.gnome.org/Projects/Vala/Tutorial Vala Tutorial
|
||||
* http://midori-browser.org/docs/api/vala/midori/ Midori Vala Docs
|
||||
* http://midori-browser.org/docs/api/c/html/ Midori C Docs
|
||||
|
||||
Variable and function names should be animal, animal_shelter or animalsc in
|
||||
case it would otherwise be very long. Loop counters may be single letters.
|
||||
Type names should be Animal, AnimalShelter or AnimalSC. No prefixes from third
|
||||
party projects should be used, such as GTK or WebKit, while underlines may be
|
||||
used but do not have a particular meaning.
|
||||
====== Build the code ======
|
||||
|
||||
There is a space between functions or keywords and round brackets, and curly
|
||||
brackets always go on separate lines, at the indentation level of the
|
||||
function, conditional or loop expression. Curly brackets are left out for single
|
||||
statement conditionals and loops unless they notably help readability.
|
||||
The type of a function goes on a separate line before the function.
|
||||
Preprocessor instructions are indented with the code they relate to.
|
||||
|
||||
Code history is precious, so one should avoid renaming a lot of functions at
|
||||
once or moving whole paragraphs only to add or remove a level of indentation.
|
||||
Moving blocks of code around is also undesriable because it makes patches less
|
||||
readable since the result looks like new code.
|
||||
mkdir _build
|
||||
cd _build
|
||||
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
|
||||
make
|
||||
sudo make install
|
||||
sudo gtk-update-icon-cache /usr/share/icons/hicolor
|
||||
|
||||
|
||||
+++ Source files in the project +++
|
||||
//Advanced Tip: Pass "-G Ninja" to cmake to use http://martine.github.io/ninja/ Ninja instead of make (usually packaged as ninja or ninja-build).//
|
||||
|
||||
Core:
|
||||
Files prefixed with "midori-" in the folder "midori" make up the core. They
|
||||
are essential to running the browser and mostly tailored to the browser.
|
||||
All header files prefixed with "midori-" are considered supported API and
|
||||
can be used to implement extensions.
|
||||
"sokoke" is a collection of very specialized helper functions which change
|
||||
from time to time as needed. In the past some of the code was moved to
|
||||
"katze" when it was considered generally useful.
|
||||
"socket" is a socket implementation with no dependency on other parts of
|
||||
the core, which is used if Midori is built without an external single
|
||||
instance support library.
|
||||
Panels:
|
||||
Files in the "panels" folder are classes that implement MidoriViewable and
|
||||
which are loaded into the MidoriPanel at startup. These panels are in
|
||||
principle optional.
|
||||
Katze:
|
||||
Re-usable classes and utility functions that don't depend on the core and
|
||||
some of that code indeed found its way into other projects.
|
||||
Extensions:
|
||||
These are extensions, written in C, which are loaded optionally if the user
|
||||
so chooses. Extensions can use API from "midori-" and "katze-" headers. Each
|
||||
module consists of either a single .c file or a folder with .c files.
|
||||
Tests:
|
||||
Unit tests are run regularly to verify possible regressions or measure
|
||||
performance of implementations. Except for select cases code changes should
|
||||
not cause failure of unit tests.
|
||||
If using GTK+3 you'll want to add -DUSE_GTK3=1 to the cmake command line.
|
||||
|
||||
You can build Midori using another C Compiler for example Clang. Just
|
||||
add -DCMAKE_C_COMPILER=/path/to/compiler to the cmake arguments.
|
||||
Then you can build following your normal procedure. Like this:
|
||||
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_COMPILER=/usr/bin/clang ..
|
||||
make
|
||||
|
||||
Midori can be **run without being installed**.
|
||||
|
||||
_build/midori/midori
|
||||
|
||||
You can use a **temporary folder for testing** without affecting normal settings
|
||||
|
||||
_build/midori/midori -c /tmp/midoridev
|
||||
|
||||
You'll want to **unit test** the code if you're testing a new version or contributed your own changes:
|
||||
|
||||
xvfb-run make check
|
||||
|
||||
Automated daily builds in Launchpad (https://launchpad.net/~elementary-os/+archive/daily ppa:elementary-os/daily and https://launchpad.net/~midori/+archive/midori-dev ppa:midori/midori-dev) run these tests as well.
|
||||
====== Debugging issues ======
|
||||
|
||||
Testing an installed release may reveal crashers or memory corruption which require investigating from a local build and obtaining a stacktrace (backtrace, crash log).
|
||||
|
||||
_build/midori/midori -g [OPTIONAL ARGUMENTS]
|
||||
|
||||
If the problem is a warning, not a crash GLib has a handy feature
|
||||
|
||||
env G_DEBUG=all _build/midori/midori -g
|
||||
|
||||
For more specific debugging output, depending on the feature in question you may use
|
||||
|
||||
env MIDORI_DEBUG=help _build/midori/midori
|
||||
|
||||
Whilst -g is convenient you may want to use proper gdb:
|
||||
|
||||
gdb
|
||||
file _build/midori/midori
|
||||
run
|
||||
…
|
||||
bt
|
||||
|
||||
On Windows you can open the folder where Midori is installed and double-click gdb.exe. A black command line window should appear.
|
||||
|
||||
file midori.exe
|
||||
run
|
||||
…
|
||||
bt
|
||||
|
||||
To verify a regression you might need to revert a particular change:
|
||||
|
||||
|
||||
+++ Examplary source code +++
|
||||
# Revert only r6304
|
||||
bzr merge . -r 6304..6303
|
||||
|
||||
/*
|
||||
Copyright
|
||||
LICENSE TEXT
|
||||
*/
|
||||
====== Coding style and quality ======
|
||||
|
||||
#include "foo.h"
|
||||
Midori code should in general have:
|
||||
|
||||
#include "bar.h"
|
||||
* 4 space indentation, no tabs
|
||||
* Between 80 to 120 columns
|
||||
* Prefer /* */ style comments
|
||||
* Call variables //animal// and //animal_shelter// instead of <del>camelCase</del>
|
||||
* Keep a space between functions/ keywords and round parentheses
|
||||
|
||||
#include <glib.h>
|
||||
For Vala:
|
||||
|
||||
void
|
||||
foobar (FooEnum bar, const gchar* foo)
|
||||
{
|
||||
gint n, i;
|
||||
* Prefer //new Gtk.Widget ()// over //using Gtk; new Widget ()//
|
||||
* Stick to standard Vala-style curly parentheses on the same line
|
||||
* Cuddled //} else {// and //} catch (Error error) {//
|
||||
|
||||
if (!foo)
|
||||
return;
|
||||
For C:
|
||||
|
||||
#ifdef BAR_STRICT
|
||||
if (bar == FOO_N)
|
||||
{
|
||||
g_print ("illegal value for 'bar'.\n");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
* Always keep { and } on their own line
|
||||
|
||||
/* this is an example */
|
||||
switch (bar)
|
||||
{
|
||||
case FOO_FOO:
|
||||
n = bar + 1;
|
||||
break;
|
||||
case FOO_BAR:
|
||||
n = bar + 10;
|
||||
break;
|
||||
default:
|
||||
n = 1;
|
||||
}
|
||||
//Extensions may historically diverge from the standard styling on a case-by-case basis//
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
g_print ("%s\n", foo);
|
||||
}
|
||||
}
|
||||
====== Committing code ======
|
||||
|
||||
Header file example:
|
||||
Tell Bazaar your name if you haven't yet
|
||||
bzr whoami "Real Name <email@address>"
|
||||
|
||||
/*
|
||||
Copyright
|
||||
LICENSE TEXT
|
||||
*/
|
||||
See what you did so far
|
||||
bzr diff
|
||||
|
||||
#ifndef __FOO_H__
|
||||
#define __FOO_H__ 1
|
||||
Get an overview of changed and new files
|
||||
bzr status
|
||||
|
||||
#ifdef HAVE_BAR_H
|
||||
#define BAR_STRICT
|
||||
#endif
|
||||
Add new files, move/ rename or delete
|
||||
bzr add FILENAME
|
||||
bzr mv OLDFILE NEWFILE
|
||||
bzr rm FILENAME
|
||||
|
||||
/* Types */
|
||||
Commit all current changes - Bazaar automatically picks up edited files. //If you're used to git, think of an implicit staging area.//
|
||||
bzr commit -p
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FOO_FOO,
|
||||
FOO_BAR,
|
||||
FOO_N
|
||||
} FooEnum;
|
||||
If you have one or more related bug reports you should pass them as arguments. Once these commits are merged the bug will automatically be closed and the commit log shows clickable links to the reports.
|
||||
bzr commit -p --fixes=lp:1111999
|
||||
|
||||
typedef struct
|
||||
{
|
||||
FooEnum foo_bar;
|
||||
} FooStruct;
|
||||
If you've done several commits
|
||||
bzr log | less
|
||||
bzr log -p | less
|
||||
|
||||
/* Declarations */
|
||||
In the case you committed something wrong or want to ammend it:
|
||||
bzr uncommit
|
||||
|
||||
void
|
||||
foo_bar (FooEnum bar,
|
||||
const gchar* foo);
|
||||
If you end up with unrelated debugging code or other patches in the current changes, it's sometimes handy to temporarily clean up. //This may be seen as bzr's version of git stash.//
|
||||
bzr shelve
|
||||
bzr commit -p
|
||||
bzr unshelve
|
||||
|
||||
const gchar*
|
||||
foo_foo (FooStruct foo_struct,
|
||||
guint number,
|
||||
gboolean flag);
|
||||
Remember to keep your branch updated:
|
||||
bzr merge --pull
|
||||
|
||||
#endif /* !__FOO_H__ */
|
||||
As a general rule of thumb, ''bzr help COMMAND'' gives you an explanation of any command and ''bzr help commands'' lists all available commands.
|
||||
|
||||
//If you're a die-hard git user, http://zyga.github.io/git-lp/ checkout git-lp to use git commands with the Bazaar repository.//
|
||||
====== Push proposed changes ======
|
||||
|
||||
If you haven't yet, https://launchpad.net/~/+editsshkeys check that Launchpad has your SSH key - you can create an SSH key with **Passwords and Keys** aka **Seahorse** or ''ssh-keygen -t rsa'' - and use ''bzr launchpad-login'' to make youself known to bzr locally.
|
||||
|
||||
If you checked out trunk, and added your patch(es), just **push it under your username** in Launchpad and you can **propose it for merging into trunk**. This will automatically request a **review from other developers** who can then comment on it and provide feedback.
|
||||
|
||||
bzr push --remember lp:~USERNAME/midori/fix-bug1120383 && bzr lp-propose-merge lp:midori
|
||||
|
||||
lp-propose-merge command may not be working on some distributions like Arch or Fedora.
|
||||
In case you get error like //bzr: ERROR: Unable to import library "launchpadlib": No module named launchpadlib// just use Launchpad's Web UI to propose a merge.
|
||||
|
||||
|
||||
**What happens to all the branches?**
|
||||
|
||||
Leave the branches alone, **approved branches are cleared automatically** by Launchpad.
|
||||
|
||||
For larger feature branches, **use the team** in Launchpad to allow other developers to work on the code with you.
|
||||
|
||||
bzr push --remember lp:~midori/midori/featuritis && bzr lp-propose-merge lp:midori
|
||||
|
||||
What if I want to help out on an **existing merge request** that I can't push to?
|
||||
|
||||
|
||||
bzr branch ~OTHERPERSON/midori/fix-bug1120383
|
||||
cd fix-bug1120383
|
||||
# make commits
|
||||
bzr push lp:USERNAME~/midori/fix-bug1120383
|
||||
bzr lp-propose-merge ~OTHERPERSON/midori/fix-bug1120383
|
||||
|
||||
|
||||
Updating a branch that may be out of sync with trunk:
|
||||
|
||||
|
||||
bzr pull
|
||||
bzr: ERROR: These branches have diverged
|
||||
bzr merge lp:midori
|
||||
# Hand-edit conflicting changes
|
||||
bzr resolve FILENAME
|
||||
# If any conflicts remain continue fixing
|
||||
bzr commit -m 'Merge lp:midori'
|
||||
|
||||
|
||||
Save a little bandwidth, **branch from an existing local copy** that you keep around:
|
||||
|
||||
|
||||
bzr branch lp:midori midori
|
||||
bzr branch midori midori.fix-bug1120383
|
||||
cd midori.fix-bug1120383
|
||||
bzr pull lp:midori
|
||||
|
||||
|
||||
====== Backwards compatibility ======
|
||||
As of Midori 0.5.4 the formula is:
|
||||
* Required dependencies need to be available on the previous stable https://apps.fedoraproject.org/packages/s/webkit Fedora and http://packages.ubuntu.com/search?suite=quantal&keywords=webkit&searchon=names Ubuntu
|
||||
* For reference http://openports.se/www/webkit OpenBSD
|
||||
* Windows XP through 8 are to date ABI compatible, all dependencies are included
|
||||
|
||||
^ package ^ F17 (2012-05-29) ^ U 12.10 (2012-10-18) ^
|
||||
| glib2 | 2.32.4 | 2.34.0 |
|
||||
| vala | 0.16.1 | 0.16 |
|
||||
| gtk3 | 3.4.4 | 3.6.0 |
|
||||
| gtk2 | 2.24.13 | 2.24.13 |
|
||||
| soup | 2.38.1 | 2.40 |
|
||||
| webkit | 1.8.3-1.fc17 | 1.10.0-0ubuntu1 |
|
||||
====== Midori with(out) Granite ======
|
||||
When built with Granite (-DUSE_GRANITE=1 or --enable-granite) there're a few key differences:
|
||||
* Preferences uses a http://valadoc.elementaryos.org/Granite/Granite.Widgets.StaticNotebook.html Granite.Widgets.StaticNotebook
|
||||
* URL completion styling is slightly different
|
||||
* Clear Private Data uses **Granite.Widgets.LightWindow**
|
||||
* Edit Bookmark and Security Details use http://valadoc.elementaryos.org/Granite/Granite.Widgets.PopOver.html Granite.Widgets.PopOver instead of Gtk.Window
|
||||
|
||||
====== Midori for Windows ======
|
||||
|
||||
===== For Linux developers =====
|
||||
==== Dependencies ====
|
||||
Midori for Windows is compiled on a Linux host and MinGW stack. For the current build Fedora 18 packages are used. Packages needed are listed below:
|
||||
|
||||
yum install gcc vala intltool
|
||||
|
||||
For a native build
|
||||
yum install libsoup-devel webkitgtk3-devel sqlite-devel
|
||||
|
||||
For cross-compilation
|
||||
yum install mingw{32,64}-webkitgtk3 mingw{32,64}-glib-networking mingw{32,64}-gdb mingw{32,64}-gstreamer-plugins-good
|
||||
|
||||
Packages needed when assembling the archive
|
||||
yum install faenza-icon-theme p7zip mingw32-nsis greybird-gtk3-theme
|
||||
|
||||
Installing those should get you the packages needed to successfully build and develop Midori for Win32.
|
||||
==== Building ====
|
||||
For 32-bit builds:
|
||||
|
||||
mkdir _mingw32
|
||||
cd _mingw32
|
||||
mingw32-cmake .. -DUSE_ZEITGEIST=0 -DUSE_GTK3=1 -DCMAKE_INSTALL_PREFIX=/usr/i686-w64-mingw32/sys-root/mingw -DCMAKE_VERBOSE_MAKEFILE=0
|
||||
make
|
||||
sudo make install
|
||||
|
||||
For 64-bit builds:
|
||||
|
||||
mkdir _mingw64
|
||||
cd _mingw64
|
||||
mingw64-cmake .. -DUSE_ZEITGEIST=0 -DUSE_GTK3=1 -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32/sys-root/mingw -DCMAKE_VERBOSE_MAKEFILE=0
|
||||
make
|
||||
sudo make install
|
||||
|
||||
Once built and tested you can assemble the Midori archive with a helper script
|
||||
32-bit build:
|
||||
env MINGW_PREFIX="/usr/i686-w64-mingw32/sys-root/mingw" ./win32/makedist/makedist.midori
|
||||
64-bit build:
|
||||
env MINGW_PREFIX="/usr/x86_64-w64-mingw32/sys-root/mingw/" ./win32/makedist/makedist.midori x64
|
||||
===== Testing =====
|
||||
For testing your changes unfortuantely a real system is needed because Midori and WebKitGTK+ don't work properly under Wine. Even if it works some problems are not visible when using Wine, but are present when running under a real Windows system and vice versa.
|
||||
|
||||
One way around it is to virtualize Windows on a Linux host and mount your MinGW directories as a network drive or shared folder.
|
||||
|
||||
===== For Windows developers =====
|
||||
Rough list of prerequisites for building with MinGW on Windows
|
||||
|
||||
If in doubt whether to get 32 or 64 bit versions use 32 bit ones, they are more
|
||||
universal and tend to be less broken.
|
||||
|
||||
|
||||
==== MinGW compiler ====
|
||||
Compiler should match the one that was used to build packages ideally.
|
||||
|
||||
* We will user *mingw64 rubenvb* release
|
||||
* Lastest stable release is gcc 4.8.0
|
||||
|
||||
[[http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting
|
||||
%20Win64/Personal%20Builds/rubenvb/gcc-4.8-release/|Releases]]
|
||||
|
||||
[[http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting
|
||||
%20Win64/Personal%20Builds/rubenvb/gcc-4.8-release/x86_64-w64-mingw32-gcc-4.8.0-
|
||||
win32_rubenvb.7z/download|Download]]
|
||||
|
||||
|
||||
==== 7zip ====
|
||||
We will need 7zip to extract various archives
|
||||
|
||||
http://www.7-zip.org/download.html Homepage
|
||||
|
||||
|
||||
http://downloads.sourceforge.net/sevenzip/7z920.exe 32bit Installer
|
||||
|
||||
|
||||
==== Python3 (to extract rpms) ====
|
||||
We will need python3 to use download-mingw-rpm.py script.
|
||||
If you don't plan to use it you can safely skip this step.
|
||||
|
||||
We get python3, whatever is the lastes stable release.
|
||||
|
||||
http://www.python.org/download/releases/3.3.5 Releases
|
||||
|
||||
http://www.python.org/downloads/release/python-335/ Download
|
||||
|
||||
http://www.python.org/ftp/python/3.3.5/python-3.3.5.amd64.msi Installer
|
||||
|
||||
Install Python and be sure to check "addd python.exe to path" installer checkbox.
|
||||
|
||||
==== download-mingw-rpm.py ====
|
||||
We get download-mingw-rpm.py script from github. It uses Python3 and should fetch and
|
||||
unpack rpm files for us.
|
||||
|
||||
[[https://github.com/mkbosmans/download-mingw-rpm/blob/master/download-
|
||||
mingw-rpm.py|View Script]]
|
||||
|
||||
[[https://github.com/mkbosmans/download-mingw-rpm/raw/master/download-
|
||||
mingw-rpm.py|Download Script]]
|
||||
|
||||
Usage:
|
||||
|
||||
* Launch cmd.exe
|
||||
* Navigate to folder where the script was saved
|
||||
* Make sure that python can access 7z.exe
|
||||
* Run command and wait, it should extract the packages into your current directory
|
||||
|
||||
c:\Python33\python.exe download-mingw-rpm.py -u http://ftp.wsisiz.edu.pl/pub/linux/fedora/linux/updates/18/i386/ --deps mingw32-webkitgtk mingw32-glib-networking mingw32-gdb mingw32-gstreamer-plugins-good
|
||||
|
||||
[[http://dl.fedoraproject.org/pub/fedora/linux/releases/18/Everything/i386/os/Packages
|
||||
/m/|Fedora 18 packages]]
|
||||
|
||||
The above URL for some reason does not work with the script.
|
||||
|
||||
==== MSYS ====
|
||||
Msys contains shell and some small utilities
|
||||
|
||||
[[http://sourceforge.net/projects/mingw-w64/files/External%20binary
|
||||
%20packages%20%28Win64%20hosted%29/MSYS%20%2832-bit%29/MSYS-20111123.zip/download|Download]]
|
||||
|
||||
|
||||
==== CMake ====
|
||||
http://www.cmake.org/cmake/resources/software.html Homepage
|
||||
http://www.cmake.org/files/v2.8/cmake-2.8.12.2-win32-x86.exe Installer
|
||||
|
||||
When installing check the installer checkbox "add to path"
|
||||
|
||||
|
||||
==== Bazaar ====
|
||||
http://wiki.bazaar.canonical.com/WindowsDownloads Homepage
|
||||
|
||||
We will get 2.4 Stable Release (standalone)
|
||||
|
||||
http://launchpad.net/bzr/2.4/2.4.2/+download/bzr-2.4.2-1-setup.exe Installer
|
||||
|
||||
When installing check the installer checkbox "add to path"
|
||||
|
||||
==== Vala ====
|
||||
http://ftp.gnome.org/pub/gnome/sources/vala/0.20/vala-0.20.0.tar.xz Source
|
||||
|
||||
==== Globbing it all together ====
|
||||
|
||||
Extracted rpms msys and mingw packages should form uniform unix like folder.
|
||||
You use msys.bat to launch a shell
|
||||
|
||||
====== Jargon ======
|
||||
* freeze: a period of bug fixes only eg. 4/2 cycle means 4 weeks of features and 2 weeks to focus on resolving existing problems
|
||||
* MR: merge request, a branch proposed for review
|
||||
* ninja: an internal tab, usually empty label, used for taking screenshots
|
||||
* fortress: user of an ancient release like 0.4.3 as found on Raspberry Pie, Debian, Ubuntu
|
||||
* katze, sokoke, tabby: API names and coincidentally cat breeds
|
66
INSTALL
66
INSTALL
|
@ -1,66 +0,0 @@
|
|||
This file is licensed under the terms of the expat license, see the file EXPAT.
|
||||
|
||||
+++ Installing Midori +++
|
||||
|
||||
Building and installing Midori is straightforward.
|
||||
|
||||
Make sure you have Python 2.4 or higher installed.
|
||||
|
||||
Change to the Midori folder on your hard disk in a terminal.
|
||||
|
||||
Run './waf configure'
|
||||
|
||||
Run './waf build'
|
||||
|
||||
You can now run Midori from the build folder like so
|
||||
|
||||
'./waf build --run'
|
||||
|
||||
Using --run as shown above will make sure extensions as well as
|
||||
localizations are used from the build folder.
|
||||
|
||||
You can install it with './waf install'
|
||||
|
||||
If you need to do a clean rebuild, you can do either './waf clean'
|
||||
in order to remove binaries or './waf distclean' which deletes generated
|
||||
configuration files as well.
|
||||
|
||||
For further options run './waf --help'
|
||||
|
||||
+++ Debugging Midori +++
|
||||
|
||||
Run './waf configure -d full' from the Midori folder.
|
||||
|
||||
Run './waf build'
|
||||
|
||||
Midori is now built with debugging symbols.
|
||||
|
||||
Make sure you have installed 'gdb', the GNU Debugger.
|
||||
|
||||
Run Midori as 'gdb _build_/default/midori/midori'.
|
||||
|
||||
Try to reproduce a crash that you experienced earlier,
|
||||
this time Midori will freeze at the point of the crash.
|
||||
Switch to your terminal, type bt ('backtrace') and hit Return.
|
||||
What you obtained now is a backtrace that should include
|
||||
function names and line numbers.
|
||||
|
||||
If the problem is a warning and not a crash, try this:
|
||||
|
||||
'G_DEBUG=all gdb _build_/default/midori/midori'
|
||||
|
||||
If you are interested in HTTP communication, try this:
|
||||
|
||||
'MIDORI_SOUP_DEBUG=2 _build_/default/midori/midori'
|
||||
|
||||
Where '2' can be a level between 0 and 3.
|
||||
|
||||
If you are interested in (non-) touchscreen behaviour, try this:
|
||||
|
||||
'MIDORI_TOUCHSCREEN=1 _build_/default/midori/midori', or
|
||||
|
||||
'MIDORI_TOUCHSCREEN=0 _build_/default/midori/midori'
|
||||
|
||||
For further information a tutorial for gdb and
|
||||
reading up on how you can install debugging
|
||||
symbols for libraries used by Midori are recommended.
|
32
README
32
README
|
@ -1,26 +1,30 @@
|
|||
This file is licensed under the terms of the expat license, see the file EXPAT.
|
||||
|
||||
Midori is a lightweight web browser.
|
||||
Midori is a fast little WebKit browser with support for HTML5. It can manage
|
||||
many open tabs and windows. The URL bar completes history, bookmarks, search
|
||||
engines and open tabs out of the box. Web developers can use the powerful
|
||||
web inspector that is a part of WebKit. Individual pages can easily be turned
|
||||
into web apps and new profiles can be created on demand.
|
||||
|
||||
* Full integration with GTK+2.
|
||||
* Fast rendering with WebKit.
|
||||
* Tabs, windows and session management.
|
||||
* Flexibly configurable Web Search.
|
||||
* User scripts and user styles support.
|
||||
* Straightforward bookmark management.
|
||||
* Customizable and extensible interface.
|
||||
* Extensions written in C.
|
||||
A number of extensions are included by default:
|
||||
|
||||
Requirements: GTK+ 2.10, WebkitGTK+ 1.1.1, libXML2, libsoup 2.25.2
|
||||
* Adblock with support for ABP filter lists and custom rules is built-in.
|
||||
* You can download files with Aria2 or SteadyFlow.
|
||||
* User scripts and styles support a la Greasemonkey.
|
||||
* Managing cookies and scripts via NoJS and Cookie Security Manager.
|
||||
* Switching open tabs in a vertical panel or a popup window.
|
||||
|
||||
Optional: Unique 0.9, libidn, sqlite 3.0, docutils, libnotify
|
||||
Requirements: GLib 2.32.3, GTK+ 2.24, WebkitGTK+ 1.8.1, libXML2,
|
||||
libsoup 2.27.90, sqlite 3.0, Vala 0.16, libnotify
|
||||
|
||||
For installation instructions read INSTALL.
|
||||
Optional: GTK+ 3.0, gcr, Granite 0.2, WebKit2GTK+ 1.11.91/ 2.0.0
|
||||
|
||||
For installation instructions read the file HACKING.
|
||||
|
||||
Please report comments, suggestions and bugs to:
|
||||
http://www.twotoasts.de/bugs
|
||||
https://bugs.launchpad.net/midori
|
||||
|
||||
And join the IRC channel #midori on irc.freenode.net
|
||||
|
||||
Check for new versions at:
|
||||
http://www.twotoasts.de
|
||||
http://www.midori-browser.org
|
||||
|
|
46
TODO
46
TODO
|
@ -5,58 +5,30 @@ TODO:
|
|||
. Request network if not connected and re-open the url on success
|
||||
. Make cookie manager horizontal if the window is wide
|
||||
. Handle SSL like SSH: confirm any cert on first connection, warn about any change in subsequent connections
|
||||
. Open on startup: Ask (Last open pages, Blank, Homepage, [x] Don't ask anymore)
|
||||
. Support @run-at document-start: http://dev.chromium.org/developers/design-documents/user-scripts
|
||||
. Add an 'install' button to addons
|
||||
. Dragging a link onto the web view to open it
|
||||
. Extension: Ask Google if an address cannot be found, ie. typo
|
||||
. View source is not always equal to Save As
|
||||
. Show New Window icon in statusbar for new-window links
|
||||
. Validate search engine tokens
|
||||
. Easily register stock items in extensions (mouse gestures, input-mouse)
|
||||
. Show graphical error when a bookmarklet fails to run
|
||||
. Unit test katze array action
|
||||
. There is no way to reset the toolbar
|
||||
. Estimate download speed
|
||||
. Implement no_proxy, https_proxy
|
||||
. Make it possible to use extra C or C++ libraries in extensions
|
||||
. Add icon cache size preference
|
||||
. Fix icons with white background to be transparent?
|
||||
. Visually indicate that a tab is being opened even if outside the visible tabs
|
||||
. gget/ eatmonkey/ Transmission dbus in Transfers
|
||||
. Add Midori to autostart, and remove it if it's quit, optionally disabled
|
||||
. Use @include and @exclude with userstyles
|
||||
. Support -moz-document domain: http://userstyles.org/styles/22837
|
||||
. Need a throbber with invisible menubar: make compact-menu throbb?
|
||||
. Implement live bookmarks, see http://johnbokma.com/firefox/rss-and-live-bookmarks.html
|
||||
. Add a dialog (right-cick) to Addons, to edit @include and @exclude
|
||||
. Show URI in css overlay tooltips if statusbar is hidden
|
||||
. "Menu" tool buttons aren't depressed while a menu is open
|
||||
. Statusbar doesn't show right-click menu
|
||||
. Statusbar/ transferbar doesn't show right-click menu
|
||||
. Consider pango_layout_set_auto_dir
|
||||
. Make it possible to change ident string for particular domains
|
||||
. Support max-age for Flash cookies
|
||||
. Update speed dial thumbnail when loading the according page from speed dial
|
||||
. Implement "Open image" which opens an image with an external application
|
||||
. Add custom actions extension; example Set Wallpaper
|
||||
. Offer restoring session after crash, if session isn't opened at startup AND crash dialogue is enabled
|
||||
. Vi extension, modelled after vimprobable
|
||||
. Show loading tabs in the tab panel extension
|
||||
. Let extensions add preferences
|
||||
. Show syntax errors in userscripts/ styles
|
||||
. Add HTTP_PRAGMA: no-cache when Ctrl+Shift+R
|
||||
. Honor HTTP_PRAGMA: no-cache in web cache
|
||||
. Switching browser window: Ctrl+Shift+PageUp/PageDown
|
||||
. Switching panel: Ctrl+Alt+PageUp/PageDown
|
||||
. Bookmark folder context menu, "Sort by Name"
|
||||
. Adblock Block image: dialog to edit regex before adding
|
||||
. KatzeArrayAction should support "activate" signal
|
||||
. Remove extra inner panel border
|
||||
. Move statusbar_contents below panel if statusbar is hidden
|
||||
. Teplace "disable plugins" with showing a "load plugins automatically", where unchecking that keeps a placeholder that can be clicked to play
|
||||
. Replace "disable plugins" with showing a "load plugins automatically", where unchecking that keeps a placeholder that can be clicked to play
|
||||
. Show "Type an address or keywords to search" in empty location even when focussed
|
||||
. Show "Search hostname" in (can't resolve) error page, www.heyarnold.twotoastsde == typo?
|
||||
. Enable extensions in private (app) mode
|
||||
. Allow -e Set setting or so
|
||||
. Remember if inspector was attached or not
|
||||
. Icon in empty entry to paste from clipboard
|
||||
|
@ -64,16 +36,11 @@ TODO:
|
|||
. Warn when closing tab with unsubmitted form
|
||||
. Always allow popups, keep hidden, show icon to ask whether to show popups
|
||||
. Make Shift + Click download the link
|
||||
. Use an update timeout in KatzePropertyProxy instead of only focus-out
|
||||
. Show a loading mouse pointer
|
||||
. Export of the bookmarks file, or using one from a specific path
|
||||
. Custom context menu actions, like in Thunar or Epiphany
|
||||
. Analogus to blocked popups, blocked scripts moving layers on load (extension)
|
||||
. Per-site blocking of individual elements on a page
|
||||
. Statusbar icon 'cookies blocked', icon 'popups blocked'
|
||||
. Per-site settings accessible via statusbar icons, ie. cookies, popups, plugins
|
||||
. CookieSafe like, a list of cookies, with type, block, allow
|
||||
. Automatic update checks (browser, extensions)?
|
||||
. Auto-group tabs by opener, with colors?
|
||||
. Mark (dogear) a selection so that it isn't cleared implicitly, multiply on one page
|
||||
. Check specific bookmarks for updates automatically (extension)
|
||||
|
@ -83,11 +50,16 @@ TODO:
|
|||
. Honor design principle "no warnings but undo of backups"?
|
||||
. Support widgets 1.0 spec in tool windows and standalone?
|
||||
. Protected tabs prompt when attempting to close them
|
||||
. Provide a 'sleep mode' after a crash where open documents are loaded manually
|
||||
. Option to run plugins or scripts only on demand, like NoScript, per-site
|
||||
. Optional http redirection manually or on timeout via SoupMessage::restarted
|
||||
. Style: none, compatible (b/w), default, [styles], "media", ["media" styles]
|
||||
. Mouse pointer coordinates in the status bar (extension)
|
||||
. Draw rectangle with the mouse, x/y/x2/y2 in the statusbar (extension)
|
||||
. Shared bookmarks and config
|
||||
. Prevent dead tabs: download, aborted page
|
||||
. In right to left pages the scroll bar should be on the left
|
||||
. drag tab between windows
|
||||
. zeitgeist extension to add history
|
||||
. kiosk mode: http://www.twotoasts.de/bugs/index.php?do=details&task_id=605#comment2651
|
||||
. Find Inline → <key> → Open selected hyperlink
|
||||
. open selected addresses in tabs
|
||||
. scrolling by just moving the mouse pointer to the edge of the window
|
||||
|
|
55
cmake/ContainTest.cmake
Normal file
55
cmake/ContainTest.cmake
Normal file
|
@ -0,0 +1,55 @@
|
|||
# Copyright (C) 2013 Christian Dywan <christian@twotoasts.de>
|
||||
|
||||
include(ParseArguments)
|
||||
|
||||
macro(contain_test test_name executable)
|
||||
parse_arguments(ARGS "test_name;executable" "" ${ARGN})
|
||||
set(TEST_ENV "")
|
||||
foreach(VARIABLE XDG_CACHE_HOME XDG_CONFIG_HOME XDG_DATA_HOME XDG_RUNTIME_DIR TMPDIR)
|
||||
set(CONTAINER "${CMAKE_CURRENT_BINARY_DIR}/${test_name}-folders/${VARIABLE}")
|
||||
set(TEST_ENV "${TEST_ENV}${VARIABLE}=${CONTAINER};")
|
||||
endforeach()
|
||||
|
||||
add_dependencies(check contain-${test_name})
|
||||
|
||||
set_tests_properties(${test_name} PROPERTIES
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
TIMEOUT 42
|
||||
ENVIRONMENT "${TEST_ENV}"
|
||||
)
|
||||
add_custom_target("contain-${test_name}"
|
||||
COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_BINARY_DIR}/${test_name}-folders
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${test_name}-folders/XDG_CACHE_HOME
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${test_name}-folders/XDG_CONFIG_HOME
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${test_name}-folders/XDG_DATA_HOME
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${test_name}-folders/XDG_RUNTIME_DIR
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${test_name}-folders/TMPDIR
|
||||
)
|
||||
|
||||
string(REPLACE ${executable} ";" " " executable)
|
||||
add_custom_target("gdb-${test_name}"
|
||||
COMMAND env ${TEST_ENV} gdb
|
||||
--batch -ex 'set print thread-events off'
|
||||
-ex 'run' -ex 'bt'
|
||||
--args ${executable}
|
||||
DEPENDS "contain-${test_name}"
|
||||
)
|
||||
|
||||
add_custom_target("valgrind-${test_name}"
|
||||
COMMAND env ${TEST_ENV} valgrind
|
||||
-q --leak-check=no --num-callers=4
|
||||
--show-possibly-lost=no
|
||||
--undef-value-errors=yes
|
||||
--track-origins=yes
|
||||
${executable}
|
||||
DEPENDS "contain-${test_name}"
|
||||
)
|
||||
|
||||
add_custom_target("callgrind-${test_name}"
|
||||
COMMAND env ${TEST_ENV} valgrind
|
||||
--tool=callgrind
|
||||
--callgrind-out-file=${UNIT}.callgrind
|
||||
${executable}
|
||||
DEPENDS "contain-${test_name}"
|
||||
)
|
||||
endmacro(contain_test)
|
19
cmake/FindConvert.cmake
Normal file
19
cmake/FindConvert.cmake
Normal file
|
@ -0,0 +1,19 @@
|
|||
# Copyright (C) 2013 Christian Dywan
|
||||
# Copyright (C) 2013 Olivier Duchateau
|
||||
|
||||
find_program (RSVG_CONVERT rsvg-convert)
|
||||
|
||||
if (RSVG_CONVERT)
|
||||
set (CONVERT_FOUND TRUE)
|
||||
macro (SVG2PNG filename install_destination)
|
||||
string(REPLACE "/" "_" target ${filename})
|
||||
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${filename}")
|
||||
add_custom_target ("${target}.png" ALL
|
||||
${RSVG_CONVERT} --keep-aspect-ratio --format=png "${CMAKE_CURRENT_SOURCE_DIR}/${filename}.svg"
|
||||
--output "${CMAKE_CURRENT_BINARY_DIR}/${filename}.png"
|
||||
)
|
||||
install (FILES "${CMAKE_CURRENT_BINARY_DIR}/${filename}.png"
|
||||
DESTINATION ${install_destination})
|
||||
endmacro (SVG2PNG filename)
|
||||
endif ()
|
||||
|
38
cmake/FindIntltool.cmake
Normal file
38
cmake/FindIntltool.cmake
Normal file
|
@ -0,0 +1,38 @@
|
|||
# FindIntltool.cmake
|
||||
#
|
||||
# Jim Nelson <jim@yorba.org>
|
||||
# Copyright 2012-2013 Yorba Foundation
|
||||
# Copyright (C) 2013 Christian Dywan
|
||||
|
||||
find_program (INTLTOOL_MERGE_EXECUTABLE intltool-merge)
|
||||
find_program (INTLTOOL_UPDATE_EXECUTABLE intltool-update)
|
||||
|
||||
if (INTLTOOL_MERGE_EXECUTABLE)
|
||||
set (INTLTOOL_MERGE_FOUND TRUE)
|
||||
macro (INTLTOOL_MERGE_DESKTOP desktop_id po_dir)
|
||||
add_custom_target ("${desktop_id}.desktop" ALL
|
||||
${INTLTOOL_MERGE_EXECUTABLE} --desktop-style ${CMAKE_SOURCE_DIR}/${po_dir}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/${desktop_id}.desktop.in ${desktop_id}.desktop
|
||||
)
|
||||
install (FILES "${CMAKE_CURRENT_BINARY_DIR}/${desktop_id}.desktop"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/applications")
|
||||
endmacro (INTLTOOL_MERGE_DESKTOP desktop_id po_dir)
|
||||
macro (INTLTOOL_MERGE_APPDATA desktop_id po_dir)
|
||||
add_custom_target ("${desktop_id}.appdata.xml" ALL
|
||||
${INTLTOOL_MERGE_EXECUTABLE} --xml-style ${CMAKE_SOURCE_DIR}/${po_dir}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/${desktop_id}.appdata.xml.in ${desktop_id}.appdata.xml
|
||||
)
|
||||
install (FILES "${CMAKE_CURRENT_BINARY_DIR}/${desktop_id}.appdata.xml"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/appdata")
|
||||
endmacro (INTLTOOL_MERGE_APPDATA desktop_id po_dir)
|
||||
endif ()
|
||||
|
||||
if (INTLTOOL_UPDATE_EXECUTABLE)
|
||||
set (INTLTOOL_UPDATE_FOUND TRUE)
|
||||
add_custom_target (pot
|
||||
COMMAND ${INTLTOOL_UPDATE_EXECUTABLE} "-p" "-g" ${GETTEXT_PACKAGE}
|
||||
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/po"
|
||||
)
|
||||
endif ()
|
||||
|
||||
|
18
cmake/FindVala.cmake
Normal file
18
cmake/FindVala.cmake
Normal file
|
@ -0,0 +1,18 @@
|
|||
# Copyright (C) 2013 Christian Dywan <christian@twotoasts.de>
|
||||
|
||||
find_program(VALA_EXECUTABLE NAMES $ENV{VALAC} valac)
|
||||
if (VALA_EXECUTABLE)
|
||||
execute_process(COMMAND ${VALA_EXECUTABLE} "--version" OUTPUT_VARIABLE "VALA_VERSION")
|
||||
string(REPLACE "Vala " "" VALA_VERSION ${VALA_VERSION})
|
||||
string(STRIP ${VALA_VERSION} VALA_VERSION)
|
||||
else ()
|
||||
message(FATAL_ERROR "valac not found - install Vala compiler or specify compiler name eg. VALAC=valac-0.20")
|
||||
endif ()
|
||||
|
||||
macro(vala_require VALA_REQUIRED)
|
||||
if (${VALA_VERSION} VERSION_GREATER ${VALA_REQUIRED} OR ${VALA_VERSION} VERSION_EQUAL ${VALA_REQUIRED})
|
||||
message(STATUS "valac ${VALA_VERSION} found")
|
||||
else ()
|
||||
message(FATAL_ERROR "valac >= ${VALA_REQUIRED} or later required")
|
||||
endif ()
|
||||
endmacro(vala_require)
|
38
cmake/GIR.cmake
Normal file
38
cmake/GIR.cmake
Normal file
|
@ -0,0 +1,38 @@
|
|||
# GIR.cmake
|
||||
#
|
||||
# Macros for building Gobject Introspection bindings for Midori API
|
||||
find_program (GIR_SCANNER_BIN g-ir-scanner)
|
||||
find_program (GIR_COMPILER_BIN g-ir-compiler)
|
||||
|
||||
if (GIR_SCANNER_BIN AND GIR_COMPILER_BIN)
|
||||
|
||||
set (GIR_FOUND TRUE)
|
||||
set (GIR_VERSION "${MIDORI_MAJOR_VERSION}.${MIDORI_MINOR_VERSION}")
|
||||
macro (gir_build module namespace)
|
||||
add_custom_target ("g-ir-scanner_${module}" ALL
|
||||
${GIR_SCANNER_BIN} -Imidori -I${CMAKE_SOURCE_DIR}/ -I${CMAKE_BINARY_DIR}/midori -I${CMAKE_SOURCE_DIR}/${module} -I${CMAKE_SOURCE_DIR}/toolbars -I.
|
||||
--header-only -n ${namespace} --identifier-prefix ${namespace}
|
||||
${CMAKE_SOURCE_DIR}/${module}/${module}-*.c ${CMAKE_SOURCE_DIR}/${module}/${module}-*.h
|
||||
--pkg gtk+-2.0 --pkg webkit-1.0 --pkg gio-2.0 --pkg gobject-2.0
|
||||
--warn-all -iGObject-2.0 -iGLib-2.0 -iGtk-2.0
|
||||
--nsversion ${GIR_VERSION}
|
||||
-o ${CMAKE_CURRENT_BINARY_DIR}/${namespace}-${GIR_VERSION}.gir
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
||||
DEPENDS ${CMAKE_PROJECT_NAME})
|
||||
add_custom_target ("g-ir-compiler_${module}" ALL
|
||||
${GIR_COMPILER_BIN} ${CMAKE_CURRENT_BINARY_DIR}/${namespace}-${GIR_VERSION}.gir
|
||||
--output ${CMAKE_CURRENT_BINARY_DIR}/${namespace}-${GIR_VERSION}.typelib
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
||||
DEPENDS g-ir-scanner_${module})
|
||||
|
||||
endmacro (gir_build module namespace)
|
||||
|
||||
macro (gir module namespace)
|
||||
gir_build (${module} ${namespace})
|
||||
|
||||
install (FILES "${CMAKE_CURRENT_BINARY_DIR}/${namespace}-${GIR_VERSION}.gir"
|
||||
DESTINATION "${CMAKE_INSTALL_DATADIR}/gir-1.0/")
|
||||
install (FILES "${CMAKE_CURRENT_BINARY_DIR}/${namespace}-${GIR_VERSION}.typelib"
|
||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/girepository-1.0/")
|
||||
endmacro (gir module)
|
||||
endif ()
|
71
cmake/GLibHelpers.cmake
Normal file
71
cmake/GLibHelpers.cmake
Normal file
|
@ -0,0 +1,71 @@
|
|||
# Copyright (C) 2010 David Sansome <me@davidsansome.com>
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
if(POLICY CMP0011)
|
||||
cmake_policy(SET CMP0011 NEW)
|
||||
endif(POLICY CMP0011)
|
||||
|
||||
find_program(GLIB_MKENUMS glib-mkenums)
|
||||
find_program(GLIB_GENMARSHAL glib-genmarshal)
|
||||
|
||||
macro(add_glib_marshal outfiles name prefix otherinclude)
|
||||
add_custom_command(
|
||||
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}.h"
|
||||
COMMAND ${GLIB_GENMARSHAL} --header "--prefix=${prefix}"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/${name}.list"
|
||||
> "${CMAKE_CURRENT_BINARY_DIR}/${name}.h"
|
||||
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${name}.list"
|
||||
)
|
||||
add_custom_command(
|
||||
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}.c"
|
||||
COMMAND echo "\\#include \\\"${otherinclude}\\\"" > "${CMAKE_CURRENT_BINARY_DIR}/${name}.c"
|
||||
COMMAND echo "\\#include \\\"glib-object.h\\\"" >> "${CMAKE_CURRENT_BINARY_DIR}/${name}.c"
|
||||
COMMAND echo "\\#include \\\"${name}.h\\\"" >> "${CMAKE_CURRENT_BINARY_DIR}/${name}.c"
|
||||
COMMAND ${GLIB_GENMARSHAL} --body "--prefix=${prefix}"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/${name}.list"
|
||||
>> "${CMAKE_CURRENT_BINARY_DIR}/${name}.c"
|
||||
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${name}.list"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${name}.h"
|
||||
)
|
||||
list(APPEND ${outfiles} "${CMAKE_CURRENT_BINARY_DIR}/${name}.c")
|
||||
endmacro(add_glib_marshal)
|
||||
|
||||
macro(add_glib_enumtypes_t outfiles name htemplate ctemplate)
|
||||
add_custom_command(
|
||||
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}.h"
|
||||
COMMAND ${GLIB_MKENUMS}
|
||||
--template "${htemplate}"
|
||||
${ARGN} > "${CMAKE_CURRENT_BINARY_DIR}/${name}.h"
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
DEPENDS ${ARGN} "${htemplate}"
|
||||
)
|
||||
add_custom_command(
|
||||
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}.c"
|
||||
COMMAND ${GLIB_MKENUMS}
|
||||
--template "${ctemplate}"
|
||||
${ARGN} > "${CMAKE_CURRENT_BINARY_DIR}/${name}.c"
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
DEPENDS ${ARGN} ${ctemplate}
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${name}.h"
|
||||
)
|
||||
list(APPEND ${outfiles} "${CMAKE_CURRENT_BINARY_DIR}/${name}.c")
|
||||
endmacro(add_glib_enumtypes_t)
|
||||
|
||||
macro(add_glib_enumtypes outfiles name includeguard)
|
||||
set(htemplate "${CMAKE_CURRENT_BINARY_DIR}/${name}.h.template")
|
||||
set(ctemplate "${CMAKE_CURRENT_BINARY_DIR}/${name}.c.template")
|
||||
|
||||
# Write the .h template
|
||||
add_custom_command(
|
||||
OUTPUT ${htemplate} ${ctemplate}
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
"-Dctemplate=${ctemplate}"
|
||||
"-Dhtemplate=${htemplate}"
|
||||
"-Dname=${name}"
|
||||
"-Dincludeguard=${includeguard}"
|
||||
"\"-Dheaders=${ARGN}\""
|
||||
-P "${CMAKE_SOURCE_DIR}/CMake/MakeGLibEnumTemplates.cmake"
|
||||
DEPENDS "${CMAKE_SOURCE_DIR}/CMake/MakeGLibEnumTemplates.cmake" ${headers}
|
||||
)
|
||||
|
||||
add_glib_enumtypes_t(${outfiles} ${name} ${htemplate} ${ctemplate} ${ARGN})
|
||||
endmacro(add_glib_enumtypes)
|
61
cmake/GtkDoc.cmake
Normal file
61
cmake/GtkDoc.cmake
Normal file
|
@ -0,0 +1,61 @@
|
|||
# GtkDoc.cmake
|
||||
#
|
||||
# Macros for building Midori API documentation.
|
||||
# Copyright (C) 2013 Olivier Duchateau
|
||||
|
||||
find_program (GTKDOC_SCAN_BIN gtkdoc-scan)
|
||||
find_program (GTKDOC_MKDB_BIN gtkdoc-mkdb)
|
||||
find_program (GTKDOC_MKHTML_BIN gtkdoc-mkhtml)
|
||||
find_program (GTKDOC_MKTMPL_BIN gtkdoc-mktmpl)
|
||||
|
||||
if (GTKDOC_SCAN_BIN AND GTKDOC_MKTMPL_BIN AND GTKDOC_MKDB_BIN
|
||||
AND GTKDOC_MKHTML_BIN)
|
||||
|
||||
set (GTKDOC_FOUND TRUE)
|
||||
|
||||
macro (gtkdoc_build module)
|
||||
message("gtkdoc: module ${module}")
|
||||
# file (MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${module}")
|
||||
add_custom_target ("gtkdoc-scan_${module}" ALL
|
||||
${GTKDOC_SCAN_BIN} --module=${module}
|
||||
--source-dir="${CMAKE_SOURCE_DIR}/${module}"
|
||||
--output-dir="${CMAKE_CURRENT_BINARY_DIR}/${module}"
|
||||
--rebuild-sections --rebuild-types
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
|
||||
add_custom_target ("gtkdoc-tmpl_${module}" ALL
|
||||
${GTKDOC_MKTMPL_BIN} --module=${module}
|
||||
--output-dir="${CMAKE_CURRENT_BINARY_DIR}"
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${module}"
|
||||
DEPENDS "gtkdoc-scan_${module}")
|
||||
|
||||
add_custom_target ("gtkdoc-docbook_${module}" ALL
|
||||
${GTKDOC_MKDB_BIN} --module=${module}
|
||||
--output-dir="xml"
|
||||
--source-dir="${CMAKE_SOURCE_DIR}/${module}"
|
||||
--source-suffixes=c,h --output-format=xml
|
||||
--default-includes=${module}/${module}.h
|
||||
--sgml-mode --main-sgml-file=${module}.sgml
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${module}"
|
||||
DEPENDS "gtkdoc-tmpl_${module}")
|
||||
|
||||
# Keep this target alone, otherwise build fails
|
||||
add_custom_target ("gtkdoc-html_${module}" ALL
|
||||
${GTKDOC_MKHTML_BIN} ${module}
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${module}/${module}.sgml"
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${module}/html"
|
||||
DEPENDS "gtkdoc-docbook_${module}")
|
||||
|
||||
endmacro (gtkdoc_build module)
|
||||
|
||||
macro (gtkdoc module)
|
||||
file (MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${module}/html")
|
||||
gtkdoc_build (${module})
|
||||
|
||||
set (DOC_DIR "html/midori-${MIDORI_MAJOR_VERSION}-${MIDORI_MINOR_VERSION}")
|
||||
install (DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${module}/html/"
|
||||
DESTINATION "${CMAKE_INSTALL_DATADIR}/gtk-doc/${DOC_DIR}/${module}"
|
||||
PATTERN "html/*"
|
||||
PATTERN "index.sgml" EXCLUDE)
|
||||
endmacro (gtkdoc module)
|
||||
endif ()
|
36
cmake/ParseArguments.cmake
Normal file
36
cmake/ParseArguments.cmake
Normal file
|
@ -0,0 +1,36 @@
|
|||
##
|
||||
# This is a helper Macro to parse optional arguments in Macros/Functions
|
||||
# It has been taken from the public CMake wiki.
|
||||
# See http://www.cmake.org/Wiki/CMakeMacroParseArguments for documentation and
|
||||
# licensing.
|
||||
##
|
||||
macro(parse_arguments prefix arg_names option_names)
|
||||
set(DEFAULT_ARGS)
|
||||
foreach(arg_name ${arg_names})
|
||||
set(${prefix}_${arg_name})
|
||||
endforeach(arg_name)
|
||||
foreach(option ${option_names})
|
||||
set(${prefix}_${option} FALSE)
|
||||
endforeach(option)
|
||||
|
||||
set(current_arg_name DEFAULT_ARGS)
|
||||
set(current_arg_list)
|
||||
foreach(arg ${ARGN})
|
||||
set(larg_names ${arg_names})
|
||||
list(FIND larg_names "${arg}" is_arg_name)
|
||||
if(is_arg_name GREATER -1)
|
||||
set(${prefix}_${current_arg_name} ${current_arg_list})
|
||||
set(current_arg_name ${arg})
|
||||
set(current_arg_list)
|
||||
else(is_arg_name GREATER -1)
|
||||
set(loption_names ${option_names})
|
||||
list(FIND loption_names "${arg}" is_option)
|
||||
if(is_option GREATER -1)
|
||||
set(${prefix}_${arg} TRUE)
|
||||
else(is_option GREATER -1)
|
||||
set(current_arg_list ${current_arg_list} ${arg})
|
||||
endif(is_option GREATER -1)
|
||||
endif(is_arg_name GREATER -1)
|
||||
endforeach(arg)
|
||||
set(${prefix}_${current_arg_name} ${current_arg_list})
|
||||
endmacro(parse_arguments)
|
236
cmake/ValaPrecompile.cmake
Normal file
236
cmake/ValaPrecompile.cmake
Normal file
|
@ -0,0 +1,236 @@
|
|||
##
|
||||
# Copyright 2009-2010 Jakob Westhoff. All rights reserved.
|
||||
# Copyright 2012 elementary.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
#
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# The views and conclusions contained in the software and documentation are those
|
||||
# of the authors and should not be interpreted as representing official policies,
|
||||
# either expressed or implied, of Jakob Westhoff
|
||||
##
|
||||
|
||||
include(ParseArguments)
|
||||
find_package(Vala REQUIRED)
|
||||
|
||||
##
|
||||
# Compile vala files to their c equivalents for further processing.
|
||||
#
|
||||
# The "vala_precompile" macro takes care of calling the valac executable on the
|
||||
# given source to produce c files which can then be processed further using
|
||||
# default cmake functions.
|
||||
#
|
||||
# The first parameter provided is a variable, which will be filled with a list
|
||||
# of c files outputted by the vala compiler. This list can than be used in
|
||||
# conjuction with functions like "add_executable" or others to create the
|
||||
# neccessary compile rules with CMake.
|
||||
#
|
||||
# The initial variable is followed by a list of .vala files to be compiled.
|
||||
# Please take care to add every vala file belonging to the currently compiled
|
||||
# project or library as Vala will otherwise not be able to resolve all
|
||||
# dependencies.
|
||||
#
|
||||
# The following sections may be specified afterwards to provide certain options
|
||||
# to the vala compiler:
|
||||
#
|
||||
# PACKAGES
|
||||
# A list of vala packages/libraries to be used during the compile cycle. The
|
||||
# package names are exactly the same, as they would be passed to the valac
|
||||
# "--pkg=" option.
|
||||
#
|
||||
# OPTIONS
|
||||
# A list of optional options to be passed to the valac executable. This can be
|
||||
# used to pass "--thread" for example to enable multi-threading support.
|
||||
#
|
||||
# CUSTOM_VAPIS
|
||||
# A list of custom vapi files to be included for compilation. This can be
|
||||
# useful to include freshly created vala libraries without having to install
|
||||
# them in the system.
|
||||
#
|
||||
# GENERATE_VAPI
|
||||
# Pass all the needed flags to the compiler to create an internal vapi for
|
||||
# the compiled library. The provided name will be used for this and a
|
||||
# <provided_name>.vapi file will be created.
|
||||
#
|
||||
# GENERATE_HEADER
|
||||
# Let the compiler generate a header file for the compiled code. There will
|
||||
# be a header file as well as an internal header file being generated called
|
||||
# <provided_name>.h and <provided_name>_internal.h
|
||||
#
|
||||
# GENERATE_GIR
|
||||
# Have the compiler generate a GObject-Introspection repository file with
|
||||
# name: <provided_name>.gir. This can be later used to create a binary typelib
|
||||
# using the GI compiler.
|
||||
#
|
||||
# GENERATE_SYMBOLS
|
||||
# Output a <provided_name>.symbols file containing all the exported symbols.
|
||||
#
|
||||
# The following call is a simple example to the vala_precompile macro showing
|
||||
# an example to every of the optional sections:
|
||||
#
|
||||
# vala_precompile(VALA_C mytargetname
|
||||
# source1.vala
|
||||
# source2.vala
|
||||
# source3.vala
|
||||
# PACKAGES
|
||||
# gtk+-2.0
|
||||
# gio-1.0
|
||||
# posix
|
||||
# DIRECTORY
|
||||
# gen
|
||||
# OPTIONS
|
||||
# --thread
|
||||
# CUSTOM_VAPIS
|
||||
# some_vapi.vapi
|
||||
# GENERATE_VAPI
|
||||
# myvapi
|
||||
# GENERATE_HEADER
|
||||
# myheader
|
||||
# GENERATE_GIR
|
||||
# mygir
|
||||
# GENERATE_SYMBOLS
|
||||
# mysymbols
|
||||
# )
|
||||
#
|
||||
# Most important is the variable VALA_C which will contain all the generated c
|
||||
# file names after the call.
|
||||
##
|
||||
|
||||
macro(vala_precompile output target_name)
|
||||
parse_arguments(ARGS "TARGET;PACKAGES;OPTIONS;DIRECTORY;GENERATE_GIR;GENERATE_SYMBOLS;GENERATE_HEADER;GENERATE_VAPI;CUSTOM_VAPIS" "" ${ARGN})
|
||||
|
||||
if(ARGS_DIRECTORY)
|
||||
set(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${ARGS_DIRECTORY})
|
||||
else(ARGS_DIRECTORY)
|
||||
set(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
||||
endif(ARGS_DIRECTORY)
|
||||
include_directories(${DIRECTORY})
|
||||
set(vala_pkg_opts "")
|
||||
foreach(pkg ${ARGS_PACKAGES})
|
||||
list(APPEND vala_pkg_opts "--pkg=${pkg}")
|
||||
endforeach(pkg ${ARGS_PACKAGES})
|
||||
set(in_files "")
|
||||
set(out_files "")
|
||||
set(out_files_display "")
|
||||
set(${output} "")
|
||||
|
||||
foreach(src ${ARGS_DEFAULT_ARGS})
|
||||
string(REGEX MATCH "^/" IS_MATCHED ${src})
|
||||
if(${IS_MATCHED} MATCHES "/")
|
||||
set(src_file_path ${src})
|
||||
else()
|
||||
set(src_file_path ${CMAKE_CURRENT_SOURCE_DIR}/${src})
|
||||
endif()
|
||||
list(APPEND in_files ${src_file_path})
|
||||
string(REPLACE ".vala" ".c" src ${src})
|
||||
string(REPLACE ".gs" ".c" src ${src})
|
||||
if(${IS_MATCHED} MATCHES "/")
|
||||
get_filename_component(VALA_FILE_NAME ${src} NAME)
|
||||
set(out_file "${CMAKE_CURRENT_BINARY_DIR}/${VALA_FILE_NAME}")
|
||||
list(APPEND out_files "${CMAKE_CURRENT_BINARY_DIR}/${VALA_FILE_NAME}")
|
||||
else()
|
||||
set(out_file "${DIRECTORY}/${src}")
|
||||
list(APPEND out_files "${DIRECTORY}/${src}")
|
||||
endif()
|
||||
list(APPEND ${output} ${out_file})
|
||||
list(APPEND out_files_display "${src}")
|
||||
endforeach(src ${ARGS_DEFAULT_ARGS})
|
||||
|
||||
set(custom_vapi_arguments "")
|
||||
if(ARGS_CUSTOM_VAPIS)
|
||||
foreach(vapi ${ARGS_CUSTOM_VAPIS})
|
||||
if(${vapi} MATCHES ${CMAKE_SOURCE_DIR} OR ${vapi} MATCHES ${CMAKE_BINARY_DIR})
|
||||
list(APPEND custom_vapi_arguments ${vapi})
|
||||
else (${vapi} MATCHES ${CMAKE_SOURCE_DIR} OR ${vapi} MATCHES ${CMAKE_BINARY_DIR})
|
||||
list(APPEND custom_vapi_arguments ${CMAKE_CURRENT_SOURCE_DIR}/${vapi})
|
||||
endif(${vapi} MATCHES ${CMAKE_SOURCE_DIR} OR ${vapi} MATCHES ${CMAKE_BINARY_DIR})
|
||||
endforeach(vapi ${ARGS_CUSTOM_VAPIS})
|
||||
endif(ARGS_CUSTOM_VAPIS)
|
||||
|
||||
set(vapi_arguments "")
|
||||
if(ARGS_GENERATE_VAPI)
|
||||
list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_VAPI}.vapi")
|
||||
list(APPEND out_files_display "${ARGS_GENERATE_VAPI}.vapi")
|
||||
set(vapi_arguments "--library=${ARGS_GENERATE_VAPI}" "--vapi=${ARGS_GENERATE_VAPI}.vapi")
|
||||
|
||||
# Header and internal header is needed to generate internal vapi
|
||||
if (NOT ARGS_GENERATE_HEADER)
|
||||
set(ARGS_GENERATE_HEADER ${ARGS_GENERATE_VAPI})
|
||||
endif(NOT ARGS_GENERATE_HEADER)
|
||||
endif(ARGS_GENERATE_VAPI)
|
||||
|
||||
set(header_arguments "")
|
||||
if(ARGS_GENERATE_HEADER)
|
||||
list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_HEADER}.h")
|
||||
list(APPEND out_files_display "${ARGS_GENERATE_HEADER}.h")
|
||||
list(APPEND header_arguments "--header=${ARGS_GENERATE_HEADER}.h")
|
||||
endif(ARGS_GENERATE_HEADER)
|
||||
|
||||
set(gir_arguments "")
|
||||
if(ARGS_GENERATE_GIR)
|
||||
list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_GIR}.gir")
|
||||
list(APPEND out_files_display "${ARGS_GENERATE_GIR}.gir")
|
||||
set(gir_arguments "--gir=${ARGS_GENERATE_GIR}.gir")
|
||||
endif(ARGS_GENERATE_GIR)
|
||||
|
||||
set(symbols_arguments "")
|
||||
if(ARGS_GENERATE_SYMBOLS)
|
||||
list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_SYMBOLS}.symbols")
|
||||
list(APPEND out_files_display "${ARGS_GENERATE_SYMBOLS}.symbols")
|
||||
set(symbols_arguments "--symbols=${ARGS_GENERATE_SYMBOLS}.symbols")
|
||||
endif(ARGS_GENERATE_SYMBOLS)
|
||||
|
||||
# Workaround for a bug that would make valac run twice. This file is written
|
||||
# after the vala compiler generates C source code.
|
||||
set(OUTPUT_STAMP ${CMAKE_CURRENT_BINARY_DIR}/${target_name}_valac.stamp)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT
|
||||
${OUTPUT_STAMP}
|
||||
COMMAND
|
||||
${VALA_EXECUTABLE}
|
||||
ARGS
|
||||
"-C"
|
||||
${header_arguments}
|
||||
${vapi_arguments}
|
||||
${gir_arguments}
|
||||
${symbols_arguments}
|
||||
"-b" ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
"-d" ${DIRECTORY}
|
||||
${vala_pkg_opts}
|
||||
${ARGS_OPTIONS}
|
||||
${in_files}
|
||||
${custom_vapi_arguments}
|
||||
COMMAND
|
||||
touch
|
||||
ARGS
|
||||
${OUTPUT_STAMP}
|
||||
DEPENDS
|
||||
${in_files}
|
||||
${ARGS_CUSTOM_VAPIS}
|
||||
COMMENT
|
||||
"Generating ${out_files_display}"
|
||||
)
|
||||
|
||||
# This command will be run twice for some reason (pass a non-empty string to COMMENT
|
||||
# in order to see it). Since valac is not executed from here, this won't be a problem.
|
||||
add_custom_command(OUTPUT ${out_files} DEPENDS ${OUTPUT_STAMP} COMMENT "")
|
||||
endmacro(vala_precompile)
|
23
config/CMakeLists.txt
Normal file
23
config/CMakeLists.txt
Normal file
|
@ -0,0 +1,23 @@
|
|||
# Copyright (C) 2013 Olivier Duchateau
|
||||
|
||||
set (SYSCONFDIR ${CMAKE_INSTALL_FULL_SYSCONFDIR})
|
||||
set (XDG_CONFIG_DIR "xdg/${CMAKE_PROJECT_NAME}")
|
||||
|
||||
file (GLOB_RECURSE CONFIG_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *)
|
||||
list (REMOVE_ITEM CONFIG_FILES "CMakeLists.txt")
|
||||
|
||||
if (${CMAKE_INSTALL_PREFIX} STREQUAL "/usr")
|
||||
set(CMAKE_INSTALL_SYSCONFDIR "/etc")
|
||||
endif()
|
||||
|
||||
foreach (FILE ${CONFIG_FILES})
|
||||
string (FIND ${FILE} "adblock" ADBLOCK_CONF)
|
||||
if (ADBLOCK_CONF GREATER -1)
|
||||
string (REPLACE "config" "" dirname ${FILE})
|
||||
install (FILES ${FILE}
|
||||
DESTINATION "${CMAKE_INSTALL_SYSCONFDIR}/${XDG_CONFIG_DIR}/${dirname}")
|
||||
else ()
|
||||
install (FILES ${FILE}
|
||||
DESTINATION "${CMAKE_INSTALL_SYSCONFDIR}/${XDG_CONFIG_DIR}")
|
||||
endif ()
|
||||
endforeach ()
|
2
config/extensions/adblock/config
Normal file
2
config/extensions/adblock/config
Normal file
|
@ -0,0 +1,2 @@
|
|||
[settings]
|
||||
filters=https://easylist-downloads.adblockplus.org/easylist.txt;https://easylist-downloads.adblockplus.org/easyprivacy.txt
|
|
@ -1,21 +1,36 @@
|
|||
[Duck Duck Go]
|
||||
name=Duck Duck Go
|
||||
text=Privacy-aware Web Search
|
||||
uri=https://duckduckgo.com/?q=%s
|
||||
token=dd
|
||||
|
||||
[Yahoo]
|
||||
name=Yahoo
|
||||
text=Yahoo Web Search
|
||||
uri=http://search.yahoo.com/search?p=
|
||||
token=y
|
||||
|
||||
[Google]
|
||||
name=Google
|
||||
text=Web Search
|
||||
uri=http://www.google.com/search?q=%s
|
||||
icon=
|
||||
token=g
|
||||
|
||||
[Wikipedia]
|
||||
name=Wikipedia
|
||||
text=The free encyclopedia
|
||||
uri=http://en.wikipedia.org/wiki/Special:Search/%s
|
||||
icon=
|
||||
token=wp
|
||||
|
||||
[TheFreeDictionary]
|
||||
name=The Free Dictionary
|
||||
text=Dictionary, Encyclopedia and Thesaurus
|
||||
uri=http://www.thefreedictionary.com/%s
|
||||
icon=
|
||||
token=fd
|
||||
|
||||
[Google Translate]
|
||||
name=Google Translate
|
||||
text=Localize text or URL
|
||||
uri=http://translate.google.com/?q=
|
||||
token=gt
|
||||
|
220
configure
vendored
220
configure
vendored
|
@ -1,153 +1,83 @@
|
|||
#! /bin/sh
|
||||
|
||||
# waf configure wrapper
|
||||
|
||||
# Fancy colors used to beautify the output a bit.
|
||||
#
|
||||
if [ "$NOCOLOR" ] ; then
|
||||
NORMAL=""
|
||||
BOLD=""
|
||||
RED=""
|
||||
YELLOW=""
|
||||
GREEN=""
|
||||
else
|
||||
NORMAL="\033[0m"
|
||||
BOLD="\033[1m"
|
||||
RED="\033[91m"
|
||||
YELLOW="\033[01;93m"
|
||||
GREEN="\033[92m"
|
||||
# Copyright (C) 2013 Christian Dywan <christian@twotoasts.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.
|
||||
#
|
||||
#~ Usage:
|
||||
#~ ./configure [OPTIONS]
|
||||
#~ Options:
|
||||
#~ --prefix=PREFIX Installation prefix
|
||||
#~ --enable-gtk3 Use GTK+3
|
||||
#~ --disable-zeitgeist Disable Zeitgeist history integration
|
||||
#~ --enable-granite Fancy notebook and pop-overs
|
||||
#~ --enable-apidocs API documentation
|
||||
#~
|
||||
#~ Environment:
|
||||
#~ VALAC if defined the valac executable to use, for example valac-0.16
|
||||
#
|
||||
|
||||
if [ -z `command -v cmake` ]; then
|
||||
echo Fatal: cmake not installed
|
||||
exit 1
|
||||
fi
|
||||
|
||||
EXIT_SUCCESS=0
|
||||
EXIT_FAILURE=1
|
||||
EXIT_ERROR=2
|
||||
EXIT_BUG=10
|
||||
while [ $# != 0 ]; do
|
||||
case $1 in
|
||||
--enable-gtk3)
|
||||
ARGS="$ARGS -DUSE_GTK3=1";;
|
||||
--disable-zeitgeist)
|
||||
ARGS="$ARGS -DUSE_ZEITGEIST=0";;
|
||||
--enable-granite)
|
||||
ARGS="$ARGS -DUSE_GRANITE=1";;
|
||||
--enable-apidocs)
|
||||
ARGS="$ARGS -DUSE_APIDOCS=1";;
|
||||
--extra-warnings)
|
||||
ARGS="$ARGS -DEXTRA_WARNINGS=1";;
|
||||
--prefix=*)
|
||||
ARGS="$ARGS -DCMAKE_INSTALL_PREFIX=${1#*=}";;
|
||||
*)
|
||||
grep -e '^#~' $0 | sed s/#~//
|
||||
exit
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
CUR_DIR=$PWD
|
||||
BUILD_DIR="_build"
|
||||
|
||||
#possible relative path
|
||||
WORKINGDIR=`dirname $0`
|
||||
cd $WORKINGDIR
|
||||
#abs path
|
||||
WORKINGDIR=`pwd`
|
||||
cd $CUR_DIR
|
||||
|
||||
# Checks for Python interpreter. Honours $PYTHON if set. Stores path to
|
||||
# interpreter in $PYTHON.
|
||||
#
|
||||
checkPython()
|
||||
{
|
||||
if [ -z "$PYTHON" ] ; then
|
||||
PYTHON=`which python 2>/dev/null`
|
||||
fi
|
||||
printf "Checking for Python\t\t\t: "
|
||||
if [ ! -x "$PYTHON" ] ; then
|
||||
printf $RED"not found!"$NORMAL"\n"
|
||||
echo "Please make sure that the Python interpreter is available in your PATH"
|
||||
echo "or invoke configure using the PYTHON flag, e.g."
|
||||
echo "$ PYTHON=/usr/local/bin/python configure"
|
||||
exit $EXIT_FAILURE
|
||||
fi
|
||||
printf $GREEN"$PYTHON"$NORMAL"\n"
|
||||
}
|
||||
|
||||
# Checks for WAF. Honours $WAF if set. Stores path to 'waf' in $WAF.
|
||||
# Requires that $PYTHON is set.
|
||||
#
|
||||
checkWAF()
|
||||
{
|
||||
printf "Checking for WAF\t\t\t: "
|
||||
#installed miniwaf in sourcedir
|
||||
if [ -z "$WAF" ] ; then
|
||||
if [ -f "${WORKINGDIR}/waf" ] ; then
|
||||
WAF="${WORKINGDIR}/waf"
|
||||
if [ ! -x "$WAF" ] ; then
|
||||
chmod +x $WAF
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [ -z "$WAF" ] ; then
|
||||
if [ -f "${WORKINGDIR}/waf-light" ] ; then
|
||||
${WORKINGDIR}/waf-light --make-waf
|
||||
WAF="${WORKINGDIR}/waf"
|
||||
fi
|
||||
fi
|
||||
#global installed waf with waf->waf.py link
|
||||
if [ -z "$WAF" ] ; then
|
||||
WAF=`which waf 2>/dev/null`
|
||||
fi
|
||||
# neither waf nor miniwaf could be found
|
||||
if [ ! -x "$WAF" ] ; then
|
||||
printf $RED"not found"$NORMAL"\n"
|
||||
echo "Go to http://code.google.com/p/waf/"
|
||||
echo "and download a waf version"
|
||||
exit $EXIT_FAILURE
|
||||
else
|
||||
printf $GREEN"$WAF"$NORMAL"\n"
|
||||
fi
|
||||
}
|
||||
|
||||
# Generates a Makefile. Requires that $WAF is set.
|
||||
#
|
||||
generateMakefile()
|
||||
{
|
||||
cat > Makefile << EOF
|
||||
#!/usr/bin/make -f
|
||||
# Waf Makefile wrapper
|
||||
WAF_HOME=$CUR_DIR
|
||||
|
||||
all:
|
||||
@$WAF build
|
||||
|
||||
all-debug:
|
||||
@$WAF -v build
|
||||
|
||||
all-progress:
|
||||
@$WAF -p build
|
||||
|
||||
install:
|
||||
@if test -n "\$(DESTDIR)"; then \\
|
||||
$WAF install --destdir="\$(DESTDIR)"; \\
|
||||
else \\
|
||||
$WAF install; \\
|
||||
fi;
|
||||
|
||||
.PHONY: install
|
||||
|
||||
uninstall:
|
||||
@if test -n "\$(DESTDIR)"; then \\
|
||||
$WAF uninstall --destdir="\$(DESTDIR)"; \\
|
||||
else \\
|
||||
$WAF uninstall; \\
|
||||
fi;
|
||||
|
||||
clean:
|
||||
@$WAF clean
|
||||
|
||||
distclean:
|
||||
@$WAF distclean
|
||||
@-rm -rf _build_
|
||||
@-rm -f Makefile
|
||||
|
||||
check:
|
||||
@$WAF check
|
||||
|
||||
dist:
|
||||
@$WAF dist
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
checkPython
|
||||
checkWAF
|
||||
|
||||
echo "calling waf configure with parameters"
|
||||
$WAF configure $* || exit $EXIT_ERROR
|
||||
|
||||
if [ -f "Makefile" ] ; then
|
||||
echo ""
|
||||
else
|
||||
generateMakefile
|
||||
if [ ! -f GNUmakefile ]; then
|
||||
cp -v GNUmakefile.in GNUmakefile || exit 1
|
||||
fi
|
||||
|
||||
exit $EXIT_SUCCESS
|
||||
# cmake was invoked in toplevel folder before
|
||||
# clean up cmake generated build files to prevent conflicts
|
||||
if [ -f CMakeCache.txt ]; then
|
||||
echo
|
||||
echo '####################################################################################'
|
||||
echo 'CMake build files detected in toplevel folder !!'
|
||||
echo 'Please always run "cmake" command from distinct folder when you use cmake yourself.'
|
||||
echo '####################################################################################'
|
||||
echo
|
||||
echo 'Cleaning up...'
|
||||
echo
|
||||
|
||||
rm -fr $BUILD_DIR
|
||||
rm CMakeCache.txt config.h Makefile
|
||||
find . -iname CMakeFiles -type d|xargs rm -fr
|
||||
find . -iname cmake_install.cmake -exec rm {} \;
|
||||
find . -iname CTestTestfile.cmake -exec rm {} \;
|
||||
|
||||
find . -iname *-folders -type d|xargs rm -fr
|
||||
rm -fr data/logo-shade
|
||||
fi
|
||||
|
||||
mkdir -p $BUILD_DIR && cd $BUILD_DIR || exit 1
|
||||
cmake $ARGS .. || exit 1
|
||||
|
||||
echo
|
||||
echo "Configuring done, run \"make\" to compile"
|
||||
|
|
58
data/CMakeLists.txt
Normal file
58
data/CMakeLists.txt
Normal file
|
@ -0,0 +1,58 @@
|
|||
# Copyright (C) 2013 Christian Dywan <christian@twotoasts.de>
|
||||
|
||||
include(FindConvert)
|
||||
if (NOT CONVERT_FOUND)
|
||||
message(FATAL_ERROR "rsvg-convert not found")
|
||||
endif ()
|
||||
|
||||
include(FindIntltool)
|
||||
if (NOT INTLTOOL_MERGE_FOUND)
|
||||
message(FATAL_ERROR "intltool-merge not found")
|
||||
elseif (NOT INTLTOOL_UPDATE_FOUND)
|
||||
message(FATAL_ERROR "intltool-update not found")
|
||||
endif ()
|
||||
|
||||
file(GLOB_RECURSE DATA_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *)
|
||||
list(REMOVE_ITEM DATA_FILES "CMakeLists.txt")
|
||||
|
||||
foreach(FILE ${DATA_FILES})
|
||||
if (${FILE} MATCHES "faq.")
|
||||
install(FILES ${FILE} DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
||||
elseif (${FILE} MATCHES ".desktop")
|
||||
if (NOT WIN32)
|
||||
string(REPLACE ".desktop.in" "" DESKTOP_ID ${FILE})
|
||||
INTLTOOL_MERGE_DESKTOP (${DESKTOP_ID} po)
|
||||
endif ()
|
||||
elseif (${FILE} MATCHES ".appdata.xml")
|
||||
if (NOT WIN32)
|
||||
string(REPLACE ".appdata.xml.in" "" DESKTOP_ID ${FILE})
|
||||
INTLTOOL_MERGE_APPDATA (${DESKTOP_ID} po)
|
||||
endif ()
|
||||
elseif (${FILE} MATCHES "\\.svg$")
|
||||
string(REPLACE ".svg" "" IMG_ID ${FILE})
|
||||
string (FIND ${FILE} "/" IS_DIR)
|
||||
if (IS_DIR GREATER -1)
|
||||
string(REPLACE "/" ";" DIR_LIST ${FILE})
|
||||
LIST(GET DIR_LIST 0 S_DIR)
|
||||
SVG2PNG (${IMG_ID} "${CMAKE_INSTALL_DATADIR}/midori/res/${S_DIR}")
|
||||
else ()
|
||||
SVG2PNG (${IMG_ID} "${CMAKE_INSTALL_DATADIR}/midori/res/")
|
||||
endif()
|
||||
# These are being handled in add_executable for the "midori" binary
|
||||
elseif (${FILE} MATCHES "\\.ico$")
|
||||
elseif (${FILE} MATCHES "\\.rc$")
|
||||
# This is only meant for testing, and not used in production
|
||||
elseif (${FILE} MATCHES "\\.swf$")
|
||||
else()
|
||||
string(FIND ${FILE} "/" IS_DIR)
|
||||
if (IS_DIR GREATER -1)
|
||||
string(REPLACE "/" ";" DIR_LIST ${FILE})
|
||||
LIST(GET DIR_LIST 0 S_DIR)
|
||||
LIST(GET DIR_LIST 1 S_FILE)
|
||||
install(FILES ${S_DIR}/${S_FILE} DESTINATION ${CMAKE_INSTALL_DATADIR}/midori/res/${S_DIR})
|
||||
else ()
|
||||
install(FILES ${FILE} DESTINATION ${CMAKE_INSTALL_DATADIR}/midori/res/)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
endforeach()
|
100
data/about.css
Normal file
100
data/about.css
Normal file
|
@ -0,0 +1,100 @@
|
|||
/*
|
||||
about: page style template for Midori.
|
||||
This file is licensed under the terms of the expat license, see the file EXPAT.
|
||||
*/
|
||||
body {
|
||||
background-color: #dedede;
|
||||
color: #222222;
|
||||
font-family: 'Open Sans', 'Droid Sans', Arial, sans-serif;
|
||||
font-size: 14px;
|
||||
font-style: normal;
|
||||
font-variant: normal;
|
||||
font-weight: normal;
|
||||
margin-top: 100px;
|
||||
}
|
||||
|
||||
html[dir="rtl"] #icon {
|
||||
float: right;
|
||||
padding-right: 1%;
|
||||
}
|
||||
|
||||
.indent {
|
||||
margin-left: 5%;
|
||||
}
|
||||
|
||||
#main {
|
||||
max-width: 50%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
min-width: 480px;
|
||||
background-repeat: no-repeat;
|
||||
background-color: #ffffff;
|
||||
border: 1px solid rgba(0, 0, 0, .3);
|
||||
padding: 25px;
|
||||
-webkit-border-radius: 4px;
|
||||
-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.1);
|
||||
background-position-x: 22px;
|
||||
background-position-y: 54px;
|
||||
}
|
||||
|
||||
#text {
|
||||
margin-left: 15%;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-family: 'Open Sans', 'Droid Sans', arial, sans-serif;
|
||||
font-size: 32px;
|
||||
font-style: normal;
|
||||
font-variant: normal;
|
||||
font-weight: 300;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
html[dir="ltr"] #logo {
|
||||
right: 15px;
|
||||
}
|
||||
|
||||
html[dir="rtl"] #logo {
|
||||
left: 15px;
|
||||
}
|
||||
|
||||
button span,
|
||||
button img {
|
||||
vertical-align: middle;
|
||||
padding: 2px 1px;
|
||||
}
|
||||
|
||||
button {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.message {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.description {
|
||||
font-size: 1em;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
#suggestions {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
#button {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#logo {
|
||||
position: absolute; bottom: 15px;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
form {
|
||||
margin-bottom: 0px;
|
||||
}
|
55
data/adblock.list
Normal file
55
data/adblock.list
Normal file
|
@ -0,0 +1,55 @@
|
|||
[Adblock Plus 2.0]
|
||||
! Version: 201402142200
|
||||
! Title: Exercise
|
||||
! Last modified: 11 Feb 2014 22:00 UTC
|
||||
! Expires: 3 days (update frequency)
|
||||
! Homepage: http://www.midori-browser.org
|
||||
! Licence: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt
|
||||
! Copyright (C) 2014 Christian Dywan <christian@twotoasts.de>
|
||||
!
|
||||
! Some freeform text:
|
||||
! Yadayada http://example.com/ e-mail (somebody@example.com).
|
||||
!
|
||||
!-----Spam eggs--------!
|
||||
! *** la:le/lu_foo_bar.txt ***
|
||||
|/http://ads.blub.boing/*$domain=xxx.com
|
||||
|/http://ads.blub.boing/*$domain=xxx.com,foo.fr,coco.at
|
||||
/market.php?$domain=adf.ly|foo.com
|
||||
/?placement=$script,domain=putlocker.com|sockshare.com
|
||||
|
||||
! Some basic filters
|
||||
*ads.foo.bar*
|
||||
*ads.bogus.name*
|
||||
||^http://ads.bla.blub/*
|
||||
engine.adct.ru/*?
|
||||
/addyn|*|adtech;
|
||||
doubleclick.net/pfadx/*.mtvi
|
||||
objects.tremormedia.com/embed/xml/*.xml?r=
|
||||
videostrip.com^*/admatcherclient.
|
||||
test.dom/test?var
|
||||
/adpage.
|
||||
br.gcl.ru/cgi-bin/br/
|
||||
_300x600.
|
||||
_rectangle_ads.
|
||||
+adverts/
|
||||
-2/ads/
|
||||
|
||||
! CSS elements
|
||||
old.tv,delicio.us,longc.at###box
|
||||
##.zRightAdNote
|
||||
###advertisingModule160x600
|
||||
##a[href$="/vghd.shtml"]
|
||||
imagetwist.com###left[align="center"] > center > a[target="_blank"]
|
||||
|
||||
! Options
|
||||
||videobox.com/?tid=$popup
|
||||
||sexsearchcom.com^$popup,third-party
|
||||
||206.217.206.137^$third-party
|
||||
/spopunder^$popup
|
||||
||putlocker.com^*.php?*title$subdocument
|
||||
://ads.$popup
|
||||
|
||||
! Whitelist
|
||||
@@||hortifor.com/images/*120x60$~third-party
|
||||
@@||stickam.com/wb/www/category/300x250/$image
|
||||
@@||adultadworld.com/adhandler/$subdocument
|
35
data/adblock/element_hider.js
Normal file
35
data/adblock/element_hider.js
Normal file
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
Copyright (C) 2014 Alexander V. Butenko <a.butenka@gmail.com>
|
||||
|
||||
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.
|
||||
*/
|
||||
function getElementsByAttribute (strTagName, strAttributeName, arrAttributeValue) {
|
||||
var arrElements = document.getElementsByTagName (strTagName);
|
||||
var arrReturnElements = new Array();
|
||||
for (var j=0; j<arrAttributeValue.length; j++) {
|
||||
var strAttributeValue = arrAttributeValue[j];
|
||||
for (var i=0; i<arrElements.length; i++) {
|
||||
var oCurrent = arrElements[i];
|
||||
var oAttribute = oCurrent.getAttribute && oCurrent.getAttribute (strAttributeName);
|
||||
if (oAttribute && oAttribute.length > 0 && strAttributeValue.indexOf (oAttribute) != -1)
|
||||
arrReturnElements.push (oCurrent);
|
||||
}
|
||||
}
|
||||
return arrReturnElements;
|
||||
};
|
||||
|
||||
function hideElementBySrc (uris) {
|
||||
var oElements = getElementsByAttribute('img', 'src', uris);
|
||||
if (oElements.length == 0)
|
||||
oElements = getElementsByAttribute ('iframe', 'src', uris);
|
||||
for (var i=0; i<oElements.length; i++) {
|
||||
oElements[i].style.visibility = 'hidden !important';
|
||||
oElements[i].style.width = '0';
|
||||
oElements[i].style.height = '0';
|
||||
}
|
||||
};
|
|
@ -1,7 +1,15 @@
|
|||
/**
|
||||
* An autosuggest textbox control.
|
||||
* from Nicholas C. Zakas (Author) example: http://www.nczonline.net/
|
||||
* Adopted for Midori by Alexander V. Butenko <a.butenka@gmail.com>
|
||||
/*
|
||||
An autosuggest textbox control.
|
||||
Copyright (C) 2012 Nicholas C. Zakas (Author) example: http://www.nczonline.net/
|
||||
Adopted for Midori by Alexander V. Butenko <a.butenka@gmail.com>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
Neither the name of the Nicholas C. Zakas nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
function AutoSuggestControl(oTextbox /*:HTMLInputElement*/,
|
||||
|
@ -186,10 +194,10 @@ AutoSuggestControl.prototype.init = function () {
|
|||
};
|
||||
|
||||
//assign onblur event handler (hides suggestions)
|
||||
this.textbox.onblur =
|
||||
this.textbox.onclick = function () {
|
||||
oThis.hideSuggestions();
|
||||
};
|
||||
if (!this.textbox.onblur)
|
||||
this.textbox.onblur = function () { oThis.hideSuggestions(); };
|
||||
if (!this.textbox.onclick)
|
||||
this.textbox.onclick = function () { oThis.hideSuggestions(); };
|
||||
|
||||
//create the suggestions dropdown
|
||||
this.createDropDown();
|
||||
|
@ -295,9 +303,11 @@ FormSuggestions.prototype.requestSuggestions = function (oAutoSuggestControl /*:
|
|||
};
|
||||
|
||||
function initSuggestions () {
|
||||
var inputs = document.getElementsByTagName("input");
|
||||
var inputs = document.getElementsByTagName ("input");
|
||||
if (inputs.length == 0)
|
||||
return false;
|
||||
|
||||
for (i=0;i<inputs.length;i++)
|
||||
for (var i=0;i<inputs.length;i++)
|
||||
{
|
||||
var ename = inputs[i].getAttribute("name");
|
||||
var eid = inputs[i].getAttribute("id");
|
||||
|
@ -308,4 +318,5 @@ function initSuggestions () {
|
|||
if (inputs[i].type == "text" && autocomplete != "off")
|
||||
var smth = new AutoSuggestControl (inputs[i], new FormSuggestions (ename));
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
|
91
data/bookmarks/Create.sql
Normal file
91
data/bookmarks/Create.sql
Normal file
|
@ -0,0 +1,91 @@
|
|||
CREATE TABLE IF NOT EXISTS bookmarks
|
||||
(
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
parentid INTEGER DEFAULT NULL,
|
||||
title TEXT,
|
||||
uri TEXT,
|
||||
desc TEXT,
|
||||
app INTEGER,
|
||||
toolbar INTEGER,
|
||||
pos_panel INTEGER,
|
||||
pos_bar INTEGER,
|
||||
created DATE DEFAULT CURRENT_TIMESTAMP,
|
||||
last_visit DATE,
|
||||
visit_count INTEGER DEFAULT 0,
|
||||
nick TEXT,
|
||||
|
||||
FOREIGN KEY(parentid) REFERENCES bookmarks(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
/* trigger: insert panel position */
|
||||
CREATE TRIGGER IF NOT EXISTS bookmarkInsertPosPanel
|
||||
AFTER INSERT ON bookmarks FOR EACH ROW
|
||||
BEGIN UPDATE bookmarks SET pos_panel = (
|
||||
SELECT ifnull(MAX(pos_panel),0)+1 FROM bookmarks WHERE
|
||||
(NEW.parentid IS NOT NULL AND parentid = NEW.parentid)
|
||||
OR (NEW.parentid IS NULL AND parentid IS NULL))
|
||||
WHERE id = NEW.id; END;
|
||||
|
||||
/* trigger: insert Bookmarkbar position */
|
||||
CREATE TRIGGER IF NOT EXISTS bookmarkInsertPosBar
|
||||
AFTER INSERT ON bookmarks FOR EACH ROW WHEN NEW.toolbar=1
|
||||
BEGIN UPDATE bookmarks SET pos_bar = (
|
||||
SELECT ifnull(MAX(pos_bar),0)+1 FROM bookmarks WHERE
|
||||
((NEW.parentid IS NOT NULL AND parentid = NEW.parentid)
|
||||
OR (NEW.parentid IS NULL AND parentid IS NULL)) AND toolbar=1)
|
||||
WHERE id = NEW.id; END;
|
||||
|
||||
/* trigger: update panel position */
|
||||
CREATE TRIGGER IF NOT EXISTS bookmarkUpdatePosPanel
|
||||
BEFORE UPDATE OF parentid ON bookmarks FOR EACH ROW
|
||||
WHEN ((NEW.parentid IS NULL OR OLD.parentid IS NULL)
|
||||
AND NEW.parentid IS NOT OLD.parentid) OR
|
||||
((NEW.parentid IS NOT NULL AND OLD.parentid IS NOT NULL)
|
||||
AND NEW.parentid!=OLD.parentid)
|
||||
BEGIN UPDATE bookmarks SET pos_panel = pos_panel-1
|
||||
WHERE ((OLD.parentid IS NOT NULL AND parentid = OLD.parentid)
|
||||
OR (OLD.parentid IS NULL AND parentid IS NULL)) AND pos_panel > OLD.pos_panel;
|
||||
UPDATE bookmarks SET pos_panel = (
|
||||
SELECT ifnull(MAX(pos_panel),0)+1 FROM bookmarks
|
||||
WHERE (NEW.parentid IS NOT NULL AND parentid = NEW.parentid)
|
||||
OR (NEW.parentid IS NULL AND parentid IS NULL))
|
||||
WHERE id = OLD.id; END;
|
||||
|
||||
/* trigger: update Bookmarkbar position */
|
||||
CREATE TRIGGER IF NOT EXISTS bookmarkUpdatePosBar0
|
||||
AFTER UPDATE OF parentid, toolbar ON bookmarks FOR EACH ROW
|
||||
WHEN ((NEW.parentid IS NULL OR OLD.parentid IS NULL)
|
||||
AND NEW.parentid IS NOT OLD.parentid)
|
||||
OR ((NEW.parentid IS NOT NULL AND OLD.parentid IS NOT NULL)
|
||||
AND NEW.parentid!=OLD.parentid) OR (OLD.toolbar=1 AND NEW.toolbar=0)
|
||||
BEGIN UPDATE bookmarks SET pos_bar = NULL WHERE id = NEW.id;
|
||||
UPDATE bookmarks SET pos_bar = pos_bar-1
|
||||
WHERE ((OLD.parentid IS NOT NULL AND parentid = OLD.parentid)
|
||||
OR (OLD.parentid IS NULL AND parentid IS NULL)) AND pos_bar > OLD.pos_bar; END;
|
||||
|
||||
/* trigger: update Bookmarkbar position */
|
||||
CREATE TRIGGER IF NOT EXISTS bookmarkUpdatePosBar1
|
||||
BEFORE UPDATE OF parentid, toolbar ON bookmarks FOR EACH ROW
|
||||
WHEN ((NEW.parentid IS NULL OR OLD.parentid IS NULL)
|
||||
AND NEW.parentid IS NOT OLD.parentid) OR
|
||||
((NEW.parentid IS NOT NULL AND OLD.parentid IS NOT NULL)
|
||||
AND NEW.parentid!=OLD.parentid) OR (OLD.toolbar=0 AND NEW.toolbar=1)
|
||||
BEGIN UPDATE bookmarks SET pos_bar = (
|
||||
SELECT ifnull(MAX(pos_bar),0)+1 FROM bookmarks WHERE
|
||||
(NEW.parentid IS NOT NULL AND parentid = NEW.parentid)
|
||||
OR (NEW.parentid IS NULL AND parentid IS NULL))
|
||||
WHERE id = OLD.id; END;
|
||||
|
||||
/* trigger: delete panel position */
|
||||
CREATE TRIGGER IF NOT EXISTS bookmarkDeletePosPanel
|
||||
AFTER DELETE ON bookmarks FOR EACH ROW
|
||||
BEGIN UPDATE bookmarks SET pos_panel = pos_panel-1
|
||||
WHERE ((OLD.parentid IS NOT NULL AND parentid = OLD.parentid)
|
||||
OR (OLD.parentid IS NULL AND parentid IS NULL)) AND pos_panel > OLD.pos_panel; END;
|
||||
|
||||
/* trigger: delete Bookmarkbar position */
|
||||
CREATE TRIGGER IF NOT EXISTS bookmarkDeletePosBar
|
||||
AFTER DELETE ON bookmarks FOR EACH ROW WHEN OLD.toolbar=1
|
||||
BEGIN UPDATE bookmarks SET pos_bar = pos_bar-1
|
||||
WHERE ((OLD.parentid IS NOT NULL AND parentid = OLD.parentid)
|
||||
OR (OLD.parentid IS NULL AND parentid IS NULL)) AND pos_bar > OLD.pos_bar; END;
|
6
data/bookmarks/Import_old_db_bookmarks.sql
Normal file
6
data/bookmarks/Import_old_db_bookmarks.sql
Normal file
|
@ -0,0 +1,6 @@
|
|||
INSERT INTO main.bookmarks (parentid, title, uri, desc, app, toolbar)
|
||||
SELECT NULL AS parentid, title, uri, desc, app, toolbar
|
||||
FROM old_db.bookmarks;
|
||||
UPDATE main.bookmarks SET parentid = (
|
||||
SELECT id FROM main.bookmarks AS b1 WHERE b1.title = (
|
||||
SELECT folder FROM old_db.bookmarks WHERE title = main.bookmarks.title));
|
|
@ -1,3 +0,0 @@
|
|||
[D-BUS Service]
|
||||
Name=com.nokia.midori
|
||||
Exec=/usr/bin/midori
|
|
@ -2,78 +2,29 @@
|
|||
Error page template for Midori.
|
||||
This file is licensed under the terms of the expat license, see the file EXPAT.
|
||||
-->
|
||||
|
||||
<html>
|
||||
<html dir="{dir}">
|
||||
<head>
|
||||
<title>{title}</title>
|
||||
<style type="text/css">
|
||||
body {
|
||||
background-color: #eee;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#container {
|
||||
background: #f6fff3;
|
||||
min-width: 70%;
|
||||
max-width: 70%;
|
||||
margin: 2em auto 1em;
|
||||
padding: 1em;
|
||||
border: 0.2em solid #9acb7f;
|
||||
-webkit-border-radius: 1em;
|
||||
}
|
||||
|
||||
icon {
|
||||
float: left;
|
||||
padding-left: 1%;
|
||||
padding-top: 1%;
|
||||
}
|
||||
|
||||
#main {
|
||||
float: right;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 1.4em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#logo {
|
||||
position: absolute; right: 15px; bottom: 15px;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
button span,
|
||||
button img {
|
||||
vertical-align: middle;
|
||||
padding: 2px 1px;
|
||||
}
|
||||
|
||||
message {
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
description {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
</style>
|
||||
{favicon}
|
||||
<link rel="stylesheet" type="text/css" href="res://about.css" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="container">
|
||||
<img id="logo" src="{res}/logo-shade.png" />
|
||||
<img id="icon" src="{stock}/gtk-dialog-error" />
|
||||
<div id="main">
|
||||
<h1>{title}</h1>
|
||||
<p id="message">{message}</p>
|
||||
<p id="description">{description}</p>
|
||||
<button onclick="location.reload()">
|
||||
<img src="{stock}/gtk-refresh"/>
|
||||
<span>{tryagain}</span>
|
||||
</button>
|
||||
<img id="logo" src="res://logo-shade.png" />
|
||||
<div id="main" style="background-image: url({error_icon});">
|
||||
<div id="text">
|
||||
<h1>{title}</h1>
|
||||
<p class="message">{message}<br><i>{description}</i></p>
|
||||
{suggestions}
|
||||
</div>
|
||||
<form method="GET" action="{uri}" id="button">
|
||||
<button type="submit" onclick="location.reload(); return false;" {autofocus}>
|
||||
<img style="{hide-button-images}" src="stock://gtk-refresh"/>
|
||||
<span>{tryagain}</span>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
<br style="clear: both;"/>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<br style="clear: both;"/>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
[settings]
|
||||
filters=http://adblockplus.mozdev.org/easylist/easylist.txt
|
|
@ -8,29 +8,64 @@ Stylesheet for Midori's documentation based on a version of Enrico Troeger.
|
|||
|
||||
@media screen {
|
||||
|
||||
body {
|
||||
background-color: #f6fff3;
|
||||
color: #404040;
|
||||
margin-left: 0.4em;
|
||||
width: 60em;
|
||||
font-size: 90%;
|
||||
html, body {
|
||||
width: 100% !important;
|
||||
height: 100% !important;
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #013100;
|
||||
* {
|
||||
background: #f6fff3 !important;
|
||||
color: #404040 !important;
|
||||
font-size: 14pt !important;
|
||||
font-family: serif !important;
|
||||
text-align: justify !important;
|
||||
line-height: 1.4em !important;
|
||||
word-spacing: 0.4mm !important;
|
||||
letter-spacing: 0.2mm !important;
|
||||
-webkit-column-count: auto !important;
|
||||
-webkit-column-width: auto !important;
|
||||
-webkit-box-shadow: none !important;
|
||||
width: auto !important;
|
||||
word-wrap: break-word !important;
|
||||
}
|
||||
|
||||
a:visited {
|
||||
color: #7E558E;
|
||||
div, p {
|
||||
padding: 5pt !important;
|
||||
}
|
||||
|
||||
li {
|
||||
padding-left: 5pt !important;
|
||||
}
|
||||
|
||||
img, *[accesskey], form *, form, iframe,
|
||||
*[id^=navigation], *[id$=navigation], *[id*=navigation], .collapsed, .expanded {
|
||||
display: none !important
|
||||
}
|
||||
|
||||
/* FIXME: we want "images bigger than 50px here" */
|
||||
img[width] {
|
||||
display: inline !important
|
||||
}
|
||||
|
||||
:link, :link * {
|
||||
color: #013100 !important;
|
||||
text-decoration: underline !important;
|
||||
}
|
||||
|
||||
:visited, :visited * {
|
||||
color: #7E558E !important;
|
||||
text-decoration: underline !important;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: none;
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
font-family: sans-serif;
|
||||
color: #002a00;
|
||||
font-family: serif !important;
|
||||
color: #002a00 !important;
|
||||
}
|
||||
|
||||
h1 {
|
1256
data/faq.html
Normal file
1256
data/faq.html
Normal file
File diff suppressed because it is too large
Load diff
6
data/flummi/Create.sql
Normal file
6
data/flummi/Create.sql
Normal file
|
@ -0,0 +1,6 @@
|
|||
CREATE TABLE IF NOT EXISTS tasks
|
||||
(
|
||||
id INTEGER PRIMARY KEY,
|
||||
once INTEGER DEFAULT 1,
|
||||
command TEXT DEFAULT NULL
|
||||
);
|
6
data/forms/Create.sql
Normal file
6
data/forms/Create.sql
Normal file
|
@ -0,0 +1,6 @@
|
|||
CREATE TABLE IF NOT EXISTS forms
|
||||
(
|
||||
domain text,
|
||||
field text,
|
||||
value text
|
||||
)
|
29
data/gtk3.css
Normal file
29
data/gtk3.css
Normal file
|
@ -0,0 +1,29 @@
|
|||
.notebook tab .button {
|
||||
-GtkButton-default-border: 0;
|
||||
-GtkButton-default-outside-border: 0;
|
||||
-GtkButton-inner-border: 0;
|
||||
-GtkWidget-focus-line-width: 0;
|
||||
-GtkWidget-focus-padding: 0;
|
||||
padding: 0;
|
||||
border-width: 1px 1px 0 0;
|
||||
}
|
||||
|
||||
GtkOverlay > * {
|
||||
padding: 4px;
|
||||
border-style: solid;
|
||||
border-radius: 0 5px 0 0;
|
||||
border-width: 1px 1px 0 0;
|
||||
}
|
||||
|
||||
GtkOverlay MidoriFindbar {
|
||||
border-radius: 0 0 0 5px;
|
||||
border-width: 0 0 1px 1px; /* top right bottom left */
|
||||
}
|
||||
|
||||
/* Kill grey backround on inactive buttons */
|
||||
GtkDrawingArea,
|
||||
GtkImage,
|
||||
GtkImage:insensitive,
|
||||
GtkImage:selected {
|
||||
background-color: @transparent;
|
||||
}
|
13
data/history/Create.sql
Normal file
13
data/history/Create.sql
Normal file
|
@ -0,0 +1,13 @@
|
|||
CREATE TABLE IF NOT EXISTS history
|
||||
(
|
||||
uri text,
|
||||
title text,
|
||||
date integer,
|
||||
day integer
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS search
|
||||
(
|
||||
keywords text,
|
||||
uri text,
|
||||
day integer
|
||||
);
|
14
data/history/Day.sql
Normal file
14
data/history/Day.sql
Normal file
|
@ -0,0 +1,14 @@
|
|||
CREATE TEMPORARY TABLE backup
|
||||
(
|
||||
uri text,
|
||||
title text,
|
||||
date integer
|
||||
);
|
||||
INSERT INTO backup SELECT uri, title, date FROM history;
|
||||
DROP TABLE history;
|
||||
CREATE TABLE history (uri text, title text, date integer, day integer);
|
||||
INSERT INTO history SELECT uri, title, date,
|
||||
julianday(date(date,'unixepoch','start of day','+1 day'))
|
||||
- julianday('0001-01-01','start of day')
|
||||
FROM backup;
|
||||
DROP TABLE backup;
|
15
data/midori-private.desktop.in
Normal file
15
data/midori-private.desktop.in
Normal file
|
@ -0,0 +1,15 @@
|
|||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Type=Application
|
||||
_Name=Midori Private Browsing
|
||||
_GenericName=Private Browsing
|
||||
_Comment=Open a new private browsing window
|
||||
Categories=GTK;Network;WebBrowser;
|
||||
Exec=midori --private %U
|
||||
Icon=midori
|
||||
Terminal=false
|
||||
StartupNotify=true
|
||||
NotShowIn=Pantheon;
|
||||
X-Osso-Type=application/x-executable
|
||||
X-Osso-Service=midori
|
||||
|
28
data/midori.appdata.xml.in
Normal file
28
data/midori.appdata.xml.in
Normal file
|
@ -0,0 +1,28 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Copyright 2013 Christian Dywan -->
|
||||
<application>
|
||||
<id type="desktop">midori.desktop</id>
|
||||
<licence>CC0</licence>
|
||||
<description>
|
||||
<p>
|
||||
Midori is a fast little WebKit browser with support for HTML5. It can manage
|
||||
many open tabs and windows. The URL bar completes history, bookmarks, search
|
||||
engines and open tabs out of the box. Web developers can use the powerful
|
||||
web inspector that is a part of WebKit. Individual pages can easily be turned
|
||||
into web apps and new profiles can be created on demand.
|
||||
</p>
|
||||
<p>A number of extensions are included by default:</p>
|
||||
<ul>
|
||||
<li>Adblock with support for ABP filter lists and custom rules is built-in</li>
|
||||
<li>You can download files with Aria2 or SteadyFlow</li>
|
||||
<li>User scripts and styles support a la Greasemonkey</li>
|
||||
<li>Managing cookies and scripts via NoJS and Cookie Security Manager</li>
|
||||
<li>Switching open tabs in a vertical panel or a popup window</li>
|
||||
</ul>
|
||||
</description>
|
||||
<url type="homepage">http://www.midori-browser.org/</url>
|
||||
<screenshots>
|
||||
<screenshot type="default">http://www.midori-browser.org/images/screenshots/rdio.png</screenshot>
|
||||
</screenshots>
|
||||
<updatecontact>christian@twotoasts.de</updatecontact>
|
||||
</application>
|
|
@ -3,12 +3,30 @@ Version=1.0
|
|||
Type=Application
|
||||
_Name=Midori
|
||||
_GenericName=Web Browser
|
||||
_Comment=Lightweight web browser
|
||||
_X-GNOME-Fullname=Midori Web Browser
|
||||
_Comment=Browse the Web
|
||||
_X-GNOME-Keywords=Internet;WWW;Explorer
|
||||
_X-AppInstall-Keywords=Internet;WWW;Explorer
|
||||
Categories=GTK;Network;WebBrowser;
|
||||
MimeType=text/html;text/xml;application/xhtml+xml;application/xml;
|
||||
Exec=midori %u
|
||||
MimeType=text/html;application/xhtml+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/geo;image/svg+xml;
|
||||
Exec=midori %U
|
||||
Icon=midori
|
||||
Terminal=false
|
||||
StartupNotify=true
|
||||
X-GNOME-UsesNotifications=true
|
||||
X-Osso-Type=application/x-executable
|
||||
X-Osso-Service=midori
|
||||
Actions=TabNew;WindowNew;Private;
|
||||
|
||||
[Desktop Action TabNew]
|
||||
_Name=New Tab
|
||||
Exec=midori -e TabNew
|
||||
|
||||
[Desktop Action WindowNew]
|
||||
_Name=New Window
|
||||
Exec=midori -e WindowNew
|
||||
|
||||
[Desktop Action Private]
|
||||
_Name=New Private Browsing Window
|
||||
Exec=midori --private
|
||||
|
||||
|
|
BIN
data/midori.ico
Normal file
BIN
data/midori.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 36 KiB |
|
@ -1,2 +1,2 @@
|
|||
|
||||
IDR_MAINFRAME ICON DISCARDABLE "../_build_/default/data/midori.ico"
|
||||
IDR_MAINFRAME ICON DISCARDABLE "midori.ico"
|
||||
|
|
BIN
data/midori.swf
Normal file
BIN
data/midori.swf
Normal file
Binary file not shown.
313
data/mootools.js
313
data/mootools.js
|
@ -1,313 +0,0 @@
|
|||
//MooTools, <http://mootools.net>, My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2009 Valerio Proietti, <http://mad4milk.net>, MIT Style License.
|
||||
|
||||
var MooTools={version:"1.2.2",build:"f0491d62fbb7e906789aa3733d6a67d43e5af7c9"};var Native=function(k){k=k||{};var a=k.name;var i=k.legacy;var b=k.protect;
|
||||
var c=k.implement;var h=k.generics;var f=k.initialize;var g=k.afterImplement||function(){};var d=f||i;h=h!==false;d.constructor=Native;d.$family={name:"native"};
|
||||
if(i&&f){d.prototype=i.prototype;}d.prototype.constructor=d;if(a){var e=a.toLowerCase();d.prototype.$family={name:e};Native.typize(d,e);}var j=function(n,l,o,m){if(!b||m||!n.prototype[l]){n.prototype[l]=o;
|
||||
}if(h){Native.genericize(n,l,b);}g.call(n,l,o);return n;};d.alias=function(n,l,o){if(typeof n=="string"){if((n=this.prototype[n])){return j(this,l,n,o);
|
||||
}}for(var m in n){this.alias(m,n[m],l);}return this;};d.implement=function(m,l,o){if(typeof m=="string"){return j(this,m,l,o);}for(var n in m){j(this,n,m[n],l);
|
||||
}return this;};if(c){d.implement(c);}return d;};Native.genericize=function(b,c,a){if((!a||!b[c])&&typeof b.prototype[c]=="function"){b[c]=function(){var d=Array.prototype.slice.call(arguments);
|
||||
return b.prototype[c].apply(d.shift(),d);};}};Native.implement=function(d,c){for(var b=0,a=d.length;b<a;b++){d[b].implement(c);}};Native.typize=function(a,b){if(!a.type){a.type=function(c){return($type(c)===b);
|
||||
};}};(function(){var a={Array:Array,Date:Date,Function:Function,Number:Number,RegExp:RegExp,String:String};for(var h in a){new Native({name:h,initialize:a[h],protect:true});
|
||||
}var d={"boolean":Boolean,"native":Native,object:Object};for(var c in d){Native.typize(d[c],c);}var f={Array:["concat","indexOf","join","lastIndexOf","pop","push","reverse","shift","slice","sort","splice","toString","unshift","valueOf"],String:["charAt","charCodeAt","concat","indexOf","lastIndexOf","match","replace","search","slice","split","substr","substring","toLowerCase","toUpperCase","valueOf"]};
|
||||
for(var e in f){for(var b=f[e].length;b--;){Native.genericize(window[e],f[e][b],true);}}})();var Hash=new Native({name:"Hash",initialize:function(a){if($type(a)=="hash"){a=$unlink(a.getClean());
|
||||
}for(var b in a){this[b]=a[b];}return this;}});Hash.implement({forEach:function(b,c){for(var a in this){if(this.hasOwnProperty(a)){b.call(c,this[a],a,this);
|
||||
}}},getClean:function(){var b={};for(var a in this){if(this.hasOwnProperty(a)){b[a]=this[a];}}return b;},getLength:function(){var b=0;for(var a in this){if(this.hasOwnProperty(a)){b++;
|
||||
}}return b;}});Hash.alias("forEach","each");Array.implement({forEach:function(c,d){for(var b=0,a=this.length;b<a;b++){c.call(d,this[b],b,this);}}});Array.alias("forEach","each");
|
||||
function $A(b){if(b.item){var a=b.length,c=new Array(a);while(a--){c[a]=b[a];}return c;}return Array.prototype.slice.call(b);}function $arguments(a){return function(){return arguments[a];
|
||||
};}function $chk(a){return !!(a||a===0);}function $clear(a){clearTimeout(a);clearInterval(a);return null;}function $defined(a){return(a!=undefined);}function $each(c,b,d){var a=$type(c);
|
||||
((a=="arguments"||a=="collection"||a=="array")?Array:Hash).each(c,b,d);}function $empty(){}function $extend(c,a){for(var b in (a||{})){c[b]=a[b];}return c;
|
||||
}function $H(a){return new Hash(a);}function $lambda(a){return(typeof a=="function")?a:function(){return a;};}function $merge(){var a=Array.slice(arguments);
|
||||
a.unshift({});return $mixin.apply(null,a);}function $mixin(e){for(var d=1,a=arguments.length;d<a;d++){var b=arguments[d];if($type(b)!="object"){continue;
|
||||
}for(var c in b){var g=b[c],f=e[c];e[c]=(f&&$type(g)=="object"&&$type(f)=="object")?$mixin(f,g):$unlink(g);}}return e;}function $pick(){for(var b=0,a=arguments.length;
|
||||
b<a;b++){if(arguments[b]!=undefined){return arguments[b];}}return null;}function $random(b,a){return Math.floor(Math.random()*(a-b+1)+b);}function $splat(b){var a=$type(b);
|
||||
return(a)?((a!="array"&&a!="arguments")?[b]:b):[];}var $time=Date.now||function(){return +new Date;};function $try(){for(var b=0,a=arguments.length;b<a;
|
||||
b++){try{return arguments[b]();}catch(c){}}return null;}function $type(a){if(a==undefined){return false;}if(a.$family){return(a.$family.name=="number"&&!isFinite(a))?false:a.$family.name;
|
||||
}if(a.nodeName){switch(a.nodeType){case 1:return"element";case 3:return(/\S/).test(a.nodeValue)?"textnode":"whitespace";}}else{if(typeof a.length=="number"){if(a.callee){return"arguments";
|
||||
}else{if(a.item){return"collection";}}}}return typeof a;}function $unlink(c){var b;switch($type(c)){case"object":b={};for(var e in c){b[e]=$unlink(c[e]);
|
||||
}break;case"hash":b=new Hash(c);break;case"array":b=[];for(var d=0,a=c.length;d<a;d++){b[d]=$unlink(c[d]);}break;default:return c;}return b;}var Browser=$merge({Engine:{name:"unknown",version:0},Platform:{name:(window.orientation!=undefined)?"ipod":(navigator.platform.match(/mac|win|linux/i)||["other"])[0].toLowerCase()},Features:{xpath:!!(document.evaluate),air:!!(window.runtime),query:!!(document.querySelector)},Plugins:{},Engines:{presto:function(){return(!window.opera)?false:((arguments.callee.caller)?960:((document.getElementsByClassName)?950:925));
|
||||
},trident:function(){return(!window.ActiveXObject)?false:((window.XMLHttpRequest)?5:4);},webkit:function(){return(navigator.taintEnabled)?false:((Browser.Features.xpath)?((Browser.Features.query)?525:420):419);
|
||||
},gecko:function(){return(document.getBoxObjectFor==undefined)?false:((document.getElementsByClassName)?19:18);}}},Browser||{});Browser.Platform[Browser.Platform.name]=true;
|
||||
Browser.detect=function(){for(var b in this.Engines){var a=this.Engines[b]();if(a){this.Engine={name:b,version:a};this.Engine[b]=this.Engine[b+a]=true;
|
||||
break;}}return{name:b,version:a};};Browser.detect();Browser.Request=function(){return $try(function(){return new XMLHttpRequest();},function(){return new ActiveXObject("MSXML2.XMLHTTP");
|
||||
});};Browser.Features.xhr=!!(Browser.Request());Browser.Plugins.Flash=(function(){var a=($try(function(){return navigator.plugins["Shockwave Flash"].description;
|
||||
},function(){return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version");})||"0 r0").match(/\d+/g);return{version:parseInt(a[0]||0+"."+a[1],10)||0,build:parseInt(a[2],10)||0};
|
||||
})();function $exec(b){if(!b){return b;}if(window.execScript){window.execScript(b);}else{var a=document.createElement("script");a.setAttribute("type","text/javascript");
|
||||
a[(Browser.Engine.webkit&&Browser.Engine.version<420)?"innerText":"text"]=b;document.head.appendChild(a);document.head.removeChild(a);}return b;}Native.UID=1;
|
||||
var $uid=(Browser.Engine.trident)?function(a){return(a.uid||(a.uid=[Native.UID++]))[0];}:function(a){return a.uid||(a.uid=Native.UID++);};var Window=new Native({name:"Window",legacy:(Browser.Engine.trident)?null:window.Window,initialize:function(a){$uid(a);
|
||||
if(!a.Element){a.Element=$empty;if(Browser.Engine.webkit){a.document.createElement("iframe");}a.Element.prototype=(Browser.Engine.webkit)?window["[[DOMElement.prototype]]"]:{};
|
||||
}a.document.window=a;return $extend(a,Window.Prototype);},afterImplement:function(b,a){window[b]=Window.Prototype[b]=a;}});Window.Prototype={$family:{name:"window"}};
|
||||
new Window(window);var Document=new Native({name:"Document",legacy:(Browser.Engine.trident)?null:window.Document,initialize:function(a){$uid(a);a.head=a.getElementsByTagName("head")[0];
|
||||
a.html=a.getElementsByTagName("html")[0];if(Browser.Engine.trident&&Browser.Engine.version<=4){$try(function(){a.execCommand("BackgroundImageCache",false,true);
|
||||
});}if(Browser.Engine.trident){a.window.attachEvent("onunload",function(){a.window.detachEvent("onunload",arguments.callee);a.head=a.html=a.window=null;
|
||||
});}return $extend(a,Document.Prototype);},afterImplement:function(b,a){document[b]=Document.Prototype[b]=a;}});Document.Prototype={$family:{name:"document"}};
|
||||
new Document(document);Array.implement({every:function(c,d){for(var b=0,a=this.length;b<a;b++){if(!c.call(d,this[b],b,this)){return false;}}return true;
|
||||
},filter:function(d,e){var c=[];for(var b=0,a=this.length;b<a;b++){if(d.call(e,this[b],b,this)){c.push(this[b]);}}return c;},clean:function(){return this.filter($defined);
|
||||
},indexOf:function(c,d){var a=this.length;for(var b=(d<0)?Math.max(0,a+d):d||0;b<a;b++){if(this[b]===c){return b;}}return -1;},map:function(d,e){var c=[];
|
||||
for(var b=0,a=this.length;b<a;b++){c[b]=d.call(e,this[b],b,this);}return c;},some:function(c,d){for(var b=0,a=this.length;b<a;b++){if(c.call(d,this[b],b,this)){return true;
|
||||
}}return false;},associate:function(c){var d={},b=Math.min(this.length,c.length);for(var a=0;a<b;a++){d[c[a]]=this[a];}return d;},link:function(c){var a={};
|
||||
for(var e=0,b=this.length;e<b;e++){for(var d in c){if(c[d](this[e])){a[d]=this[e];delete c[d];break;}}}return a;},contains:function(a,b){return this.indexOf(a,b)!=-1;
|
||||
},extend:function(c){for(var b=0,a=c.length;b<a;b++){this.push(c[b]);}return this;},getLast:function(){return(this.length)?this[this.length-1]:null;},getRandom:function(){return(this.length)?this[$random(0,this.length-1)]:null;
|
||||
},include:function(a){if(!this.contains(a)){this.push(a);}return this;},combine:function(c){for(var b=0,a=c.length;b<a;b++){this.include(c[b]);}return this;
|
||||
},erase:function(b){for(var a=this.length;a--;a){if(this[a]===b){this.splice(a,1);}}return this;},empty:function(){this.length=0;return this;},flatten:function(){var d=[];
|
||||
for(var b=0,a=this.length;b<a;b++){var c=$type(this[b]);if(!c){continue;}d=d.concat((c=="array"||c=="collection"||c=="arguments")?Array.flatten(this[b]):this[b]);
|
||||
}return d;},hexToRgb:function(b){if(this.length!=3){return null;}var a=this.map(function(c){if(c.length==1){c+=c;}return c.toInt(16);});return(b)?a:"rgb("+a+")";
|
||||
},rgbToHex:function(d){if(this.length<3){return null;}if(this.length==4&&this[3]==0&&!d){return"transparent";}var b=[];for(var a=0;a<3;a++){var c=(this[a]-0).toString(16);
|
||||
b.push((c.length==1)?"0"+c:c);}return(d)?b:"#"+b.join("");}});Function.implement({extend:function(a){for(var b in a){this[b]=a[b];}return this;},create:function(b){var a=this;
|
||||
b=b||{};return function(d){var c=b.arguments;c=(c!=undefined)?$splat(c):Array.slice(arguments,(b.event)?1:0);if(b.event){c=[d||window.event].extend(c);
|
||||
}var e=function(){return a.apply(b.bind||null,c);};if(b.delay){return setTimeout(e,b.delay);}if(b.periodical){return setInterval(e,b.periodical);}if(b.attempt){return $try(e);
|
||||
}return e();};},run:function(a,b){return this.apply(b,$splat(a));},pass:function(a,b){return this.create({bind:b,arguments:a});},bind:function(b,a){return this.create({bind:b,arguments:a});
|
||||
},bindWithEvent:function(b,a){return this.create({bind:b,arguments:a,event:true});},attempt:function(a,b){return this.create({bind:b,arguments:a,attempt:true})();
|
||||
},delay:function(b,c,a){return this.create({bind:c,arguments:a,delay:b})();},periodical:function(c,b,a){return this.create({bind:b,arguments:a,periodical:c})();
|
||||
}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this));},round:function(a){a=Math.pow(10,a||0);return Math.round(this*a)/a;},times:function(b,c){for(var a=0;
|
||||
a<this;a++){b.call(c,a,this);}},toFloat:function(){return parseFloat(this);},toInt:function(a){return parseInt(this,a||10);}});Number.alias("times","each");
|
||||
(function(b){var a={};b.each(function(c){if(!Number[c]){a[c]=function(){return Math[c].apply(null,[this].concat($A(arguments)));};}});Number.implement(a);
|
||||
})(["abs","acos","asin","atan","atan2","ceil","cos","exp","floor","log","max","min","pow","sin","sqrt","tan"]);String.implement({test:function(a,b){return((typeof a=="string")?new RegExp(a,b):a).test(this);
|
||||
},contains:function(a,b){return(b)?(b+this+b).indexOf(b+a+b)>-1:this.indexOf(a)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,"");},clean:function(){return this.replace(/\s+/g," ").trim();
|
||||
},camelCase:function(){return this.replace(/-\D/g,function(a){return a.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());
|
||||
});},capitalize:function(){return this.replace(/\b[a-z]/g,function(a){return a.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");
|
||||
},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this);},hexToRgb:function(b){var a=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
|
||||
return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=this.match(/\d{1,3}/g);return(a)?a.rgbToHex(b):null;},stripScripts:function(b){var a="";
|
||||
var c=this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(){a+=arguments[1]+"\n";return"";});if(b===true){$exec(a);}else{if($type(b)=="function"){b(a,c);
|
||||
}}return c;},substitute:function(a,b){return this.replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1);}return(a[c]!=undefined)?a[c]:"";
|
||||
});}});Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(b){for(var a in this){if(this.hasOwnProperty(a)&&this[a]===b){return a;}}return null;
|
||||
},hasValue:function(a){return(Hash.keyOf(this,a)!==null);},extend:function(a){Hash.each(a,function(c,b){Hash.set(this,b,c);},this);return this;},combine:function(a){Hash.each(a,function(c,b){Hash.include(this,b,c);
|
||||
},this);return this;},erase:function(a){if(this.hasOwnProperty(a)){delete this[a];}return this;},get:function(a){return(this.hasOwnProperty(a))?this[a]:null;
|
||||
},set:function(a,b){if(!this[a]||this.hasOwnProperty(a)){this[a]=b;}return this;},empty:function(){Hash.each(this,function(b,a){delete this[a];},this);
|
||||
return this;},include:function(a,b){if(this[a]==undefined){this[a]=b;}return this;},map:function(b,c){var a=new Hash;Hash.each(this,function(e,d){a.set(d,b.call(c,e,d,this));
|
||||
},this);return a;},filter:function(b,c){var a=new Hash;Hash.each(this,function(e,d){if(b.call(c,e,d,this)){a.set(d,e);}},this);return a;},every:function(b,c){for(var a in this){if(this.hasOwnProperty(a)&&!b.call(c,this[a],a)){return false;
|
||||
}}return true;},some:function(b,c){for(var a in this){if(this.hasOwnProperty(a)&&b.call(c,this[a],a)){return true;}}return false;},getKeys:function(){var a=[];
|
||||
Hash.each(this,function(c,b){a.push(b);});return a;},getValues:function(){var a=[];Hash.each(this,function(b){a.push(b);});return a;},toQueryString:function(a){var b=[];
|
||||
Hash.each(this,function(f,e){if(a){e=a+"["+e+"]";}var d;switch($type(f)){case"object":d=Hash.toQueryString(f,e);break;case"array":var c={};f.each(function(h,g){c[g]=h;
|
||||
});d=Hash.toQueryString(c,e);break;default:d=e+"="+encodeURIComponent(f);}if(f!=undefined){b.push(d);}});return b.join("&");}});Hash.alias({keyOf:"indexOf",hasValue:"contains"});
|
||||
var Event=new Native({name:"Event",initialize:function(a,f){f=f||window;var k=f.document;a=a||f.event;if(a.$extended){return a;}this.$extended=true;var j=a.type;
|
||||
var g=a.target||a.srcElement;while(g&&g.nodeType==3){g=g.parentNode;}if(j.test(/key/)){var b=a.which||a.keyCode;var m=Event.Keys.keyOf(b);if(j=="keydown"){var d=b-111;
|
||||
if(d>0&&d<13){m="f"+d;}}m=m||String.fromCharCode(b).toLowerCase();}else{if(j.match(/(click|mouse|menu)/i)){k=(!k.compatMode||k.compatMode=="CSS1Compat")?k.html:k.body;
|
||||
var i={x:a.pageX||a.clientX+k.scrollLeft,y:a.pageY||a.clientY+k.scrollTop};var c={x:(a.pageX)?a.pageX-f.pageXOffset:a.clientX,y:(a.pageY)?a.pageY-f.pageYOffset:a.clientY};
|
||||
if(j.match(/DOMMouseScroll|mousewheel/)){var h=(a.wheelDelta)?a.wheelDelta/120:-(a.detail||0)/3;}var e=(a.which==3)||(a.button==2);var l=null;if(j.match(/over|out/)){switch(j){case"mouseover":l=a.relatedTarget||a.fromElement;
|
||||
break;case"mouseout":l=a.relatedTarget||a.toElement;}if(!(function(){while(l&&l.nodeType==3){l=l.parentNode;}return true;}).create({attempt:Browser.Engine.gecko})()){l=false;
|
||||
}}}}return $extend(this,{event:a,type:j,page:i,client:c,rightClick:e,wheel:h,relatedTarget:l,target:g,code:b,key:m,shift:a.shiftKey,control:a.ctrlKey,alt:a.altKey,meta:a.metaKey});
|
||||
}});Event.Keys=new Hash({enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46});Event.implement({stop:function(){return this.stopPropagation().preventDefault();
|
||||
},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault();
|
||||
}else{this.event.returnValue=false;}return this;}});function Class(b){if(b instanceof Function){b={initialize:b};}var a=function(){Object.reset(this);if(a._prototyping){return this;
|
||||
}this._current=$empty;var c=(this.initialize)?this.initialize.apply(this,arguments):this;delete this._current;delete this.caller;return c;}.extend(this);
|
||||
a.implement(b);a.constructor=Class;a.prototype.constructor=a;return a;}Function.prototype.protect=function(){this._protected=true;return this;};Object.reset=function(a,c){if(c==null){for(var e in a){Object.reset(a,e);
|
||||
}return a;}delete a[c];switch($type(a[c])){case"object":var d=function(){};d.prototype=a[c];var b=new d;a[c]=Object.reset(b);break;case"array":a[c]=$unlink(a[c]);
|
||||
break;}return a;};new Native({name:"Class",initialize:Class}).extend({instantiate:function(b){b._prototyping=true;var a=new b;delete b._prototyping;return a;
|
||||
},wrap:function(a,b,c){if(c._origin){c=c._origin;}return function(){if(c._protected&&this._current==null){throw new Error('The method "'+b+'" cannot be called.');
|
||||
}var e=this.caller,f=this._current;this.caller=f;this._current=arguments.callee;var d=c.apply(this,arguments);this._current=f;this.caller=e;return d;}.extend({_owner:a,_origin:c,_name:b});
|
||||
}});Class.implement({implement:function(a,d){if($type(a)=="object"){for(var e in a){this.implement(e,a[e]);}return this;}var f=Class.Mutators[a];if(f){d=f.call(this,d);
|
||||
if(d==null){return this;}}var c=this.prototype;switch($type(d)){case"function":if(d._hidden){return this;}c[a]=Class.wrap(this,a,d);break;case"object":var b=c[a];
|
||||
if($type(b)=="object"){$mixin(b,d);}else{c[a]=$unlink(d);}break;case"array":c[a]=$unlink(d);break;default:c[a]=d;}return this;}});Class.Mutators={Extends:function(a){this.parent=a;
|
||||
this.prototype=Class.instantiate(a);this.implement("parent",function(){var b=this.caller._name,c=this.caller._owner.parent.prototype[b];if(!c){throw new Error('The method "'+b+'" has no parent.');
|
||||
}return c.apply(this,arguments);}.protect());},Implements:function(a){$splat(a).each(function(b){if(b instanceof Function){b=Class.instantiate(b);}this.implement(b);
|
||||
},this);}};var Chain=new Class({$chain:[],chain:function(){this.$chain.extend(Array.flatten(arguments));return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;
|
||||
},clearChain:function(){this.$chain.empty();return this;}});var Events=new Class({$events:{},addEvent:function(c,b,a){c=Events.removeOn(c);if(b!=$empty){this.$events[c]=this.$events[c]||[];
|
||||
this.$events[c].include(b);if(a){b.internal=true;}}return this;},addEvents:function(a){for(var b in a){this.addEvent(b,a[b]);}return this;},fireEvent:function(c,b,a){c=Events.removeOn(c);
|
||||
if(!this.$events||!this.$events[c]){return this;}this.$events[c].each(function(d){d.create({bind:this,delay:a,"arguments":b})();},this);return this;},removeEvent:function(b,a){b=Events.removeOn(b);
|
||||
if(!this.$events[b]){return this;}if(!a.internal){this.$events[b].erase(a);}return this;},removeEvents:function(c){var d;if($type(c)=="object"){for(d in c){this.removeEvent(d,c[d]);
|
||||
}return this;}if(c){c=Events.removeOn(c);}for(d in this.$events){if(c&&c!=d){continue;}var b=this.$events[d];for(var a=b.length;a--;a){this.removeEvent(d,b[a]);
|
||||
}}return this;}});Events.removeOn=function(a){return a.replace(/^on([A-Z])/,function(b,c){return c.toLowerCase();});};var Options=new Class({setOptions:function(){this.options=$merge.run([this.options].extend(arguments));
|
||||
if(!this.addEvent){return this;}for(var a in this.options){if($type(this.options[a])!="function"||!(/^on[A-Z]/).test(a)){continue;}this.addEvent(a,this.options[a]);
|
||||
delete this.options[a];}return this;}});var Element=new Native({name:"Element",legacy:window.Element,initialize:function(a,b){var c=Element.Constructors.get(a);
|
||||
if(c){return c(b);}if(typeof a=="string"){return document.newElement(a,b);}return $(a).set(b);},afterImplement:function(a,b){Element.Prototype[a]=b;if(Array[a]){return;
|
||||
}Elements.implement(a,function(){var c=[],g=true;for(var e=0,d=this.length;e<d;e++){var f=this[e][a].apply(this[e],arguments);c.push(f);if(g){g=($type(f)=="element");
|
||||
}}return(g)?new Elements(c):c;});}});Element.Prototype={$family:{name:"element"}};Element.Constructors=new Hash;var IFrame=new Native({name:"IFrame",generics:false,initialize:function(){var e=Array.link(arguments,{properties:Object.type,iframe:$defined});
|
||||
var c=e.properties||{};var b=$(e.iframe)||false;var d=c.onload||$empty;delete c.onload;c.id=c.name=$pick(c.id,c.name,b.id,b.name,"IFrame_"+$time());b=new Element(b||"iframe",c);
|
||||
var a=function(){var f=$try(function(){return b.contentWindow.location.host;});if(f&&f==window.location.host){var g=new Window(b.contentWindow);new Document(b.contentWindow.document);
|
||||
$extend(g.Element.prototype,Element.Prototype);}d.call(b.contentWindow,b.contentWindow.document);};(window.frames[c.id])?a():b.addListener("load",a);return b;
|
||||
}});var Elements=new Native({initialize:function(f,b){b=$extend({ddup:true,cash:true},b);f=f||[];if(b.ddup||b.cash){var g={},e=[];for(var c=0,a=f.length;
|
||||
c<a;c++){var d=$.element(f[c],!b.cash);if(b.ddup){if(g[d.uid]){continue;}g[d.uid]=true;}e.push(d);}f=e;}return(b.cash)?$extend(f,this):f;}});Elements.implement({filter:function(a,b){if(!a){return this;
|
||||
}return new Elements(Array.filter(this,(typeof a=="string")?function(c){return c.match(a);}:a,b));}});Document.implement({newElement:function(a,b){if(Browser.Engine.trident&&b){["name","type","checked"].each(function(c){if(!b[c]){return;
|
||||
}a+=" "+c+'="'+b[c]+'"';if(c!="checked"){delete b[c];}});a="<"+a+">";}return $.element(this.createElement(a)).set(b);},newTextNode:function(a){return this.createTextNode(a);
|
||||
},getDocument:function(){return this;},getWindow:function(){return this.window;}});Window.implement({$:function(b,c){if(b&&b.$family&&b.uid){return b;}var a=$type(b);
|
||||
return($[a])?$[a](b,c,this.document):null;},$$:function(a){if(arguments.length==1&&typeof a=="string"){return this.document.getElements(a);}var f=[];var c=Array.flatten(arguments);
|
||||
for(var d=0,b=c.length;d<b;d++){var e=c[d];switch($type(e)){case"element":f.push(e);break;case"string":f.extend(this.document.getElements(e,true));}}return new Elements(f);
|
||||
},getDocument:function(){return this.document;},getWindow:function(){return this;}});$.string=function(c,b,a){c=a.getElementById(c);return(c)?$.element(c,b):null;
|
||||
};$.element=function(a,d){$uid(a);if(!d&&!a.$family&&!(/^object|embed$/i).test(a.tagName)){var b=Element.Prototype;for(var c in b){a[c]=b[c];}}return a;
|
||||
};$.object=function(b,c,a){if(b.toElement){return $.element(b.toElement(a),c);}return null;};$.textnode=$.whitespace=$.window=$.document=$arguments(0);
|
||||
Native.implement([Element,Document],{getElement:function(a,b){return $(this.getElements(a,true)[0]||null,b);},getElements:function(a,d){a=a.split(",");
|
||||
var c=[];var b=(a.length>1);a.each(function(e){var f=this.getElementsByTagName(e.trim());(b)?c.extend(f):c=f;},this);return new Elements(c,{ddup:b,cash:!d});
|
||||
}});(function(){var h={},f={};var i={input:"checked",option:"selected",textarea:(Browser.Engine.webkit&&Browser.Engine.version<420)?"innerHTML":"value"};
|
||||
var c=function(l){return(f[l]||(f[l]={}));};var g=function(n,l){if(!n){return;}var m=n.uid;if(Browser.Engine.trident){if(n.clearAttributes){var q=l&&n.cloneNode(false);
|
||||
n.clearAttributes();if(q){n.mergeAttributes(q);}}else{if(n.removeEvents){n.removeEvents();}}if((/object/i).test(n.tagName)){for(var o in n){if(typeof n[o]=="function"){n[o]=$empty;
|
||||
}}Element.dispose(n);}}if(!m){return;}h[m]=f[m]=null;};var d=function(){Hash.each(h,g);if(Browser.Engine.trident){$A(document.getElementsByTagName("object")).each(g);
|
||||
}if(window.CollectGarbage){CollectGarbage();}h=f=null;};var j=function(n,l,s,m,p,r){var o=n[s||l];var q=[];while(o){if(o.nodeType==1&&(!m||Element.match(o,m))){if(!p){return $(o,r);
|
||||
}q.push(o);}o=o[l];}return(p)?new Elements(q,{ddup:false,cash:!r}):null;};var e={html:"innerHTML","class":"className","for":"htmlFor",text:(Browser.Engine.trident||(Browser.Engine.webkit&&Browser.Engine.version<420))?"innerText":"textContent"};
|
||||
var b=["compact","nowrap","ismap","declare","noshade","checked","disabled","readonly","multiple","selected","noresize","defer"];var k=["value","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","maxLength","readOnly","rowSpan","tabIndex","useMap"];
|
||||
b=b.associate(b);Hash.extend(e,b);Hash.extend(e,k.associate(k.map(String.toLowerCase)));var a={before:function(m,l){if(l.parentNode){l.parentNode.insertBefore(m,l);
|
||||
}},after:function(m,l){if(!l.parentNode){return;}var n=l.nextSibling;(n)?l.parentNode.insertBefore(m,n):l.parentNode.appendChild(m);},bottom:function(m,l){l.appendChild(m);
|
||||
},top:function(m,l){var n=l.firstChild;(n)?l.insertBefore(m,n):l.appendChild(m);}};a.inside=a.bottom;Hash.each(a,function(l,m){m=m.capitalize();Element.implement("inject"+m,function(n){l(this,$(n,true));
|
||||
return this;});Element.implement("grab"+m,function(n){l($(n,true),this);return this;});});Element.implement({set:function(o,m){switch($type(o)){case"object":for(var n in o){this.set(n,o[n]);
|
||||
}break;case"string":var l=Element.Properties.get(o);(l&&l.set)?l.set.apply(this,Array.slice(arguments,1)):this.setProperty(o,m);}return this;},get:function(m){var l=Element.Properties.get(m);
|
||||
return(l&&l.get)?l.get.apply(this,Array.slice(arguments,1)):this.getProperty(m);},erase:function(m){var l=Element.Properties.get(m);(l&&l.erase)?l.erase.apply(this):this.removeProperty(m);
|
||||
return this;},setProperty:function(m,n){var l=e[m];if(n==undefined){return this.removeProperty(m);}if(l&&b[m]){n=!!n;}(l)?this[l]=n:this.setAttribute(m,""+n);
|
||||
return this;},setProperties:function(l){for(var m in l){this.setProperty(m,l[m]);}return this;},getProperty:function(m){var l=e[m];var n=(l)?this[l]:this.getAttribute(m,2);
|
||||
return(b[m])?!!n:(l)?n:n||null;},getProperties:function(){var l=$A(arguments);return l.map(this.getProperty,this).associate(l);},removeProperty:function(m){var l=e[m];
|
||||
(l)?this[l]=(l&&b[m])?false:"":this.removeAttribute(m);return this;},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;
|
||||
},hasClass:function(l){return this.className.contains(l," ");},addClass:function(l){if(!this.hasClass(l)){this.className=(this.className+" "+l).clean();
|
||||
}return this;},removeClass:function(l){this.className=this.className.replace(new RegExp("(^|\\s)"+l+"(?:\\s|$)"),"$1");return this;},toggleClass:function(l){return this.hasClass(l)?this.removeClass(l):this.addClass(l);
|
||||
},adopt:function(){Array.flatten(arguments).each(function(l){l=$(l,true);if(l){this.appendChild(l);}},this);return this;},appendText:function(m,l){return this.grab(this.getDocument().newTextNode(m),l);
|
||||
},grab:function(m,l){a[l||"bottom"]($(m,true),this);return this;},inject:function(m,l){a[l||"bottom"](this,$(m,true));return this;},replaces:function(l){l=$(l,true);
|
||||
l.parentNode.replaceChild(this,l);return this;},wraps:function(m,l){m=$(m,true);return this.replaces(m).grab(m,l);},getPrevious:function(l,m){return j(this,"previousSibling",null,l,false,m);
|
||||
},getAllPrevious:function(l,m){return j(this,"previousSibling",null,l,true,m);},getNext:function(l,m){return j(this,"nextSibling",null,l,false,m);},getAllNext:function(l,m){return j(this,"nextSibling",null,l,true,m);
|
||||
},getFirst:function(l,m){return j(this,"nextSibling","firstChild",l,false,m);},getLast:function(l,m){return j(this,"previousSibling","lastChild",l,false,m);
|
||||
},getParent:function(l,m){return j(this,"parentNode",null,l,false,m);},getParents:function(l,m){return j(this,"parentNode",null,l,true,m);},getSiblings:function(l,m){return this.getParent().getChildren(l,m).erase(this);
|
||||
},getChildren:function(l,m){return j(this,"nextSibling","firstChild",l,true,m);},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;
|
||||
},getElementById:function(o,n){var m=this.ownerDocument.getElementById(o);if(!m){return null;}for(var l=m.parentNode;l!=this;l=l.parentNode){if(!l){return null;
|
||||
}}return $.element(m,n);},getSelected:function(){return new Elements($A(this.options).filter(function(l){return l.selected;}));},getComputedStyle:function(m){if(this.currentStyle){return this.currentStyle[m.camelCase()];
|
||||
}var l=this.getDocument().defaultView.getComputedStyle(this,null);return(l)?l.getPropertyValue([m.hyphenate()]):null;},toQueryString:function(){var l=[];
|
||||
this.getElements("input, select, textarea",true).each(function(m){if(!m.name||m.disabled){return;}var n=(m.tagName.toLowerCase()=="select")?Element.getSelected(m).map(function(o){return o.value;
|
||||
}):((m.type=="radio"||m.type=="checkbox")&&!m.checked)?null:m.value;$splat(n).each(function(o){if(typeof o!="undefined"){l.push(m.name+"="+encodeURIComponent(o));
|
||||
}});});return l.join("&");},clone:function(o,l){o=o!==false;var r=this.cloneNode(o);var n=function(v,u){if(!l){v.removeAttribute("id");}if(Browser.Engine.trident){v.clearAttributes();
|
||||
v.mergeAttributes(u);v.removeAttribute("uid");if(v.options){var w=v.options,s=u.options;for(var t=w.length;t--;){w[t].selected=s[t].selected;}}}var x=i[u.tagName.toLowerCase()];
|
||||
if(x&&u[x]){v[x]=u[x];}};if(o){var p=r.getElementsByTagName("*"),q=this.getElementsByTagName("*");for(var m=p.length;m--;){n(p[m],q[m]);}}n(r,this);return $(r);
|
||||
},destroy:function(){Element.empty(this);Element.dispose(this);g(this,true);return null;},empty:function(){$A(this.childNodes).each(function(l){Element.destroy(l);
|
||||
});return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this;},hasChild:function(l){l=$(l,true);if(!l){return false;
|
||||
}if(Browser.Engine.webkit&&Browser.Engine.version<420){return $A(this.getElementsByTagName(l.tagName)).contains(l);}return(this.contains)?(this!=l&&this.contains(l)):!!(this.compareDocumentPosition(l)&16);
|
||||
},match:function(l){return(!l||(l==this)||(Element.get(this,"tag")==l));}});Native.implement([Element,Window,Document],{addListener:function(o,n){if(o=="unload"){var l=n,m=this;
|
||||
n=function(){m.removeListener("unload",n);l();};}else{h[this.uid]=this;}if(this.addEventListener){this.addEventListener(o,n,false);}else{this.attachEvent("on"+o,n);
|
||||
}return this;},removeListener:function(m,l){if(this.removeEventListener){this.removeEventListener(m,l,false);}else{this.detachEvent("on"+m,l);}return this;
|
||||
},retrieve:function(m,l){var o=c(this.uid),n=o[m];if(l!=undefined&&n==undefined){n=o[m]=l;}return $pick(n);},store:function(m,l){var n=c(this.uid);n[m]=l;
|
||||
return this;},eliminate:function(l){var m=c(this.uid);delete m[l];return this;}});window.addListener("unload",d);})();Element.Properties=new Hash;Element.Properties.style={set:function(a){this.style.cssText=a;
|
||||
},get:function(){return this.style.cssText;},erase:function(){this.style.cssText="";}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase();
|
||||
}};Element.Properties.html=(function(){var c=document.createElement("div");var a={table:[1,"<table>","</table>"],select:[1,"<select>","</select>"],tbody:[2,"<table><tbody>","</tbody></table>"],tr:[3,"<table><tbody><tr>","</tr></tbody></table>"]};
|
||||
a.thead=a.tfoot=a.tbody;var b={set:function(){var e=Array.flatten(arguments).join("");var f=Browser.Engine.trident&&a[this.get("tag")];if(f){var g=c;g.innerHTML=f[1]+e+f[2];
|
||||
for(var d=f[0];d--;){g=g.firstChild;}this.empty().adopt(g.childNodes);}else{this.innerHTML=e;}}};b.erase=b.set;return b;})();if(Browser.Engine.webkit&&Browser.Engine.version<420){Element.Properties.text={get:function(){if(this.innerText){return this.innerText;
|
||||
}var a=this.ownerDocument.newElement("div",{html:this.innerHTML}).inject(this.ownerDocument.body);var b=a.innerText;a.destroy();return b;}};}Element.Properties.events={set:function(a){this.addEvents(a);
|
||||
}};Native.implement([Element,Window,Document],{addEvent:function(e,g){var h=this.retrieve("events",{});h[e]=h[e]||{keys:[],values:[]};if(h[e].keys.contains(g)){return this;
|
||||
}h[e].keys.push(g);var f=e,a=Element.Events.get(e),c=g,i=this;if(a){if(a.onAdd){a.onAdd.call(this,g);}if(a.condition){c=function(j){if(a.condition.call(this,j)){return g.call(this,j);
|
||||
}return true;};}f=a.base||f;}var d=function(){return g.call(i);};var b=Element.NativeEvents[f];if(b){if(b==2){d=function(j){j=new Event(j,i.getWindow());
|
||||
if(c.call(i,j)===false){j.stop();}};}this.addListener(f,d);}h[e].values.push(d);return this;},removeEvent:function(c,b){var a=this.retrieve("events");if(!a||!a[c]){return this;
|
||||
}var f=a[c].keys.indexOf(b);if(f==-1){return this;}a[c].keys.splice(f,1);var e=a[c].values.splice(f,1)[0];var d=Element.Events.get(c);if(d){if(d.onRemove){d.onRemove.call(this,b);
|
||||
}c=d.base||c;}return(Element.NativeEvents[c])?this.removeListener(c,e):this;},addEvents:function(a){for(var b in a){this.addEvent(b,a[b]);}return this;
|
||||
},removeEvents:function(a){var c;if($type(a)=="object"){for(c in a){this.removeEvent(c,a[c]);}return this;}var b=this.retrieve("events");if(!b){return this;
|
||||
}if(!a){for(c in b){this.removeEvents(c);}this.eliminate("events");}else{if(b[a]){while(b[a].keys[0]){this.removeEvent(a,b[a].keys[0]);}b[a]=null;}}return this;
|
||||
},fireEvent:function(d,b,a){var c=this.retrieve("events");if(!c||!c[d]){return this;}c[d].keys.each(function(e){e.create({bind:this,delay:a,"arguments":b})();
|
||||
},this);return this;},cloneEvents:function(d,a){d=$(d);var c=d.retrieve("events");if(!c){return this;}if(!a){for(var b in c){this.cloneEvents(d,b);}}else{if(c[a]){c[a].keys.each(function(e){this.addEvent(a,e);
|
||||
},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,load:1,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1};
|
||||
(function(){var a=function(b){var c=b.relatedTarget;if(c==undefined){return true;}if(c===false){return false;}return($type(this)!="document"&&c!=this&&c.prefix!="xul"&&!this.hasChild(c));
|
||||
};Element.Events=new Hash({mouseenter:{base:"mouseover",condition:a},mouseleave:{base:"mouseout",condition:a},mousewheel:{base:(Browser.Engine.gecko)?"DOMMouseScroll":"mousewheel"}});
|
||||
})();Element.Properties.styles={set:function(a){this.setStyles(a);}};Element.Properties.opacity={set:function(a,b){if(!b){if(a==0){if(this.style.visibility!="hidden"){this.style.visibility="hidden";
|
||||
}}else{if(this.style.visibility!="visible"){this.style.visibility="visible";}}}if(!this.currentStyle||!this.currentStyle.hasLayout){this.style.zoom=1;}if(Browser.Engine.trident){this.style.filter=(a==1)?"":"alpha(opacity="+a*100+")";
|
||||
}this.style.opacity=a;this.store("opacity",a);},get:function(){return this.retrieve("opacity",1);}};Element.implement({setOpacity:function(a){return this.set("opacity",a,true);
|
||||
},getOpacity:function(){return this.get("opacity");},setStyle:function(b,a){switch(b){case"opacity":return this.set("opacity",parseFloat(a));case"float":b=(Browser.Engine.trident)?"styleFloat":"cssFloat";
|
||||
}b=b.camelCase();if($type(a)!="string"){var c=(Element.Styles.get(b)||"@").split(" ");a=$splat(a).map(function(e,d){if(!c[d]){return"";}return($type(e)=="number")?c[d].replace("@",Math.round(e)):e;
|
||||
}).join(" ");}else{if(a==String(Number(a))){a=Math.round(a);}}this.style[b]=a;return this;},getStyle:function(g){switch(g){case"opacity":return this.get("opacity");
|
||||
case"float":g=(Browser.Engine.trident)?"styleFloat":"cssFloat";}g=g.camelCase();var a=this.style[g];if(!$chk(a)){a=[];for(var f in Element.ShortStyles){if(g!=f){continue;
|
||||
}for(var e in Element.ShortStyles[f]){a.push(this.getStyle(e));}return a.join(" ");}a=this.getComputedStyle(g);}if(a){a=String(a);var c=a.match(/rgba?\([\d\s,]+\)/);
|
||||
if(c){a=a.replace(c[0],c[0].rgbToHex());}}if(Browser.Engine.presto||(Browser.Engine.trident&&!$chk(parseInt(a,10)))){if(g.test(/^(height|width)$/)){var b=(g=="width")?["left","right"]:["top","bottom"],d=0;
|
||||
b.each(function(h){d+=this.getStyle("border-"+h+"-width").toInt()+this.getStyle("padding-"+h).toInt();},this);return this["offset"+g.capitalize()]-d+"px";
|
||||
}if((Browser.Engine.presto)&&String(a).test("px")){return a;}if(g.test(/(border(.+)Width|margin|padding)/)){return"0px";}}return a;},setStyles:function(b){for(var a in b){this.setStyle(a,b[a]);
|
||||
}return this;},getStyles:function(){var a={};Array.each(arguments,function(b){a[b]=this.getStyle(b);},this);return a;}});Element.Styles=new Hash({left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"});
|
||||
Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(g){var f=Element.ShortStyles;
|
||||
var b=Element.Styles;["margin","padding"].each(function(h){var i=h+g;f[h][i]=b[i]="@px";});var e="border"+g;f.border[e]=b[e]="@px @ rgb(@, @, @)";var d=e+"Width",a=e+"Style",c=e+"Color";
|
||||
f[e]={};f.borderWidth[d]=f[e][d]=b[d]="@px";f.borderStyle[a]=f[e][a]=b[a]="@";f.borderColor[c]=f[e][c]=b[c]="rgb(@, @, @)";});Native.implement([Document,Element],{getElements:function(h,g){h=h.split(",");
|
||||
var c,e={};for(var d=0,b=h.length;d<b;d++){var a=h[d],f=Selectors.Utils.search(this,a,e);if(d!=0&&f.item){f=$A(f);}c=(d==0)?f:(c.item)?$A(c).concat(f):c.concat(f);
|
||||
}return new Elements(c,{ddup:(h.length>1),cash:!g});}});Element.implement({match:function(b){if(!b||(b==this)){return true;}var d=Selectors.Utils.parseTagAndID(b);
|
||||
var a=d[0],e=d[1];if(!Selectors.Filters.byID(this,e)||!Selectors.Filters.byTag(this,a)){return false;}var c=Selectors.Utils.parseSelector(b);return(c)?Selectors.Utils.filter(this,c,{}):true;
|
||||
}});var Selectors={Cache:{nth:{},parsed:{}}};Selectors.RegExps={id:(/#([\w-]+)/),tag:(/^(\w+|\*)/),quick:(/^(\w+|\*)$/),splitter:(/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),combined:(/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)};
|
||||
Selectors.Utils={chk:function(b,c){if(!c){return true;}var a=$uid(b);if(!c[a]){return c[a]=true;}return false;},parseNthArgument:function(h){if(Selectors.Cache.nth[h]){return Selectors.Cache.nth[h];
|
||||
}var e=h.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);if(!e){return false;}var g=parseInt(e[1],10);var d=(g||g===0)?g:1;var f=e[2]||false;var c=parseInt(e[3],10)||0;
|
||||
if(d!=0){c--;while(c<1){c+=d;}while(c>=d){c-=d;}}else{d=c;f="index";}switch(f){case"n":e={a:d,b:c,special:"n"};break;case"odd":e={a:2,b:0,special:"n"};
|
||||
break;case"even":e={a:2,b:1,special:"n"};break;case"first":e={a:0,special:"index"};break;case"last":e={special:"last-child"};break;case"only":e={special:"only-child"};
|
||||
break;default:e={a:(d-1),special:"index"};}return Selectors.Cache.nth[h]=e;},parseSelector:function(e){if(Selectors.Cache.parsed[e]){return Selectors.Cache.parsed[e];
|
||||
}var d,h={classes:[],pseudos:[],attributes:[]};while((d=Selectors.RegExps.combined.exec(e))){var i=d[1],g=d[2],f=d[3],b=d[5],c=d[6],j=d[7];if(i){h.classes.push(i);
|
||||
}else{if(c){var a=Selectors.Pseudo.get(c);if(a){h.pseudos.push({parser:a,argument:j});}else{h.attributes.push({name:c,operator:"=",value:j});}}else{if(g){h.attributes.push({name:g,operator:f,value:b});
|
||||
}}}}if(!h.classes.length){delete h.classes;}if(!h.attributes.length){delete h.attributes;}if(!h.pseudos.length){delete h.pseudos;}if(!h.classes&&!h.attributes&&!h.pseudos){h=null;
|
||||
}return Selectors.Cache.parsed[e]=h;},parseTagAndID:function(b){var a=b.match(Selectors.RegExps.tag);var c=b.match(Selectors.RegExps.id);return[(a)?a[1]:"*",(c)?c[1]:false];
|
||||
},filter:function(f,c,e){var d;if(c.classes){for(d=c.classes.length;d--;d){var g=c.classes[d];if(!Selectors.Filters.byClass(f,g)){return false;}}}if(c.attributes){for(d=c.attributes.length;
|
||||
d--;d){var b=c.attributes[d];if(!Selectors.Filters.byAttribute(f,b.name,b.operator,b.value)){return false;}}}if(c.pseudos){for(d=c.pseudos.length;d--;d){var a=c.pseudos[d];
|
||||
if(!Selectors.Filters.byPseudo(f,a.parser,a.argument,e)){return false;}}}return true;},getByTagAndID:function(b,a,d){if(d){var c=(b.getElementById)?b.getElementById(d,true):Element.getElementById(b,d,true);
|
||||
return(c&&Selectors.Filters.byTag(c,a))?[c]:[];}else{return b.getElementsByTagName(a);}},search:function(o,h,t){var b=[];var c=h.trim().replace(Selectors.RegExps.splitter,function(k,j,i){b.push(j);
|
||||
return":)"+i;}).split(":)");var p,e,A;for(var z=0,v=c.length;z<v;z++){var y=c[z];if(z==0&&Selectors.RegExps.quick.test(y)){p=o.getElementsByTagName(y);
|
||||
continue;}var a=b[z-1];var q=Selectors.Utils.parseTagAndID(y);var B=q[0],r=q[1];if(z==0){p=Selectors.Utils.getByTagAndID(o,B,r);}else{var d={},g=[];for(var x=0,w=p.length;
|
||||
x<w;x++){g=Selectors.Getters[a](g,p[x],B,r,d);}p=g;}var f=Selectors.Utils.parseSelector(y);if(f){e=[];for(var u=0,s=p.length;u<s;u++){A=p[u];if(Selectors.Utils.filter(A,f,t)){e.push(A);
|
||||
}}p=e;}}return p;}};Selectors.Getters={" ":function(h,g,j,a,e){var d=Selectors.Utils.getByTagAndID(g,j,a);for(var c=0,b=d.length;c<b;c++){var f=d[c];if(Selectors.Utils.chk(f,e)){h.push(f);
|
||||
}}return h;},">":function(h,g,j,a,f){var c=Selectors.Utils.getByTagAndID(g,j,a);for(var e=0,d=c.length;e<d;e++){var b=c[e];if(b.parentNode==g&&Selectors.Utils.chk(b,f)){h.push(b);
|
||||
}}return h;},"+":function(c,b,a,e,d){while((b=b.nextSibling)){if(b.nodeType==1){if(Selectors.Utils.chk(b,d)&&Selectors.Filters.byTag(b,a)&&Selectors.Filters.byID(b,e)){c.push(b);
|
||||
}break;}}return c;},"~":function(c,b,a,e,d){while((b=b.nextSibling)){if(b.nodeType==1){if(!Selectors.Utils.chk(b,d)){break;}if(Selectors.Filters.byTag(b,a)&&Selectors.Filters.byID(b,e)){c.push(b);
|
||||
}}}return c;}};Selectors.Filters={byTag:function(b,a){return(a=="*"||(b.tagName&&b.tagName.toLowerCase()==a));},byID:function(a,b){return(!b||(a.id&&a.id==b));
|
||||
},byClass:function(b,a){return(b.className&&b.className.contains(a," "));},byPseudo:function(a,d,c,b){return d.call(a,c,b);},byAttribute:function(c,d,b,e){var a=Element.prototype.getProperty.call(c,d);
|
||||
if(!a){return(b=="!=");}if(!b||e==undefined){return true;}switch(b){case"=":return(a==e);case"*=":return(a.contains(e));case"^=":return(a.substr(0,e.length)==e);
|
||||
case"$=":return(a.substr(a.length-e.length)==e);case"!=":return(a!=e);case"~=":return a.contains(e," ");case"|=":return a.contains(e,"-");}return false;
|
||||
}};Selectors.Pseudo=new Hash({checked:function(){return this.checked;},empty:function(){return !(this.innerText||this.textContent||"").length;},not:function(a){return !Element.match(this,a);
|
||||
},contains:function(a){return(this.innerText||this.textContent||"").contains(a);},"first-child":function(){return Selectors.Pseudo.index.call(this,0);},"last-child":function(){var a=this;
|
||||
while((a=a.nextSibling)){if(a.nodeType==1){return false;}}return true;},"only-child":function(){var b=this;while((b=b.previousSibling)){if(b.nodeType==1){return false;
|
||||
}}var a=this;while((a=a.nextSibling)){if(a.nodeType==1){return false;}}return true;},"nth-child":function(g,e){g=(g==undefined)?"n":g;var c=Selectors.Utils.parseNthArgument(g);
|
||||
if(c.special!="n"){return Selectors.Pseudo[c.special].call(this,c.a,e);}var f=0;e.positions=e.positions||{};var d=$uid(this);if(!e.positions[d]){var b=this;
|
||||
while((b=b.previousSibling)){if(b.nodeType!=1){continue;}f++;var a=e.positions[$uid(b)];if(a!=undefined){f=a+f;break;}}e.positions[d]=f;}return(e.positions[d]%c.a==c.b);
|
||||
},index:function(a){var b=this,c=0;while((b=b.previousSibling)){if(b.nodeType==1&&++c>a){return false;}}return(c==a);},even:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n+1",a);
|
||||
},odd:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n",a);},selected:function(){return this.selected;}});Element.Events.domready={onAdd:function(a){if(Browser.loaded){a.call(this);
|
||||
}}};(function(){var b=function(){if(Browser.loaded){return;}Browser.loaded=true;window.fireEvent("domready");document.fireEvent("domready");};if(Browser.Engine.trident){var a=document.createElement("div");
|
||||
(function(){($try(function(){a.doScroll("left");return $(a).inject(document.body).set("html","temp").dispose();}))?b():arguments.callee.delay(50);})();
|
||||
}else{if(Browser.Engine.webkit&&Browser.Engine.version<525){(function(){(["loaded","complete"].contains(document.readyState))?b():arguments.callee.delay(50);
|
||||
})();}else{window.addEvent("load",b);document.addEvent("DOMContentLoaded",b);}}})();var JSON=new Hash({$specialChars:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},$replaceChars:function(a){return JSON.$specialChars[a]||"\\u00"+Math.floor(a.charCodeAt()/16).toString(16)+(a.charCodeAt()%16).toString(16);
|
||||
},encode:function(b){switch($type(b)){case"string":return'"'+b.replace(/[\x00-\x1f\\"]/g,JSON.$replaceChars)+'"';case"array":return"["+String(b.map(JSON.encode).filter($defined))+"]";
|
||||
case"object":case"hash":var a=[];Hash.each(b,function(e,d){var c=JSON.encode(e);if(c){a.push(JSON.encode(d)+":"+c);}});return"{"+a+"}";case"number":case"boolean":return String(b);
|
||||
case false:return"null";}return null;},decode:function(string,secure){if($type(string)!="string"||!string.length){return null;}if(secure&&!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""))){return null;
|
||||
}return eval("("+string+")");}});Native.implement([Hash,Array,String,Number],{toJSON:function(){return JSON.encode(this);}});var Cookie=new Class({Implements:Options,options:{path:false,domain:false,duration:false,secure:false,document:document},initialize:function(b,a){this.key=b;
|
||||
this.setOptions(a);},write:function(b){b=encodeURIComponent(b);if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path;
|
||||
}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure";
|
||||
}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)");
|
||||
return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,$merge(this.options,{duration:-1})).write("");return this;}});Cookie.write=function(b,c,a){return new Cookie(b,a).write(c);
|
||||
};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose();};var Fx=new Class({Implements:[Chain,Events,Options],options:{fps:50,unit:false,duration:500,link:"ignore"},initialize:function(a){this.subject=this.subject||this;
|
||||
this.setOptions(a);this.options.duration=Fx.Durations[this.options.duration]||this.options.duration.toInt();var b=this.options.wait;if(b===false){this.options.link="cancel";
|
||||
}},getTransition:function(){return function(a){return -(Math.cos(Math.PI*a)-1)/2;};},step:function(){var a=$time();if(a<this.time+this.options.duration){var b=this.transition((a-this.time)/this.options.duration);
|
||||
this.set(this.compute(this.from,this.to,b));}else{this.set(this.compute(this.from,this.to,1));this.complete();}},set:function(a){return a;},compute:function(c,b,a){return Fx.compute(c,b,a);
|
||||
},check:function(){if(!this.timer){return true;}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.bind(this,arguments));
|
||||
return false;}return false;},start:function(b,a){if(!this.check(b,a)){return this;}this.from=b;this.to=a;this.time=0;this.transition=this.getTransition();
|
||||
this.startTimer();this.onStart();return this;},complete:function(){if(this.stopTimer()){this.onComplete();}return this;},cancel:function(){if(this.stopTimer()){this.onCancel();
|
||||
}return this;},onStart:function(){this.fireEvent("start",this.subject);},onComplete:function(){this.fireEvent("complete",this.subject);if(!this.callChain()){this.fireEvent("chainComplete",this.subject);
|
||||
}},onCancel:function(){this.fireEvent("cancel",this.subject).clearChain();},pause:function(){this.stopTimer();return this;},resume:function(){this.startTimer();
|
||||
return this;},stopTimer:function(){if(!this.timer){return false;}this.time=$time()-this.time;this.timer=$clear(this.timer);return true;},startTimer:function(){if(this.timer){return false;
|
||||
}this.time=$time()-this.time;this.timer=this.step.periodical(Math.round(1000/this.options.fps),this);return true;}});Fx.compute=function(c,b,a){return(b-c)*a+c;
|
||||
};Fx.Durations={"short":250,normal:500,"long":1000};Fx.CSS=new Class({Extends:Fx,prepare:function(d,e,b){b=$splat(b);var c=b[1];if(!$chk(c)){b[1]=b[0];
|
||||
b[0]=d.getStyle(e);}var a=b.map(this.parse);return{from:a[0],to:a[1]};},parse:function(a){a=$lambda(a)();a=(typeof a=="string")?a.split(" "):$splat(a);
|
||||
return a.map(function(c){c=String(c);var b=false;Fx.CSS.Parsers.each(function(f,e){if(b){return;}var d=f.parse(c);if($chk(d)){b={value:d,parser:f};}});
|
||||
b=b||{value:c,parser:Fx.CSS.Parsers.String};return b;});},compute:function(d,c,b){var a=[];(Math.min(d.length,c.length)).times(function(e){a.push({value:d[e].parser.compute(d[e].value,c[e].value,b),parser:d[e].parser});
|
||||
});a.$family={name:"fx:css:value"};return a;},serve:function(c,b){if($type(c)!="fx:css:value"){c=this.parse(c);}var a=[];c.each(function(d){a=a.concat(d.parser.serve(d.value,b));
|
||||
});return a;},render:function(a,d,c,b){a.setStyle(d,this.serve(c,b));},search:function(a){if(Fx.CSS.Cache[a]){return Fx.CSS.Cache[a];}var b={};Array.each(document.styleSheets,function(e,d){var c=e.href;
|
||||
if(c&&c.contains("://")&&!c.contains(document.domain)){return;}var f=e.rules||e.cssRules;Array.each(f,function(j,g){if(!j.style){return;}var h=(j.selectorText)?j.selectorText.replace(/^\w+/,function(i){return i.toLowerCase();
|
||||
}):null;if(!h||!h.test("^"+a+"$")){return;}Element.Styles.each(function(k,i){if(!j.style[i]||Element.ShortStyles[i]){return;}k=String(j.style[i]);b[i]=(k.test(/^rgb/))?k.rgbToHex():k;
|
||||
});});});return Fx.CSS.Cache[a]=b;}});Fx.CSS.Cache={};Fx.CSS.Parsers=new Hash({Color:{parse:function(a){if(a.match(/^#[0-9a-f]{3,6}$/i)){return a.hexToRgb(true);
|
||||
}return((a=a.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[a[1],a[2],a[3]]:false;},compute:function(c,b,a){return c.map(function(e,d){return Math.round(Fx.compute(c[d],b[d],a));
|
||||
});},serve:function(a){return a.map(Number);}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(b,a){return(a)?b+a:b;}},String:{parse:$lambda(false),compute:$arguments(1),serve:$arguments(0)}});
|
||||
Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=$(b);this.parent(a);},set:function(b,a){if(arguments.length==1){a=b;
|
||||
b=this.property||this.options.property;}this.render(this.element,b,a,this.options.unit);return this;},start:function(c,e,d){if(!this.check(c,e,d)){return this;
|
||||
}var b=Array.flatten(arguments);this.property=this.options.property||b.shift();var a=this.prepare(this.element,this.property,b);return this.parent(a.from,a.to);
|
||||
}});Element.Properties.tween={set:function(a){var b=this.retrieve("tween");if(b){b.cancel();}return this.eliminate("tween").store("tween:options",$extend({link:"cancel"},a));
|
||||
},get:function(a){if(a||!this.retrieve("tween")){if(a||!this.retrieve("tween:options")){this.set("tween",a);}this.store("tween",new Fx.Tween(this,this.retrieve("tween:options")));
|
||||
}return this.retrieve("tween");}};Element.implement({tween:function(a,c,b){this.get("tween").start(arguments);return this;},fade:function(c){var e=this.get("tween"),d="opacity",a;
|
||||
c=$pick(c,"toggle");switch(c){case"in":e.start(d,1);break;case"out":e.start(d,0);break;case"show":e.set(d,1);break;case"hide":e.set(d,0);break;case"toggle":var b=this.retrieve("fade:flag",this.get("opacity")==1);
|
||||
e.start(d,(b)?0:1);this.store("fade:flag",!b);a=true;break;default:e.start(d,arguments);}if(!a){this.eliminate("fade:flag");}return this;},highlight:function(c,a){if(!a){a=this.retrieve("highlight:original",this.getStyle("background-color"));
|
||||
a=(a=="transparent")?"#fff":a;}var b=this.get("tween");b.start("background-color",c||"#ffff88",a).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original"));
|
||||
b.callChain();}.bind(this));return this;}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=$(b);this.parent(a);},set:function(a){if(typeof a=="string"){a=this.search(a);
|
||||
}for(var b in a){this.render(this.element,b,a[b],this.options.unit);}return this;},compute:function(e,d,c){var a={};for(var b in e){a[b]=this.parent(e[b],d[b],c);
|
||||
}return a;},start:function(b){if(!this.check(b)){return this;}if(typeof b=="string"){b=this.search(b);}var e={},d={};for(var c in b){var a=this.prepare(this.element,c,b[c]);
|
||||
e[c]=a.from;d[c]=a.to;}return this.parent(e,d);}});Element.Properties.morph={set:function(a){var b=this.retrieve("morph");if(b){b.cancel();}return this.eliminate("morph").store("morph:options",$extend({link:"cancel"},a));
|
||||
},get:function(a){if(a||!this.retrieve("morph")){if(a||!this.retrieve("morph:options")){this.set("morph",a);}this.store("morph",new Fx.Morph(this,this.retrieve("morph:options")));
|
||||
}return this.retrieve("morph");}};Element.implement({morph:function(a){this.get("morph").start(a);return this;}});Fx.implement({getTransition:function(){var a=this.options.transition||Fx.Transitions.Sine.easeInOut;
|
||||
if(typeof a=="string"){var b=a.split(":");a=Fx.Transitions;a=a[b[0]]||a[b[0].capitalize()];if(b[1]){a=a["ease"+b[1].capitalize()+(b[2]?b[2].capitalize():"")];
|
||||
}}return a;}});Fx.Transition=function(b,a){a=$splat(a);return $extend(b,{easeIn:function(c){return b(c,a);},easeOut:function(c){return 1-b(1-c,a);},easeInOut:function(c){return(c<=0.5)?b(2*c,a)/2:(2-b(2*(1-c),a))/2;
|
||||
}});};Fx.Transitions=new Hash({linear:$arguments(0)});Fx.Transitions.extend=function(a){for(var b in a){Fx.Transitions[b]=new Fx.Transition(a[b]);}};Fx.Transitions.extend({Pow:function(b,a){return Math.pow(b,a[0]||6);
|
||||
},Expo:function(a){return Math.pow(2,8*(a-1));},Circ:function(a){return 1-Math.sin(Math.acos(a));},Sine:function(a){return 1-Math.sin((1-a)*Math.PI/2);
|
||||
},Back:function(b,a){a=a[0]||1.618;return Math.pow(b,2)*((a+1)*b-a);},Bounce:function(f){var e;for(var d=0,c=1;1;d+=c,c/=2){if(f>=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);
|
||||
break;}}return e;},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a[0]||1)/3);}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,[a+2]);
|
||||
});});var Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,noCache:false},initialize:function(a){this.xhr=new Browser.Request();
|
||||
this.setOptions(a);this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.headers=new Hash(this.options.headers);},onStateChange:function(){if(this.xhr.readyState!=4||!this.running){return;
|
||||
}this.running=false;this.status=0;$try(function(){this.status=this.xhr.status;}.bind(this));if(this.options.isSuccess.call(this,this.status)){this.response={text:this.xhr.responseText,xml:this.xhr.responseXML};
|
||||
this.success(this.response.text,this.response.xml);}else{this.response={text:null,xml:null};this.failure();}this.xhr.onreadystatechange=$empty;},isSuccess:function(){return((this.status>=200)&&(this.status<300));
|
||||
},processScripts:function(a){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return $exec(a);}return a.stripScripts(this.options.evalScripts);
|
||||
},success:function(b,a){this.onSuccess(this.processScripts(b),a);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain();
|
||||
},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},setHeader:function(a,b){this.headers.set(a,b);
|
||||
return this;},getHeader:function(a){return $try(function(){return this.xhr.getResponseHeader(a);}.bind(this));},check:function(){if(!this.running){return true;
|
||||
}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.bind(this,arguments));return false;}return false;},send:function(j){if(!this.check(j)){return this;
|
||||
}this.running=true;var h=$type(j);if(h=="string"||h=="element"){j={data:j};}var d=this.options;j=$extend({data:d.data,url:d.url,method:d.method},j);var f=j.data,b=j.url,a=j.method;
|
||||
switch($type(f)){case"element":f=$(f).toQueryString();break;case"object":case"hash":f=Hash.toQueryString(f);}if(this.options.format){var i="format="+this.options.format;
|
||||
f=(f)?i+"&"+f:i;}if(this.options.emulation&&["put","delete"].contains(a)){var g="_method="+a;f=(f)?g+"&"+f:g;a="post";}if(this.options.urlEncoded&&a=="post"){var c=(this.options.encoding)?"; charset="+this.options.encoding:"";
|
||||
this.headers.set("Content-type","application/x-www-form-urlencoded"+c);}if(this.options.noCache){var e="noCache="+new Date().getTime();f=(f)?e+"&"+f:e;
|
||||
}if(f&&a=="get"){b=b+(b.contains("?")?"&":"?")+f;f=null;}this.xhr.open(a.toUpperCase(),b,this.options.async);this.xhr.onreadystatechange=this.onStateChange.bind(this);
|
||||
this.headers.each(function(l,k){try{this.xhr.setRequestHeader(k,l);}catch(m){this.fireEvent("exception",[k,l]);}},this);this.fireEvent("request");this.xhr.send(f);
|
||||
if(!this.options.async){this.onStateChange();}return this;},cancel:function(){if(!this.running){return this;}this.running=false;this.xhr.abort();this.xhr.onreadystatechange=$empty;
|
||||
this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});(function(){var a={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(b){a[b]=function(){var c=Array.link(arguments,{url:String.type,data:$defined});
|
||||
return this.send($extend(c,{method:b.toLowerCase()}));};});Request.implement(a);})();
|
BIN
data/nojs/nojs-statusicon-allowed.png
Normal file
BIN
data/nojs/nojs-statusicon-allowed.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 444 B |
BIN
data/nojs/nojs-statusicon-denied.png
Normal file
BIN
data/nojs/nojs-statusicon-denied.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 605 B |
BIN
data/nojs/nojs-statusicon-mixed.png
Normal file
BIN
data/nojs/nojs-statusicon-mixed.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 630 B |
8
data/notes/Create.sql
Normal file
8
data/notes/Create.sql
Normal file
|
@ -0,0 +1,8 @@
|
|||
CREATE TABLE IF NOT EXISTS notes
|
||||
(
|
||||
id INTEGER PRIMARY KEY,
|
||||
uri TEXT,
|
||||
title TEXT,
|
||||
note_content TEXT,
|
||||
tstamp INTEGER
|
||||
);
|
|
@ -1,335 +1,351 @@
|
|||
<!--
|
||||
Speed Dial head template for Midori.
|
||||
Copyright (C) 2009 Jean-François Guchens <zcx000@gmail.com>
|
||||
Copyright (C) 2011 Paweł Forysiuk <tuxator@o2.pl>
|
||||
Copyright (C) 2011 Cassidy James <email@cassidyjames.com>
|
||||
This file is licensed under the terms of the expat license, see the file EXPAT.
|
||||
-->
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>{title}</title>
|
||||
<script type="text/javascript" src="{res}/mootools.js"></script>
|
||||
|
||||
<style>
|
||||
html, body, #content {
|
||||
margin: 0px;
|
||||
padding: 0px
|
||||
|
||||
/* Animations */
|
||||
|
||||
@-webkit-keyframes popin {
|
||||
0% { opacity: 0.0; -webkit-transform: scale(0.00); }
|
||||
75% { opacity: 0.5; -webkit-transform: scale(1.15); }
|
||||
100% { opacity: 1.0; -webkit-transform: scale(1.00); }
|
||||
}
|
||||
|
||||
body {
|
||||
text-align: center;
|
||||
background-color: #fefefe;
|
||||
/* Styles */
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
cursor: default;
|
||||
font-size: 13px;
|
||||
color: #4d4d4d;
|
||||
-webkit-user-select: none;
|
||||
}
|
||||
|
||||
html, body {
|
||||
font-family: sans-serif;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
outline: 0;
|
||||
background: #eee;
|
||||
}
|
||||
|
||||
#wrap {
|
||||
width: 660px;
|
||||
height: 500px;
|
||||
margin: 0px auto;
|
||||
text-align: center;
|
||||
input {
|
||||
width: 85%;
|
||||
}
|
||||
|
||||
#content {
|
||||
margin-top: 40px;
|
||||
width: 96%;
|
||||
height: 85%;
|
||||
margin: 0 auto;
|
||||
padding-top: 5%;
|
||||
padding-left: 2%;
|
||||
}
|
||||
|
||||
div.shortcut {
|
||||
width: 25%;
|
||||
height: 33%;
|
||||
float: left;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
div.shortcut .preview {
|
||||
width: 85%;
|
||||
height: 75%;
|
||||
margin: auto;
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,0.12),
|
||||
0 1px 2px rgba(0,0,0,0.24);
|
||||
position: relative;
|
||||
width: 200px;
|
||||
height: 150px;
|
||||
margin: 20px 20px 0px 0px;
|
||||
background-color: #fff;
|
||||
-webkit-border-radius: 10px;
|
||||
border-radius: 3px;
|
||||
transition: all 200ms ease-in-out;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
div.right {
|
||||
margin-right: 0px;
|
||||
margin-left: 0px;
|
||||
div.shortcut .preview img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
cursor: pointer;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
div.shortcut .preview.new {
|
||||
background-color: rgba(0,0,0,0.05);
|
||||
border: 1px solid rgba(0,0,0,0.15);
|
||||
|
||||
box-shadow: inset 0 0 1px 1px rgba(0,0,0,0.05),
|
||||
0 1px 0 0 rgba(255,255,255,0.40);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
div.top {
|
||||
margin-top: 0px;
|
||||
div.shortcut .preview.new .add {
|
||||
background-color: #777;
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
line-height: 64px;
|
||||
text-align: center;
|
||||
border-radius: 32px;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
margin-left: -32px;
|
||||
margin-top: -32px;
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,0.12),
|
||||
0 1px 2px rgba(0,0,0,0.24);
|
||||
outline: none;
|
||||
}
|
||||
|
||||
div.shortcut .preview.new .add:after {
|
||||
content: "+";
|
||||
color: #fff;
|
||||
font-size: 48px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 50px;
|
||||
font-weight: bold;
|
||||
margin: 0px;
|
||||
height: 30px;
|
||||
padding: 10px 0px 0px 0px;
|
||||
.title {
|
||||
background: transparent;
|
||||
border: 2px solid transparent;
|
||||
display: block;
|
||||
text-align: center;
|
||||
margin: 8px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
cursor: text;
|
||||
outline: none;
|
||||
transition: all 200ms ease-in-out;
|
||||
padding-bottom: 6px;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 11px;
|
||||
font-weight: bold
|
||||
margin: 10px 0px 0px 0px;
|
||||
padding: 10px 5px 0px;
|
||||
display: block;
|
||||
|
||||
.preview.new ~ .title {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
h4 span:before {
|
||||
content: "{click_to_add}";
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
h4 span {
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
div.shortcut a {
|
||||
border: 1px solid #ccc;
|
||||
display: block;
|
||||
width: 160px;
|
||||
height: 107px;
|
||||
margin: 15px auto 0px;
|
||||
background-color: #fafafa;
|
||||
color: #aaa;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.waiter img {
|
||||
margin-top: 38px;
|
||||
}
|
||||
|
||||
div.shortcut a:hover {
|
||||
border: 1px solid #999;
|
||||
}
|
||||
|
||||
div.shortcut p {
|
||||
font-size: 12px;
|
||||
margin: 0px;
|
||||
padding: 5px 0px 0px;
|
||||
color: #222;
|
||||
}
|
||||
|
||||
div.clear {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
div.activated {
|
||||
background-color: #f5f5f5;
|
||||
|
||||
.title.active {
|
||||
border-bottom-color: #4CAF50;
|
||||
}
|
||||
|
||||
.cross {
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
margin-bottom: -17px;
|
||||
margin-left: 180px;
|
||||
margin-top: 2px;
|
||||
background: url({stock}/16/gtk-close) 98% 70% no-repeat;
|
||||
color: #fff;
|
||||
display: block;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
text-align: center;
|
||||
line-height: 32px;
|
||||
top: -14px;
|
||||
right: -14px;
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
z-index: -4;
|
||||
opacity: 0.6;
|
||||
opacity: 0;
|
||||
background-color: #555;
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,0.12),
|
||||
0 1px 2px rgba(0,0,0,0.24);
|
||||
}
|
||||
|
||||
.cross:after {
|
||||
content: '+';
|
||||
-webkit-transform: rotate(45deg);
|
||||
font-size: 22px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.cross:hover {
|
||||
div.shortcut .preview:hover .cross {
|
||||
-webkit-animation: popin 250ms ease-in-out;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.activated p {
|
||||
cursor: text;
|
||||
background: url({stock}/16/gtk-edit) 98% 70% no-repeat;
|
||||
opacity: 0.6;
|
||||
color: rgba(0,0,0,1);
|
||||
.box.added {
|
||||
display:none;
|
||||
}
|
||||
|
||||
.activated p:hover {
|
||||
opacity: 1;
|
||||
color: rgba(0,0,0,0.5);
|
||||
.selectable {
|
||||
-webkit-user-select: text;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script type="text/javascript">
|
||||
var previousName = "";
|
||||
|
||||
sc = JSON.decode ({json_data});
|
||||
|
||||
var encodeSafe = function (obj) {
|
||||
var str = JSON.encode (obj);
|
||||
str = str.replace (/\'/g, '\\\'');
|
||||
return str;
|
||||
function input_key_down (ev) {
|
||||
// 13 is the key code for enter
|
||||
if(ev.keyCode == 13) ev.target.blur();
|
||||
// 27 is the key code for escape
|
||||
if(ev.keyCode == 27) {
|
||||
ev.target.value = previousName;
|
||||
ev.target.blur();
|
||||
}
|
||||
}
|
||||
|
||||
var getAction = function (id)
|
||||
{
|
||||
var a = $(id).getFirst ();
|
||||
if (a.getProperty ('href') != "#" )
|
||||
return true;
|
||||
function add_tile (ev) {
|
||||
ev.preventDefault();
|
||||
|
||||
var url = prompt ("{enter_shortcut_address}", "http://");
|
||||
if (!url) return false;
|
||||
if (!url)
|
||||
return false;
|
||||
|
||||
var name = prompt ("{enter_shortcut_name}", "");
|
||||
if (!name) name = "";
|
||||
if (url.indexOf ("://") == -1)
|
||||
url = "http://" + url;
|
||||
|
||||
a.setProperty('href', url);
|
||||
a.getNext().set('text', name);
|
||||
|
||||
var num = id.substr (1) - 1;
|
||||
sc.shortcuts[num].title = name;
|
||||
|
||||
a.empty();
|
||||
var im = new Element('img', { src: '{stock}/image-loading' });
|
||||
|
||||
a.addClass ('waiter');
|
||||
a.grab (im);
|
||||
|
||||
getThumbnail (id, url);
|
||||
return false;
|
||||
var id = ev.target.parentNode.parentNode.id;
|
||||
console.log ("speed_dial-save-add " + id + " " + url);
|
||||
}
|
||||
|
||||
var getThumbnail = function (id, url)
|
||||
{
|
||||
console.log ("speed_dial-get-thumbnail " + id + " " + url);
|
||||
return false;
|
||||
function done_editing_title (ev) {
|
||||
input = ev.target;
|
||||
input.className = "title";
|
||||
|
||||
var name = ev.target.value;
|
||||
if (name == "")
|
||||
name = previousName;
|
||||
var id = ev.target.parentNode.id;
|
||||
console.log ("speed_dial-save-rename " + id + " " + name);
|
||||
}
|
||||
|
||||
var setThumbnail = function (id, data, href)
|
||||
{
|
||||
var a = $(id).getFirst ();
|
||||
var im = new Element ('img', { src: 'data:image/png;base64,' + data });
|
||||
|
||||
a.empty ().removeClass ('waiter').grab (im);
|
||||
a.setProperty ('href', href);
|
||||
|
||||
var cross = new Element ('div', { 'html': '' });
|
||||
cross.setProperty ('onclick', 'clearShortcut("' + id + '");');
|
||||
cross.addClass ('cross');
|
||||
cross.inject ($(id), 'top');
|
||||
|
||||
$(id).addClass ('activated');
|
||||
|
||||
var p = a.getNext ();
|
||||
p.setProperty('onclick', 'javascript:renameShortcut("' + id + '");');
|
||||
|
||||
var num = id.substr (1) - 1;
|
||||
sc.shortcuts[num].href = href;
|
||||
sc.shortcuts[num].img = data;
|
||||
|
||||
console.log ("speed_dial-save '" + encodeSafe (sc) + "'");
|
||||
function editing_tile (ev) {
|
||||
input = ev.target;
|
||||
previousName = input.value;
|
||||
// indicate to user they are editing the title
|
||||
input.className = input.className + " active";
|
||||
}
|
||||
|
||||
var renameShortcut = function (id)
|
||||
{
|
||||
var name = prompt ("{enter_shortcut_name}", "");
|
||||
if (!name) return;
|
||||
function delete_tile (ev) {
|
||||
ev.preventDefault();
|
||||
|
||||
var num = id.substr (1) - 1;
|
||||
|
||||
$(id).getLast ().set ('html', name);
|
||||
sc.shortcuts[num].title = name;
|
||||
|
||||
console.log ("speed_dial-save '" + encodeSafe (sc) + "'");
|
||||
}
|
||||
|
||||
var clearShortcut = function (id)
|
||||
{
|
||||
if(!confirm("{are_you_sure}"))
|
||||
if (!confirm("{are_you_sure}"))
|
||||
return;
|
||||
|
||||
var num = id.substr (1);
|
||||
var div = $(id);
|
||||
var cross = div.getFirst ();
|
||||
var a = cross.getNext ();
|
||||
var p = a.getNext ();
|
||||
|
||||
cross.dispose ();
|
||||
div.removeClass ('activated');
|
||||
a.empty ().set ('html', '<h1>' + num + '</h1><h4><span/></h4>');
|
||||
a.setProperty ('href', '#');
|
||||
p.empty ().removeProperty ('onclick');
|
||||
|
||||
num -= 1;
|
||||
sc.shortcuts[num].href = "#";
|
||||
sc.shortcuts[num].title = "";
|
||||
sc.shortcuts[num].img = "";
|
||||
|
||||
console.log ("speed_dial-save '" + encodeSafe (sc) + "'");
|
||||
var id = ev.target.parentNode.parentNode.id;
|
||||
console.log ("speed_dial-save-delete " + id);
|
||||
}
|
||||
|
||||
var buildSpeeddial = function ()
|
||||
{
|
||||
var width = 3;
|
||||
if (sc.width != undefined)
|
||||
{
|
||||
width = sc.width;
|
||||
$('wrap').style.width = (width * 220) + 'px';
|
||||
}
|
||||
var firstNode, secondNode;
|
||||
var cursor;
|
||||
|
||||
sc.shortcuts.each (function (item, index, sc)
|
||||
{
|
||||
var cl = "shortcut";
|
||||
var get_dial_div = function (ele) {
|
||||
var dial_div;
|
||||
if (ele.nodeName == 'IMG')
|
||||
dial_div = ele.parentNode.parentNode.parentNode;
|
||||
if (ele.className == 'title')
|
||||
dial_div = ele.parentNode;
|
||||
if (ele.className.indexOf ('shortcut') != -1)
|
||||
dial_div = ele;
|
||||
return dial_div;
|
||||
}
|
||||
|
||||
if (index < width)
|
||||
cl += " top";
|
||||
if ((index % width) == (width - 1))
|
||||
cl += " right";
|
||||
function click (ev) {
|
||||
if (ev == undefined)
|
||||
return;
|
||||
|
||||
var div = new Element ('div', {
|
||||
'class': cl,
|
||||
'id': item.id
|
||||
});
|
||||
|
||||
var a = new Element ('a', {
|
||||
'href': item.href,
|
||||
'events': {
|
||||
'click': function () {
|
||||
return getAction (item.id);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var p = new Element ('p', {
|
||||
'text': item.title
|
||||
});
|
||||
|
||||
if (item.href == "#")
|
||||
a.set ('html', '<h1>' + item.id.substr (1) + '</h1><h4><span/></h4>');
|
||||
else
|
||||
{
|
||||
div.addClass ('activated');
|
||||
var im = new Element ('img', { src: 'data:image/png;base64,' + item.img });
|
||||
var cross = new Element ('div', { 'html': '' });
|
||||
cross.setProperty ('onclick', 'clearShortcut("' + item.id + '");');
|
||||
cross.addClass ('cross');
|
||||
cross.inject (div, 'top');
|
||||
a.grab (im);
|
||||
p.setProperty('onclick', 'javascript:renameShortcut("' + item.id + '");');
|
||||
/* If the target of the event is an element of class title
|
||||
* and not also of class add-shortcut we are editing title
|
||||
*/
|
||||
var classes = ev.target.className.split(" ");
|
||||
var edit_title = false;
|
||||
for (var i = 0; i < classes.length; i++) {
|
||||
if(classes[i] == "add-shortcut") {
|
||||
edit_title = false;
|
||||
break;
|
||||
}
|
||||
|
||||
div.grab (a);
|
||||
div.grab (p);
|
||||
$('content').grab (div);
|
||||
});
|
||||
}
|
||||
|
||||
window.addEvent ('domready', function () {
|
||||
buildSpeeddial ();
|
||||
});
|
||||
|
||||
document.onkeypress = function ()
|
||||
{
|
||||
var id = $('s' + String.fromCharCode (event.which));
|
||||
|
||||
if ($(id))
|
||||
{
|
||||
if (getAction (id))
|
||||
document.location = $(id).children[1];
|
||||
return false;
|
||||
if(classes[i] == "title")
|
||||
edit_title = true;
|
||||
}
|
||||
|
||||
return true
|
||||
if(edit_title)
|
||||
return;
|
||||
|
||||
ev.preventDefault();
|
||||
var ele = ev.target;
|
||||
cursor = ele.style.cursor;
|
||||
ele.style.cursor = 'move';
|
||||
|
||||
var eparent = get_dial_div (ele);
|
||||
if (eparent != undefined) {
|
||||
eparent.className = 'shortcut selected';
|
||||
firstNode = eparent.id;
|
||||
}
|
||||
};
|
||||
|
||||
function up (ev) {
|
||||
if (ev == undefined)
|
||||
return;
|
||||
|
||||
ev.preventDefault();
|
||||
ele = ev.target;
|
||||
var eparent = get_dial_div (ele);
|
||||
|
||||
ele.style.cursor = cursor;
|
||||
if(eparent != undefined) secondNode = eparent.id;
|
||||
else return;
|
||||
|
||||
/* ommit just mere clicking the dial */
|
||||
if (firstNode != secondNode && firstNode != undefined)
|
||||
swap();
|
||||
};
|
||||
|
||||
function over (ev) {
|
||||
if (ev == undefined)
|
||||
return;
|
||||
|
||||
ev.preventDefault();
|
||||
var ele = ev.target;
|
||||
var eparent = get_dial_div (ele);
|
||||
|
||||
var dial = document.getElementsByClassName("shortcut");
|
||||
if (firstNode != undefined)
|
||||
{
|
||||
eparent.className = 'shortcut selected';
|
||||
for (var i = 0; i < dial.length; i++) {
|
||||
if (eparent.id != firstNode.id && dial[i].id != eparent.id) {
|
||||
dial[i].className = 'shortcut';
|
||||
}
|
||||
}
|
||||
}
|
||||
ele.style.cursor = cursor;
|
||||
}
|
||||
|
||||
function swap () {
|
||||
console.log ("speed_dial-save-swap " + firstNode + " " + secondNode);
|
||||
};
|
||||
|
||||
function init () {
|
||||
var new_tile = document.getElementsByClassName ("preview new");
|
||||
new_tile[0].addEventListener ('click', add_tile, false);
|
||||
|
||||
var titles = document.getElementsByClassName ("title");
|
||||
var len = titles.length;
|
||||
for (var i = 0; i < len; i++) {
|
||||
if (titles[i].parentNode.childNodes[0].className != "preview new") {
|
||||
titles[i].addEventListener ('click', editing_tile, false);
|
||||
titles[i].addEventListener ('blur', done_editing_title, false);
|
||||
titles[i].addEventListener ('keydown', input_key_down, false);
|
||||
}
|
||||
}
|
||||
|
||||
var crosses = document.getElementsByClassName ("cross");
|
||||
var len = crosses.length;
|
||||
for (var i = 0; i < len; i++)
|
||||
crosses[i].addEventListener ('click', delete_tile, false);
|
||||
|
||||
var occupied_tiles = document.getElementsByClassName ("shortcut");
|
||||
var len = occupied_tiles.length;
|
||||
for (var i = 0; i < len; i++) {
|
||||
if (occupied_tiles[i].childNodes[0].className != "preview new") {
|
||||
occupied_tiles[i].addEventListener('mousedown', click, false);
|
||||
occupied_tiles[i].addEventListener('mouseover', over, false);
|
||||
occupied_tiles[i].addEventListener('mouseup', up, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="wrap">
|
||||
<div id="content">
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<body onload="init ();">
|
||||
<div id="content">
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
'{"shortcuts":[{"id":"s1","href":"#","title":"","img":""},{"id":"s2","href":"#","title":"","img":""},{"id":"s3","href":"#","title":"","img":""},{"id":"s4","href":"#","title":"","img":""},{"id":"s5","href":"#","title":"","img":""},{"id":"s6","href":"#","title":"","img":""},{"id":"s7","href":"#","title":"","img":""},{"id":"s8","href":"#","title":"","img":""},{"id":"s9","href":"#","title":"","img":""}]}'
|
33
data/tabby/Create.sql
Normal file
33
data/tabby/Create.sql
Normal file
|
@ -0,0 +1,33 @@
|
|||
CREATE TABLE IF NOT EXISTS sessions
|
||||
(
|
||||
id INTEGER PRIMARY KEY,
|
||||
parent_id INTEGER DEFAULT 0,
|
||||
crdate INTEGER DEFAULT 0,
|
||||
tstamp INTEGER DEFAULT 0,
|
||||
closed INTEGER DEFAULT 0,
|
||||
title TEXT DEFAULT NULL,
|
||||
FOREIGN KEY(parent_id) REFERENCES sessions(id)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS tabs
|
||||
(
|
||||
id INTEGER PRIMARY KEY,
|
||||
session_id INTEGER NOT NULL,
|
||||
uri TEXT DEFAULT NULL,
|
||||
icon TEXT DEFAULT NULL,
|
||||
title TEXT DEFAULT NULL,
|
||||
crdate INTEGER DEFAULT 0,
|
||||
tstamp INTEGER DEFAULT 0,
|
||||
closed INTEGER DEFAULT 0,
|
||||
FOREIGN KEY(session_id) REFERENCES sessions(id)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS tab_history
|
||||
(
|
||||
id INTEGER PRIMARY KEY,
|
||||
tab_id INTEGER,
|
||||
url TEXT,
|
||||
icon TEXT,
|
||||
title TEXT,
|
||||
FOREIGN KEY(tab_id) REFERENCES tabs(id)
|
||||
);
|
4
data/tabby/Update1.sql
Normal file
4
data/tabby/Update1.sql
Normal file
|
@ -0,0 +1,4 @@
|
|||
ALTER TABLE tabs ADD sorting REAL DEFAULT 0;
|
||||
|
||||
CREATE INDEX sorting on tabs (sorting ASC);
|
||||
CREATE INDEX tstamp on tabs (tstamp ASC);
|
3
debian/Debian-config
vendored
Normal file
3
debian/Debian-config
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
[settings]
|
||||
|
||||
homepage=file:///usr/share/doc/midori/faq.html
|
45
debian/README.Debian
vendored
Normal file
45
debian/README.Debian
vendored
Normal file
|
@ -0,0 +1,45 @@
|
|||
Midori for Debian
|
||||
=================
|
||||
|
||||
Missing Icons
|
||||
-------------
|
||||
|
||||
Based on conversation with the author, and the faq entries cited
|
||||
below, I do not think Midori will be changed upstream to use only
|
||||
"stock" GTK icons.
|
||||
|
||||
* There are missing icons/ warnings
|
||||
|
||||
The set of themed icons Midori can use is very limited. For
|
||||
instance icons for a new tab or the throbber are not guaranteed to
|
||||
be available. To fix this, install a Freedesktop.org spec
|
||||
compliant icon theme, such as Tango or Gnome, or one that is
|
||||
compatible with these.
|
||||
|
||||
* Tweaking Midori on the Gtk level
|
||||
|
||||
If you don't have a desktop application that takes care of Gtk
|
||||
settings or if your interface doesn't support a particular
|
||||
feature, you can modify any settings easily manually by specifying
|
||||
them in a text file called ~/.gtkrc-2.0 or /etc/gtk-2.0/gtkrc:
|
||||
|
||||
Use Tango as a fallback for your icon theme:
|
||||
|
||||
gtk-icon-theme = "MySuperFancyTheme"
|
||||
gtk-fallback-icon-theme = "Tango"
|
||||
|
||||
-- http://wiki.xfce.org/midori_faq
|
||||
|
||||
Therefore I will add document this state of affairs in README.Debian
|
||||
and add the following header to debian/control:
|
||||
|
||||
Recommends: gnome-icon-theme
|
||||
|
||||
This seems to be in line with what other packages currently do
|
||||
(e.g. galeon).
|
||||
|
||||
I am choosing not to include a whole bunch of alternatives in the
|
||||
Recommendation because I don't want to have to keep that list of
|
||||
alternatives accurate.
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com>, Thu, 20 Nov 2008 20:23:33 +1100
|
42
debian/README.source
vendored
Normal file
42
debian/README.source
vendored
Normal file
|
@ -0,0 +1,42 @@
|
|||
I'm using the following to roll local snapshot releases.
|
||||
|
||||
To make the initial checkout:
|
||||
|
||||
git clone git://git.xfce.org/kalikiana/midori midori &&
|
||||
apt-get source midori &&
|
||||
cd midori &&
|
||||
zcat ../midori*.diff.gz | patch -p1
|
||||
|
||||
To update and roll a .deb:
|
||||
|
||||
debuild clean &&
|
||||
git pull &&
|
||||
v=$(git describe --tags) && v=${v%-*} && v=${v//-/+} &&
|
||||
dch -v $v-1 'New upstream snapshot.' &&
|
||||
tar --exclude .git --exclude debian -lzma -cf ../${PWD##*/}_$v.orig.tar.lzma -C .. ${PWD##*/} &&
|
||||
mkdir -p debian/source && echo '3.0 (quilt)' >debian/source/format &&
|
||||
pdebuild
|
||||
|
||||
Midori has a large number of optional dependencies; I have made some
|
||||
of them build dependencies based on what I think is widely useful.
|
||||
The easiest way to build your own custom binary without such support
|
||||
is to move the appropriate entries from Build-Depends to
|
||||
Build-Conflicts in debian/control.
|
||||
|
||||
- gtk-doc-tools: API documentation.
|
||||
- python-docutils: HTML user documentation (from plain text).
|
||||
- intltool: localized UI text (menu titles and such).
|
||||
- libunique-dev: turns midori into a client/server arrangement,
|
||||
where subsequent calls will open windows in the first midori.
|
||||
- libsoup2.4-dev: view source code and favicons and "save as".
|
||||
- libsqlite3-dev: persistent history. Without this, browsing
|
||||
history is lost when you quit midori. Possibly also relevant for
|
||||
bookmarks, I'm not sure. Compiles OK with libsqlite0-dev, but
|
||||
history isn't persistent.
|
||||
- librsvg2-bin: create PNG icons from SVG source at compile time.
|
||||
This avoids needing to rasterize the SVGs on the fly each time
|
||||
midori is run.
|
||||
- libidn11-dev: internationalized domain names.
|
||||
- libhildon-1-dev: an alternative to GTK2, for embedded systems.
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com>, Sat, 21 Mar 2009 19:20:33 +1100
|
32
debian/TODO
vendored
Normal file
32
debian/TODO
vendored
Normal file
|
@ -0,0 +1,32 @@
|
|||
* Document how to use Firefox plugins.
|
||||
|
||||
* Remove runtime dependency on dbus-launch.
|
||||
|
||||
http://www.twotoasts.de/bugs/index.php?do=details&task_id=113
|
||||
|
||||
When building binary packages for Debian, I can either
|
||||
|
||||
- Build without libunique. Then midori works for everyone, but
|
||||
running "midori foo" on the command line results in a new midori
|
||||
process.
|
||||
|
||||
- Build with libunique. Then midori doesn't start unless there is a
|
||||
session dbus, or dbus-launch can be used to create one:
|
||||
|
||||
$ midori; echo $?
|
||||
|
||||
(midori:2128): Unique-DBus-WARNING **: Unable to open a connection
|
||||
to the session bus: Failed to execute dbus-launch to autolaunch
|
||||
D-Bus session
|
||||
|
||||
(midori:2128): Unique-DBus-WARNING **: Unable to connect to the
|
||||
running instance, aborting.
|
||||
|
||||
An instance of Midori is already running but not responding.
|
||||
1
|
||||
$ env | grep DBUS
|
||||
$
|
||||
|
||||
Neither choice particularly appeals to me. Please sort out the code
|
||||
so that when built with libunique, midori will fall back to the
|
||||
"unique-less" behaviour when there is no session dbus.
|
2
debian/Ubuntu-config
vendored
Normal file
2
debian/Ubuntu-config
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
[settings]
|
||||
homepage=file:///usr/share/ubuntu-artwork/home/index.html
|
626
debian/changelog
vendored
Normal file
626
debian/changelog
vendored
Normal file
|
@ -0,0 +1,626 @@
|
|||
midori (0.5.11-2) unstable; urgency=medium
|
||||
|
||||
* Remove "Force SSL verification" patch.
|
||||
The patch "force-ssl-cert-verification.patch" was mistakenly included
|
||||
in the last Midori release; this cased a regression because the user
|
||||
cannot access a website that has a self-signed SSL/TLS certificate
|
||||
anymore. This change removes the patch and allows the user to trust
|
||||
self-signed certificates again. (Closes: #799337)
|
||||
|
||||
-- Sergio Durigan Junior <sergiodj@sergiodj.net> Fri, 18 Sep 2015 15:29:38 -0400
|
||||
|
||||
midori (0.5.11-1) unstable; urgency=low
|
||||
|
||||
[ Yves-Alexis Perez ]
|
||||
* New upstream release.
|
||||
* Apply patch from Colin Watson to improve conffile handling, using new
|
||||
debhelper features. closes: #659773
|
||||
* debian/control:
|
||||
- update standards version to 3.9.3.
|
||||
- update homepage address.
|
||||
- remove myself from uploaders.
|
||||
* debian/midori.maintscript:
|
||||
- handle the /etc/xdg/midori/extensions/libadblock.so removal there.
|
||||
closes: #660303
|
||||
* debian/patches:
|
||||
- force-ssl-cert-verification added, set ssl-strict to TRUE so connections
|
||||
are not done if the ssl certificate can't be trusted.
|
||||
* debian/compat bumped to 9.
|
||||
|
||||
[ Ryan Niebur ]
|
||||
* new upstream version, including the waf unpack changes made thanks
|
||||
to the NMU by Koichi Akabe
|
||||
- refreshed patches
|
||||
- add new Build-Dep on libzeitgeist-dev
|
||||
* Improve dh_auto_clean target in d/rules to handle some leftover
|
||||
files from quilt and waf
|
||||
|
||||
[ Andres Salomon ]
|
||||
* Import Debian patch 0.4.3+dfsg-0.2
|
||||
|
||||
[ Sergio Durigan Junior ]
|
||||
* Changing gbp.conf to not override the default tag name for releases.
|
||||
* Updating section names on debian/gbp.conf
|
||||
* Imported Upstream version 0.5.11
|
||||
* Update debian/patches for the new Midori version (0.5.11).
|
||||
* Revamp build system (use cmake instead of waf)
|
||||
- Update debian/rules, removing old stuff (from waf) and adding new,
|
||||
simpler rules for the cmake-based build.
|
||||
- Update debian/control, listing the new package maintainer and
|
||||
reviewed dependencies.
|
||||
- Delete debian/waf-unpack file.
|
||||
- Rename debian/config/{Debian,Ubuntu}.h files to
|
||||
debian/config/{Debian,Ubuntu}.conf.
|
||||
With this change, it is now unnecessary to create a DFSG-modified
|
||||
version of the package, because Waf is not used as the build system
|
||||
anymore (for more details, see Bug 645191).
|
||||
It is possible to build the package now, but it still has some lintian
|
||||
warnings that will be fixed in the following changes.
|
||||
(Closes: #663185, #758103, #787878)
|
||||
* Adding shlibs and lintian-overrides files.
|
||||
Due to the way libraries (i.e., plugins) are built by Midori (without
|
||||
a proper SONAME), it is necessary (or at least recommended) to provide
|
||||
a shlibs file that contains trustworthy information about the
|
||||
libraries being installed on the system.
|
||||
Unfortunately, it is also necessary to provide a lintian-overrides
|
||||
file in order to silence some lintian warnings (mostly about the
|
||||
shlibs mentioned above). We'll have to work with upstream in order to
|
||||
solve this problem.
|
||||
Another lintian error that needed to be silenced was related to the
|
||||
data/midori.swf file, present at the original tarball. This file is
|
||||
used just for testing (i.e., it is not installed in the system), and
|
||||
is actually generated using the png2swf utility (from the swftools
|
||||
package), which means it can be verified.
|
||||
* Rewrite manpage.
|
||||
The old manpage was too simple and did not cover many of the options
|
||||
supported by Midori on the command line. Fixed that by rewriting it
|
||||
almost completely, including many missing options, updating dates and
|
||||
author, and improving the formatting.
|
||||
|
||||
-- Sergio Durigan Junior <sergiodj@sergiodj.net> Tue, 15 Sep 2015 12:37:55 -0400
|
||||
|
||||
midori (0.4.3+dfsg-0.2) unstable; urgency=medium
|
||||
|
||||
* Non-maintainer upload.
|
||||
* Drop debian/presubj.in as the webkit text browser
|
||||
GtkLauncher is no longer packaged. (Closes: #759959)
|
||||
|
||||
-- Neil Williams <codehelp@debian.org> Thu, 06 Nov 2014 14:04:07 +0000
|
||||
|
||||
midori (0.4.3+dfsg-0.1) unstable; urgency=low
|
||||
|
||||
* Non-maintainer upload
|
||||
* Repack to extract waf script (Closes: 645191)
|
||||
* debian/waf-unpack
|
||||
- add to describe how to extract waf script
|
||||
* debian/rules
|
||||
- add get-orig-source target
|
||||
|
||||
-- Koichi Akabe <vbkaisetsu@gmail.com> Sat, 24 Nov 2012 17:33:35 +0900
|
||||
|
||||
midori (0.4.3-1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Mon, 19 Dec 2011 00:26:46 +0100
|
||||
|
||||
midori (0.4.2-1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
* debian/midori.{preinst,postinst,postrm}:
|
||||
- handle adblock configuration file rename.
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Mon, 14 Nov 2011 14:26:25 +0100
|
||||
|
||||
midori (0.4.1-2) unstable; urgency=low
|
||||
|
||||
* debian/control:
|
||||
- update libwebkitgtk-dev build-dep to 1.4.3
|
||||
* As a side effect, the rebuild against webkit 1.6.1 fix midori crashing
|
||||
because of missing webkit_web_view_get_selected_text() closes: #646198
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Sat, 22 Oct 2011 14:46:34 +0200
|
||||
|
||||
midori (0.4.1-1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
- fix middle click on back/forward button. closes: #644840
|
||||
- correctly clear private data on quit when asked. closes: #644658
|
||||
* debian/patches:
|
||||
- 0001-Fix-for-Bug-819688 dropped, included upstream.
|
||||
* debian/control:
|
||||
- drop libjs-mootools from depends, it's not needed anymore.
|
||||
* debian/rules:
|
||||
- don't remove mootools.js since it's not even shipped anymore.
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Mon, 10 Oct 2011 08:24:46 +0200
|
||||
|
||||
midori (0.4.0-2) unstable; urgency=low
|
||||
|
||||
* debian/patches:
|
||||
- 0001-Fix-for-Bug-819688 added, correctly restore tab panel when needed.
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Tue, 06 Sep 2011 09:30:33 +0200
|
||||
|
||||
midori (0.4.0-1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
* debian/control:
|
||||
- bump webkit build-dep to 1.1.17.
|
||||
- bump valac build-dep to 0.10.
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Tue, 02 Aug 2011 09:44:09 +0200
|
||||
|
||||
midori (0.3.6-2) unstable; urgency=low
|
||||
|
||||
* debian/rules:
|
||||
- don't install upstream changelog twice. closes: #614692
|
||||
* debian/Debian-config:
|
||||
- update homepage to point to faq.html.
|
||||
* debian/control:
|
||||
- build-dep on libwebkitgtk-dev instead of libwebkit-dev.
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Tue, 26 Jul 2011 00:24:23 +0200
|
||||
|
||||
midori (0.3.6-1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
* debian/control:
|
||||
- update vcs info.
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Mon, 16 May 2011 08:32:33 +0200
|
||||
|
||||
midori (0.3.5-1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
* debian/control:
|
||||
- add myself to uploaders...
|
||||
- update standards version to 3.9.2.
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Mon, 02 May 2011 21:50:53 +0200
|
||||
|
||||
midori (0.3.3-0.1) unstable; urgency=low
|
||||
|
||||
* Non-maintainer upload.
|
||||
* New upstream release.
|
||||
* debian/rules:
|
||||
- install ChangeLog file as changelog and remove the one installed by make
|
||||
install.
|
||||
* debian/control:
|
||||
- drop dpkg PreDepends.
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Tue, 15 Mar 2011 22:36:00 +0100
|
||||
|
||||
midori (0.3.2-0.1) unstable; urgency=low
|
||||
|
||||
* Non-maintainer upload.
|
||||
* New upstream release.
|
||||
- fix bookmarks multiplication. closes: #613739
|
||||
* debian/patches:
|
||||
- 0001-Only-no-adblock-if-main-frame-in-provisional-state dropped, included
|
||||
upstream.
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Sun, 20 Feb 2011 10:50:11 +0100
|
||||
|
||||
midori (0.3.0-1.3) unstable; urgency=low
|
||||
|
||||
* Non-maintainer upload.
|
||||
* debian/control:
|
||||
- replace hardening-includes build-dep by hardening-wrapper.
|
||||
* debian/rules:
|
||||
- enable hardening.
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Fri, 04 Feb 2011 09:01:07 +0100
|
||||
|
||||
midori (0.3.0-1.2) unstable; urgency=low
|
||||
|
||||
* Non-maintainer upload.
|
||||
* debian/patches:
|
||||
- 0001-Only-no-adblock-if-main-frame-in-provisional-state added, fix
|
||||
adblock extension. closes: #611682
|
||||
* debian/rules:
|
||||
- remove .lock-script in clean target.
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Wed, 02 Feb 2011 21:01:25 +0100
|
||||
|
||||
midori (0.3.0-1.1) unstable; urgency=low
|
||||
|
||||
* Non-maintainer upload.
|
||||
* New upstream release.
|
||||
* debian/rules:
|
||||
- pick {C,LD}FLAGS from dpkg-buildflags.
|
||||
- add -Wl,-z,defs -Wl,--as-needed to LDFLAGS.
|
||||
- add hardening flags to {C,LD}FLAGS.
|
||||
* debian/rules:
|
||||
- remove waf stuff, midori waf has been updated so it's no longer needed
|
||||
to dynamically patch waf for HPPA.
|
||||
- install $(DISTRO)-config to /etc/xdg/midori to tune the default homepage
|
||||
- add -O1 to LDFLAGS.
|
||||
* debian/{Ubuntu,Debian}-config added, with default homepage setting.
|
||||
* debian/patches:
|
||||
- add-debian-search refreshed.
|
||||
- fix-serial-build dropped thanks to waf upgrade in midori.
|
||||
* debian/control:
|
||||
- drop quilt build-dep, useless now.
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Mon, 31 Jan 2011 17:49:21 +0100
|
||||
|
||||
midori (0.2.7-1.1) unstable; urgency=low
|
||||
|
||||
* Non-maintainer upload.
|
||||
|
||||
[Ryan Niebur]
|
||||
* New Upstream Version (Closes: #582213)
|
||||
- fixes segfault (Closes: #579118)
|
||||
- correct link to FAQ (Closes: #582512)
|
||||
* refresh patches
|
||||
* update copyright
|
||||
* use dpkg-maintscript-helper to remove old config file
|
||||
/etc/midori/extensions/libadblock.so (Closes: #573208)
|
||||
|
||||
[Yves-Alexis Perez]
|
||||
* New 2.7 upstream release.
|
||||
* debian/watch edited to correctly track upstream versions.
|
||||
* debian/rules:
|
||||
- use --fail-missing in dh_install
|
||||
* debian/control:
|
||||
- add build-dep on valac to build certain extensions.
|
||||
- update standards version to 3.9.1
|
||||
|
||||
-- Yves-Alexis Perez <corsac@debian.org> Tue, 17 Aug 2010 22:11:21 +0200
|
||||
|
||||
midori (0.2.4-3) unstable; urgency=low
|
||||
|
||||
* don't run the tests
|
||||
* add debian/source/format
|
||||
* fix building in Serial mode (on HPPA)
|
||||
|
||||
-- Ryan Niebur <ryan@debian.org> Sun, 18 Apr 2010 23:41:50 -0700
|
||||
|
||||
midori (0.2.4-2) unstable; urgency=low
|
||||
|
||||
* use a patched waf for hppa, thanks to Jakub Wilk (Closes: #559989)
|
||||
|
||||
-- Ryan Niebur <ryan@debian.org> Mon, 29 Mar 2010 00:39:30 -0700
|
||||
|
||||
midori (0.2.4-1) unstable; urgency=low
|
||||
|
||||
* New Upstream Version
|
||||
- update d/copyright
|
||||
- handles files in current dir correctly (Closes: #565329)
|
||||
* use bundled waf again (Closes: 571709)
|
||||
* set Standards-Version to 3.8.4
|
||||
|
||||
-- Ryan Niebur <ryan@debian.org> Sun, 07 Mar 2010 22:28:54 -0800
|
||||
|
||||
midori (0.2.2-1) unstable; urgency=low
|
||||
|
||||
* New Upstream Version (Closes: #556184, #558339)
|
||||
- fixes local uri handling (Closes: #560866, #550844)
|
||||
- move libnotify from Recommends to Build-Deps to follow upstream
|
||||
- update debian/copyright to match upstream changes
|
||||
- fixes handling of URLs like "some.url?%00" (Closes: #561451)
|
||||
- running twice doesn't crash the browser (Closes: #514435)
|
||||
- Ctrl-w on last tab now closes it but still not the browser
|
||||
(Closes: #545251)
|
||||
- Ctrl-u in urlbar with emacs key binding theme works (Closes: #538327)
|
||||
* move libjs-mootools to Recommends, it's not required (Closes:
|
||||
#547584)
|
||||
* tell the user to report the bug against libwebkit-1.0-2 if they
|
||||
reproduce it in the Webkit test browser. Figure out the package name
|
||||
and the path to GtkLauncher automagically during build. (Closes:
|
||||
#562501)
|
||||
* switch to system waf
|
||||
- the FTBFS #559989 is no longer the fault of anything in my package,
|
||||
and I've set #561130 in the BTS to affect midori, so (Closes: #559989)
|
||||
* refresh patch
|
||||
|
||||
-- Ryan Niebur <ryan@debian.org> Thu, 24 Dec 2009 18:30:46 -0800
|
||||
|
||||
midori (0.2.0-1) unstable; urgency=low
|
||||
|
||||
* New Upstream Version
|
||||
(Closes: 551328, 551513)
|
||||
* update debian/copyright
|
||||
* bump libwebkit-dev build-dep to 1.1.15 for adblock (Closes: 546985)
|
||||
* update my email address and remove DMUA field
|
||||
|
||||
-- Ryan Niebur <ryan@debian.org> Sun, 18 Oct 2009 15:44:22 -0700
|
||||
|
||||
midori (0.1.10-1) unstable; urgency=low
|
||||
|
||||
* New upstream release
|
||||
* use mootools.js from the libjs-mootools package
|
||||
|
||||
-- Ryan Niebur <ryanryan52@gmail.com> Tue, 15 Sep 2009 22:46:55 -0700
|
||||
|
||||
midori (0.1.9-1) unstable; urgency=low
|
||||
|
||||
* fix watch file, thanks to Rogério Brito
|
||||
* New Upstream Version (Closes: #541354)
|
||||
- refresh patches
|
||||
- update copyright
|
||||
* fix Homepage field, thanks to Francesco Poli (Closes: #541414)
|
||||
* improve bugs search to work for packages too, thanks to Denis
|
||||
Laxalde for the suggestion (Closes: #542050)
|
||||
* Debian Policy 3.8.3
|
||||
|
||||
-- Ryan Niebur <ryanryan52@gmail.com> Wed, 02 Sep 2009 15:36:37 -0700
|
||||
|
||||
midori (0.1.8-1) unstable; urgency=low
|
||||
|
||||
* New Upstream Version
|
||||
- refresh patches
|
||||
- enable tests
|
||||
- update debian/copyright
|
||||
* Debian Policy 3.8.2
|
||||
|
||||
-- Ryan Niebur <ryanryan52@gmail.com> Sat, 01 Aug 2009 09:07:30 -0700
|
||||
|
||||
midori (0.1.7-1) unstable; urgency=low
|
||||
|
||||
* New Upstream Version
|
||||
* adopt package: set myself as maintainer, remove uploaders (Closes: #528731)
|
||||
* rearrange the debian/rules file
|
||||
* use xvfb for tests, but disable them, they don't work right
|
||||
* use 'dh --with quilt' for patching instead of including
|
||||
/usr/share/quilt/quilt.make
|
||||
* fix format of debian/copyright
|
||||
* build dep on debhelper 7.0.50 instead of 7.2
|
||||
* add debian bts to the list of searches, thanks to Giuseppe for the
|
||||
patch (Closes: #525991)
|
||||
* refresh patches
|
||||
* change the default-homepage patch to use the files in debian/config/
|
||||
to set the default homepage based on whether it's debian, ubuntu,
|
||||
etc (second half of ubuntu diff)
|
||||
* also set a priority number for the alternative in the distro config
|
||||
file. This sets it to 50 for debian, and 39 for ubuntu (just under
|
||||
firefox). This addresses the other half of the ubuntu diff.
|
||||
* add recommends on libnotify1
|
||||
* update copyright information
|
||||
* remove extra file, debian/patches/0001-Don-t-expressly-use-libkatze-
|
||||
in-extensions-to-avoid.patch
|
||||
* remove some old todo items from debian/TODO
|
||||
|
||||
-- Ryan Niebur <ryanryan52@gmail.com> Fri, 29 May 2009 20:31:09 -0700
|
||||
|
||||
midori (0.1.6-1) experimental; urgency=low
|
||||
|
||||
* New upstream release (Closes: #525471).
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com> Sat, 25 Apr 2009 11:09:59 +1000
|
||||
|
||||
midori (0.1.5-1) experimental; urgency=low
|
||||
|
||||
* New upstream release (Closes: #522549).
|
||||
* Cherry-pick -fPIC fix from upstream's git and remove previous
|
||||
kludge from debian/rules (Closes: #518281).
|
||||
* Don't allow linking with incompatibly old libsoup (Closes: #522436).
|
||||
* Use new "debug" section for midori-dbg.
|
||||
* As Midori is still immature, reduce its priority as an x-www-browser
|
||||
alternatives. Mainly this is to keep Ubuntu's iceweasel users happy.
|
||||
|
||||
Long-term, I should collaborate with the other x-www-browser providers
|
||||
to agree on a numbering system (e.g. by popcon popularity). Currently
|
||||
it is as follows:
|
||||
|
||||
20 conkeror, 30 chimera2, 50 dillo, 50 midori, 69 xlinks2,
|
||||
70 iceweasel, 70 kazehakase, 85 epiphany-gecko, 100 konqueror,
|
||||
100 netsurf, 120 galeon
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com> Sun, 05 Apr 2009 14:07:42 +1000
|
||||
|
||||
midori (0.1.4-2) experimental; urgency=low
|
||||
|
||||
* Always use -fPIC. (Closes: #518281).
|
||||
* Force rebuild with newer dependencies, to see what happens.
|
||||
The next upstream release will require these version bumps anyway.
|
||||
|
||||
* Bump libsoup dependency to 2.25.2.
|
||||
* Bump webkit dependency to 1.1 (Closes: #519854, #519123).
|
||||
* Bump libunique dependency to 1.0.6 (Closes: #509801).
|
||||
Note that 1.0.2 should work: only 1.0.4 is bad.
|
||||
|
||||
* Reintroduce quilt while we wait for the 3.0 source format.
|
||||
* Add a Debian search to the default search list (Closes: #520381).
|
||||
* Make the homepage a local file. See patch header for rationale.
|
||||
|
||||
* Use new dh 7.2 "overrides" style.
|
||||
* Update copyright file.
|
||||
* Remove stale CDBS dependency.
|
||||
* Bump standards version to 3.8.1. No changes necessary.
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com> Sat, 21 Mar 2009 21:39:05 +1100
|
||||
|
||||
midori (0.1.4-1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
* Use dh(1).
|
||||
* New dependency (libidn11-dev) and undependency (libhildon-1-dev).
|
||||
* Install /etc/xdg/midori/search.
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com> Mon, 09 Mar 2009 22:29:12 +1100
|
||||
|
||||
midori (0.1.2-1) unstable; urgency=low
|
||||
|
||||
[ Trent W. Buck ]
|
||||
* New upstream release (Closes: #512788).
|
||||
Paraphrasing upstream's blog post:
|
||||
|
||||
* Support for bookmarklets (javascript in bookmarks).
|
||||
* Links with target=_blank now work (opening a new tab).
|
||||
* With recent versions of libsoup and webkit, cookies can persist
|
||||
between sessions.
|
||||
* Preferences or bookmarks are saved to disk as they are changed.
|
||||
* The first time Midori is run after a crash, it will first
|
||||
display a "rescue" dialog allowing preferences to be edited or
|
||||
scripts disabled. This is intended for when a script causes
|
||||
Midori to crash as it boots, which would otherwise require
|
||||
editing config files by hand to fix.
|
||||
* Significant speed and capacity improvements to browsing history.
|
||||
* Appease lintian regarding various warnings.
|
||||
* Update feature list in Description.
|
||||
* Make me the Maintainer and William and Uploader.
|
||||
* Rewrite manpage.
|
||||
|
||||
[ William Pitcock ]
|
||||
* Fix lintian source warnings concerning midori-dbg.
|
||||
* Update my e-mail address.
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com> Sat, 31 Jan 2009 14:24:16 +1100
|
||||
|
||||
midori (0.1.1-1) unstable; urgency=low
|
||||
|
||||
* New upstream release. From upstream's blog post:
|
||||
|
||||
* Integration of history completion in the location entry.
|
||||
* libSoup is used in place of GIO for loading icons, viewing
|
||||
sources, saving files, and for the first time icons are actually
|
||||
cached on disk.
|
||||
* The side panel gained a compact mode to take up considerably
|
||||
less space. Bookmarks in the toolbar finally match the menu and
|
||||
the panel at any time.
|
||||
* The Web Inspector [in] WebKitGtk is now supported.
|
||||
* The beginning of unit testing.
|
||||
* The ground work for an extension interface has been done,
|
||||
extension modules can be written in C at the moment. Bindings to
|
||||
Lua and/ or Python are planned for the future. Note that the
|
||||
side panel doesn't currently expose the extension management,
|
||||
but the Page holder was actually rewritten as one of the example
|
||||
extensions.
|
||||
|
||||
* Change build dependency to libsoup (from gvfs and gtksourceview).
|
||||
* Rewrite manpage and package description.
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com> Sat, 13 Dec 2008 18:00:06 +1100
|
||||
|
||||
midori (0.1.0-1) unstable; urgency=low
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com> Fri, 24 Oct 2008 15:42:29 +1100
|
||||
|
||||
midori (0.0.21+23-1) UNRELEASED; urgency=low
|
||||
|
||||
* Upstream snapshot.
|
||||
* TODO: .po issue fixed upstream (FS: 114).
|
||||
* TODO: Help > Contents now browses to FAQ (FS: 112).
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com> Thu, 18 Sep 2008 11:07:19 +1000
|
||||
|
||||
midori (0.0.21-1) unstable; urgency=low
|
||||
|
||||
* New upstream release (Closes: #497647).
|
||||
* control: add new upstream dependencies.
|
||||
* control: Bump Standards-Version to 3.8.0 (no changes). We were
|
||||
actually already using the Homepage header field.
|
||||
* control, compat, rules: bump debhelper to 7, because I'm a bit
|
||||
paranoid about claiming to build with dh4.1. Fix dh_strip args in
|
||||
rules file since the semantics changed in dh5.
|
||||
* README.Debian: discuss "missing" icons.
|
||||
* control: recommend gnome-icon-theme (Closes: #494061).
|
||||
* control: fix homepage link (Closes: #492687).
|
||||
* control: provide www-browser (Closes: #476178).
|
||||
Not adding www-browser alternative since other X-based browsers seem
|
||||
to only set the x-www-browser alternative.
|
||||
* watch: fixed. Upstream tarballs now hosted by XFCE, yay!
|
||||
* presubj, install: have users try GtkLauncher before reporting bugs.
|
||||
* midori.menu: add (Closes: #466588).
|
||||
* midori.install: install .mo and .png files!
|
||||
* control: allow DM uploads, since I'll soon be a DM.
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com> Mon, 15 Sep 2008 22:10:35 +1000
|
||||
|
||||
midori (0.0.19-2) unstable; urgency=low
|
||||
|
||||
* Add build dependency on python (for ./waf).
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com> Wed, 13 Aug 2008 12:30:27 +1000
|
||||
|
||||
midori (0.0.19-1) unstable; urgency=low
|
||||
|
||||
* New upstream release
|
||||
* Upstream uses waf now. Dirty hacks to make CDBS do waf.
|
||||
* Drop the homepage patch, since it wasn't being unapplied correctly and
|
||||
it doesn't really accomplish anything like the desired behaviour in
|
||||
debian/TODO.
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com> Sun, 10 Aug 2008 22:18:52 +1000
|
||||
|
||||
midori (0.0.18-2) unstable; urgency=low
|
||||
|
||||
* Change release to unstable, per William Pitcock's request.
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com> Sun, 08 Jun 2008 13:32:23 +1000
|
||||
|
||||
midori (0.0.18-1) experimental; urgency=low
|
||||
|
||||
* New upstream release
|
||||
* debian/control (Build-Depends): accommodate name change in webkit.
|
||||
* debian/control (Build-Depends): appease lintian by dropping -1.
|
||||
* debian/control (Build-Depends): add libxml-parser-perl.
|
||||
* debian/control (Homepage): add.
|
||||
* debian/control (Maintainer, Uploaders): change (Closes: #480026).
|
||||
* debian/copyright: appease lintian by citing copyright verbatim.
|
||||
* debian/midori.prerm, debian/midori.postrm: tweak cases where
|
||||
update-alternatives is called, hopefully making them more correct.
|
||||
* debian/rules: remove config.log to appease lintian.
|
||||
* debian/watch: add (Closes: #482002).
|
||||
|
||||
-- Trent W. Buck <trentbuck@gmail.com> Sat, 07 Jun 2008 15:00:06 +1000
|
||||
|
||||
midori (0.0.17-1) experimental; urgency=low
|
||||
|
||||
* New upstream release. Closes: #457392
|
||||
- Fix issues with the preference dialog. Closes: #454206
|
||||
* Provide an alternative for x-www-browser. Closes: #454607
|
||||
* Update Standards-Version.
|
||||
|
||||
-- Emanuele Rocca <ema@debian.org> Thu, 07 Feb 2008 11:11:14 +0100
|
||||
|
||||
midori (0.0.13-1) experimental; urgency=low
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Emanuele Rocca <ema@debian.org> Tue, 04 Dec 2007 19:41:39 +0100
|
||||
|
||||
midori (0.0.12-1) experimental; urgency=low
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Emanuele Rocca <ema@debian.org> Fri, 30 Nov 2007 18:41:48 +0100
|
||||
|
||||
midori (0.0.11-1) experimental; urgency=low
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Emanuele Rocca <ema@debian.org> Fri, 16 Nov 2007 18:56:50 +0100
|
||||
|
||||
midori (0.0.10-1) experimental; urgency=low
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Emanuele Rocca <ema@debian.org> Sat, 13 Oct 2007 10:45:09 +0200
|
||||
|
||||
midori (0.0.8-1) experimental; urgency=low
|
||||
|
||||
* New upstream release
|
||||
* Patched to build correctly against webkit 0~svn26044-1
|
||||
* libwebkitgdk has been renamed to libwebkitgtk, build dependency updated
|
||||
accordingly
|
||||
|
||||
-- Emanuele Rocca <ema@debian.org> Tue, 09 Oct 2007 22:42:25 +0200
|
||||
|
||||
midori (0.0.7-1) experimental; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
* Added minori-dbg binary package.
|
||||
* Improved long description.
|
||||
|
||||
-- Emanuele Rocca <ema@debian.org> Sat, 15 Sep 2007 14:01:58 +0200
|
||||
|
||||
midori (0.0.6-1) experimental; urgency=low
|
||||
|
||||
* Initial release. Closes: #441838
|
||||
|
||||
-- Emanuele Rocca <ema@debian.org> Mon, 10 Sep 2007 23:37:01 +0200
|
2
debian/clean
vendored
Normal file
2
debian/clean
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
midori/midori-debian.h
|
||||
debian/midori.postinst
|
1
debian/compat
vendored
Normal file
1
debian/compat
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
9
|
2
debian/config/Debian.conf
vendored
Normal file
2
debian/config/Debian.conf
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
DEBIAN_DISTRO_DEFAULT_HOMEPAGE "file:///usr/share/doc/midori/user/midori.html"
|
||||
DEBIAN_WWW_ALTERNATIVES_PRIORITY 50
|
2
debian/config/Ubuntu.conf
vendored
Normal file
2
debian/config/Ubuntu.conf
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
DEBIAN_DISTRO_DEFAULT_HOMEPAGE "file:///usr/share/ubuntu-artwork/home/index.html"
|
||||
DEBIAN_WWW_ALTERNATIVES_PRIORITY 39
|
74
debian/control
vendored
Normal file
74
debian/control
vendored
Normal file
|
@ -0,0 +1,74 @@
|
|||
Source: midori
|
||||
Section: web
|
||||
Priority: optional
|
||||
Maintainer: Sergio Durigan Junior <sergiodj@sergiodj.net>
|
||||
Build-Depends: debhelper (>= 9),
|
||||
cmake,
|
||||
valac,
|
||||
lsb-release,
|
||||
libwebkitgtk-dev (>= 1.8.1),
|
||||
libgtk2.0-dev (>= 2.24.0),
|
||||
libglib2.0-dev,
|
||||
libsoup-gnome2.4-dev (>= 2.27.90),
|
||||
libxml2-dev (>= 2.6),
|
||||
libsqlite3-dev (>= 3.6.19),
|
||||
libjavascriptcoregtk-1.0-dev,
|
||||
libnotify-dev,
|
||||
libgcr-3-dev (>= 2.32),
|
||||
librsvg2-bin,
|
||||
intltool,
|
||||
libunique-dev (>= 1.0.6),
|
||||
libzeitgeist-2.0-dev,
|
||||
# Necessary for 'make check'
|
||||
xvfb,
|
||||
xauth,
|
||||
xfonts-base,
|
||||
libxss-dev
|
||||
Standards-Version: 3.9.6
|
||||
Homepage: http://www.midori-browser.org
|
||||
Vcs-Git: git://git.debian.org/collab-maint/midori.git
|
||||
Vcs-Browser: http://git.debian.org/?p=collab-maint/midori.git;a=summary
|
||||
|
||||
Package: midori
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Recommends: gnome-icon-theme
|
||||
Provides: www-browser
|
||||
# For http://bugs.debian.org/522436 (missing symbols):
|
||||
Conflicts: libsoup2.4-1 (<< 2.25.2)
|
||||
Description: fast, lightweight graphical web browser
|
||||
Midori is a lightweight web browser based on WebKit.
|
||||
.
|
||||
Its features include:
|
||||
.
|
||||
* Full integration with GTK+2.
|
||||
* Fast rendering with WebKit.
|
||||
* Tabs, windows and session management.
|
||||
* Flexibly configurable Web Search.
|
||||
* User scripts and user styles support.
|
||||
* Straightforward bookmark management.
|
||||
* Customizable and extensible interface.
|
||||
* Support for extensions (written in C).
|
||||
* Custom context menu actions.
|
||||
|
||||
Package: midori-dbg
|
||||
Architecture: any
|
||||
Priority: extra
|
||||
Section: debug
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, midori (= ${binary:Version})
|
||||
Description: fast, lightweight graphical web browser (debug symbols)
|
||||
Midori is a lightweight web browser based on WebKit.
|
||||
.
|
||||
Its features include:
|
||||
.
|
||||
* Full integration with GTK+2.
|
||||
* Fast rendering with WebKit.
|
||||
* Tabs, windows and session management.
|
||||
* Flexibly configurable Web Search.
|
||||
* User scripts and user styles support.
|
||||
* Straightforward bookmark management.
|
||||
* Customizable and extensible interface.
|
||||
* Support for extensions (written in C).
|
||||
* Custom context menu actions.
|
||||
.
|
||||
This package contains the debugging symbols for midori.
|
276
debian/copyright
vendored
Normal file
276
debian/copyright
vendored
Normal file
|
@ -0,0 +1,276 @@
|
|||
Format-Specification:
|
||||
http://wiki.debian.org/Proposals/CopyrightFormat?action=recall&rev=227
|
||||
Upstream-Name: midori
|
||||
Upstream-Maintainer: Christian Dywan <christian@twotoasts.de>
|
||||
Upstream-Source: http://goodies.xfce.org/releases/midori/
|
||||
|
||||
Files: *
|
||||
Copyright: © 2007-2010, Christian Dywan <christian@twotoasts.de>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: tests/magic-uri.c
|
||||
Copyright: © 2007-2009, Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2009 Alexander Butenko <a.butenka@gmail.com>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: midori/midori-view.c
|
||||
Copyright: Copyright (C) 2007-2010 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2009 Jean-François Guchens <zcx000@gmail.com>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: data/speeddial-head.html
|
||||
Copyright: Copyright (C) 2009 Jean-François Guchens <zcx000@gmail.com>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: data/mootools.js
|
||||
Copyright: Copyright (c) 2006-2009 Valerio Proietti
|
||||
License: MIT
|
||||
|
||||
Files: extensions/addons.c
|
||||
Copyright: Copyright (C) 2008 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2008-2010 Arno Renevier <arno@renevier.net>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: colorful-tabs
|
||||
Copyright: Copyright (C) 2009 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2010 Samuel Creshal <creshal@arcor.de>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: extensions/adblock.c
|
||||
Copyright: Copyright (C) 2009-2010 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2009 Alexander Butenko <a.butenka@gmail.com>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: extensions/cookie-manager.c extensions/cookie-manager/*
|
||||
Copyright: Copyright (C) 2009 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: extensions/feed-panel/*
|
||||
Copyright: Copyright (C) 2009-2010 Dale Whittaker <dayul@users.sf.net>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: debian/*
|
||||
Copyright: © 2007, Emanuele Rocca <ema@debian.org>
|
||||
© 2008, Trent W. Buck <trentbuck@gmail.com>
|
||||
2009, Ryan Niebur <ryanryan52@gmail.com>
|
||||
License: expat
|
||||
|
||||
Files: po/gl.po
|
||||
Copyright: Copyright (C) 2008, 2009 Miguel Anxo Bouzada.
|
||||
Copyright (C) 2009-2010 Leandro Regueiro.
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: po/sv.po
|
||||
Copyright: Copyright (C) 2008, 2009 Free Software Foundation, Inc.
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: katze/katze-http-cookies.c
|
||||
Copyright: Copyright (C) 2008-2009 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2008 Xan Lopez <xan@gnome.org>
|
||||
Copyright (C) 2008 Dan Winship <danw@gnome.org>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: katze/katze-arrayaction.c
|
||||
Copyright: Copyright (C) 2008-2009 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2009 Enrico Tröger <enrico.troeger@uvena.de>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: midori/socket.c
|
||||
Copyright: Copyright 1999-2008 Hiroyuki Yamamoto
|
||||
Copyright 2006-2009 Enrico Tröger <enrico.troeger@uvena.de>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: katze/katze-utils.c
|
||||
Copyright: Copyright (C) 2007-2009 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
Copyright 2000 Red Hat, Inc.
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: katze/katze-utils.h
|
||||
Copyright: Copyright (C) 2008-2009 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2009 Dale Whittaker <dayul@users.sf.net
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: midori/midori-browser.c
|
||||
Copyright: Copyright (C) 2007-2010 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2008 Dale Whittaker <dayul@users.sf.net>
|
||||
Copyright (C) 2009 Jérôme Geulfucci <jeromeg@xfce.org>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: extensions/formhistory.c
|
||||
Copyright: Copyright (C) 2009 Alexander Butenko <a.butenka@gmail.com>
|
||||
Copyright (C) 2009 Christian Dywan <christian@twotoasts.de>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: katze/katze-preferences.c
|
||||
Copyright: Copyright (C) 2007-2009 Christian Dywan <christian@twotoasts.de>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: katze/katze-preferences.h
|
||||
Copyright: Copyright (C) 2008-2009 Christian Dywan <christian@twotoasts.de>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: katze/katze-scrolled.c, katze/katze-scrolled.h
|
||||
Copyright: Copyright (C) 2007 Henrik Hedberg <hhedberg@innologies.fi>
|
||||
Copyright (C) 2009 Nadav Wiener <nadavwr@yahoo.com>
|
||||
Copyright (C) 2009 Christian Dywan <christian@twotoasts.de>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: midori/midori-extension.c
|
||||
Copyright: Copyright (C) 2008-2009 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2009 Dale Whittaker <dayul@users.sf.net>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: midori/midori-locationaction.c
|
||||
Copyright: Copyright (C) 2008-2010 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2008-2010 Dale Whittaker <dayul@users.sf.net>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: midori/gtkiconentry.?
|
||||
Copyright: © 2004, Christian Hammond
|
||||
© 2008, Cody Russell <bratsche@gnome.org>
|
||||
(C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
Modified by the GTK+ Team and others 1997-2000
|
||||
License: LGPL-2+
|
||||
|
||||
Files: extensions/mouse-gestures.c
|
||||
Copyright: Copyright (C) 2009 Matthias Kruk <mkruk@matthiaskruk.de>
|
||||
Copyright (C) 2009-2010 Christian Dywan <christian@twotoasts.de>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: extensions/status-clock.c
|
||||
Copyright: Copyright (C) 2010 Arno Renevier <arno@renevier.net>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: extensions/tab-switcher.c
|
||||
Copyright: Copyright (C) 2009 André Stösel <Midori-Plugin@PyIT.de>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: midori/midori.vapi
|
||||
Copyright: Copyright (C) 2010 Christian Dywan <christian@twotoasts.de>
|
||||
License: expat
|
||||
|
||||
Files: tools/check-style
|
||||
Copyright: Copyright (C) 2010 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2010 Arno Renevier <arno@renevier.net>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: tools/midori-dev
|
||||
Copyright: Copyright (C) 2010 David Mohr <david@mcbf.net>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: extensions/web-cache.c
|
||||
Copyright: Copyright (C) 2009 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2009 Alexander Butenko <a.butenka@gmail.com>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: icons/scalable/extension.svg
|
||||
Copyright: © 2008, Nancy Runge <nancy@twotoasts.de>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: midori/sokoke.c
|
||||
Copyright: Copyright (C) 2009 Dale Whittaker <dayul@users.sf.net>
|
||||
Copyright (C) 2009 Alexander Butenko <a.butenka@gmail.com>
|
||||
Copyright (C) 2009 Mario Sanchez Prada <msanchez@igalia.com>
|
||||
Copyright (C) 2009 Dan Winship <danw@gnome.org>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: extensions/toolbar-editor.c
|
||||
Copyright: Copyright (C) 2009 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: README, TRANSLATE, INSTALL, TODO, HACKING, ChangeLog,
|
||||
wscript, */wscript_build, docs/user/midori.css
|
||||
Copyright: © 2007, Christian Dywan <christian@twotoasts.de>
|
||||
License: expat
|
||||
|
||||
Files: waf
|
||||
Copyright: © 2005, Thomas Nagy
|
||||
License: BSD-C3
|
||||
|
||||
License: LGPL-2.1+
|
||||
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 /usr/share/common-licenses/LGPL-2.1 for the full license text.
|
||||
|
||||
License: LGPL-2+
|
||||
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 of the
|
||||
License, or (at your option) any later version.
|
||||
.
|
||||
This library is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
.
|
||||
See /usr/share/common-licenses/LGPL-2 for the full license text.
|
||||
|
||||
License: expat
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
License: BSD-C3
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. The name of the author may not be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
License: MIT
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
.
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
7
debian/gbp.conf
vendored
Normal file
7
debian/gbp.conf
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
[import-orig]
|
||||
upstream-branch=upstream-unstable
|
||||
debian-branch=master
|
||||
|
||||
[import-dsc]
|
||||
upstream-branch=upstream-unstable
|
||||
debian-branch=master
|
123
debian/midori.1
vendored
Normal file
123
debian/midori.1
vendored
Normal file
|
@ -0,0 +1,123 @@
|
|||
.TH MIDORI "1" "September 2015" "midori 0.5.11" "User commands"
|
||||
|
||||
.SH NAME
|
||||
midori \- fast and lightweight Web Browser.
|
||||
|
||||
.SH SYNOPSIS
|
||||
|
||||
.PP
|
||||
\fBmidori\fR [OPTION...] [URL]
|
||||
|
||||
.SH DESCRIPTION
|
||||
\fBmidori\fR is a lightweight Web Browser.
|
||||
|
||||
.SH OPTIONS
|
||||
.IP
|
||||
.SS "Application Options:"
|
||||
|
||||
.TP
|
||||
\fB\-a\fR \fIADDRESS\fR\fR, \fB\-\-app\fR=\fIADDRESS\fR
|
||||
|
||||
Run \fIADDRESS\fR as a web application.
|
||||
|
||||
.TP
|
||||
\fB\-c\fR \fIFOLDER\fR, \fB\-\-config\fR=\fIFOLDER\fR
|
||||
|
||||
Use \fIFOLDER\fR as configuration folder.
|
||||
|
||||
.TP
|
||||
\fB\-p\fR, \fB\-\-private\fR
|
||||
|
||||
Run Midori in private mode. No changes are saved in this mode.
|
||||
|
||||
.TP
|
||||
\fB\-\-plain\fR
|
||||
|
||||
Plain GTK+ window with WebKit, akin to GtkLauncher.
|
||||
|
||||
.TP
|
||||
\fB\-d\fR, \fB\-\-diagnostic\-dialog\fR
|
||||
|
||||
Show a diagnostic dialog.
|
||||
|
||||
.TP
|
||||
\fB\-g\fR, \fB\-\-debug\fR
|
||||
|
||||
Run Midori within gdb and save a backtrace on crash. Useful when
|
||||
reporting bugs against the package.
|
||||
|
||||
.TP
|
||||
\fB\-r\fR \fIFILE\fR, \fB\-\-run\fR=\fIFILE\fR
|
||||
|
||||
Run \fIFILE\fR as a JavaScript.
|
||||
|
||||
.TP
|
||||
\fB\-s\fR \fIURI\fR, \fB\-\-snapshot\fR=\fIURI\fR
|
||||
|
||||
Take a snapshot of \fIURI\fR.
|
||||
|
||||
.TP
|
||||
\fB\-e\fR \fICOMMAND\fR, \fB\-\-execute\fR=\fICOMMAND\fR
|
||||
|
||||
Run the specified \fICOMMAND\fR. To obtain a list of supported
|
||||
commands, see \fB\-\-help\-execute\fR below.
|
||||
|
||||
.TP
|
||||
\fB\-\-help\-execute\fR
|
||||
|
||||
Print a list of available commands supported by \fB\-\-execute\fR.
|
||||
|
||||
.TP
|
||||
\fB\-V\fR, \fB\-\-version\fR
|
||||
|
||||
Print the version of Midori.
|
||||
|
||||
.TP
|
||||
\fB\-b\fR \fIPATTERN\fR, \fB\-\-block\-uris\fR=\fIPATTERN\fR
|
||||
|
||||
Block URIs according to the regular expression specified in
|
||||
\fIPATTERN\fR.
|
||||
|
||||
.TP
|
||||
\fB\-i\fR \fISECONDS\fR, \fB\-\-inactivity\-reset\fR=\fISECONDS\fR
|
||||
|
||||
Reset Midori after \fISECONDS\fR seconds of inactivity.
|
||||
|
||||
.TP
|
||||
\fB\-\-display\fR=\fIDISPLAY\fR
|
||||
|
||||
X display to use.
|
||||
|
||||
.SS Help Options:
|
||||
|
||||
.TP
|
||||
\-?, \fB\-\-help\fR
|
||||
|
||||
Show help options described above.
|
||||
|
||||
.TP
|
||||
\fB\-\-help\-all\fR
|
||||
|
||||
Show all help options.
|
||||
|
||||
.TP
|
||||
\fB\-\-help\-gtk\fR
|
||||
|
||||
Show GTK+ Options.
|
||||
|
||||
.SH REPORTING BUGS
|
||||
Please report bugs using the Debian BTS <https://bugs.debian.org>.
|
||||
|
||||
.SH AUTHOR
|
||||
\fBMidori\fR is copyright (C) 2007 Christian Dywan.
|
||||
|
||||
.PP
|
||||
This manual page was completely rewritten by Sergio Durigan Junior
|
||||
<sergiodj@sergiodj.net>, based on the previous version by Emanuele
|
||||
Rocca <ema@debian.org>. It was written for the Debian GNU/Linux
|
||||
system but may be used by others.
|
||||
|
||||
.PP
|
||||
Permission is granted to copy, distribute and/or modify this document under the
|
||||
terms of the GNU General Public License, Version 2 or any later version published
|
||||
by the Free Software Foundation.
|
2
debian/midori.docs
vendored
Normal file
2
debian/midori.docs
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
docs/user/*.txt
|
||||
docs/user/*.html
|
1
debian/midori.install
vendored
Normal file
1
debian/midori.install
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
debian/tmp/*
|
37
debian/midori.lintian-overrides
vendored
Normal file
37
debian/midori.lintian-overrides
vendored
Normal file
|
@ -0,0 +1,37 @@
|
|||
# Overrides the warnings given by the following shlibs. These
|
||||
# warnings are wrong because these shlibs are private to the project;
|
||||
# they are actually plugins that Midori offers. For the rationale
|
||||
# behind these overrides, see Debian Policy, section 10.2.
|
||||
unused-shlib-entry-in-control-file libabout 1
|
||||
unused-shlib-entry-in-control-file libadblock 1
|
||||
unused-shlib-entry-in-control-file libaddons 1
|
||||
unused-shlib-entry-in-control-file libapps 1
|
||||
unused-shlib-entry-in-control-file libcolorful-tabs 1
|
||||
unused-shlib-entry-in-control-file libcookie-manager 1
|
||||
unused-shlib-entry-in-control-file libcookie-permissions 1
|
||||
unused-shlib-entry-in-control-file libcopy-tabs 1
|
||||
unused-shlib-entry-in-control-file libdelayed-load 1
|
||||
unused-shlib-entry-in-control-file libdevpet 1
|
||||
unused-shlib-entry-in-control-file libdomain-keys 1
|
||||
unused-shlib-entry-in-control-file libexternal-download-manager 1
|
||||
unused-shlib-entry-in-control-file libfeed-panel 1
|
||||
unused-shlib-entry-in-control-file libflummi 1
|
||||
unused-shlib-entry-in-control-file libformhistory 1
|
||||
unused-shlib-entry-in-control-file libhistory-list 1
|
||||
unused-shlib-entry-in-control-file libmouse-gestures 1
|
||||
unused-shlib-entry-in-control-file libnojs 1
|
||||
unused-shlib-entry-in-control-file libnotes 1
|
||||
unused-shlib-entry-in-control-file libnsplugin-manager 1
|
||||
unused-shlib-entry-in-control-file libopen-with 1
|
||||
unused-shlib-entry-in-control-file libshortcuts 1
|
||||
unused-shlib-entry-in-control-file libstatusbar-features 1
|
||||
unused-shlib-entry-in-control-file libstatus-clock 1
|
||||
unused-shlib-entry-in-control-file libtabby 1
|
||||
unused-shlib-entry-in-control-file libtab-panel 1
|
||||
unused-shlib-entry-in-control-file libtabs-minimized 1
|
||||
unused-shlib-entry-in-control-file libtoolbar-editor 1
|
||||
unused-shlib-entry-in-control-file libtransfers 1
|
||||
unused-shlib-entry-in-control-file libwebmedia-now-playing 1
|
||||
|
||||
package-name-doesnt-match-sonames libmidori-core1
|
||||
non-dev-pkg-with-shlib-symlink usr/lib/libmidori-core.so.0.0.0 usr/lib/libmidori-core.so
|
2
debian/midori.maintscript
vendored
Normal file
2
debian/midori.maintscript
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
mv_conffile /etc/xdg/midori/extensions/libadblock.so/config /etc/xdg/midori/extensions/adblock/config 0.4.1-2
|
||||
rm_conffile /etc/xdg/midori/extensions/libadblock.so 0.4.1-2
|
1
debian/midori.manpages
vendored
Normal file
1
debian/midori.manpages
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
debian/midori.1
|
2
debian/midori.menu
vendored
Normal file
2
debian/midori.menu
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
?package(midori):needs="x11" section="Applications/Network/Web Browsing" \
|
||||
title="Midori" command="midori"
|
13
debian/midori.postinst.base
vendored
Normal file
13
debian/midori.postinst.base
vendored
Normal file
|
@ -0,0 +1,13 @@
|
|||
#!/bin/sh
|
||||
set -e
|
||||
case "$1" in
|
||||
configure)
|
||||
update-alternatives \
|
||||
--install /usr/bin/x-www-browser \
|
||||
x-www-browser /usr/bin/midori DEBIAN_WWW_ALTERNATIVES_PRIORITY \
|
||||
--slave /usr/share/man/man1/x-www-browser.1.gz \
|
||||
x-www-browser.1.gz /usr/share/man/man1/midori.1.gz
|
||||
;;
|
||||
esac
|
||||
#DEBHELPER#
|
||||
exit 0
|
9
debian/midori.prerm
vendored
Normal file
9
debian/midori.prerm
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
#!/bin/sh
|
||||
set -e
|
||||
case "$1" in
|
||||
remove|deconfigure)
|
||||
update-alternatives --remove x-www-browser /usr/bin/midori
|
||||
;;
|
||||
esac
|
||||
#DEBHELPER#
|
||||
exit 0
|
31
debian/midori.shlibs
vendored
Normal file
31
debian/midori.shlibs
vendored
Normal file
|
@ -0,0 +1,31 @@
|
|||
libmidori-core 1 midori
|
||||
libabout 1 midori
|
||||
libadblock 1 midori
|
||||
libaddons 1 midori
|
||||
libapps 1 midori
|
||||
libcolorful-tabs 1 midori
|
||||
libcookie-manager 1 midori
|
||||
libcookie-permissions 1 midori
|
||||
libcopy-tabs 1 midori
|
||||
libdelayed-load 1 midori
|
||||
libdevpet 1 midori
|
||||
libdomain-keys 1 midori
|
||||
libexternal-download-manager 1 midori
|
||||
libfeed-panel 1 midori
|
||||
libflummi 1 midori
|
||||
libformhistory 1 midori
|
||||
libhistory-list 1 midori
|
||||
libmouse-gestures 1 midori
|
||||
libnojs 1 midori
|
||||
libnotes 1 midori
|
||||
libnsplugin-manager 1 midori
|
||||
libopen-with 1 midori
|
||||
libshortcuts 1 midori
|
||||
libstatusbar-features 1 midori
|
||||
libstatus-clock 1 midori
|
||||
libtabby 1 midori
|
||||
libtab-panel 1 midori
|
||||
libtabs-minimized 1 midori
|
||||
libtoolbar-editor 1 midori
|
||||
libtransfers 1 midori
|
||||
libwebmedia-now-playing 1 midori
|
21
debian/patches/add-debian-searches
vendored
Normal file
21
debian/patches/add-debian-searches
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
Index: midori-debian-repo/config/search
|
||||
===================================================================
|
||||
--- midori-debian-repo.orig/config/search
|
||||
+++ midori-debian-repo/config/search
|
||||
@@ -34,3 +34,16 @@ text=Localize text or URL
|
||||
uri=http://translate.google.com/?q=
|
||||
token=gt
|
||||
|
||||
+[Debian Packages]
|
||||
+name=Debian Packages
|
||||
+text=Search Debian Packages
|
||||
+uri=http://packages.debian.org/%s
|
||||
+icon=
|
||||
+token=d
|
||||
+
|
||||
+[Debian Bugs]
|
||||
+name=Debian Bugs
|
||||
+text=Debian Bugs Search
|
||||
+uri=http://bugs.debian.org/%s
|
||||
+icon=
|
||||
+token=dbs
|
1
debian/patches/series
vendored
Normal file
1
debian/patches/series
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
add-debian-searches
|
57
debian/rules
vendored
Executable file
57
debian/rules
vendored
Executable file
|
@ -0,0 +1,57 @@
|
|||
#!/usr/bin/make -f
|
||||
# output every command that modifies files on the build system.
|
||||
#DH_VERBOSE = 1
|
||||
|
||||
DPKG_EXPORT_BUILDFLAGS = 1
|
||||
include /usr/share/dpkg/default.mk
|
||||
|
||||
# Necessary for the configuration file (xdg).
|
||||
DISTRO = $(shell lsb_release -is)
|
||||
CONFIG_FILE = debian/config/$(DISTRO).conf
|
||||
ifneq (0, $(shell test -f $(CONFIG_FILE); echo "$$?"))
|
||||
DISTRO = Debian
|
||||
endif
|
||||
|
||||
%:
|
||||
dh $@ --buildsystem=cmake --builddirectory=_build/
|
||||
|
||||
# Midori uses a "poor man's configure" which only accepts a minimal,
|
||||
# pre-defined set of flags. Therefore, we invoke cmake directly here.
|
||||
override_dh_auto_configure:
|
||||
dh_auto_configure -- \
|
||||
-DCMAKE_INSTALL_PREFIX=/usr \
|
||||
-DCMAKE_INSTALL_SYSCONFDIR=/etc \
|
||||
-DCMAKE_INSTALL_LIBDIR=/usr/lib \
|
||||
..
|
||||
|
||||
# cmake does not emit useful information when compiling the source
|
||||
# files. We use VERBOSE here for that.
|
||||
override_dh_auto_build:
|
||||
dh_auto_build -- VERBOSE=1
|
||||
|
||||
# We have to override 'make check' because it needs to run under
|
||||
# xvfb-run. And some tests still fail.
|
||||
override_dh_auto_test:
|
||||
(cd _build && xvfb-run make check) || true
|
||||
|
||||
override_dh_auto_install:
|
||||
dh_auto_install
|
||||
rm -f debian/tmp/usr/share/doc/midori/COPYING debian/tmp/usr/share/doc/midori/TRANSLATE
|
||||
install -m 0644 debian/$(DISTRO)-config debian/tmp/etc/xdg/midori/config
|
||||
|
||||
# Generate the debuginfo package.
|
||||
override_dh_strip:
|
||||
dh_strip --dbg-package=midori-dbg
|
||||
|
||||
# Updating the alternatives priority
|
||||
PRIORITY = $(shell sed -ne 's/^DEBIAN_WWW_ALTERNATIVES_PRIORITY \([0-9]\+\)/\1/p' $(CONFIG_FILE))
|
||||
|
||||
debian/midori.postinst: debian/midori.postinst.base
|
||||
sed 's/DEBIAN_WWW_ALTERNATIVES_PRIORITY/$(PRIORITY)/g' debian/midori.postinst.base > debian/midori.postinst
|
||||
|
||||
override_dh_installdeb: debian/midori.postinst
|
||||
dh_installdeb
|
||||
|
||||
override_dh_installchangelogs:
|
||||
rm -f debian/midori/usr/share/doc/midori/ChangeLog
|
||||
dh_installchangelogs
|
1
debian/source/format
vendored
Normal file
1
debian/source/format
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
3.0 (quilt)
|
9
debian/source/lintian-overrides
vendored
Normal file
9
debian/source/lintian-overrides
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
# This file is just used for testing, and is not installed with the
|
||||
# package. Moreover, it is generated from a PNG image, using the
|
||||
# following command:
|
||||
#
|
||||
# png2swf -z -j 1 -o data/midori.swf ./icons/16x16/midori.png
|
||||
#
|
||||
# Which means that it can be easily verified. The png2swf command can
|
||||
# be found in the swftools package.
|
||||
midori source: source-is-missing data/midori.swf
|
3
debian/watch
vendored
Normal file
3
debian/watch
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
version=3
|
||||
opts=dversionmangle=s/\+dfsg// \
|
||||
http://archive.xfce.org/src/apps/midori/([\d\.]+)/midori-([\d.]+).tar.bz2
|
14
docs/api/CMakeLists.txt
Normal file
14
docs/api/CMakeLists.txt
Normal file
|
@ -0,0 +1,14 @@
|
|||
# Copyright (C) 2013 Olivier Duchateau
|
||||
|
||||
include (GtkDoc)
|
||||
|
||||
if (GTKDOC_FOUND)
|
||||
list (APPEND MODULES "katze" "midori")
|
||||
foreach (MOD ${MODULES})
|
||||
if (EXISTS "${CMAKE_SOURCE_DIR}/${MOD}")
|
||||
gtkdoc (${MOD})
|
||||
endif ()
|
||||
endforeach ()
|
||||
else ()
|
||||
message (FATAL_ERROR "gtk-doc not found")
|
||||
endif ()
|
|
@ -1,35 +0,0 @@
|
|||
#! /usr/bin/env python
|
||||
# WAF build script for midori
|
||||
# This file is licensed under the terms of the expat license, see the file EXPAT.
|
||||
|
||||
import pproc as subprocess
|
||||
import os
|
||||
|
||||
for module in ('midori', 'katze'):
|
||||
try:
|
||||
if not os.access ('_build_', os.F_OK):
|
||||
Utils.check_dir ('_build_')
|
||||
if not os.access ('_build_/docs', os.F_OK):
|
||||
Utils.check_dir ('_build_/docs')
|
||||
if not os.access ('_build_/docs/api', os.F_OK):
|
||||
Utils.check_dir ('_build_/docs/api')
|
||||
subprocess.call (['gtkdoc-scan', '--module=' + module,
|
||||
'--source-dir=' + module, '--output-dir=_build_/docs/api/' + module,
|
||||
'--rebuild-sections', '--rebuild-types'])
|
||||
os.chdir ('_build_/docs/api/' + module)
|
||||
subprocess.call (['gtkdoc-mktmpl', '--module=' + module,
|
||||
'--output-dir=.' + module])
|
||||
subprocess.call (['gtkdoc-mkdb', '--module=' + module,
|
||||
'--source-dir=.', '--output-dir=xml',
|
||||
'--source-suffixes=c,h', '--output-format=xml',
|
||||
'--default-includes=%s/%s.h' % (module, module),
|
||||
'--sgml-mode', '--main-sgml-file=%s.sgml' % module])
|
||||
if not os.access ('html', os.F_OK):
|
||||
Utils.check_dir ('html')
|
||||
os.chdir ('html')
|
||||
subprocess.call (['gtkdoc-mkhtml', module, '../%s.sgml' % module])
|
||||
Utils.pprint ('YELLOW', "Created documentation for %s." % module)
|
||||
os.chdir ('../../../../..')
|
||||
except Exception, msg:
|
||||
print msg
|
||||
Utils.pprint ('RED', "Failed to create documentation for %s." % module)
|
|
@ -1,255 +0,0 @@
|
|||
.. |(version)| replace:: 0.2.2
|
||||
|
||||
'''''''
|
||||
Midori
|
||||
'''''''
|
||||
|
||||
-----------------------------------------
|
||||
A lightweight, portable GTK+ web browser
|
||||
-----------------------------------------
|
||||
|
||||
:Authors: Christian Dywan
|
||||
:Date: $Date: 2009-11-18 18:20:11 +0100 (Wed, 18 Nov 2009) $
|
||||
:Version: |(version)|
|
||||
|
||||
Copyright © 2008-2009
|
||||
|
||||
This documentation is distributed under the terms of the
|
||||
`GNU Lesser General Public License`_; 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.
|
||||
|
||||
|
||||
.. contents::
|
||||
|
||||
|
||||
|
||||
Introduction
|
||||
''''''''''''
|
||||
|
||||
|
||||
What is Midori
|
||||
--------------
|
||||
|
||||
Midori is a lightweight and portable web browser based on Gtk+. The
|
||||
interface is designed to be intuitive yet powerful.
|
||||
|
||||
* Full integration with GTK+2.
|
||||
* Fast rendering with WebKit.
|
||||
* Tabs, windows and session management.
|
||||
* Flexibly configurable Web Search.
|
||||
* User scripts and user styles support.
|
||||
* Straightforward bookmark management.
|
||||
* Customizable and extensible interface.
|
||||
* Extensions written in C.
|
||||
|
||||
|
||||
Running Midori
|
||||
--------------
|
||||
|
||||
|
||||
* If you are using a graphical desktop environment you will usually find
|
||||
Midori in the menu under Network.
|
||||
|
||||
* You can also run Midori from a console or a Run dialog.
|
||||
See also `Command line usage`.
|
||||
|
||||
$ midori
|
||||
|
||||
A browser window appears where you can start navigating the web right away.
|
||||
|
||||
|
||||
The main interface
|
||||
--------------------------
|
||||
|
||||
|
||||
The main browser window consists of a few basic elements:
|
||||
|
||||
|
||||
* The menubar. It's pretty much standardized and gives you access to
|
||||
allmost all features, many of the items have a keyboard shortcut by default.
|
||||
See also `Keyboard shortcuts`_.
|
||||
|
||||
* The navigationbar. It lets you open tabs, go back and forward, enter
|
||||
addresses, search the web and reopen closed tabs.
|
||||
See also `The navigationbar`.
|
||||
|
||||
* The sidepanel. It takes a pretty central role in the functionality it provides,
|
||||
yet it can be hidden and resized to not distract you.
|
||||
See also `The sidepanel`.
|
||||
|
||||
* The statusbar. It displays informational text when hovering something
|
||||
with a pointer. That's it.
|
||||
|
||||
|
||||
Taking a closer look
|
||||
''''''''''''''''''''
|
||||
|
||||
|
||||
Command line usage
|
||||
------------------
|
||||
|
||||
|
||||
Running Midori normally works as follows:
|
||||
|
||||
|
||||
* $ midori
|
||||
|
||||
Just run a new instance of Midori. If an instance of Midori is already
|
||||
running a new window in that instance will be opened.
|
||||
|
||||
* $ midori [URIs]
|
||||
|
||||
You can supply any number of URIs to open as arguments. If you have a
|
||||
saved session or a running instance they will be added to the last
|
||||
active window.
|
||||
|
||||
* $ midori [URI1]|[URI2]|...
|
||||
|
||||
You can separate URIS by a pipe (|) as well. They are handled as if you
|
||||
provided all URIs as separate arguments.
|
||||
|
||||
* $ midori --run [JAVASCRIPT]
|
||||
|
||||
If you pass the filename of a javascript Midori will attempt to run
|
||||
the contents of the file as javascript code.
|
||||
|
||||
|
||||
Note that support for opening tabs in an existing instance depends on
|
||||
your build and may not be available on some platforms.
|
||||
|
||||
|
||||
The following arguments are supported if you call Midori from a command line.
|
||||
|
||||
|
||||
+-------+--------------------+------------------------------------------------+
|
||||
| Short | Long option | Function |
|
||||
+=======+====================+================================================+
|
||||
| -a | --app | Run ADDRESS as a web application |
|
||||
+-------+--------------------+------------------------------------------------+
|
||||
| -c | --config | Use FOLDER as configuration folder |
|
||||
+-------+--------------------+------------------------------------------------+
|
||||
| -r | --run | Run the specified filename as javascript |
|
||||
+-------+--------------------+------------------------------------------------+
|
||||
| -s | --snapshot + Take a snapshot of the specified URI |
|
||||
+-------+--------------------+------------------------------------------------+
|
||||
| -V | --version | Show version information and exit. |
|
||||
+-------+--------------------+------------------------------------------------+
|
||||
|
||||
|
||||
Configuration files
|
||||
-------------------
|
||||
|
||||
|
||||
The configuration files in Midori that save related states are by default
|
||||
stored in the folder ~/.config/midori in the home directory. It is possible
|
||||
to use a different folder by specifying '--config' on the command line.
|
||||
|
||||
The files stored in the primary configuration folder are the following:
|
||||
|
||||
+----------------+------------------------------------------------------------+
|
||||
| Filename | Contents |
|
||||
+================+============================================================+
|
||||
| accels | Keyboard shortcuts, GtkAccelMap resource |
|
||||
+----------------+------------------------------------------------------------+
|
||||
| bookmarks.xbel | Bookmarks, XBEL |
|
||||
+----------------+------------------------------------------------------------+
|
||||
| config | Preferences, text key file |
|
||||
+----------------+------------------------------------------------------------+
|
||||
| cookies.txt | Cookies, Mozilla text cookies |
|
||||
+----------------+------------------------------------------------------------+
|
||||
| history.db | History, sqlite3 |
|
||||
+----------------+------------------------------------------------------------+
|
||||
| logins | Usernames and passwords, plain text |
|
||||
+----------------+------------------------------------------------------------+
|
||||
| running | A file created to track whether Midori quit cleanly |
|
||||
+----------------+------------------------------------------------------------+
|
||||
| search | Search engines, text key file |
|
||||
+----------------+------------------------------------------------------------+
|
||||
| session.xbel | The current or last session, ie. open tabs, |
|
||||
+----------------+------------------------------------------------------------+
|
||||
| tabtrash.xbel | The 10 last closed tabs |
|
||||
+----------------+------------------------------------------------------------+
|
||||
|
||||
Note that generally manual modifications to these files aren't recommended. As
|
||||
an exception, while Midori is *not* running, it is possible to edit or
|
||||
replace the 'bookmarks.xbel' as long as it is valid XBEL/ XML.
|
||||
|
||||
Currently while Midori is running it will happily overwrite files as needed and
|
||||
never read back any changes.
|
||||
|
||||
|
||||
Keyboard shortcuts
|
||||
------------------
|
||||
|
||||
|
||||
...
|
||||
|
||||
|
||||
The navigationbar
|
||||
-----------------
|
||||
|
||||
|
||||
The navigationbar is the primary toolbar containing notably back and forward
|
||||
buttons, the location entry and a search entry. The "Toolbar Editor" extension
|
||||
can be used to add or remove items.
|
||||
|
||||
|
||||
The sidepanel
|
||||
-------------
|
||||
|
||||
|
||||
...
|
||||
|
||||
|
||||
Extensions
|
||||
----------
|
||||
|
||||
|
||||
...
|
||||
|
||||
|
||||
Frequently asked questions
|
||||
''''''''''''''''''''''''''
|
||||
|
||||
|
||||
How do you pronounce Midori and what does it mean anyway?
|
||||
---------------------------------------------------------
|
||||
|
||||
Pronounce it "midoɺi", with a Bavarian/ Japanese "r" or "Mee-Doh-Ree"
|
||||
in English or read it Italian. The name comes from the Japanese word
|
||||
緑 (みどり) for the colour "green".
|
||||
|
||||
|
||||
What does the logo mean?
|
||||
------------------------
|
||||
|
||||
The paw of a green cat. Obviously. Also it resembles the letter "M"
|
||||
in "Midori". The curving is supposed to emphasize speed.
|
||||
|
||||
|
||||
On which platforms does Midori run currently?
|
||||
---------------------------------------------
|
||||
|
||||
Midori is basically very portable and should run on all platforms that
|
||||
its dependencies support.
|
||||
|
||||
|
||||
|
||||
Under which license is Midori distributed?
|
||||
------------------------------------------
|
||||
|
||||
Midori, documentation and all delivered artwork are licensed under the LGPL2.
|
||||
|
||||
|
||||
GNU Lesser General Public License
|
||||
'''''''''''''''''''''''''''''''''
|
||||
|
||||
::
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
FIXME: Provide full license text
|
||||
|
134
extensions/CMakeLists.txt
Normal file
134
extensions/CMakeLists.txt
Normal file
|
@ -0,0 +1,134 @@
|
|||
# Copyright (C) 2013 Christian Dywan <christian@twotoasts.de>
|
||||
|
||||
set(EXTENSIONDIR "${CMAKE_INSTALL_FULL_LIBDIR}/${CMAKE_PROJECT_NAME}")
|
||||
include_directories(
|
||||
"${CMAKE_SOURCE_DIR}"
|
||||
"${CMAKE_SOURCE_DIR}/midori"
|
||||
"${CMAKE_SOURCE_DIR}/katze"
|
||||
${DEPS_INCLUDE_DIRS}
|
||||
${OPTS_INCLUDE_DIRS}
|
||||
${DEPS_GTK_INCLUDE_DIRS}
|
||||
${OPTS_GTK_INCLUDE_DIRS}
|
||||
${CMAKE_BINARY_DIR}
|
||||
"${CMAKE_BINARY_DIR}/midori"
|
||||
)
|
||||
file(GLOB EXTENSIONS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *)
|
||||
if (HALF_BRO_INCOM_WEBKIT2)
|
||||
list(REMOVE_ITEM EXTENSIONS
|
||||
"cookie-permissions"
|
||||
"addons.c"
|
||||
"formhistory"
|
||||
"external-download-manager.vala"
|
||||
"nojs"
|
||||
"nsplugin-manager.vala"
|
||||
"tabs2one.c"
|
||||
)
|
||||
endif ()
|
||||
|
||||
# FIXME: re-enable webmedia extension
|
||||
# once we have working notifications on win
|
||||
if (WIN32)
|
||||
list(REMOVE_ITEM EXTENSIONS "webmedia-now-playing.vala")
|
||||
endif()
|
||||
|
||||
# FIXME: not stable enough for release
|
||||
if (NOT REVISION)
|
||||
list(REMOVE_ITEM EXTENSIONS "tabs2one.c")
|
||||
endif()
|
||||
|
||||
foreach(UNIT_SRC ${EXTENSIONS})
|
||||
string(FIND ${UNIT_SRC} ".c" UNIT_EXTENSION)
|
||||
if (UNIT_EXTENSION GREATER -1)
|
||||
string(REPLACE ".c" "" UNIT ${UNIT_SRC})
|
||||
add_library(${UNIT} MODULE ${UNIT_SRC})
|
||||
target_link_libraries(${UNIT}
|
||||
${LIBMIDORI}
|
||||
)
|
||||
set_target_properties(${UNIT} PROPERTIES
|
||||
COMPILE_FLAGS ${CFLAGS}
|
||||
)
|
||||
install(TARGETS ${UNIT}
|
||||
LIBRARY DESTINATION ${EXTENSIONDIR}
|
||||
)
|
||||
endif ()
|
||||
endforeach ()
|
||||
|
||||
foreach(UNIT_SRC ${EXTENSIONS})
|
||||
string(FIND ${UNIT_SRC} "." UNIT_EXTENSION)
|
||||
if (UNIT_EXTENSION EQUAL -1)
|
||||
file(GLOB UNIT_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${UNIT_SRC}/*.c")
|
||||
file(GLOB UNIT_FILES_VALA RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${UNIT_SRC}/*.vala")
|
||||
if (UNIT_FILES_VALA)
|
||||
include(ValaPrecompile)
|
||||
vala_precompile(UNIT_SRC_C ${UNIT_SRC}
|
||||
${UNIT_FILES_VALA}
|
||||
PACKAGES
|
||||
${PKGS}
|
||||
OPTIONS
|
||||
${VALAFLAGS}
|
||||
--use-header="${CMAKE_PROJECT_NAME}-core.h"
|
||||
GENERATE_HEADER
|
||||
"${UNIT_SRC}"
|
||||
GENERATE_HEADER
|
||||
${UNIT}
|
||||
CUSTOM_VAPIS
|
||||
${EXTRA_VAPIS}
|
||||
"${CMAKE_SOURCE_DIR}/midori/midori.vapi"
|
||||
"${CMAKE_BINARY_DIR}/midori/${LIBMIDORI}.vapi"
|
||||
)
|
||||
set(UNIT_FILES ${UNIT_FILES} ${UNIT_SRC_C})
|
||||
endif ()
|
||||
if (UNIT_FILES)
|
||||
add_library(${UNIT_SRC} MODULE ${UNIT_FILES})
|
||||
target_link_libraries(${UNIT_SRC}
|
||||
${LIBMIDORI}
|
||||
)
|
||||
install(TARGETS ${UNIT_SRC}
|
||||
LIBRARY DESTINATION ${EXTENSIONDIR}
|
||||
)
|
||||
# extensions with vala code get the lenient VALA_CFLAGS
|
||||
# others get the usual CFLAGS with -Wall and -Werror
|
||||
if (UNIT_FILES_VALA)
|
||||
set_target_properties(${UNIT_SRC} PROPERTIES
|
||||
COMPILE_FLAGS ${VALA_CFLAGS}
|
||||
)
|
||||
else ()
|
||||
set_target_properties(${UNIT_SRC} PROPERTIES
|
||||
COMPILE_FLAGS ${CFLAGS}
|
||||
)
|
||||
endif ()
|
||||
endif ()
|
||||
endif ()
|
||||
endforeach ()
|
||||
|
||||
foreach(UNIT_SRC ${EXTENSIONS})
|
||||
string(FIND ${UNIT_SRC} ".vala" UNIT_EXTENSION)
|
||||
if (UNIT_EXTENSION GREATER -1)
|
||||
string(REPLACE ".vala" "" UNIT ${UNIT_SRC})
|
||||
include(ValaPrecompile)
|
||||
vala_precompile(UNIT_SRC_C ${UNIT}
|
||||
${UNIT_SRC}
|
||||
PACKAGES
|
||||
${PKGS}
|
||||
OPTIONS
|
||||
${VALAFLAGS}
|
||||
--use-header="${CMAKE_PROJECT_NAME}-core.h"
|
||||
GENERATE_HEADER
|
||||
${UNIT}
|
||||
CUSTOM_VAPIS
|
||||
${EXTRA_VAPIS}
|
||||
"${CMAKE_SOURCE_DIR}/midori/midori.vapi"
|
||||
"${CMAKE_BINARY_DIR}/midori/${LIBMIDORI}.vapi"
|
||||
)
|
||||
add_library(${UNIT} MODULE ${UNIT_SRC_C})
|
||||
target_link_libraries(${UNIT}
|
||||
${LIBMIDORI}
|
||||
)
|
||||
set_target_properties(${UNIT} PROPERTIES
|
||||
COMPILE_FLAGS "${VALA_CFLAGS}"
|
||||
)
|
||||
install(TARGETS ${UNIT}
|
||||
LIBRARY DESTINATION ${EXTENSIONDIR}
|
||||
)
|
||||
endif ()
|
||||
endforeach ()
|
373
extensions/about.vala
Normal file
373
extensions/about.vala
Normal file
|
@ -0,0 +1,373 @@
|
|||
/*
|
||||
Copyright (C) 2013 André Stösel <andre@stoesel.de>
|
||||
Copyright (C) 2014 Christian Dywan <christian@twotoasts.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 About {
|
||||
private abstract class Page : GLib.Object {
|
||||
public abstract string uri { get; set; }
|
||||
public abstract void get_contents (Midori.View view, string uri);
|
||||
protected void load_html (Midori.View view, string content, string uri) {
|
||||
#if HAVE_WEBKIT2
|
||||
view.web_view.load_html (content, uri);
|
||||
#else
|
||||
view.web_view.load_html_string (content, uri);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
private class Widgets : Page {
|
||||
public override string uri { get; set; default = "about:widgets"; }
|
||||
public override void get_contents (Midori.View view, string uri) {
|
||||
string[] widgets = {
|
||||
"<input value=\"demo\"%s>",
|
||||
"<p><input type=\"password\" value=\"demo\"%s></p>",
|
||||
"<p><input type=\"checkbox\" value=\"demo\"%s> demo</p>",
|
||||
"<p><input type=\"radio\" value=\"demo\"%s> demo</p>",
|
||||
"<p><select%s><option>foo bar</option><option selected>spam eggs</option></select></p>",
|
||||
"<p><select%s size=\"3\"><option>foo bar</option><option selected>spam eggs</option></select></p>",
|
||||
"<p><input type=\"file\"%s></p>",
|
||||
"<p><input type=\"file\" multiple%s></p>",
|
||||
"<input type=\"button\" value=\"demo\"%s>",
|
||||
"<p><input type=\"email\" value=\"user@localhost.com\"%s></p>",
|
||||
"<input type=\"url\" value=\"http://www.example.com\"%s>",
|
||||
"<input type=\"tel\" value=\"+1 234 567 890\" pattern=\"^[0+][1-9 /-]*$\"%s>",
|
||||
"<input type=\"number\" min=1 max=9 step=1 value=\"4\"%s>",
|
||||
"<input type=\"range\" min=1 max=9 step=1 value=\"4\"%s>",
|
||||
"<input type=\"date\" min=1990-01-01 max=2010-01-01%s>",
|
||||
"<input type=\"search\" placeholder=\"demo\"%s>",
|
||||
"<textarea%s>Lorem ipsum doloret sit amet…</textarea>",
|
||||
"<input type=\"color\" value=\"#d1eeb9\"%s>",
|
||||
"<progress min=1 max=9 value=4 %s></progress>",
|
||||
"<keygen type=\"rsa\" challenge=\"235ldahlae983dadfar\"%s>",
|
||||
"<p><input type=\"reset\"%s></p>",
|
||||
"<input type=\"submit\"%s>"
|
||||
};
|
||||
|
||||
string content = """<html>
|
||||
<head>
|
||||
<style>
|
||||
.fallback::-webkit-slider-thumb,
|
||||
.fallback, .fallback::-webkit-file-upload-button {
|
||||
-webkit-appearance: none !important;
|
||||
}
|
||||
.column {
|
||||
display:inline-block; vertical-align:top;
|
||||
width:25%;
|
||||
margin-right:1%;
|
||||
}
|
||||
</style>
|
||||
<title>%s</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>%s</h1>
|
||||
<div class="column">%s</div>
|
||||
<div class="column">%s</div>
|
||||
<div class="column">%s</div>
|
||||
<p><a href="http://example.com" target="wp" onclick="javascript:window.open('http://example.com','wp','width=320, height=240, toolbar=false'); return false;">Popup window</a></p>
|
||||
</body>
|
||||
</html>""";
|
||||
|
||||
string[] widget_options = {"", " disabled", " class=\"fallback\""};
|
||||
string[] widgets_formated = {"", "", ""};
|
||||
|
||||
for (int i = 0; i < widget_options.length && i < widgets_formated.length; i++) {
|
||||
for (int j = 0; j < widgets.length; j++) {
|
||||
widgets_formated[i] = widgets_formated[i] + widgets[j].printf (widget_options[i]);
|
||||
}
|
||||
}
|
||||
|
||||
this.load_html (view, content.printf (uri, uri, widgets_formated[0], widgets_formated[1], widgets_formated[2]), uri);
|
||||
}
|
||||
}
|
||||
|
||||
private class Version : Page {
|
||||
public override string uri { get; set; }
|
||||
private GLib.HashTable<string, Page> about_pages;
|
||||
|
||||
public Version (string alias, HashTable<string, Page> about_pages) {
|
||||
this.uri = alias;
|
||||
this.about_pages = about_pages;
|
||||
}
|
||||
|
||||
private string list_about_uris () {
|
||||
string links = "";
|
||||
foreach (unowned string uri in about_pages.get_keys ())
|
||||
links = links + "<a href=\"%s\">%s</a> ".printf (uri, uri);
|
||||
return "<p>%s</p>".printf (links);
|
||||
}
|
||||
|
||||
public override void get_contents (Midori.View view, string uri) {
|
||||
string contents = """<html>
|
||||
<head><title>about:version</title></head>
|
||||
<body>
|
||||
<h1>a<span style="position: absolute; left: -1000px; top: -1000px">lias a=b; echo Copy carefully #</span>bout:version</h1>
|
||||
<p>%s</p>
|
||||
<img src="res://logo-shade.png" style="position: absolute; right: 15px; bottom: 15px; z-index: -9;">
|
||||
<table>
|
||||
<tr><td>Command line %s</td></tr>
|
||||
%s
|
||||
<tr><td>Platform %s %s %s</td></tr>
|
||||
<tr><td>Identification %s</td></tr>
|
||||
%s
|
||||
</table>
|
||||
<table>
|
||||
%s
|
||||
</table>
|
||||
%s
|
||||
</body>
|
||||
</html>""";
|
||||
|
||||
GLib.StringBuilder versions = new GLib.StringBuilder ();
|
||||
Midori.View.list_versions (versions, true);
|
||||
|
||||
string ident;
|
||||
unowned string architecture;
|
||||
unowned string platform;
|
||||
unowned string sys_name = Midori.WebSettings.get_system_name (out architecture, out platform);
|
||||
view.settings.get ("user-agent", out ident);
|
||||
|
||||
GLib.StringBuilder video_formats = new GLib.StringBuilder ();
|
||||
view.list_video_formats (video_formats, true);
|
||||
|
||||
GLib.StringBuilder ns_plugins = new GLib.StringBuilder ();
|
||||
view.list_plugins (ns_plugins, true);
|
||||
|
||||
/* TODO: list active extensions */
|
||||
|
||||
this.load_html (view, contents.printf (
|
||||
_("Version numbers in brackets show the version used at runtime."),
|
||||
Midori.Paths.get_command_line_str (true),
|
||||
versions.str,
|
||||
platform, sys_name, architecture != null ? architecture : "",
|
||||
ident,
|
||||
video_formats.str,
|
||||
ns_plugins.str,
|
||||
this.list_about_uris ()
|
||||
), uri);
|
||||
}
|
||||
}
|
||||
|
||||
private class Private : Page {
|
||||
public override string uri { get; set; default = "about:private"; }
|
||||
public override void get_contents (Midori.View view, string uri) {
|
||||
this.load_html (view, """<html dir="ltr">
|
||||
<head>
|
||||
<title>%s</title>
|
||||
<link rel="stylesheet" type="text/css" href="res://about.css">
|
||||
</head>
|
||||
<body>
|
||||
<img id="logo" src="res://logo-shade.png" />
|
||||
<div id="main" style="background-image: url(stock://dialog/gtk-dialog-info);">
|
||||
<div id="text">
|
||||
<h1>%s</h1>
|
||||
<p class="message">%s</p><ul class=" suggestions"><li>%s</li><li>%s</li><li>%s</li></ul>
|
||||
<p class="message">%s</p><ul class=" suggestions"><li>%s</li><li>%s</li><li>%s</li><li>%s</li></ul>
|
||||
</div><br style="clear: both"></div>
|
||||
</body>
|
||||
</html>""".printf (
|
||||
_("Private Browsing"), _("Private Browsing"),
|
||||
_("Midori doesn't store any personal data:"),
|
||||
_("No history or web cookies are being saved."),
|
||||
_("Extensions are disabled."),
|
||||
_("HTML5 storage, local database and application caches are disabled."),
|
||||
_("Midori prevents websites from tracking the user:"),
|
||||
_("Referrer URLs are stripped down to the hostname."),
|
||||
_("DNS prefetching is disabled."),
|
||||
_("The language and timezone are not revealed to websites."),
|
||||
_("Flash and other Netscape plugins cannot be listed by websites.")
|
||||
), uri);
|
||||
}
|
||||
}
|
||||
|
||||
private class Paths : Page {
|
||||
public override string uri { get; set; default = "about:paths"; }
|
||||
public override void get_contents (Midori.View view, string uri) {
|
||||
string res_dir = Midori.Paths.get_res_filename ("about.css");
|
||||
string lib_dir = Midori.Paths.get_lib_path (PACKAGE_NAME);
|
||||
this.load_html (view, """<html>
|
||||
<body>
|
||||
<h1>%s</h1>
|
||||
<p>config: <code>%s</code></p>
|
||||
<p>res: <code>%s</code></p>
|
||||
<p>data: <code>%s/%s</code></p>
|
||||
<p>lib: <code>%s</code></p>
|
||||
<p>cache: <code>%s</code></p>
|
||||
<p>tmp: <code>%s</code></p>
|
||||
</body>
|
||||
</html>""".printf (
|
||||
uri, Midori.Paths.get_config_dir_for_reading (), res_dir,
|
||||
Midori.Paths.get_user_data_dir_for_reading (), PACKAGE_NAME,
|
||||
lib_dir, Midori.Paths.get_cache_dir_for_reading (), Midori.Paths.get_tmp_dir ()
|
||||
), uri);
|
||||
}
|
||||
}
|
||||
|
||||
private class Dial : Page {
|
||||
public override string uri { get; set; default = "about:dial"; }
|
||||
public override void get_contents (Midori.View view, string uri) {
|
||||
var browser = Midori.Browser.get_for_widget (view);
|
||||
Midori.SpeedDial dial;
|
||||
browser.get ("speed-dial", out dial);
|
||||
if (dial == null)
|
||||
return;
|
||||
try {
|
||||
this.load_html (view, dial.get_html (), uri);
|
||||
} catch (Error error) {
|
||||
this.load_html (view, error.message, uri);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class Geolocation : Page {
|
||||
public override string uri { get; set; default = "about:geolocation"; }
|
||||
public override void get_contents (Midori.View view, string uri) {
|
||||
this.load_html (view, """<html>
|
||||
<body>
|
||||
<a href="http://dev.w3.org/geo/api/spec-source.html" id="method"></a>
|
||||
<span id="locationInfo"><noscript>No Geolocation without Javascript</noscript></span>
|
||||
<script>
|
||||
function displayLocation (position) {
|
||||
var geouri = 'geo:' + position.coords.latitude + ',' + position.coords.longitude + ',' + position.coords.altitude + ',u=' + position.coords.accuracy;
|
||||
document.getElementById('locationInfo').innerHTML = '<a href="' + geouri + '">' + geouri + '</a><br><code>'
|
||||
+ ' timestamp: ' + position.timestamp
|
||||
+ ' latitude: ' + position.coords.latitude
|
||||
+ ' longitude: ' + position.coords.longitude
|
||||
+ ' altitude: ' + position.coords.altitude + '<br>'
|
||||
+ ' accuracy: ' + position.coords.accuracy
|
||||
+ ' altitudeAccuracy: ' + position.coords.altitudeAccuracy
|
||||
+ ' heading: ' + position.coords.heading
|
||||
+ ' speed: ' + position.coords.speed
|
||||
+ '</code>';
|
||||
}
|
||||
function handleError (error) {
|
||||
var errorMessage = '<b>' + ['Unknown error', 'Permission denied', 'Position failed', 'Timed out'][error.code] + '</b>';
|
||||
if (error.code == 3) document.getElementById('locationInfo').innerHTML += (' ' + errorMessage);
|
||||
else document.getElementById('locationInfo').innerHTML = errorMessage;
|
||||
}
|
||||
if (navigator.geolocation) {
|
||||
var options = { enableHighAccuracy: true, timeout: 60000, maximumAge: "Infinite" };
|
||||
if (navigator.geolocation.watchPosition) {
|
||||
document.getElementById('method').innerHTML = '<code>geolocation.watchPosition</code>:';
|
||||
navigator.geolocation.watchPosition(displayLocation, handleError, options);
|
||||
} else {
|
||||
document.getElementById('method').innerHTML = '<code>geolocation.getCurrentPosition</code>:';
|
||||
navigator.geolocation.getCurrentPosition(displayLocation, handleError);
|
||||
}
|
||||
} else
|
||||
document.getElementById('locationInfo').innerHTML = 'Geolocation unavailable';
|
||||
</script>
|
||||
</body>
|
||||
</html>""", uri);
|
||||
}
|
||||
}
|
||||
|
||||
private class Redirects : Page {
|
||||
public override string uri { get; set; }
|
||||
private string property;
|
||||
public Redirects (string alias, string property) {
|
||||
this.uri = alias;
|
||||
this.property = property;
|
||||
}
|
||||
public override void get_contents (Midori.View view, string uri) {
|
||||
string new_uri = uri;
|
||||
view.settings.get (property, out new_uri);
|
||||
if (uri == "about:search")
|
||||
new_uri = Midori.URI.for_search (new_uri, "");
|
||||
view.set_uri (new_uri);
|
||||
}
|
||||
}
|
||||
|
||||
private class Manager : Midori.Extension {
|
||||
private GLib.HashTable<string, Page>? about_pages;
|
||||
|
||||
private void register (Page page) {
|
||||
this.about_pages.insert (page.uri, page);
|
||||
}
|
||||
|
||||
private bool about_content (Midori.View view, string uri) {
|
||||
unowned Page? page = this.about_pages.get (uri);
|
||||
if (page != null) {
|
||||
page.get_contents (view, uri);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void tab_added (Midori.Browser browser, Midori.View view) {
|
||||
view.about_content.connect (this.about_content);
|
||||
}
|
||||
|
||||
private void tab_removed (Midori.Browser browser, Midori.View view) {
|
||||
view.about_content.disconnect (this.about_content);
|
||||
}
|
||||
|
||||
private void browser_added (Midori.Browser browser) {
|
||||
foreach (Midori.View tab in browser.get_tabs ()) {
|
||||
this.tab_added (browser, tab);
|
||||
}
|
||||
browser.add_tab.connect (this.tab_added);
|
||||
browser.remove_tab.connect (this.tab_removed);
|
||||
}
|
||||
|
||||
private void browser_removed (Midori.Browser browser) {
|
||||
foreach (Midori.View tab in browser.get_tabs ()) {
|
||||
this.tab_removed (browser, tab);
|
||||
}
|
||||
browser.add_tab.disconnect (this.tab_added);
|
||||
browser.remove_tab.disconnect (this.tab_removed);
|
||||
}
|
||||
|
||||
public void activated (Midori.App app) {
|
||||
this.about_pages = new GLib.HashTable<string, Page> (GLib.str_hash, GLib.str_equal);
|
||||
register (new Widgets ());
|
||||
register (new Version ("about:", about_pages));
|
||||
register (new Version ("about:version", about_pages));
|
||||
register (new Private ());
|
||||
register (new Paths ());
|
||||
register (new Geolocation ());
|
||||
register (new Redirects ("about:new", "tabhome"));
|
||||
register (new Redirects ("about:home", "homepage"));
|
||||
register (new Redirects ("about:search", "location-entry-search"));
|
||||
register (new Dial ());
|
||||
|
||||
foreach (Midori.Browser browser in app.get_browsers ()) {
|
||||
this.browser_added (browser);
|
||||
}
|
||||
app.add_browser.connect (this.browser_added);
|
||||
}
|
||||
|
||||
public void deactivated () {
|
||||
Midori.App app = this.get_app ();
|
||||
foreach (Midori.Browser browser in app.get_browsers ()) {
|
||||
this.browser_removed (browser);
|
||||
}
|
||||
app.add_browser.disconnect (this.browser_added);
|
||||
|
||||
this.about_pages = null;
|
||||
}
|
||||
|
||||
internal Manager () {
|
||||
GLib.Object (name: "About pages",
|
||||
description: "Internal about: handler",
|
||||
version: "0.1",
|
||||
authors: "André Stösel <andre@stoesel.de>");
|
||||
|
||||
this.activate.connect (this.activated);
|
||||
this.deactivate.connect (this.deactivated);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Midori.Extension extension_init () {
|
||||
return new About.Manager ();
|
||||
}
|
||||
|
1500
extensions/adblock.c
1500
extensions/adblock.c
File diff suppressed because it is too large
Load diff
146
extensions/adblock/config.vala
Normal file
146
extensions/adblock/config.vala
Normal file
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
Copyright (C) 2014 Christian Dywan <christian@twotoasts.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 Adblock {
|
||||
public class Config : GLib.Object {
|
||||
List<Subscription> subscriptions;
|
||||
public string? path { get; private set; }
|
||||
KeyFile keyfile;
|
||||
bool should_save;
|
||||
public bool enabled { get; set; }
|
||||
|
||||
public Config (string? path, string? presets) {
|
||||
should_save = false;
|
||||
subscriptions = new GLib.List<Subscription> ();
|
||||
enabled = true;
|
||||
this.path = path;
|
||||
size = 0;
|
||||
load_file (path);
|
||||
load_file (presets);
|
||||
should_save = true;
|
||||
}
|
||||
|
||||
void load_file (string? filename) {
|
||||
if (filename == null)
|
||||
return;
|
||||
|
||||
keyfile = new GLib.KeyFile ();
|
||||
try {
|
||||
keyfile.load_from_file (filename, GLib.KeyFileFlags.NONE);
|
||||
string[] filters = keyfile.get_string_list ("settings", "filters");
|
||||
foreach (unowned string filter in filters) {
|
||||
bool active = false;
|
||||
string uri = filter;
|
||||
if (filter.has_prefix ("http-/"))
|
||||
uri = "http:" + filter.substring (5);
|
||||
else if (filter.has_prefix ("file-/"))
|
||||
uri = "file:" + filter.substring (5);
|
||||
else if (filter.has_prefix ("http-:"))
|
||||
uri = "https" + filter.substring (5);
|
||||
else
|
||||
active = true;
|
||||
Subscription sub = new Subscription (uri);
|
||||
sub.active = active;
|
||||
sub.add_feature (new Updater ());
|
||||
add (sub);
|
||||
}
|
||||
enabled = !keyfile.get_boolean ("settings", "disabled");
|
||||
} catch (KeyFileError.KEY_NOT_FOUND key_error) {
|
||||
/* It's no error if a key is missing */
|
||||
} catch (KeyFileError.GROUP_NOT_FOUND group_error) {
|
||||
/* It's no error if a group is missing */
|
||||
} catch (FileError.NOENT exist_error) {
|
||||
/* It's no error if no config file exists */
|
||||
} catch (GLib.Error settings_error) {
|
||||
warning ("Error reading settings from %s: %s\n", filename, settings_error.message);
|
||||
}
|
||||
|
||||
notify["enabled"].connect (enabled_changed);
|
||||
}
|
||||
|
||||
void enabled_changed (ParamSpec pspec) {
|
||||
keyfile.set_boolean ("settings", "disabled", !enabled);
|
||||
save ();
|
||||
}
|
||||
|
||||
void active_changed (Object subscription, ParamSpec pspec) {
|
||||
update_filters ();
|
||||
}
|
||||
|
||||
void update_filters () {
|
||||
var filters = new StringBuilder ();
|
||||
foreach (unowned Subscription sub in subscriptions) {
|
||||
if (!sub.mutable)
|
||||
continue;
|
||||
if (sub.uri.has_prefix ("http:") && !sub.active)
|
||||
filters.append ("http-" + sub.uri.substring (4));
|
||||
else if (sub.uri.has_prefix ("file:") && !sub.active)
|
||||
filters.append ("file-" + sub.uri.substring (5));
|
||||
else if (sub.uri.has_prefix ("https:") && !sub.active)
|
||||
filters.append ("http-" + sub.uri.substring (5));
|
||||
else
|
||||
filters.append (sub.uri);
|
||||
filters.append_c (';');
|
||||
}
|
||||
|
||||
if (filters.str.has_suffix (";"))
|
||||
filters.truncate (filters.len - 1);
|
||||
string[] list = filters.str.split (";");
|
||||
keyfile.set_string_list ("settings", "filters", list);
|
||||
|
||||
save ();
|
||||
}
|
||||
|
||||
|
||||
public void save () {
|
||||
try {
|
||||
FileUtils.set_contents (path, keyfile.to_data ());
|
||||
} catch (Error error) {
|
||||
warning ("Failed to save settings: %s", error.message);
|
||||
}
|
||||
}
|
||||
|
||||
/* foreach support */
|
||||
public new unowned Subscription? get (uint index) {
|
||||
return subscriptions.nth_data (index);
|
||||
}
|
||||
public uint size { get; private set; }
|
||||
|
||||
bool contains (Subscription subscription) {
|
||||
foreach (unowned Subscription sub in subscriptions)
|
||||
if (sub.uri == subscription.uri)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool add (Subscription sub) {
|
||||
if (contains (sub))
|
||||
return false;
|
||||
|
||||
sub.notify["active"].connect (active_changed);
|
||||
subscriptions.append (sub);
|
||||
size++;
|
||||
if (should_save)
|
||||
update_filters ();
|
||||
return true;
|
||||
}
|
||||
|
||||
public void remove (Subscription sub) {
|
||||
if (!contains (sub))
|
||||
return;
|
||||
|
||||
subscriptions.remove (sub);
|
||||
sub.notify["active"].disconnect (active_changed);
|
||||
update_filters ();
|
||||
size--;
|
||||
}
|
||||
}
|
||||
}
|
36
extensions/adblock/element.vala
Normal file
36
extensions/adblock/element.vala
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
Copyright (C) 2014 Christian Dywan <christian@twotoasts.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 Adblock {
|
||||
public class Element : Feature {
|
||||
public HashTable<string, string> blockcssprivate;
|
||||
bool debug_element;
|
||||
|
||||
public Element () {
|
||||
base ();
|
||||
debug_element = "adblock:element" in (Environment.get_variable ("MIDORI_DEBUG") ?? "");
|
||||
}
|
||||
|
||||
public override void clear () {
|
||||
blockcssprivate = new HashTable<string, string> (str_hash, str_equal);
|
||||
}
|
||||
|
||||
public string? lookup (string domain) {
|
||||
return blockcssprivate.lookup (domain);
|
||||
}
|
||||
|
||||
public void insert (string domain, string value) {
|
||||
if (debug_element)
|
||||
stdout.printf ("Element to be blocked %s => %s\n", domain, value);
|
||||
blockcssprivate.insert (domain, value);
|
||||
}
|
||||
}
|
||||
}
|
865
extensions/adblock/extension.vala
Normal file
865
extensions/adblock/extension.vala
Normal file
|
@ -0,0 +1,865 @@
|
|||
/*
|
||||
Copyright (C) 2009-2014 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2009-2012 Alexander Butenko <a.butenka@gmail.com>
|
||||
|
||||
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 Adblock {
|
||||
public enum Directive {
|
||||
ALLOW,
|
||||
BLOCK
|
||||
}
|
||||
|
||||
public enum State {
|
||||
ENABLED,
|
||||
DISABLED,
|
||||
BLOCKED
|
||||
}
|
||||
|
||||
public string? parse_subscription_uri (string? uri) {
|
||||
if (uri == null)
|
||||
return null;
|
||||
|
||||
if (uri.has_prefix ("http") || uri.has_prefix ("abp") || uri.has_prefix ("file"))
|
||||
{
|
||||
string sub_uri = uri;
|
||||
if (uri.has_prefix ("abp:")) {
|
||||
uri.replace ("abp://", "abp:");
|
||||
if (uri.has_prefix ("abp:subscribe?location=")) {
|
||||
/* abp://subscripe?location=http://example.com&title=foo */
|
||||
string[] parts = uri.substring (23, -1).split ("&", 2);
|
||||
sub_uri = parts[0];
|
||||
}
|
||||
}
|
||||
|
||||
string decoded_uri = Soup.URI.decode (sub_uri);
|
||||
return decoded_uri;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public class Extension : Midori.Extension {
|
||||
internal Config config;
|
||||
internal Subscription custom;
|
||||
internal StringBuilder hider_selectors;
|
||||
internal StatusIcon status_icon;
|
||||
internal SubscriptionManager manager;
|
||||
internal bool debug_element;
|
||||
#if !USE_CSS_SELECTOR_FOR_BLOCKED_RESOURCES
|
||||
internal string? js_hider_function_body;
|
||||
#endif
|
||||
|
||||
#if HAVE_WEBKIT2
|
||||
#if !HAVE_WEBKIT2_3_91
|
||||
public Extension.WebExtension (WebKit.WebExtension web_extension) {
|
||||
init ();
|
||||
web_extension.page_created.connect (page_created);
|
||||
}
|
||||
|
||||
void page_created (WebKit.WebPage web_page) {
|
||||
web_page.send_request.connect (send_request);
|
||||
}
|
||||
|
||||
bool send_request (WebKit.WebPage web_page, WebKit.URIRequest request, WebKit.URIResponse? redirected_response) {
|
||||
return request_handled (request.uri, web_page.uri);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
public Extension () {
|
||||
GLib.Object (name: _("Advertisement blocker"),
|
||||
description: _("Block advertisements according to a filter list"),
|
||||
version: "2.0",
|
||||
authors: "Christian Dywan <christian@twotoasts.de>");
|
||||
activate.connect (extension_activated);
|
||||
deactivate.connect (extension_deactivated);
|
||||
open_preferences.connect (extension_preferences);
|
||||
}
|
||||
|
||||
void extension_preferences () {
|
||||
manager.add_subscription (null);
|
||||
}
|
||||
|
||||
void extension_activated (Midori.App app) {
|
||||
#if HAVE_WEBKIT2
|
||||
string cache_dir = Environment.get_user_cache_dir ();
|
||||
string wk2path = Path.build_path (Path.DIR_SEPARATOR_S, cache_dir, "wk2ext");
|
||||
Midori.Paths.mkdir_with_parents (wk2path);
|
||||
string filename = "libadblock." + GLib.Module.SUFFIX;
|
||||
var wk2link = File.new_for_path (wk2path).get_child (filename);
|
||||
var library = File.new_for_path (Midori.Paths.get_lib_path (PACKAGE_NAME)).get_child (filename);
|
||||
try {
|
||||
wk2link.make_symbolic_link (library.get_path ());
|
||||
} catch (IOError.EXISTS exist_error) {
|
||||
/* It's no error if the file already exists. */
|
||||
} catch (Error error) {
|
||||
critical ("Failed to create WebKit2 link: %s", error.message);
|
||||
}
|
||||
#endif
|
||||
init ();
|
||||
foreach (var browser in app.get_browsers ())
|
||||
browser_added (browser);
|
||||
app.add_browser.connect (browser_added);
|
||||
app.remove_browser.connect (browser_removed);
|
||||
}
|
||||
|
||||
void extension_deactivated () {
|
||||
var app = get_app ();
|
||||
foreach (var browser in app.get_browsers ())
|
||||
browser_removed (browser);
|
||||
app.add_browser.disconnect (browser_added);
|
||||
app.remove_browser.disconnect (browser_removed);
|
||||
}
|
||||
|
||||
void browser_added (Midori.Browser browser) {
|
||||
foreach (var tab in browser.get_tabs ())
|
||||
tab_added (tab);
|
||||
browser.add_tab.connect (tab_added);
|
||||
browser.remove_tab.connect (tab_removed);
|
||||
|
||||
browser.add_action (status_icon);
|
||||
}
|
||||
|
||||
void browser_removed (Midori.Browser browser) {
|
||||
foreach (var tab in browser.get_tabs ())
|
||||
tab_removed (tab);
|
||||
browser.add_tab.disconnect (tab_added);
|
||||
browser.remove_tab.disconnect (tab_removed);
|
||||
browser.remove_action (status_icon);
|
||||
}
|
||||
|
||||
void tab_added (Midori.View view) {
|
||||
view.navigation_requested.connect (navigation_requested);
|
||||
#if !HAVE_WEBKIT2
|
||||
view.web_view.resource_request_starting.connect (resource_requested);
|
||||
#endif
|
||||
view.notify["load-status"].connect (load_status_changed);
|
||||
view.context_menu.connect (context_menu);
|
||||
}
|
||||
|
||||
void tab_removed (Midori.View view) {
|
||||
#if !HAVE_WEBKIT2
|
||||
view.web_view.resource_request_starting.disconnect (resource_requested);
|
||||
#endif
|
||||
view.navigation_requested.disconnect (navigation_requested);
|
||||
view.notify["load-status"].disconnect (load_status_changed);
|
||||
view.context_menu.disconnect (context_menu);
|
||||
}
|
||||
|
||||
void load_status_changed (Object object, ParamSpec pspec) {
|
||||
var view = object as Midori.View;
|
||||
if (config.enabled) {
|
||||
if (view.load_status == Midori.LoadStatus.FINISHED)
|
||||
inject_css (view, view.uri);
|
||||
}
|
||||
}
|
||||
|
||||
void context_menu (WebKit.HitTestResult hit_test_result, Midori.ContextAction menu) {
|
||||
string label, uri;
|
||||
if ((hit_test_result.context & WebKit.HitTestResultContext.IMAGE) != 0) {
|
||||
label = _("Bl_ock image");
|
||||
uri = hit_test_result.image_uri;
|
||||
} else if ((hit_test_result.context & WebKit.HitTestResultContext.LINK) != 0) {
|
||||
label = _("Bl_ock link");
|
||||
uri = hit_test_result.link_uri;
|
||||
} else
|
||||
return;
|
||||
var action = new Gtk.Action ("BlockElement", label, null, null);
|
||||
action.activate.connect ((action) => {
|
||||
CustomRulesEditor custom_rules_editor = new CustomRulesEditor (custom);
|
||||
custom_rules_editor.set_uri (uri);
|
||||
custom_rules_editor.show();
|
||||
});
|
||||
menu.add (action);
|
||||
}
|
||||
|
||||
#if !HAVE_WEBKIT2
|
||||
void resource_requested (WebKit.WebView web_view, WebKit.WebFrame frame,
|
||||
WebKit.WebResource resource, WebKit.NetworkRequest request, WebKit.NetworkResponse? response) {
|
||||
|
||||
if (request_handled (request.uri, web_view.uri)) {
|
||||
request.set_uri ("about:blank");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
bool navigation_requested (Midori.Tab tab, string uri) {
|
||||
if (uri.has_prefix ("abp:")) {
|
||||
string parsed_uri = parse_subscription_uri (uri);
|
||||
manager.add_subscription (parsed_uri);
|
||||
return true;
|
||||
}
|
||||
status_icon.set_state (config.enabled ? State.ENABLED : State.DISABLED);
|
||||
return false;
|
||||
}
|
||||
|
||||
#if USE_CSS_SELECTOR_FOR_BLOCKED_RESOURCES
|
||||
string? get_hider_css_for_blocked_resources () {
|
||||
if (hider_selectors.str == "")
|
||||
return null;
|
||||
|
||||
/* Hide elements that were blocked, otherwise we will get "broken image" icon */
|
||||
var code = new StringBuilder (hider_selectors.str);
|
||||
string hider_css;
|
||||
if (debug_element)
|
||||
hider_css = " { background-color: red; border: 4px solid green; }";
|
||||
else
|
||||
hider_css = " { visiblility: hidden; width: 0; height: 0; }";
|
||||
|
||||
code.truncate (code.len -3);
|
||||
code.append (hider_css);
|
||||
if (debug_element)
|
||||
stdout.printf ("hider css: %s\n", code.str);
|
||||
return code.str;
|
||||
}
|
||||
#else
|
||||
string? fetch_js_hider_function_body () {
|
||||
string filename = Midori.Paths.get_res_filename ("adblock/element_hider.js");
|
||||
File js_file = GLib.File.new_for_path (filename);
|
||||
try {
|
||||
uint8[] function_body;
|
||||
js_file.load_contents (null, out function_body, null);
|
||||
return (string)function_body;
|
||||
}
|
||||
catch (Error error) {
|
||||
warning ("Error while loading adblock hider js: %s\n", error.message);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
string? get_hider_js_for_blocked_resorces () {
|
||||
if (hider_selectors.str == "")
|
||||
return null;
|
||||
|
||||
if (js_hider_function_body == null || js_hider_function_body == "")
|
||||
return null;
|
||||
|
||||
var js = new StringBuilder ("(function() {");
|
||||
js.append (js_hider_function_body);
|
||||
js.append ("var uris=new Array ();");
|
||||
js.append (hider_selectors.str);
|
||||
js.append (" hideElementBySrc (uris);})();");
|
||||
|
||||
return js.str;
|
||||
}
|
||||
#endif
|
||||
|
||||
string[]? get_domains_for_uri (string uri) {
|
||||
if (uri == null)
|
||||
return null;
|
||||
string[]? domains = null;
|
||||
string domain = Midori.URI.parse_hostname (uri, null);
|
||||
string[] subdomains = domain.split (".");
|
||||
if (subdomains == null)
|
||||
return null;
|
||||
int cnt = subdomains.length - 1;
|
||||
var subdomain = new StringBuilder (subdomains[cnt]);
|
||||
subdomain.prepend_c ('.');
|
||||
cnt--;
|
||||
while (cnt >= 0) {
|
||||
subdomain.prepend (subdomains[cnt]);
|
||||
domains += subdomain.str;
|
||||
subdomain.prepend_c ('.');
|
||||
cnt--;
|
||||
}
|
||||
return domains;
|
||||
}
|
||||
|
||||
string? get_hider_css_rules_for_uri (string page_uri) {
|
||||
if (page_uri == null)
|
||||
return null;
|
||||
string[]? domains = get_domains_for_uri (page_uri);
|
||||
if (domains == null)
|
||||
return null;
|
||||
var code = new StringBuilder ();
|
||||
int blockscnt = 0;
|
||||
string? style = null;
|
||||
foreach (unowned Subscription sub in config) {
|
||||
foreach (unowned Feature feature in sub) {
|
||||
var element = feature as Element;
|
||||
if (element != null) {
|
||||
foreach (unowned string subdomain in domains) {
|
||||
style = element.lookup (subdomain);
|
||||
if (style != null) {
|
||||
code.append (style);
|
||||
code.append_c (',');
|
||||
blockscnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (blockscnt == 0)
|
||||
return null;
|
||||
code.truncate (code.len - 1);
|
||||
|
||||
string hider_css;
|
||||
if (debug_element)
|
||||
hider_css = " { background-color: red !important; border: 4px solid green !important; }";
|
||||
else
|
||||
hider_css = " { display: none !important }";
|
||||
|
||||
code.append (hider_css);
|
||||
if (debug_element)
|
||||
stdout.printf ("css: %s\n", code.str);
|
||||
|
||||
return code.str;
|
||||
}
|
||||
|
||||
void inject_css (Midori.View view, string page_uri) {
|
||||
/* Don't block ads on internal pages */
|
||||
if (!Midori.URI.is_http (page_uri))
|
||||
return;
|
||||
|
||||
if ("adblock:element" in (Environment.get_variable ("MIDORI_DEBUG") ?? ""))
|
||||
debug_element = true;
|
||||
else
|
||||
debug_element = status_icon.debug_element_toggled;
|
||||
|
||||
#if USE_CSS_SELECTOR_FOR_BLOCKED_RESOURCES
|
||||
string? blocked_css = get_hider_css_for_blocked_resources ();
|
||||
if (blocked_css != null)
|
||||
view.inject_stylesheet (blocked_css);
|
||||
#else
|
||||
string? blocked_js = get_hider_js_for_blocked_resorces ();
|
||||
if (blocked_js != null)
|
||||
view.execute_script (blocked_js, null);
|
||||
#endif
|
||||
string? style = get_hider_css_rules_for_uri (page_uri);
|
||||
if (style != null)
|
||||
view.inject_stylesheet (style);
|
||||
}
|
||||
|
||||
internal void init () {
|
||||
hider_selectors = new StringBuilder ();
|
||||
load_config ();
|
||||
manager = new SubscriptionManager (config);
|
||||
status_icon = new StatusIcon (config, manager);
|
||||
foreach (unowned Subscription sub in config) {
|
||||
try {
|
||||
sub.parse ();
|
||||
} catch (GLib.Error error) {
|
||||
warning ("Error parsing %s: %s", sub.uri, error.message);
|
||||
}
|
||||
}
|
||||
config.notify["size"].connect (subscriptions_added_removed);
|
||||
manager.description_label.activate_link.connect (open_link);
|
||||
#if !USE_CSS_SELECTOR_FOR_BLOCKED_RESOURCES
|
||||
js_hider_function_body = fetch_js_hider_function_body ();
|
||||
#endif
|
||||
}
|
||||
|
||||
bool open_link (string uri) {
|
||||
var browser = get_app ().browser;
|
||||
var view = browser.add_uri (uri);
|
||||
browser.tab = view;
|
||||
return true;
|
||||
}
|
||||
|
||||
void subscriptions_added_removed (ParamSpec pspec) {
|
||||
hider_selectors = new StringBuilder ();
|
||||
}
|
||||
|
||||
void load_config () {
|
||||
#if HAVE_WEBKIT2
|
||||
string config_dir = Path.build_filename (GLib.Environment.get_user_config_dir (), PACKAGE_NAME, "extensions", "libadblock." + GLib.Module.SUFFIX);
|
||||
Midori.Paths.mkdir_with_parents (config_dir);
|
||||
#else
|
||||
string config_dir = Midori.Paths.get_extension_config_dir ("adblock");
|
||||
#endif
|
||||
string presets = Midori.Paths.get_extension_preset_filename ("adblock", "config");
|
||||
string filename = Path.build_filename (config_dir, "config");
|
||||
config = new Config (filename, presets);
|
||||
string custom_list = GLib.Path.build_filename (config_dir, "custom.list");
|
||||
try {
|
||||
custom = new Subscription (Filename.to_uri (custom_list, null));
|
||||
custom.mutable = false;
|
||||
custom.title = _("Custom");
|
||||
config.add (custom);
|
||||
} catch (Error error) {
|
||||
custom = null;
|
||||
warning ("Failed to add custom list %s: %s", custom_list, error.message);
|
||||
}
|
||||
}
|
||||
|
||||
public Adblock.Directive get_directive_for_uri (string request_uri, string page_uri) {
|
||||
if (!config.enabled)
|
||||
return Directive.ALLOW;
|
||||
|
||||
/* Always allow the main page */
|
||||
if (request_uri == page_uri)
|
||||
return Directive.ALLOW;
|
||||
|
||||
/* Skip adblock on internal pages */
|
||||
if (Midori.URI.is_blank (page_uri))
|
||||
return Directive.ALLOW;
|
||||
|
||||
/* Skip adblock on favicons and non http schemes */
|
||||
if (!Midori.URI.is_http (request_uri) || request_uri.has_suffix ("favicon.ico"))
|
||||
return Directive.ALLOW;
|
||||
|
||||
Directive? directive = null;
|
||||
foreach (unowned Subscription sub in config) {
|
||||
directive = sub.get_directive (request_uri, page_uri);
|
||||
if (directive != null)
|
||||
break;
|
||||
}
|
||||
|
||||
if (directive == null)
|
||||
directive = Directive.ALLOW;
|
||||
else if (directive == Directive.BLOCK) {
|
||||
status_icon.set_state (State.BLOCKED);
|
||||
#if USE_CSS_SELECTOR_FOR_BLOCKED_RESOURCES
|
||||
hider_selectors.append ("img[src*=\"%s\"] , iframe[src*=\"%s\"] , ".printf (request_uri, request_uri));
|
||||
#else
|
||||
hider_selectors.append (" uris.push ('%s');\n".printf (request_uri));
|
||||
#endif
|
||||
}
|
||||
return directive;
|
||||
}
|
||||
|
||||
internal bool request_handled (string request_uri, string page_uri) {
|
||||
return get_directive_for_uri (request_uri, page_uri) == Directive.BLOCK;
|
||||
}
|
||||
}
|
||||
|
||||
static void debug (string format, ...) {
|
||||
bool debug_match = "adblock:match" in (Environment.get_variable ("MIDORI_DEBUG") ?? "");
|
||||
if (!debug_match)
|
||||
return;
|
||||
|
||||
var args = va_list ();
|
||||
stdout.vprintf (format + "\n", args);
|
||||
}
|
||||
|
||||
internal static string? fixup_regex (string prefix, string? src) {
|
||||
if (src == null)
|
||||
return null;
|
||||
|
||||
var fixed = new StringBuilder ();
|
||||
fixed.append(prefix);
|
||||
|
||||
uint i = 0;
|
||||
if (src[0] == '*')
|
||||
i++;
|
||||
uint l = src.length;
|
||||
while (i < l) {
|
||||
char c = src[i];
|
||||
switch (c) {
|
||||
case '*':
|
||||
fixed.append (".*"); break;
|
||||
case '|':
|
||||
case '^':
|
||||
case '+':
|
||||
break;
|
||||
case '?':
|
||||
case '[':
|
||||
case ']':
|
||||
case '.':
|
||||
case '(':
|
||||
case ')':
|
||||
fixed.append_printf ("\\%c", c); break;
|
||||
default:
|
||||
fixed.append_c (c); break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return fixed.str;
|
||||
}
|
||||
}
|
||||
|
||||
#if HAVE_WEBKIT2
|
||||
#if !HAVE_WEBKIT2_3_91
|
||||
Adblock.Extension? filter;
|
||||
public static void webkit_web_extension_initialize (WebKit.WebExtension web_extension) {
|
||||
filter = new Adblock.Extension.WebExtension (web_extension);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
public Midori.Extension extension_init () {
|
||||
return new Adblock.Extension ();
|
||||
}
|
||||
|
||||
static string? tmp_folder = null;
|
||||
string get_test_file (string contents) {
|
||||
if (tmp_folder == null)
|
||||
tmp_folder = Midori.Paths.make_tmp_dir ("adblockXXXXXX");
|
||||
string checksum = Checksum.compute_for_string (ChecksumType.MD5, contents);
|
||||
string file = Path.build_path (Path.DIR_SEPARATOR_S, tmp_folder, checksum);
|
||||
try {
|
||||
FileUtils.set_contents (file, contents, -1);
|
||||
} catch (Error file_error) {
|
||||
GLib.error (file_error.message);
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
struct TestCaseConfig {
|
||||
public string content;
|
||||
public uint size;
|
||||
public bool enabled;
|
||||
}
|
||||
|
||||
const TestCaseConfig[] configs = {
|
||||
{ "", 0, true },
|
||||
{ "[settings]", 0, true },
|
||||
{ "[settings]\nfilters=foo;", 1, true },
|
||||
{ "[settings]\nfilters=foo;\ndisabled=true", 1, false }
|
||||
};
|
||||
|
||||
void test_adblock_config () {
|
||||
assert (new Adblock.Config (null, null).size == 0);
|
||||
|
||||
foreach (var conf in configs) {
|
||||
var config = new Adblock.Config (get_test_file (conf.content), null);
|
||||
if (config.size != conf.size)
|
||||
error ("Wrong size %s rather than %s:\n%s",
|
||||
config.size.to_string (), conf.size.to_string (), conf.content);
|
||||
if (config.enabled != conf.enabled)
|
||||
error ("Wrongly got enabled=%s rather than %s:\n%s",
|
||||
config.enabled.to_string (), conf.enabled.to_string (), conf.content);
|
||||
}
|
||||
}
|
||||
|
||||
struct TestCaseSub {
|
||||
public string uri;
|
||||
public bool active;
|
||||
}
|
||||
|
||||
const TestCaseSub[] subs = {
|
||||
{ "http://foo.com", true },
|
||||
{ "http://bar.com", false },
|
||||
{ "https://spam.com", true },
|
||||
{ "https://eggs.com", false },
|
||||
{ "file:///bla", true },
|
||||
{ "file:///blub", false }
|
||||
};
|
||||
|
||||
void test_adblock_subs () {
|
||||
var config = new Adblock.Config (get_test_file ("""
|
||||
[settings]
|
||||
filters=http://foo.com;http-//bar.com;https://spam.com;http-://eggs.com;file:///bla;file-///blub;http://foo.com;
|
||||
"""), null);
|
||||
|
||||
assert (config.enabled);
|
||||
foreach (var sub in subs) {
|
||||
bool found = false;
|
||||
foreach (unowned Adblock.Subscription subscription in config) {
|
||||
if (subscription.uri == sub.uri) {
|
||||
assert (subscription.active == sub.active);
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
error ("%s not found", sub.uri);
|
||||
}
|
||||
|
||||
/* 6 unique URLs, 1 duplicate */
|
||||
assert (config.size == 6);
|
||||
/* Duplicates aren't added again either */
|
||||
assert (!config.add (new Adblock.Subscription ("https://spam.com")));
|
||||
|
||||
/* Saving the config and loading it should give back identical results */
|
||||
config.save ();
|
||||
var copy = new Adblock.Config (config.path, null);
|
||||
assert (copy.size == config.size);
|
||||
assert (copy.enabled == config.enabled);
|
||||
for (int i = 0; i < config.size; i++) {
|
||||
assert (copy[i].uri == config[i].uri);
|
||||
assert (copy[i].active == config[i].active);
|
||||
}
|
||||
/* Enabled status should be saved and loaded */
|
||||
config.enabled = false;
|
||||
copy = new Adblock.Config (config.path, null);
|
||||
assert (copy.enabled == config.enabled);
|
||||
/* Flipping individual active values should be retained after saving */
|
||||
foreach (unowned Adblock.Subscription sub in config)
|
||||
sub.active = !sub.active;
|
||||
copy = new Adblock.Config (config.path, null);
|
||||
for (uint i = 0; i < config.size; i++) {
|
||||
if (config[i].active != copy[i].active) {
|
||||
string contents;
|
||||
try {
|
||||
FileUtils.get_contents (config.path, out contents, null);
|
||||
} catch (Error file_error) {
|
||||
error (file_error.message);
|
||||
}
|
||||
error ("%s is %s but should be %s:\n%s",
|
||||
copy[i].uri, copy[i].active ? "active" : "disabled", config[i].active ? "active" : "disabled", contents);
|
||||
}
|
||||
}
|
||||
|
||||
/* Adding and removing works, changes size */
|
||||
var s = new Adblock.Subscription ("http://en.de");
|
||||
assert (config.add (s));
|
||||
assert (config.size == 7);
|
||||
config.remove (s);
|
||||
assert (config.size == 6);
|
||||
/* If it was removed before we should be able to add it again */
|
||||
assert (config.add (s));
|
||||
assert (config.size == 7);
|
||||
}
|
||||
|
||||
void test_adblock_init () {
|
||||
/* No config */
|
||||
var extension = new Adblock.Extension ();
|
||||
extension.init ();
|
||||
assert (extension.config.enabled);
|
||||
/* Defaults plus custom */
|
||||
if (extension.config.size != 3)
|
||||
error ("Expected 3 initial subs, got %s".printf (
|
||||
extension.config.size.to_string ()));
|
||||
assert (extension.status_icon.state == Adblock.State.ENABLED);
|
||||
|
||||
/* Add new subscription */
|
||||
string path = Midori.Paths.get_res_filename ("adblock.list");
|
||||
string uri;
|
||||
try {
|
||||
uri = Filename.to_uri (path, null);
|
||||
} catch (Error error) {
|
||||
GLib.error (error.message);
|
||||
}
|
||||
var sub = new Adblock.Subscription (uri);
|
||||
extension.config.add (sub);
|
||||
assert (extension.status_icon.state == Adblock.State.ENABLED);
|
||||
assert (extension.config.size == 4);
|
||||
try {
|
||||
sub.parse ();
|
||||
} catch (GLib.Error error) {
|
||||
GLib.error (error.message);
|
||||
}
|
||||
/* The page itself never hits */
|
||||
assert (!extension.request_handled ("https://ads.bogus.name/blub", "https://ads.bogus.name/blub"));
|
||||
/* Favicons don't either */
|
||||
assert (!extension.request_handled ("https://foo.com", "https://ads.bogus.name/blub/favicon.ico"));
|
||||
assert (extension.status_icon.state == Adblock.State.ENABLED);
|
||||
/* Some sanity checks to be sure there's no earlier problem */
|
||||
assert (sub.title == "Exercise");
|
||||
assert (sub.get_directive ("https://ads.bogus.name/blub", "") == Adblock.Directive.BLOCK);
|
||||
/* A rule hit should add to the cache */
|
||||
assert (extension.request_handled ("https://ads.bogus.name/blub", "https://foo.com"));
|
||||
assert (extension.status_icon.state == Adblock.State.BLOCKED);
|
||||
assert (extension.hider_selectors.str != "");
|
||||
/* Disabled means no request should be handled */
|
||||
extension.config.enabled = false;
|
||||
assert (!extension.request_handled ("https://ads.bogus.name/blub", "https://foo.com"));
|
||||
// FIXME: assert (extension.status_icon.state == Adblock.State.DISABLED);
|
||||
/* Removing a subscription should clear the cached CSS */
|
||||
extension.config.remove (sub);
|
||||
assert (extension.hider_selectors.str == "");
|
||||
assert (extension.config.size == 3);
|
||||
/* Now let's add a custom rule */
|
||||
extension.config.enabled = true;
|
||||
extension.custom.add_rule ("/adpage.");
|
||||
assert (extension.custom.get_directive ("http://www.engadget.com/_uac/adpage.html", "http://foo.com") == Adblock.Directive.BLOCK);
|
||||
assert (extension.request_handled ("http://www.engadget.com/_uac/adpage.html", "http://foo.com"));
|
||||
assert (extension.status_icon.state == Adblock.State.BLOCKED);
|
||||
/* Second attempt, from cache, same result */
|
||||
assert (extension.custom.get_directive ("http://www.engadget.com/_uac/adpage.html", "http://foo.com") == Adblock.Directive.BLOCK);
|
||||
assert (extension.request_handled ("http://www.engadget.com/_uac/adpage.html", "http://foo.com"));
|
||||
/* Another custom rule */
|
||||
extension.custom.add_rule ("/images/*.png");
|
||||
assert (extension.custom.get_directive ("http://alpha.beta.com/images/yota.png", "https://foo.com") == Adblock.Directive.BLOCK);
|
||||
assert (extension.request_handled ("http://alpha.beta.com/images/yota.png", "https://foo.com"));
|
||||
/* Second attempt, from cache, same result */
|
||||
assert (extension.request_handled ("http://alpha.beta.com/images/yota.png", "https://foo.com"));
|
||||
/* Similar uri but .jpg should pass */
|
||||
assert (!extension.request_handled ("http://alpha.beta.com/images/yota.jpg", "https://foo.com"));
|
||||
assert (extension.custom.get_directive ("http://alpha.beta.com/images/yota.jpg", "https://foo.com") != Adblock.Directive.BLOCK);
|
||||
/* Add whitelist rule */
|
||||
extension.custom.add_rule ("@@http://alpha.beta.com/images/drop*bear.png");
|
||||
assert (!extension.request_handled ("http://alpha.beta.com/images/drop-bear.png", "https://foo.com"));
|
||||
assert (!extension.request_handled ("http://alpha.beta.com/images/dropzone_bear.png", "https://foo.com"));
|
||||
assert (extension.custom.get_directive ("http://alpha.beta.com/images/drop-bear.png", "https://foo.com") != Adblock.Directive.BLOCK);
|
||||
/* Doesn't match whitelist, matches *.png rule, should be blocked */
|
||||
assert (extension.request_handled ("http://alpha.beta.com/images/bear.png", "https://foo.com"));
|
||||
assert (extension.custom.get_directive ("http://alpha.beta.com/images/bear.png", "https://foo.com") == Adblock.Directive.BLOCK);
|
||||
}
|
||||
|
||||
struct TestCaseLine {
|
||||
public string line;
|
||||
public string fixed;
|
||||
}
|
||||
|
||||
const TestCaseLine[] lines = {
|
||||
{ null, null },
|
||||
{ "!", "!" },
|
||||
{ "@@", "@@" },
|
||||
{ "##", "##" },
|
||||
{ "[", "\\[" },
|
||||
{ "+advert/", "advert/" },
|
||||
{ "*foo", "foo" },
|
||||
{ "f*oo", "f.*oo" },
|
||||
{ "?foo", "\\?foo" },
|
||||
{ "foo?", "foo\\?" },
|
||||
{ ".*foo/bar", "..*foo/bar" },
|
||||
{ ".*.*.*.info/popup", "\\..*\\..*\\..*\\.info/popup" },
|
||||
{ "http://bla.blub/*", "http://bla.blub/.*" },
|
||||
{ "bag?r[]=*cpa", "bag\\?r\\[\\]=.*cpa" },
|
||||
{ "(facebookLike,", "\\(facebookLike," }
|
||||
};
|
||||
|
||||
void test_adblock_fixup_regexp () {
|
||||
foreach (var line in lines) {
|
||||
Katze.assert_str_equal (line.line, Adblock.fixup_regex ("", line.line), line.fixed);
|
||||
}
|
||||
}
|
||||
|
||||
struct TestCasePattern {
|
||||
public string uri;
|
||||
public Adblock.Directive directive;
|
||||
}
|
||||
|
||||
const TestCasePattern[] patterns = {
|
||||
{ "http://www.engadget.com/_uac/adpage.html", Adblock.Directive.BLOCK },
|
||||
{ "http://test.dom/test?var=1", Adblock.Directive.BLOCK },
|
||||
{ "http://ads.foo.bar/teddy", Adblock.Directive.BLOCK },
|
||||
{ "http://ads.fuu.bar/teddy", Adblock.Directive.ALLOW },
|
||||
{ "https://ads.bogus.name/blub", Adblock.Directive.BLOCK },
|
||||
// FIXME { "http://ads.bla.blub/kitty", Adblock.Directive.BLOCK },
|
||||
// FIXME { "http://ads.blub.boing/soda", Adblock.Directive.BLOCK },
|
||||
{ "http://ads.foo.boing/beer", Adblock.Directive.ALLOW },
|
||||
{ "https://testsub.engine.adct.ru/test?id=1", Adblock.Directive.BLOCK },
|
||||
{ "http://test.ltd/addyn/test/test?var=adtech;&var2=1", Adblock.Directive.BLOCK },
|
||||
{ "http://add.doubleclick.net/pfadx/aaaa.mtvi", Adblock.Directive.BLOCK },
|
||||
{ "http://add.doubleclick.net/pfadx/aaaa.mtv", Adblock.Directive.ALLOW },
|
||||
{ "http://objects.tremormedia.com/embed/xml/list.xml?r=", Adblock.Directive.BLOCK },
|
||||
{ "http://qq.videostrip.c/sub/admatcherclient.php", Adblock.Directive.ALLOW },
|
||||
{ "http://qq.videostrip.com/sub/admatcherclient.php", Adblock.Directive.BLOCK },
|
||||
{ "http://qq.videostrip.com/sub/admatcherclient.php", Adblock.Directive.BLOCK },
|
||||
{ "http://br.gcl.ru/cgi-bin/br/test", Adblock.Directive.BLOCK },
|
||||
{ "https://bugs.webkit.org/buglist.cgi?query_format=advanced&short_desc_type=allwordssubstr&short_desc=&long_desc_type=substring&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&keywords_type=allwords&keywords=&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&emailassigned_to1=1&emailtype1=substring&email1=&emailassigned_to2=1&emailreporter2=1&emailcc2=1&emailtype2=substring&email2=&bugidtype=include&bug_id=&votes=&chfieldfrom=&chfieldto=Now&chfieldvalue=&query_based_on=gtkport&field0-0-0=keywords&type0-0-0=anywordssubstr&value0-0-0=Gtk%20Cairo%20soup&field0-0-1=short_desc&type0-0-1=anywordssubstr&value0-0-1=Gtk%20Cairo%20soup%20autoconf%20automake%20autotool&field0-0-2=component&type0-0-2=equals&value0-0-2=WebKit%20Gtk", Adblock.Directive.ALLOW },
|
||||
{ "http://www.engadget.com/2009/09/24/google-hits-android-rom-modder-with-a-cease-and-desist-letter/", Adblock.Directive.ALLOW },
|
||||
{ "http://karibik-invest.com/es/bienes_raices/search.php?sqT=19&sqN=&sqMp=&sqL=0&qR=1&sqMb=&searchMode=1&action=B%FAsqueda", Adblock.Directive.ALLOW },
|
||||
{ "http://google.com", Adblock.Directive.ALLOW }
|
||||
};
|
||||
|
||||
string pretty_directive (Adblock.Directive? directive) {
|
||||
if (directive == null)
|
||||
return "none";
|
||||
return directive.to_string ();
|
||||
}
|
||||
|
||||
void test_adblock_pattern () {
|
||||
string path = Midori.Paths.get_res_filename ("adblock.list");
|
||||
string uri;
|
||||
try {
|
||||
uri = Filename.to_uri (path, null);
|
||||
} catch (Error error) {
|
||||
GLib.error (error.message);
|
||||
}
|
||||
var sub = new Adblock.Subscription (uri);
|
||||
try {
|
||||
sub.parse ();
|
||||
} catch (Error error) {
|
||||
GLib.error (error.message);
|
||||
}
|
||||
foreach (var pattern in patterns) {
|
||||
Adblock.Directive? directive = sub.get_directive (pattern.uri, "");
|
||||
if (directive == null)
|
||||
directive = Adblock.Directive.ALLOW;
|
||||
if (directive != pattern.directive) {
|
||||
error ("%s expected for %s but got %s",
|
||||
pretty_directive (pattern.directive), pattern.uri, pretty_directive (directive));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
string pretty_date (DateTime? date) {
|
||||
if (date == null)
|
||||
return "N/A";
|
||||
return date.to_string ();
|
||||
}
|
||||
|
||||
struct TestUpdateExample {
|
||||
public string content;
|
||||
public bool result;
|
||||
public bool valid;
|
||||
}
|
||||
|
||||
const TestUpdateExample[] examples = {
|
||||
{ "[Adblock Plus 1.1]\n! Last modified: 05 Sep 2010 11:00 UTC\n! This list expires after 48 hours\n", true, true },
|
||||
{ "[Adblock Plus 1.1]\n! Last modified: 05.09.2010 11:00 UTC\n! Expires: 2 days (update frequency)\n", true, true },
|
||||
{ "[Adblock Plus 1.1]\n! Updated: 05 Nov 2024 11:00 UTC\n! Expires: 5 days (update frequency)\n", false, true },
|
||||
{ "[Adblock]\n! dutchblock v3\n! This list expires after 14 days\n|http://b*.mookie1.com/\n", false, true },
|
||||
{ "[Adblock Plus 2.0]\n! Last modification time (GMT): 2012.11.05 13:33\n! Expires: 5 days (update frequency)\n", true, true },
|
||||
{ "[Adblock Plus 2.0]\n! Last modification time (GMT): 2012.11.05 13:33\n", true, true },
|
||||
{ "[Adblock]\n ! dummy, i dont have any dates\n", false, true },
|
||||
/* non-standard update time metadata as found in http://abp.mozilla-hispano.org/nauscopio/filtros.txt */
|
||||
{ "[Adblock Plus 2.0]\n ! Last modified: Oct 26, 2013 18:00 UTC\n ! This list expires after 5 days\n! Last modified by maty: 12Oct2013\n! \n", false, true },
|
||||
{ "\n", false, false }
|
||||
};
|
||||
|
||||
void test_subscription_update () {
|
||||
string uri;
|
||||
FileIOStream iostream;
|
||||
File file;
|
||||
try {
|
||||
file = File.new_tmp ("midori_adblock_update_test_XXXXXX", out iostream);
|
||||
uri = file.get_uri ();
|
||||
} catch (Error error) {
|
||||
GLib.error (error.message);
|
||||
}
|
||||
var sub = new Adblock.Subscription (uri);
|
||||
var updater = new Adblock.Updater ();
|
||||
sub.add_feature (updater);
|
||||
|
||||
foreach (var example in examples) {
|
||||
try {
|
||||
file.replace_contents (example.content.data, null, false, FileCreateFlags.NONE, null);
|
||||
sub.clear ();
|
||||
sub.parse ();
|
||||
} catch (Error error) {
|
||||
GLib.error (error.message);
|
||||
}
|
||||
if (example.valid != sub.valid)
|
||||
error ("Subscription expected to be %svalid but %svalid:\n%s",
|
||||
example.valid ? "" : "in", sub.valid ? "" : "in", example.content);
|
||||
if (example.result != updater.needs_update)
|
||||
error ("Update%s expected for:\n%s\nLast Updated: %s\nExpires: %s",
|
||||
example.result ? "" : " not", example.content,
|
||||
pretty_date (updater.last_updated), pretty_date (updater.expires));
|
||||
}
|
||||
}
|
||||
|
||||
struct TestSubUri {
|
||||
public string? src_uri;
|
||||
public string? dst_uri;
|
||||
}
|
||||
|
||||
const TestSubUri[] suburis =
|
||||
{
|
||||
{ null, null },
|
||||
{ "not-a-link", null },
|
||||
{ "http://some.uri", "http://some.uri" },
|
||||
{ "abp:subscribe?location=https%3A%2F%2Feasylist-downloads.adblockplus.org%2Fabpindo%2Beasylist.txt&title=ABPindo%2BEasyList", "https://easylist-downloads.adblockplus.org/abpindo+easylist.txt" }
|
||||
};
|
||||
|
||||
void test_subscription_uri_parsing () {
|
||||
string? parsed_uri;
|
||||
foreach (var example in suburis) {
|
||||
parsed_uri = Adblock.parse_subscription_uri (example.src_uri);
|
||||
if (parsed_uri != example.dst_uri)
|
||||
error ("Subscription expected to be %svalid but %svalid:\n%s",
|
||||
example.dst_uri, parsed_uri, example.src_uri);
|
||||
}
|
||||
}
|
||||
|
||||
public void extension_test () {
|
||||
Test.add_func ("/extensions/adblock2/config", test_adblock_config);
|
||||
Test.add_func ("/extensions/adblock2/subs", test_adblock_subs);
|
||||
Test.add_func ("/extensions/adblock2/init", test_adblock_init);
|
||||
Test.add_func ("/extensions/adblock2/parse", test_adblock_fixup_regexp);
|
||||
Test.add_func ("/extensions/adblock2/pattern", test_adblock_pattern);
|
||||
Test.add_func ("/extensions/adblock2/update", test_subscription_update);
|
||||
Test.add_func ("/extensions/adblock2/subsparse", test_subscription_uri_parsing);
|
||||
}
|
||||
|
52
extensions/adblock/filter.vala
Normal file
52
extensions/adblock/filter.vala
Normal file
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
Copyright (C) 2009-2014 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2009-2012 Alexander Butenko <a.butenka@gmail.com>
|
||||
|
||||
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 Adblock {
|
||||
public abstract class Filter : Feature {
|
||||
Options optslist;
|
||||
protected HashTable<string, Regex?> rules;
|
||||
|
||||
public virtual void insert (string sig, Regex regex) {
|
||||
rules.insert (sig, regex);
|
||||
}
|
||||
|
||||
public virtual Regex? lookup (string sig) {
|
||||
return rules.lookup (sig);
|
||||
}
|
||||
|
||||
public virtual uint size () {
|
||||
return rules.size ();
|
||||
}
|
||||
|
||||
protected Filter (Options options) {
|
||||
optslist = options;
|
||||
clear ();
|
||||
}
|
||||
|
||||
public override void clear () {
|
||||
rules = new HashTable<string, Regex> (str_hash, str_equal);
|
||||
}
|
||||
|
||||
protected bool check_rule (Regex regex, string pattern, string request_uri, string page_uri) throws Error {
|
||||
if (!regex.match_full (request_uri))
|
||||
return false;
|
||||
|
||||
var opts = optslist.lookup (pattern);
|
||||
if (opts != null && Regex.match_simple (",third-party", opts,
|
||||
RegexCompileFlags.CASELESS, RegexMatchFlags.NOTEMPTY))
|
||||
if (page_uri != null && regex.match_full (page_uri))
|
||||
return false;
|
||||
debug ("blocked by pattern regexp=%s -- %s", regex.get_pattern (), request_uri);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
47
extensions/adblock/keys.vala
Normal file
47
extensions/adblock/keys.vala
Normal file
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
Copyright (C) 2009-2014 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2009-2012 Alexander Butenko <a.butenka@gmail.com>
|
||||
|
||||
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 Adblock {
|
||||
public class Keys : Filter {
|
||||
List<Regex> blacklist;
|
||||
|
||||
public Keys (Options options) {
|
||||
base (options);
|
||||
}
|
||||
|
||||
public override void clear () {
|
||||
base.clear ();
|
||||
blacklist = new List<Regex> ();
|
||||
}
|
||||
|
||||
public override Directive? match (string request_uri, string page_uri) throws Error {
|
||||
string? uri = fixup_regex ("", request_uri);
|
||||
if (uri == null)
|
||||
return null;
|
||||
|
||||
int signature_size = 8;
|
||||
int pos, l = uri.length;
|
||||
for (pos = l - signature_size; pos >= 0; pos--) {
|
||||
string signature = uri.offset (pos).ndup (signature_size);
|
||||
var regex = rules.lookup (signature);
|
||||
if (regex == null || blacklist.find (regex) != null)
|
||||
continue;
|
||||
|
||||
if (check_rule (regex, uri, request_uri, page_uri))
|
||||
return Directive.BLOCK;
|
||||
blacklist.prepend (regex);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
32
extensions/adblock/options.vala
Normal file
32
extensions/adblock/options.vala
Normal file
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
Copyright (C) 2014 Christian Dywan <christian@twotoasts.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 Adblock {
|
||||
public class Options : GLib.Object {
|
||||
HashTable<string, string?> optslist;
|
||||
|
||||
public Options () {
|
||||
clear ();
|
||||
}
|
||||
|
||||
public void insert (string sig, string? opts) {
|
||||
optslist.insert (sig, opts);
|
||||
}
|
||||
|
||||
public string? lookup (string sig) {
|
||||
return optslist.lookup (sig);
|
||||
}
|
||||
|
||||
public void clear () {
|
||||
optslist = new HashTable<string, string?> (str_hash, str_equal);
|
||||
}
|
||||
}
|
||||
}
|
26
extensions/adblock/pattern.vala
Normal file
26
extensions/adblock/pattern.vala
Normal file
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
Copyright (C) 2009-2014 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2009-2012 Alexander Butenko <a.butenka@gmail.com>
|
||||
|
||||
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 Adblock {
|
||||
public class Pattern : Filter {
|
||||
public Pattern (Options options) {
|
||||
base (options);
|
||||
}
|
||||
|
||||
public override Directive? match (string request_uri, string page_uri) throws Error {
|
||||
foreach (unowned string patt in rules.get_keys ())
|
||||
if (check_rule (rules.lookup (patt), patt, request_uri, page_uri))
|
||||
return Directive.BLOCK;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
404
extensions/adblock/subscriptions.vala
Normal file
404
extensions/adblock/subscriptions.vala
Normal file
|
@ -0,0 +1,404 @@
|
|||
/*
|
||||
Copyright (C) 2009-2014 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2009-2012 Alexander Butenko <a.butenka@gmail.com>
|
||||
|
||||
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 Adblock {
|
||||
public abstract class Feature : GLib.Object {
|
||||
public virtual bool header (string key, string value) {
|
||||
return false;
|
||||
}
|
||||
public virtual bool parsed (File file) {
|
||||
return true;
|
||||
}
|
||||
public virtual Directive? match (string request_uri, string page_uri) throws Error {
|
||||
return null;
|
||||
}
|
||||
public virtual void clear () {
|
||||
}
|
||||
}
|
||||
|
||||
public class Subscription : GLib.Object {
|
||||
public string? path;
|
||||
bool debug_parse;
|
||||
public string uri { get; set; default = null; }
|
||||
public string title { get; set; default = null; }
|
||||
public bool active { get; set; default = true; }
|
||||
public bool mutable { get; set; default = true; }
|
||||
public bool valid { get; private set; default = true; }
|
||||
HashTable<string, Directive?> cache;
|
||||
List<Feature> features;
|
||||
public Pattern pattern;
|
||||
public Keys keys;
|
||||
public Options optslist;
|
||||
public Whitelist whitelist;
|
||||
public Element element;
|
||||
#if !HAVE_WEBKIT2
|
||||
WebKit.Download? download;
|
||||
#endif
|
||||
|
||||
public Subscription (string uri) {
|
||||
debug_parse = "adblock:parse" in (Environment.get_variable ("MIDORI_DEBUG") ?? "");
|
||||
|
||||
this.uri = uri;
|
||||
|
||||
this.optslist = new Options ();
|
||||
this.whitelist = new Whitelist (optslist);
|
||||
add_feature (this.whitelist);
|
||||
this.keys = new Keys (optslist);
|
||||
add_feature (this.keys);
|
||||
this.pattern = new Pattern (optslist);
|
||||
add_feature (this.pattern);
|
||||
this.element = new Element ();
|
||||
add_feature (this.element);
|
||||
clear ();
|
||||
}
|
||||
|
||||
public void add_feature (Feature feature) {
|
||||
features.append (feature);
|
||||
size++;
|
||||
}
|
||||
|
||||
/* foreach support */
|
||||
public new unowned Feature? get (uint index) {
|
||||
return features.nth_data (index);
|
||||
}
|
||||
public uint size { get; private set; }
|
||||
|
||||
public void clear () {
|
||||
cache = new HashTable<string, Directive?> (str_hash, str_equal);
|
||||
foreach (unowned Feature feature in features)
|
||||
feature.clear ();
|
||||
optslist.clear ();
|
||||
}
|
||||
|
||||
internal void parse_line (string? line) throws Error {
|
||||
if (line.has_prefix ("@@")) {
|
||||
if (line.contains("$") && line.contains ("domain"))
|
||||
return;
|
||||
if (line.has_prefix ("@@||"))
|
||||
add_url_pattern ("^", "whitelist", line.offset (4));
|
||||
else if (line.has_prefix ("@@|"))
|
||||
add_url_pattern ("^", "whitelist", line.offset (3));
|
||||
else
|
||||
add_url_pattern ("", "whitelist", line.offset (2));
|
||||
return;
|
||||
}
|
||||
/* TODO: [include] [exclude] */
|
||||
if (line[0] == '[')
|
||||
return;
|
||||
|
||||
/* CSS block hider */
|
||||
if (line.has_prefix ("##")) {
|
||||
/* TODO */
|
||||
return;
|
||||
}
|
||||
if (line[0] == '#')
|
||||
return;
|
||||
|
||||
/* TODO: CSS hider whitelist */
|
||||
if ("#@#" in line)
|
||||
return;
|
||||
|
||||
/* Per domain CSS hider rule */
|
||||
if ("##" in line) {
|
||||
frame_add_private (line, "##");
|
||||
return;
|
||||
}
|
||||
if ("#" in line) {
|
||||
frame_add_private (line, "#");
|
||||
return;
|
||||
}
|
||||
|
||||
/* URL blocker rule */
|
||||
if (line.has_prefix ("|")) {
|
||||
/* TODO: handle options and domains excludes */
|
||||
if (line.contains("$"))
|
||||
return;
|
||||
|
||||
if (line.has_prefix ("||"))
|
||||
add_url_pattern ("", "fulluri", line.offset (2));
|
||||
else
|
||||
add_url_pattern ("^", "fulluri", line.offset (1));
|
||||
return /* add_url_pattern */;
|
||||
}
|
||||
|
||||
add_url_pattern ("", "uri", line);
|
||||
return /* add_url_pattern */;
|
||||
}
|
||||
|
||||
void frame_add_private (string line, string sep) {
|
||||
string[] data = line.split (sep, 2);
|
||||
if (!(data[1] != null && data[1] != "")
|
||||
|| data[1].chr (-1, '\'') != null
|
||||
|| (data[1].chr (-1, ':') != null
|
||||
&& !Regex.match_simple (".*\\[.*:.*\\].*", data[1],
|
||||
RegexCompileFlags.CASELESS, RegexMatchFlags.NOTEMPTY))) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (data[0].chr (-1, ',') != null) {
|
||||
string[] domains = data[0].split (",", -1);
|
||||
|
||||
foreach (unowned string domain in domains) {
|
||||
/* Ignore Firefox-specific option */
|
||||
if (domain == "~pregecko2")
|
||||
continue;
|
||||
string stripped = domain.strip ();
|
||||
/* FIXME: ~ should negate match */
|
||||
if (stripped[0] == '~')
|
||||
stripped = stripped.substring (1, -1);
|
||||
update_css_hash (stripped, data[1]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
update_css_hash (data[0], data[1]);
|
||||
}
|
||||
}
|
||||
|
||||
bool css_element_seems_valid (string element) {
|
||||
bool is_valid = true;
|
||||
string[] valid_elements = { "::after", "::before", "a", "abbr", "address", "article", "aside",
|
||||
"b", "blockquote", "caption", "center", "cite", "code", "div", "dl", "dt", "dd", "em",
|
||||
"feed", "fieldset", "figcaption", "figure", "font", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6",
|
||||
"header", "hgroup", "i", "iframe", "iframe html *", "img", "kbd", "label", "legend", "li",
|
||||
"m", "main", "marquee", "menu", "nav", "ol", "option", "p", "pre", "q", "samp", "section",
|
||||
"small", "span", "strong", "summary", "table", "tr", "tbody", "td", "th", "thead", "tt", "ul" };
|
||||
|
||||
if (!element.has_prefix (".") && !element.has_prefix ("#")
|
||||
&& !(element.split("[")[0] in valid_elements))
|
||||
is_valid = false;
|
||||
|
||||
|
||||
bool debug_selectors = "adblock:css" in (Environment.get_variable ("MIDORI_DEBUG") ?? "");
|
||||
if (debug_selectors)
|
||||
stdout.printf ("Adblock '%s' %s: %s\n",
|
||||
this.title, is_valid ? "selector" : "INVALID?", element);
|
||||
|
||||
return is_valid;
|
||||
}
|
||||
|
||||
void update_css_hash (string domain, string value) {
|
||||
if (css_element_seems_valid (value)) {
|
||||
string? olddata = element.lookup (domain);
|
||||
if (olddata != null) {
|
||||
string newdata = olddata + " , " + value;
|
||||
element.insert (domain, newdata);
|
||||
} else {
|
||||
element.insert (domain, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void add_url_pattern (string prefix, string type, string line) throws Error {
|
||||
string[]? data = line.split ("$", 2);
|
||||
if (data == null || data[0] == null)
|
||||
return;
|
||||
|
||||
string patt, opts;
|
||||
patt = data[0];
|
||||
opts = type;
|
||||
|
||||
if (data[1] != null)
|
||||
opts = type + "," + data[1];
|
||||
|
||||
if (Regex.match_simple ("subdocument", opts,
|
||||
RegexCompileFlags.CASELESS, RegexMatchFlags.NOTEMPTY))
|
||||
return;
|
||||
|
||||
string format_patt = fixup_regex (prefix, patt);
|
||||
if (debug_parse)
|
||||
stdout.printf ("got: %s opts %s\n", format_patt, opts);
|
||||
compile_regexp (format_patt, opts);
|
||||
/* return format_patt */
|
||||
}
|
||||
|
||||
bool compile_regexp (string? patt, string opts) throws Error {
|
||||
if (patt == null)
|
||||
return false;
|
||||
try {
|
||||
var regex = new Regex (patt, RegexCompileFlags.OPTIMIZE, RegexMatchFlags.NOTEMPTY);
|
||||
/* is pattern is already a regex? */
|
||||
if (Regex.match_simple ("^/.*[\\^\\$\\*].*/$", patt,
|
||||
RegexCompileFlags.UNGREEDY, RegexMatchFlags.NOTEMPTY)
|
||||
|| (opts != null && opts.contains ("whitelist"))) {
|
||||
if (debug_parse)
|
||||
stdout.printf ("patt: %s\n", patt);
|
||||
if (opts.contains ("whitelist"))
|
||||
this.whitelist.insert (patt, regex);
|
||||
else
|
||||
this.pattern.insert (patt, regex);
|
||||
this.optslist.insert (patt, opts);
|
||||
return false;
|
||||
} else { /* nope, no regex */
|
||||
int pos = 0, len;
|
||||
int signature_size = 8;
|
||||
string sig;
|
||||
len = patt.length;
|
||||
|
||||
/* chop up pattern into substrings for faster matching */
|
||||
for (pos = len - signature_size; pos>=0; pos--)
|
||||
{
|
||||
sig = patt.offset (pos).ndup (signature_size);
|
||||
/* we don't have a * nor \\, does not look like regex, save chunk as "key" */
|
||||
if (!Regex.match_simple ("[\\*]", sig, RegexCompileFlags.UNGREEDY, RegexMatchFlags.NOTEMPTY) && keys.lookup (sig) == null) {
|
||||
this.keys.insert (sig, regex);
|
||||
this.optslist.insert (sig, opts);
|
||||
} else {
|
||||
/* starts with * or \\ - save as regex */
|
||||
if ((sig.has_prefix ("*") || sig.has_prefix("\\")) && this.pattern.lookup (sig) == null) {
|
||||
this.pattern.insert (sig, regex);
|
||||
this.optslist.insert (sig, opts);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
catch (Error error) {
|
||||
warning ("Adblock compile regexp: %s", error.message);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public void parse_header (string header) throws Error {
|
||||
/* Headers come in two forms
|
||||
! Foo: Bar
|
||||
! Some freeform text
|
||||
*/
|
||||
string key = header;
|
||||
string value = "";
|
||||
if (header.contains (":")) {
|
||||
string[] parts = header.split (":", 2);
|
||||
if (parts[0] != null && parts[0] != ""
|
||||
&& parts[1] != null && parts[1] != "") {
|
||||
key = parts[0].substring (2, -1);
|
||||
value = parts[1].substring (1, -1);
|
||||
}
|
||||
}
|
||||
debug ("Header '%s' says '%s'", key, value);
|
||||
if (key == "Title")
|
||||
title = value;
|
||||
foreach (unowned Feature feature in features) {
|
||||
if (feature.header (key, value))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if !HAVE_WEBKIT2
|
||||
void download_status (ParamSpec pspec) {
|
||||
if (download.get_status () != WebKit.DownloadStatus.FINISHED)
|
||||
return;
|
||||
|
||||
download = null;
|
||||
try {
|
||||
parse ();
|
||||
} catch (Error error) {
|
||||
warning ("Error parsing %s: %s", uri, error.message);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
public void parse () throws Error
|
||||
{
|
||||
if (!active)
|
||||
return;
|
||||
|
||||
debug ("Parsing %s (%s)", uri, path);
|
||||
|
||||
clear ();
|
||||
|
||||
if (uri.has_prefix ("file://"))
|
||||
path = Filename.from_uri (uri);
|
||||
else {
|
||||
string cache_dir = GLib.Path.build_filename (GLib.Environment.get_user_cache_dir (), PACKAGE_NAME, "adblock");
|
||||
Midori.Paths.mkdir_with_parents (cache_dir);
|
||||
string filename = Checksum.compute_for_string (ChecksumType.MD5, this.uri, -1);
|
||||
path = GLib.Path.build_filename (cache_dir, filename);
|
||||
}
|
||||
|
||||
File filter_file = File.new_for_path (path);
|
||||
DataInputStream stream;
|
||||
try {
|
||||
stream = new DataInputStream (filter_file.read ());
|
||||
} catch (IOError.NOT_FOUND exist_error) {
|
||||
#if HAVE_WEBKIT2
|
||||
/* TODO */
|
||||
#else
|
||||
/* Don't bother trying to download local files */
|
||||
if (!uri.has_prefix ("file://")) {
|
||||
if (download != null)
|
||||
return;
|
||||
|
||||
string destination_uri = Filename.to_uri (path, null);
|
||||
debug ("Fetching %s to %s now", uri, destination_uri);
|
||||
download = new WebKit.Download (new WebKit.NetworkRequest (uri));
|
||||
if (!Midori.Download.has_enough_space (download, destination_uri, true))
|
||||
throw new FileError.EXIST ("Can't download to \"%s\"", path);
|
||||
download.destination_uri = destination_uri;
|
||||
download.notify["status"].connect (download_status);
|
||||
download.start ();
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
valid = false;
|
||||
string? line;
|
||||
while ((line = stream.read_line (null)) != null) {
|
||||
if (line == null)
|
||||
continue;
|
||||
string chomped = line.chomp ();
|
||||
if (chomped == "")
|
||||
continue;
|
||||
if (line[0] == '!')
|
||||
parse_header (chomped);
|
||||
else
|
||||
parse_line (chomped);
|
||||
/* The file isn't completely empty */
|
||||
valid = true;
|
||||
}
|
||||
|
||||
foreach (unowned Feature feature in features) {
|
||||
if (!feature.parsed (filter_file))
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
|
||||
public Directive? get_directive (string request_uri, string page_uri) {
|
||||
try {
|
||||
Directive? directive = cache.lookup (request_uri);
|
||||
if (directive != null)
|
||||
return directive;
|
||||
foreach (unowned Feature feature in features) {
|
||||
directive = feature.match (request_uri, page_uri);
|
||||
if (directive != null) {
|
||||
debug ("%s gave %s for %s (%s)\n",
|
||||
feature.get_type ().name (), directive.to_string (), request_uri, page_uri);
|
||||
return directive;
|
||||
}
|
||||
}
|
||||
} catch (Error error) {
|
||||
warning ("Adblock match error: %s\n", error.message);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void add_rule (string rule) {
|
||||
try {
|
||||
var file = File.new_for_uri (uri);
|
||||
file.append_to (FileCreateFlags.NONE).write (("%s\n".printf (rule)).data);
|
||||
parse ();
|
||||
} catch (Error error) {
|
||||
warning ("Failed to add custom rule: %s", error.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
155
extensions/adblock/updater.vala
Normal file
155
extensions/adblock/updater.vala
Normal file
|
@ -0,0 +1,155 @@
|
|||
/*
|
||||
Copyright (C) 2014 Paweł Forysiuk <tuxator@o2.pl>
|
||||
Copyright (C) 2014 Christian Dywan <christian@twotoasts.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 Adblock {
|
||||
public class Updater : Feature {
|
||||
string expires_meta;
|
||||
string last_mod_meta;
|
||||
public DateTime last_updated { get; set; }
|
||||
public DateTime expires { get; set; }
|
||||
public bool needs_update { get; set; }
|
||||
|
||||
public Updater () {
|
||||
}
|
||||
|
||||
public override void clear () {
|
||||
expires_meta = null;
|
||||
last_mod_meta = null;
|
||||
last_updated = null;
|
||||
expires = null;
|
||||
needs_update = false;
|
||||
}
|
||||
|
||||
public override bool header (string key, string value) {
|
||||
if (key.has_prefix ("Last mod") || key == "Updated") {
|
||||
last_mod_meta = value;
|
||||
return true;
|
||||
} else if (key == "Expires") {
|
||||
/* ! Expires: 5 days (update frequency) */
|
||||
expires_meta = value;
|
||||
return true;
|
||||
} else if (key.has_prefix ("! This list expires after")) {
|
||||
/* ! This list expires after 14 days */
|
||||
expires_meta = key.substring (26, -1);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool parsed (File file) {
|
||||
process_dates (file);
|
||||
/* It's not an error to have no update headers, we go for defaults */
|
||||
return true;
|
||||
}
|
||||
|
||||
int get_month_from_string (string? month) {
|
||||
if (month == null)
|
||||
return 0;
|
||||
|
||||
string[] months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
|
||||
for (int i = 0; i<= months.length; i++)
|
||||
{
|
||||
if (month.has_prefix (months[i]))
|
||||
return i+1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void process_dates (File file) {
|
||||
DateTime now = new DateTime.now_local ();
|
||||
last_updated = null;
|
||||
expires = null;
|
||||
|
||||
/* We have "last modification" metadata */
|
||||
if (last_mod_meta != null && (last_mod_meta.contains (" ") && last_mod_meta[0].isdigit () == true)) {
|
||||
int h = 0, min = 0, d, m, y;
|
||||
/* Date in a form of: 20.08.2012 12:34 */
|
||||
if (last_mod_meta.contains (".") || last_mod_meta.contains("-")) {
|
||||
string[] parts = last_mod_meta.split (" ", 2);
|
||||
string[] date_parts;
|
||||
string split_char = " ";
|
||||
|
||||
/* contains time part ? */
|
||||
if (parts[1] != "" && parts[1].contains (":")) {
|
||||
string[] time_parts = parts[1].split (":", 2);
|
||||
h = int.parse(time_parts[0]);
|
||||
min = int.parse(time_parts[1]);
|
||||
}
|
||||
|
||||
/* check if dot or dash was used as a delimiter */
|
||||
if (parts[0].contains ("."))
|
||||
split_char = ".";
|
||||
else if (parts[0].contains ("-"))
|
||||
split_char = "-";
|
||||
|
||||
date_parts = parts[0].split (split_char, 3);
|
||||
m = int.parse(date_parts[1]);
|
||||
if (date_parts[2].length == 4) {
|
||||
y = int.parse(date_parts[2]);
|
||||
d = int.parse(date_parts[0]);
|
||||
} else {
|
||||
y = int.parse(date_parts[0]);
|
||||
d = int.parse(date_parts[2]);
|
||||
}
|
||||
} else { /* Date in a form of: 20 Mar 2012 12:34 */
|
||||
string[] parts = last_mod_meta.split (" ", 4);
|
||||
/* contains time part ? */
|
||||
if (parts[3] != null && parts[3].contains (":")) {
|
||||
string[] time_parts = parts[3].split (":", 2);
|
||||
h = int.parse(time_parts[0]);
|
||||
min = int.parse(time_parts[1]);
|
||||
}
|
||||
|
||||
m = get_month_from_string (parts[1]);
|
||||
if (parts[2].length == 4) {
|
||||
y = int.parse(parts[2]);
|
||||
d = int.parse(parts[0]);
|
||||
} else {
|
||||
y = int.parse(parts[0]);
|
||||
d = int.parse(parts[2]);
|
||||
}
|
||||
}
|
||||
|
||||
last_updated = new DateTime.local (y, m, d, h, min, 0.0);
|
||||
} else {
|
||||
/* FIXME: use file modification date if there's no update header
|
||||
try {
|
||||
string modified = FileAttribute.TIME_MODIFIED;
|
||||
var info = file.query_filesystem_info (modified);
|
||||
last_updated = new DateTime.from_timeval_local (info.get_modification_time ());
|
||||
} catch (Error error) {
|
||||
last_updated = now;
|
||||
}
|
||||
*/
|
||||
last_updated = now;
|
||||
}
|
||||
|
||||
/* We have "expires" metadata */
|
||||
if (expires_meta != null) {
|
||||
if (expires_meta.contains ("days")) {
|
||||
string[] parts = expires_meta.split (" ");
|
||||
expires = last_updated.add_days (int.parse (parts[0]));
|
||||
} else if (expires_meta.contains ("hours")) {
|
||||
string[] parts = expires_meta.split (" ");
|
||||
expires = last_updated.add_hours (int.parse (parts[0]));
|
||||
}
|
||||
} else {
|
||||
/* No expire metadata found, assume x days */
|
||||
int days_to_expire = 7;
|
||||
expires = last_updated.add_days (days_to_expire);
|
||||
}
|
||||
|
||||
/* Check if we are past expire date */
|
||||
needs_update = now.compare (expires) == 1;
|
||||
}
|
||||
}
|
||||
}
|
30
extensions/adblock/whitelist.vala
Normal file
30
extensions/adblock/whitelist.vala
Normal file
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
Copyright (C) 2014 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2014 Paweł Forysiuk <tuxator@o2.pl>
|
||||
|
||||
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 Adblock {
|
||||
public class Whitelist : Filter {
|
||||
public Whitelist (Options options) {
|
||||
base (options);
|
||||
}
|
||||
|
||||
public override Directive? match (string request_uri, string page_uri) throws Error {
|
||||
foreach (unowned string white in rules.get_keys ()) {
|
||||
var regex = rules.lookup (white);
|
||||
if (!regex.match_full (request_uri))
|
||||
return null;
|
||||
if (Regex.match_simple (regex.get_pattern (), request_uri, RegexCompileFlags.UNGREEDY, RegexMatchFlags.NOTEMPTY))
|
||||
return Directive.ALLOW;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
292
extensions/adblock/widgets.vala
Normal file
292
extensions/adblock/widgets.vala
Normal file
|
@ -0,0 +1,292 @@
|
|||
/*
|
||||
Copyright (C) 2009-2014 Christian Dywan <christian@twotoasts.de>
|
||||
Copyright (C) 2009-2012 Alexander Butenko <a.butenka@gmail.com>
|
||||
|
||||
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 Adblock {
|
||||
|
||||
|
||||
public class StatusIcon : Midori.ContextAction {
|
||||
Config config;
|
||||
SubscriptionManager manager;
|
||||
public State state;
|
||||
public bool debug_element_toggled;
|
||||
|
||||
public StatusIcon (Adblock.Config config, SubscriptionManager manager) {
|
||||
GLib.Object (name: "AdblockStatusMenu");
|
||||
|
||||
this.config = config;
|
||||
this.manager = manager;
|
||||
this.debug_element_toggled = false;
|
||||
|
||||
var item = new Midori.ContextAction ("Preferences",
|
||||
_("Preferences"), null, Gtk.STOCK_PREFERENCES);
|
||||
item.activate.connect (() => {
|
||||
manager.add_subscription (null);
|
||||
});
|
||||
add (item);
|
||||
|
||||
add (null);
|
||||
|
||||
var checkitem = new Gtk.ToggleAction ("Disable", _("Disable"), null, null);
|
||||
checkitem.set_active (!config.enabled);
|
||||
checkitem.toggled.connect (() => {
|
||||
config.enabled = !checkitem.active;
|
||||
set_state (config.enabled ? Adblock.State.ENABLED : Adblock.State.DISABLED);
|
||||
});
|
||||
add (checkitem);
|
||||
|
||||
var hideritem = new Gtk.ToggleAction ("HiddenElements",
|
||||
_("Display hidden elements"), null, null);
|
||||
hideritem.set_active (debug_element_toggled);
|
||||
hideritem.toggled.connect (() => {
|
||||
this.debug_element_toggled = hideritem.active;
|
||||
});
|
||||
add (hideritem);
|
||||
set_status (config.enabled ? "enabled" : "disabled");
|
||||
}
|
||||
|
||||
void set_status (string status) {
|
||||
gicon = new GLib.ThemedIcon ("adblock-%s".printf (status));
|
||||
}
|
||||
|
||||
public void set_state (Adblock.State state) {
|
||||
this.state = state;
|
||||
|
||||
if (this.state == State.BLOCKED) {
|
||||
set_status ("blocked");
|
||||
tooltip = _("Blocking");
|
||||
} else if (this.state == State.ENABLED) {
|
||||
set_status ("enabled");
|
||||
tooltip = _("Enabled");
|
||||
} else if (this.state == State.DISABLED) {
|
||||
set_status ("disabled");
|
||||
tooltip = _("Disabled");
|
||||
} else
|
||||
assert_not_reached ();
|
||||
}
|
||||
}
|
||||
|
||||
public class SubscriptionManager {
|
||||
Gtk.TreeView treeview;
|
||||
Gtk.ListStore liststore;
|
||||
Adblock.Config config;
|
||||
public Gtk.Label description_label;
|
||||
string description;
|
||||
|
||||
public SubscriptionManager (Config config) {
|
||||
this.config = config;
|
||||
this.liststore = new Gtk.ListStore (1, typeof (Subscription));
|
||||
this.description_label = new Gtk.Label (null);
|
||||
this.description = _("Type the address of a preconfigured filter list in the text entry and hit Enter.\n");
|
||||
this.description += _("You can find more lists by visiting following sites:\n %s, %s\n".printf (
|
||||
"<a href=\"http://adblockplus.org/en/subscriptions\">adblockplus.org/en/subscriptions</a>",
|
||||
"<a href=\"http://easylist.adblockplus.org/\">easylist.adblockplus.org</a>"
|
||||
));
|
||||
}
|
||||
|
||||
public void add_subscription (string? uri) {
|
||||
var dialog = new Gtk.Dialog.with_buttons (_("Configure Advertisement filters"),
|
||||
null,
|
||||
#if !HAVE_GTK3
|
||||
Gtk.DialogFlags.NO_SEPARATOR |
|
||||
#endif
|
||||
Gtk.DialogFlags.DESTROY_WITH_PARENT,
|
||||
Gtk.STOCK_HELP, Gtk.ResponseType.HELP,
|
||||
Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE);
|
||||
#if HAVE_GTK3
|
||||
dialog.get_widget_for_response (Gtk.ResponseType.HELP).get_style_context ().add_class ("help_button");
|
||||
#endif
|
||||
dialog.set_icon_name (Gtk.STOCK_PROPERTIES);
|
||||
dialog.set_response_sensitive (Gtk.ResponseType.HELP, false);
|
||||
|
||||
var hbox = new Gtk.HBox (false, 0);
|
||||
(dialog.get_content_area () as Gtk.Box).pack_start (hbox, true, true, 12);
|
||||
var vbox = new Gtk.VBox (false, 0);
|
||||
hbox.pack_start (vbox, true, true, 4);
|
||||
this.description_label.set_markup (this.description);
|
||||
this.description_label.set_line_wrap (true);
|
||||
vbox.pack_start (this.description_label, false, false, 4);
|
||||
|
||||
var entry = new Gtk.Entry ();
|
||||
if (uri != null)
|
||||
entry.set_text (uri);
|
||||
vbox.pack_start (entry, false, false, 4);
|
||||
|
||||
liststore = new Gtk.ListStore (1, typeof (Subscription));
|
||||
treeview = new Gtk.TreeView.with_model (liststore);
|
||||
treeview.set_headers_visible (false);
|
||||
var column = new Gtk.TreeViewColumn ();
|
||||
var renderer_toggle = new Gtk.CellRendererToggle ();
|
||||
column.pack_start (renderer_toggle, false);
|
||||
column.set_cell_data_func (renderer_toggle, (column, renderer, model, iter) => {
|
||||
Subscription sub;
|
||||
liststore.get (iter, 0, out sub);
|
||||
renderer.set ("active", sub.active,
|
||||
"sensitive", sub.mutable);
|
||||
});
|
||||
renderer_toggle.toggled.connect ((path) => {
|
||||
Gtk.TreeIter iter;
|
||||
if (liststore.get_iter_from_string (out iter, path)) {
|
||||
Subscription sub;
|
||||
liststore.get (iter, 0, out sub);
|
||||
sub.active = !sub.active;
|
||||
}
|
||||
});
|
||||
treeview.append_column (column);
|
||||
|
||||
column = new Gtk.TreeViewColumn ();
|
||||
var renderer_text = new Gtk.CellRendererText ();
|
||||
column.pack_start (renderer_text, false);
|
||||
renderer_text.set ("editable", true);
|
||||
// TODO: renderer_text.edited.connect
|
||||
column.set_cell_data_func (renderer_text, (column, renderer, model, iter) => {
|
||||
Subscription sub;
|
||||
liststore.get (iter, 0, out sub);
|
||||
string status = "";
|
||||
foreach (unowned Feature feature in sub) {
|
||||
var updater = feature as Adblock.Updater;
|
||||
if (updater != null) {
|
||||
if (updater.last_updated != null)
|
||||
status = updater.last_updated.format (_("Last update: %x %X"));
|
||||
}
|
||||
}
|
||||
if (!sub.valid)
|
||||
status = _("File incomplete - broken download?");
|
||||
renderer.set ("markup", (Markup.printf_escaped ("<b>%s</b>\n%s",
|
||||
sub.title ?? sub.uri, status)));
|
||||
});
|
||||
treeview.append_column (column);
|
||||
|
||||
column = new Gtk.TreeViewColumn ();
|
||||
Gtk.CellRendererPixbuf renderer_button = new Gtk.CellRendererPixbuf ();
|
||||
column.pack_start (renderer_button, false);
|
||||
column.set_cell_data_func (renderer_button, on_render_button);
|
||||
treeview.append_column (column);
|
||||
|
||||
var scrolled = new Gtk.ScrolledWindow (null, null);
|
||||
scrolled.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
|
||||
scrolled.add (treeview);
|
||||
vbox.pack_start (scrolled);
|
||||
int height;
|
||||
treeview.create_pango_layout ("a\nb").get_pixel_size (null, out height);
|
||||
scrolled.set_size_request (-1, height * 5);
|
||||
|
||||
foreach (unowned Subscription sub in config)
|
||||
liststore.insert_with_values (null, 0, 0, sub);
|
||||
treeview.button_release_event.connect (button_released);
|
||||
|
||||
entry.activate.connect (() => {
|
||||
string? parsed_uri = Adblock.parse_subscription_uri (entry.text);
|
||||
if (parsed_uri != null) {
|
||||
var sub = new Subscription (parsed_uri);
|
||||
if (config.add (sub)) {
|
||||
liststore.insert_with_values (null, 0, 0, sub);
|
||||
try {
|
||||
sub.parse ();
|
||||
} catch (GLib.Error error) {
|
||||
warning ("Error parsing %s: %s", sub.uri, error.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
entry.text = "";
|
||||
});
|
||||
|
||||
dialog.get_content_area ().show_all ();
|
||||
|
||||
dialog.response.connect ((response)=>{ dialog.destroy (); });
|
||||
dialog.show ();
|
||||
}
|
||||
|
||||
void on_render_button (Gtk.CellLayout column, Gtk.CellRenderer renderer,
|
||||
Gtk.TreeModel model, Gtk.TreeIter iter) {
|
||||
|
||||
Subscription sub;
|
||||
liststore.get (iter, 0, out sub);
|
||||
|
||||
renderer.set ("stock-id", sub.mutable ? Gtk.STOCK_DELETE : null,
|
||||
"stock-size", Gtk.IconSize.MENU);
|
||||
}
|
||||
|
||||
public bool button_released (Gdk.EventButton event) {
|
||||
Gtk.TreePath? path;
|
||||
Gtk.TreeViewColumn column;
|
||||
if (treeview.get_path_at_pos ((int)event.x, (int)event.y, out path, out column, null, null)) {
|
||||
if (path != null) {
|
||||
if (column == treeview.get_column (2)) {
|
||||
Gtk.TreeIter iter;
|
||||
if (liststore.get_iter (out iter, path)) {
|
||||
Subscription sub;
|
||||
liststore.get (iter, 0, out sub);
|
||||
if (sub.mutable) {
|
||||
config.remove (sub);
|
||||
liststore.remove (iter);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
class CustomRulesEditor {
|
||||
Gtk.Dialog dialog;
|
||||
Subscription custom;
|
||||
public string? rule { get; set; }
|
||||
|
||||
public CustomRulesEditor (Subscription custom) {
|
||||
this.custom = custom;
|
||||
}
|
||||
|
||||
public void set_uri (string uri) {
|
||||
this.rule = uri;
|
||||
}
|
||||
|
||||
public void show () {
|
||||
this.dialog = new Gtk.Dialog.with_buttons (_("Edit rule"),
|
||||
null,
|
||||
#if !HAVE_GTK3
|
||||
Gtk.DialogFlags.NO_SEPARATOR |
|
||||
#endif
|
||||
Gtk.DialogFlags.DESTROY_WITH_PARENT,
|
||||
Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
|
||||
Gtk.STOCK_ADD, Gtk.ResponseType.ACCEPT);
|
||||
dialog.set_icon_name (Gtk.STOCK_ADD);
|
||||
dialog.resizable = false;
|
||||
|
||||
var hbox = new Gtk.HBox (false, 8);
|
||||
var sizegroup = new Gtk.SizeGroup (Gtk.SizeGroupMode.HORIZONTAL);
|
||||
hbox.border_width = 5;
|
||||
var label = new Gtk.Label.with_mnemonic (_("_Rule:"));
|
||||
sizegroup.add_widget (label);
|
||||
hbox.pack_start (label, false, false, 0);
|
||||
(dialog.get_content_area () as Gtk.Box).pack_start (hbox, false, true, 0);
|
||||
|
||||
var entry = new Gtk.Entry ();
|
||||
sizegroup.add_widget (entry);
|
||||
entry.activates_default = true;
|
||||
entry.set_text (this.rule);
|
||||
hbox.pack_start (entry, true, true, 0);
|
||||
|
||||
dialog.get_content_area ().show_all ();
|
||||
|
||||
dialog.set_default_response (Gtk.ResponseType.ACCEPT);
|
||||
if (dialog.run () != Gtk.ResponseType.ACCEPT)
|
||||
return;
|
||||
|
||||
this.rule = entry.get_text ();
|
||||
this.dialog.destroy ();
|
||||
custom.add_rule (this.rule);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load diff
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue