Merge lp:~midori/midori/gtk3WebKit2only into lp:midori

Proposed by Cris Dywan
Status: Work in progress
Proposed branch: lp:~midori/midori/gtk3WebKit2only
Merge into: lp:midori
Diff against target: 16822 lines (+5233/-7471)
92 files modified
CMakeLists.txt (+14/-65)
data/error.html (+0/-30)
data/logo-shade.svg (+0/-150)
extensions/CMakeLists.txt (+81/-72)
extensions/about.vala (+31/-33)
extensions/adblock/extension.vala (+1/-27)
extensions/adblock/widgets.vala (+0/-8)
extensions/colorful-tabs.c (+0/-5)
extensions/colorful-tabs.web.vala (+69/-0)
extensions/cookie-manager/cookie-manager.c (+0/-6)
extensions/cookie-permissions/cookie-permission-manager-preferences-window.c (+0/-22)
extensions/cookie-permissions/cookie-permission-manager.c (+0/-6)
extensions/donottrack.web.vala (+141/-0)
extensions/external-download-manager.vala (+2/-19)
extensions/feed-panel/feed-panel.c (+0/-4)
extensions/feed-panel/main.c (+1/-1)
extensions/formhistory/formhistory.c (+1/-1)
extensions/history-list.vala (+0/-14)
extensions/hsts.web.vala (+173/-0)
extensions/nojs/nojs-preferences.c (+0/-18)
extensions/nojs/nojs.c (+1/-1)
extensions/nsplugin-manager.vala (+0/-71)
extensions/open-with.vala (+0/-11)
extensions/shortcuts.c (+1/-1)
extensions/status-clock.c (+1/-1)
extensions/statusbar-features.c (+1/-42)
extensions/tabby.vala (+0/-5)
extensions/transfers.vala (+1/-28)
ipc/CMakeLists.txt (+47/-0)
ipc/ipc-contextaction.vala (+56/-0)
ipc/ipc-paths.vala (+132/-0)
ipc/midori-tabproxy.vala (+29/-0)
ipc/midori-webextension.vala (+40/-0)
katze/gtk3-compat.c (+0/-119)
katze/gtk3-compat.h (+0/-93)
katze/katze-cellrenderercomboboxtext.c (+0/-39)
katze/katze-http-auth.c (+0/-464)
katze/katze-http-auth.h (+0/-42)
katze/katze-preferences.c (+4/-7)
katze/katze-utils.c (+0/-80)
katze/katze-utils.h (+0/-1)
katze/katze.h (+0/-5)
katze/midori-hsts.vala (+0/-145)
katze/midori-paths.vala (+22/-111)
katze/midori-uri.vala (+0/-6)
midori/CMakeLists.txt (+10/-12)
midori/main.c (+50/-11)
midori/midori-addons.vala (+415/-0)
midori/midori-app.c (+4/-9)
midori/midori-app.h (+5/-0)
midori/midori-browser.c (+190/-1110)
midori/midori-browser.h (+1/-1)
midori/midori-contextaction.vala (+19/-13)
midori/midori-download.vala (+2/-36)
midori/midori-extension.c (+47/-830)
midori/midori-extension.h (+2/-5)
midori/midori-findbar.c (+7/-4)
midori/midori-frontend.c (+19/-15)
midori/midori-locationaction.c (+16/-97)
midori/midori-navigationaction.vala (+237/-0)
midori/midori-notebook.vala (+0/-48)
midori/midori-oops.vala (+53/-0)
midori/midori-panedaction.vala (+0/-79)
midori/midori-panel.c (+0/-10)
midori/midori-platform.h (+0/-1)
midori/midori-preferences.c (+0/-15)
midori/midori-privatedata.c (+2/-44)
midori/midori-searchaction.c (+2/-8)
midori/midori-session.c (+0/-87)
midori/midori-session.h (+0/-3)
midori/midori-settings.vala (+1/-0)
midori/midori-tab.vala (+101/-50)
midori/midori-view.c (+151/-1121)
midori/midori-view.h (+3/-5)
midori/midori-websettings.c (+8/-202)
midori/midori-window.vala (+211/-0)
midori/midori.vapi (+2/-23)
midori/sokoke.c (+0/-53)
midori/sokoke.h (+0/-1)
midori/webkit2gtk-3.0.vapi (+0/-779)
midori/webkit2gtk-web-extension-4.0.vapi (+2801/-0)
midori/webkitgtk-3.0.deps (+0/-6)
midori/webkitgtk-3.0.vapi (+0/-841)
po/POTFILES.in (+12/-7)
tests/CMakeLists.txt (+0/-12)
tests/browser.c (+0/-33)
tests/extensions.c (+0/-52)
tests/hsts.vala (+0/-32)
tests/magic-uri.c (+0/-2)
tests/properties.c (+0/-5)
tests/tab.vala (+1/-5)
win32/makedist/makedist.midori (+12/-51)
To merge this branch: bzr merge lp:~midori/midori/gtk3WebKit2only
Reviewer Review Type Date Requested Status
Midori Devs Pending
Review via email: mp+242128@code.launchpad.net

Commit message

Make WebKit2/ GTK+3 and GCR mandatory

Description of the change

WebKit2 porting:
[x] HSTS
[ ] Adblock
[*] Addons
[ ] Cookie Permissions
[*] Form History
[ ] NoJS
[x] NS plugin manager

Drop compatibility lower than
[x] GTK+3.12
[x] WebKit2GTK+ 2.6
[x] Vala 0.26

Other
[ ] Plug holes in WebKit2 API based code
[x] Drop obsolete custom auth backend
[x] Drop cryptic site-data-uri feature
[x] Split NavigationAction off Browser
[x] Add Do-Not-Track/ URL cleansing extension

To post a comment you must log in.
lp:~midori/midori/gtk3WebKit2only updated
6833. By Cris Dywan

Drop most obvious GTK+3/ WebKit2/ GCR compat code paths

Leaving for now some pieces of WebKit1-only code

6834. By Cris Dywan

Dropping gtk3-compat.* files

6835. By Cris Dywan

Drop remaining HAVE_GTK3 instances

6836. By Cris Dywan

More HAVE_WEBKIT2 droppings

6837. By Cris Dywan

Drop inspector split view which isn't needed for WebKit2

6838. By Cris Dywan

Switch to WebKit2GTK+ 4.0 (new ABI) and upstream vapi

6839. By Cris Dywan

Stop using javascriptcoregtk-3.0

6840. By Cris Dywan

Drop obsolete Soup-based KatzeHttpAuth

6841. By Cris Dywan

Drop Soup-based cache and cookie setup

6842. By Cris Dywan

Drop half-baked site data policy support: it was never fully implemented

6843. By Cris Dywan

Geo location request support with WebKit2

6844. By Cris Dywan

Correctly set/ unset link uri with WebKit2

6845. By Cris Dywan

Drop obsolete midori_view_ensure_link_uri helper

6846. By Cris Dywan

Use load-failed-with-tls-errors to handle certificate errors

6847. By Cris Dywan

Implement new NavigationAction and remove back/ forward logic from Browser

6848. By Cris Dywan

Drop GTK_CHECK_VERSION GTK2 fallbacks

6849. By Cris Dywan

Merge lp:midori

6850. By Cris Dywan

Save/ views source with WebKit2

6851. By Cris Dywan

Use gtk-decoration-layout to determine close button position

6852. By Cris Dywan

Port HSTS to WebKit.WebExtension

6853. By Cris Dywan

Run classic extensions through -t also

6854. By Cris Dywan

Add DoNotTrack/ URL cleanser web extension

6855. By Cris Dywan

Don't consider absent hsts cache as an error

6856. By Cris Dywan

Native GTK+ tabs: errors and private browsing info

6857. By Cris Dywan

New Window superclass with transparent header-/ toolbar

6858. By Cris Dywan

Implement Midori.Addons singleton

Extensions as well as Netscape plugins
and web extensions have a common place.
All modes have an App.
There's a proper way to handle stock extensions.

6859. By Paweł Forysiuk <email address hidden>

makedist: Drop support for gtk2 and old gstreamer version

6860. By Cris Dywan

Omit active extensions from about: and interns unless debugging

6861. By Cris Dywan

Scan user scripts/ styles and add to ContentManager

6862. By Cris Dywan

Implement non-GUI that provides a subset of Midori.Paths through IPC

6863. By Cris Dywan

Expose tabs on DBus and use it to set tab colors from meta tags

6864. By Cris Dywan

Fallback to uri if error page really has no title

6865. By Cris Dywan

Make extension tests aware of web extensions with user data

6866. By Cris Dywan

DoNotTrack needs to handle query keys being null

6867. By Cris Dywan

Fix return_if_fail's on midori_view_get_source/find_bar

6868. By Cris Dywan

Update webkit2gtk-web-extension-4.0.vapi from vala master

https://github.com/GNOME/vala/commit/8d57dffdea43a9d663e12b52722ef567c705bf5e

6869. By Cris Dywan

Make Midori.Database available to web extensions

6870. By Cris Dywan

Reinstate unowned annotation of URIRequest.get_http_headers

6871. By Cris Dywan

Implement TabProxy.add_icon and low-level Midori.ContextItem

Revision history for this message
Cris Dywan (kalikiana) wrote :

As per discussion I'll split this work once we branch stable off the current trunk which then becomes 0.6 in ~ a week's time and then review becomes easier.

Unmerged revisions

6871. By Cris Dywan

Implement TabProxy.add_icon and low-level Midori.ContextItem

6870. By Cris Dywan

Reinstate unowned annotation of URIRequest.get_http_headers

6869. By Cris Dywan

Make Midori.Database available to web extensions

6868. By Cris Dywan

Update webkit2gtk-web-extension-4.0.vapi from vala master

https://github.com/GNOME/vala/commit/8d57dffdea43a9d663e12b52722ef567c705bf5e

6867. By Cris Dywan

Fix return_if_fail's on midori_view_get_source/find_bar

6866. By Cris Dywan

DoNotTrack needs to handle query keys being null

6865. By Cris Dywan

Make extension tests aware of web extensions with user data

6864. By Cris Dywan

Fallback to uri if error page really has no title

6863. By Cris Dywan

Expose tabs on DBus and use it to set tab colors from meta tags

6862. By Cris Dywan

Implement non-GUI that provides a subset of Midori.Paths through IPC

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'CMakeLists.txt'
2--- CMakeLists.txt 2014-11-10 22:59:26 +0000
3+++ CMakeLists.txt 2015-03-10 00:27:20 +0000
4@@ -39,7 +39,7 @@
5 set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY 1)
6
7 find_package(Vala REQUIRED)
8-vala_require("0.16.0")
9+vala_require("0.26.0")
10 set(VALAFLAGS ${VALAFLAGS}
11 --enable-deprecated
12 --debug
13@@ -118,30 +118,19 @@
14 sqlite3>=3.6.19
15 gmodule-2.0
16 gio-2.0>=2.32.3
17- libsoup-gnome-2.4>=2.27.90
18+ libsoup-gnome-2.4>=2.40.0
19 )
20 add_definitions("-DHAVE_LIBXML")
21 add_definitions("-DGIO_VERSION=\"${DEPS_gio-2.0_VERSION}\"")
22 add_definitions("-DLIBSOUP_VERSION=\"${DEPS_libsoup-gnome-2.4_VERSION}\"")
23-set(PKGS posix linux libxml-2.0 sqlite3 gmodule-2.0 gio-2.0 libsoup-2.4)
24-if (${DEPS_libsoup-gnome-2.4_VERSION} VERSION_GREATER "2.29.91")
25+set(PACKAGES_CORE posix libsoup-2.4 sqlite3 gtk+-3.0)
26+set(PKGS ${PACKAGES_CORE} linux libxml-2.0 gmodule-2.0)
27 add_definitions("-DHAVE_LIBSOUP_2_29_91")
28-endif ()
29-if (${DEPS_libsoup-gnome-2.4_VERSION} VERSION_GREATER "2.34.0")
30 add_definitions("-DHAVE_LIBSOUP_2_34_0")
31 set(VALAFLAGS ${VALAFLAGS} -D HAVE_LIBSOUP_2_34_0)
32-endif ()
33-if (${DEPS_libsoup-gnome-2.4_VERSION} VERSION_GREATER "2.37.1")
34 add_definitions("-DHAVE_LIBSOUP_2_37_1")
35-endif ()
36-if (${DEPS_libsoup-gnome-2.4_VERSION} VERSION_GREATER "2.40.0")
37- # valac 0.16 didn't have the bindings yet
38- # For consistency we need to ensure C code makes the same assumptions
39- if (${VALA_VERSION} VERSION_GREATER "0.17.0")
40 add_definitions("-DHAVE_LIBSOUP_2_40_0")
41 set(VALAFLAGS ${VALAFLAGS} -D HAVE_LIBSOUP_2_40_0)
42- endif ()
43-endif ()
44
45 if (WIN32)
46 add_definitions("-DLIBNOTIFY_VERSION=\"No\"")
47@@ -154,19 +143,12 @@
48 set(PKGS ${PKGS} libnotify)
49 endif ()
50
51-option(USE_GTK3 "Use GTK+3" OFF)
52-option(HALF_BRO_INCOM_WEBKIT2 "Serve as a guniea pig" OFF)
53 option(USE_ZEITGEIST "Zeitgeist history integration" ON)
54 option(USE_GRANITE "Fancy notebook and pop-overs" OFF)
55 option(USE_APIDOCS "API documentation" OFF)
56 option(USE_GIR "Generate GObject Introspection bindings" OFF)
57 option(EXTRA_WARNINGS "Additional compiler warnings" OFF)
58
59-# GTK+3 is implied here, whether set or not
60-if (USE_GRANITE OR HALF_BRO_INCOM_WEBKIT2)
61- set(USE_GTK3 ON)
62-endif ()
63-
64 if (USE_GRANITE)
65 pkg_check_modules(GRANITE granite>=0.2)
66 set(OPTS_INCLUDE_DIRS "${OPTS_INCLUDE_DIRS};${GRANITE_INCLUDE_DIRS}")
67@@ -187,60 +169,24 @@
68 set(PKGS ${PKGS} zeitgeist-1.0)
69 endif()
70
71-if (USE_GTK3)
72- pkg_check_modules(GCR gcr-3>=2.32)
73- if (GCR_VERSION)
74+pkg_check_modules(GCR REQUIRED gcr-3>=2.32)
75 set(OPTS_INCLUDE_DIRS "${OPTS_INCLUDE_DIRS};${GCR_INCLUDE_DIRS}")
76 set(OPTS_LIBRARIES "${OPTS_LIBRARIES};${GCR_LIBRARIES}")
77 add_definitions("-DGCR_VERSION=\"${GCR_VERSION}\"")
78 add_definitions("-DHAVE_GCR")
79 set(VALAFLAGS ${VALAFLAGS} -D HAVE_GCR)
80- else ()
81- add_definitions("-DGCR_VERSION=\"No\"")
82- endif ()
83-else ()
84- add_definitions("-DGCR_VERSION=\"No\"")
85-endif ()
86
87-if (HALF_BRO_INCOM_WEBKIT2)
88- # Note: WebKitGTK+ 2.0.0 matches 1.11.91; 1.11.92 > 2.0.0
89 pkg_check_modules(DEPS_GTK REQUIRED
90- gtk+-3.0>=3.0.0
91- webkit2gtk-3.0>=1.11.91
92- javascriptcoregtk-3.0
93+ gtk+-3.0>=3.6.0
94+ webkit2gtk-4.0>=2.3.91
95 )
96 add_definitions("-DHAVE_WEBKIT2")
97 add_definitions("-DGTK_VERSION=\"${DEPS_GTK_gtk+-3.0_VERSION}\"")
98- add_definitions("-DWEBKIT_VERSION=\"${DEPS_GTK_webkit2gtk-3.0_VERSION}\"")
99- set(PKGS ${PKGS} gtk+-3.0)
100- set(EXTRA_VAPIS ${EXTRA_VAPIS} "${CMAKE_SOURCE_DIR}/midori/webkit2gtk-3.0.vapi")
101+ add_definitions("-DWEBKIT_VERSION=\"${DEPS_GTK_webkit2gtk-4.0_VERSION}\"")
102+ set(PKGS ${PKGS} webkit2gtk-4.0)
103 set(VALAFLAGS ${VALAFLAGS} -D HAVE_GTK3)
104 set(VALAFLAGS ${VALAFLAGS} -D HAVE_WEBKIT2)
105- if (${DEPS_GTK_webkit2gtk-3.0_VERSION} VERSION_GREATER "2.3.90")
106- set(VALAFLAGS ${VALAFLAGS} -D HAVE_WEBKIT2_3_91)
107- endif ()
108-elseif (USE_GTK3)
109- pkg_check_modules(DEPS_GTK REQUIRED
110- gtk+-3.0>=3.0.0
111- webkitgtk-3.0>=1.8.1
112- javascriptcoregtk-3.0
113- )
114- add_definitions("-DGTK_VERSION=\"${DEPS_GTK_gtk+-3.0_VERSION}\"")
115- add_definitions("-DWEBKIT_VERSION=\"${DEPS_GTK_webkitgtk-3.0_VERSION}\"")
116- set(PKGS ${PKGS} gtk+-3.0)
117- set(EXTRA_VAPIS ${EXTRA_VAPIS} "${CMAKE_SOURCE_DIR}/midori/webkitgtk-3.0.vapi")
118- set(VALAFLAGS ${VALAFLAGS} -D HAVE_GTK3)
119-else ()
120- pkg_check_modules(DEPS_GTK REQUIRED
121- gtk+-2.0>=2.24.0
122- webkit-1.0>=1.8.1
123- javascriptcoregtk-1.0
124- )
125- add_definitions("-DGTK_VERSION=\"${DEPS_GTK_gtk+-2.0_VERSION}\"")
126- add_definitions("-DWEBKIT_VERSION=\"${DEPS_GTK_webkit-1.0_VERSION}\"")
127- set(PKGS ${PKGS} gtk+-2.0)
128- set(EXTRA_VAPIS ${EXTRA_VAPIS} "${CMAKE_SOURCE_DIR}/midori/webkitgtk-3.0.vapi")
129-endif ()
130+ set(VALAFLAGS ${VALAFLAGS} -D HAVE_WEBKIT2_3_91)
131
132 # dh_translations detects this if there's no variable used
133 set (GETTEXT_PACKAGE "midori")
134@@ -273,6 +219,8 @@
135 set(VALA_CFLAGS "-w -g -fPIC")
136
137 set(LIBMIDORI "${CMAKE_PROJECT_NAME}-core")
138+set(LIBMIDORIV "${CMAKE_PROJECT_NAME}-vala")
139+set(LIBMIDORI2 "${CMAKE_PROJECT_NAME}-ipc")
140
141 # CMake provides no uninstall target by design
142 add_custom_target (uninstall
143@@ -281,8 +229,9 @@
144 install(FILES AUTHORS COPYING ChangeLog EXPAT README DESTINATION ${CMAKE_INSTALL_DOCDIR})
145
146 add_subdirectory (midori)
147+add_subdirectory (ipc)
148+enable_testing()
149 add_subdirectory (extensions)
150-enable_testing()
151 add_subdirectory (tests)
152 add_subdirectory (po)
153 add_subdirectory (icons)
154
155=== removed file 'data/error.html'
156--- data/error.html 2013-10-06 16:41:01 +0000
157+++ data/error.html 1970-01-01 00:00:00 +0000
158@@ -1,30 +0,0 @@
159-<!--
160- Error page template for Midori.
161- This file is licensed under the terms of the expat license, see the file EXPAT.
162--->
163-<html dir="{dir}">
164-<head>
165-<title>{title}</title>
166-{favicon}
167-<link rel="stylesheet" type="text/css" href="res://about.css" />
168-</head>
169-<body>
170-<img id="logo" src="res://logo-shade.png" />
171-<div id="main" style="background-image: url({error_icon});">
172- <div id="text">
173- <h1>{title}</h1>
174- <p class="message">{message}<br><i>{description}</i></p>
175- {suggestions}
176- </div>
177- <form method="GET" action="{uri}" id="button">
178- <button type="submit" onclick="location.reload(); return false;" {autofocus}>
179- <img style="{hide-button-images}" src="stock://gtk-refresh"/>
180- <span>{tryagain}</span>
181- </button>
182- </form>
183- </div>
184-
185-<br style="clear: both;"/>
186-</div>
187-</body>
188-</html>
189
190=== removed file 'data/logo-shade.svg'
191--- data/logo-shade.svg 2008-10-16 01:51:39 +0000
192+++ data/logo-shade.svg 1970-01-01 00:00:00 +0000
193@@ -1,150 +0,0 @@
194-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
195-<!-- Created with Inkscape (http://www.inkscape.org/) -->
196-<svg
197- xmlns:dc="http://purl.org/dc/elements/1.1/"
198- xmlns:cc="http://creativecommons.org/ns#"
199- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
200- xmlns:svg="http://www.w3.org/2000/svg"
201- xmlns="http://www.w3.org/2000/svg"
202- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
203- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
204- width="307.65372"
205- height="350"
206- id="svg2418"
207- sodipodi:version="0.32"
208- inkscape:version="0.46"
209- version="1.0"
210- inkscape:export-filename="/home/user/logo-shade.png"
211- inkscape:export-xdpi="90"
212- inkscape:export-ydpi="90"
213- sodipodi:docname="logo-shade.svg"
214- inkscape:output_extension="org.inkscape.output.svg.inkscape">
215- <sodipodi:namedview
216- id="base"
217- pagecolor="#ffffff"
218- bordercolor="#666666"
219- borderopacity="1.0"
220- gridtolerance="10000"
221- guidetolerance="10"
222- objecttolerance="10"
223- inkscape:pageopacity="0.0"
224- inkscape:pageshadow="2"
225- inkscape:zoom="1.03"
226- inkscape:cx="74.949357"
227- inkscape:cy="143.09941"
228- inkscape:document-units="px"
229- inkscape:current-layer="layer1"
230- showgrid="false"
231- inkscape:window-width="1253"
232- inkscape:window-height="682"
233- inkscape:window-x="0"
234- inkscape:window-y="22" />
235- <defs
236- id="defs2420">
237- <linearGradient
238- id="linearGradient3412">
239- <stop
240- id="stop3414"
241- offset="0"
242- style="stop-color:#ffffff;stop-opacity:0.59836066;" />
243- <stop
244- id="stop3416"
245- offset="1"
246- style="stop-color:#97f839;stop-opacity:0;" />
247- </linearGradient>
248- <linearGradient
249- id="linearGradient3458">
250- <stop
251- id="stop3460"
252- offset="0"
253- style="stop-color:#88fe38;stop-opacity:1;" />
254- <stop
255- id="stop3462"
256- offset="1"
257- style="stop-color:#ffffff;stop-opacity:0;" />
258- </linearGradient>
259- <inkscape:perspective
260- id="perspective2426"
261- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
262- inkscape:vp_z="744.09448 : 526.18109 : 1"
263- inkscape:vp_y="0 : 1000 : 0"
264- inkscape:vp_x="0 : 526.18109 : 1"
265- sodipodi:type="inkscape:persp3d" />
266- <linearGradient
267- id="linearGradient3458-648">
268- <stop
269- id="stop2423"
270- offset="0"
271- style="stop-color:#bababa;stop-opacity:1;" />
272- <stop
273- id="stop2425"
274- offset="1"
275- style="stop-color:#ffffff;stop-opacity:0;" />
276- </linearGradient>
277- <linearGradient
278- id="linearGradient3412-967">
279- <stop
280- id="stop2429"
281- offset="0"
282- style="stop-color:#ffffff;stop-opacity:0.59836066;" />
283- <stop
284- id="stop2431"
285- offset="1"
286- style="stop-color:#bababa;stop-opacity:0;" />
287- </linearGradient>
288- </defs>
289- <metadata
290- id="metadata2423">
291- <rdf:RDF>
292- <cc:Work
293- rdf:about="">
294- <dc:format>image/svg+xml</dc:format>
295- <dc:type
296- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
297- <dc:creator>
298- <cc:Agent>
299- <dc:title>Nancy Runge &lt;nancy@twotoasts.de&gt;</dc:title>
300- </cc:Agent>
301- </dc:creator>
302- <cc:license
303- rdf:resource="http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" />
304- </cc:Work>
305- </rdf:RDF>
306- </metadata>
307- <g
308- transform="translate(-280.66056,-644.09745)"
309- id="layer1"
310- inkscape:groupmode="layer"
311- inkscape:label="Layer 1">
312- <g
313- id="g2546"
314- style="fill:#ffffff;fill-opacity:1;stroke:#bcbcbc;stroke-opacity:1"
315- transform="matrix(2.7318355,0,0,2.7318355,-731.07518,-1421.3016)">
316- <path
317- sodipodi:nodetypes="ccsscccsc"
318- id="path3598"
319- d="M 479.0149,757.44485 C 463.33929,760.3524 390.05715,768.6009 373.75783,823.05659 C 368.99751,841.48441 371.67629,866.55457 392.88608,865.62945 C 394.38911,865.56465 394.54399,866.0597 395.07871,867.32475 C 403.8111,887.98406 426.11314,884.657 430.13518,876.12801 C 430.41248,875.53998 429.75994,876.1331 430.13518,876.12801 C 452.01909,891.1113 463.94687,870.37434 470.8404,851.89287 C 479.26032,835.85799 484.40756,769.09622 479.90163,773.41411 C 403.13312,846.97906 403.28006,782.18757 479.0149,757.44485"
320- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#bcbcbc;stroke-width:2.79349113000000004;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
321- <path
322- id="path3606"
323- d="M 394.6271,866.42646 C 389.11843,841.31269 395.51037,833.40754 398.10369,830.14819"
324- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#bcbcbc;stroke-width:2.79349113000000004;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
325- sodipodi:nodetypes="cc" />
326- <path
327- id="path3608"
328- d="M 430.04511,875.57142 C 422.884,860.41673 424.07276,847.90995 429.16085,838.58891"
329- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#bcbcbc;stroke-width:2.79349113000000004;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
330- sodipodi:nodetypes="cc" />
331- </g>
332- <g
333- id="g2551"
334- style="fill:#e8e8e8;fill-opacity:1;stroke:none"
335- transform="matrix(2.7318355,0,0,2.7318355,-731.59243,-1420.9344)">
336- <path
337- sodipodi:nodetypes="cccccccccccc"
338- id="path2553"
339- d="M 447.08573,768.31725 C 436.04919,774.1595 397.92257,781.58705 381.33359,820.27881 C 377.02863,833.88105 375.31278,851.44676 387.44516,857.54862 C 385.16801,848.06163 387.57514,834.11288 393.43272,827.57808 C 397.5473,821.96506 405.70797,826.00823 403.09775,831.29165 C 401.29067,836.46522 394.76631,843.8643 399.87669,863.28435 C 404.09154,874.85534 415.25599,879.58634 422.43347,873.92723 C 414.92666,858.12585 420.32228,825.17457 433.92305,832.69366 C 440.70334,836.82119 424.80942,848.38632 435.43821,869.81488 C 448.73626,880.75776 460.15899,863.55615 464.02222,850.63024 C 472.18961,832.82769 477.16809,790.8233 475.1786,786.29359 C 410.97397,845.50147 395.61545,794.24336 447.07098,768.23969"
340- style="fill:#e8e8e8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.79349113;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
341- </g>
342- </g>
343-</svg>
344
345=== modified file 'extensions/CMakeLists.txt'
346--- extensions/CMakeLists.txt 2014-07-03 08:03:18 +0000
347+++ extensions/CMakeLists.txt 2015-03-10 00:27:20 +0000
348@@ -1,5 +1,7 @@
349-# Copyright (C) 2013 Christian Dywan <christian@twotoasts.de>
350+# Copyright (C) 2013-2014 Christian Dywan <christian@twotoasts.de>
351
352+include(ContainTest)
353+add_custom_target(check COMMAND "env" "CTEST_OUTPUT_ON_FAILURE=1" "${CMAKE_CTEST_COMMAND}")
354 set(EXTENSIONDIR "${CMAKE_INSTALL_FULL_LIBDIR}/${CMAKE_PROJECT_NAME}")
355 include_directories(
356 "${CMAKE_SOURCE_DIR}"
357@@ -11,18 +13,16 @@
358 ${OPTS_GTK_INCLUDE_DIRS}
359 ${CMAKE_BINARY_DIR}
360 "${CMAKE_BINARY_DIR}/midori"
361+ "${CMAKE_BINARY_DIR}/ipc"
362 )
363 file(GLOB EXTENSIONS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *)
364-if (HALF_BRO_INCOM_WEBKIT2)
365+# TODO: port to WebKit2
366 list(REMOVE_ITEM EXTENSIONS
367 "cookie-permissions"
368 "addons.c"
369 "formhistory"
370- "external-download-manager.vala"
371 "nojs"
372- "nsplugin-manager.vala"
373 )
374-endif ()
375
376 # FIXME: re-enable webmedia extension
377 # once we have working notifications on win
378@@ -30,97 +30,106 @@
379 list(REMOVE_ITEM EXTENSIONS "webmedia-now-playing.vala")
380 endif()
381
382-foreach(UNIT_SRC ${EXTENSIONS})
383- string(FIND ${UNIT_SRC} ".c" UNIT_EXTENSION)
384- if (UNIT_EXTENSION GREATER -1)
385- string(REPLACE ".c" "" UNIT ${UNIT_SRC})
386- add_library(${UNIT} MODULE ${UNIT_SRC})
387- target_link_libraries(${UNIT}
388- ${LIBMIDORI}
389- )
390- set_target_properties(${UNIT} PROPERTIES
391- COMPILE_FLAGS ${CFLAGS}
392- )
393- install(TARGETS ${UNIT}
394- LIBRARY DESTINATION ${EXTENSIONDIR}
395- )
396- endif ()
397-endforeach ()
398+include(ParseArguments)
399+include(ValaPrecompile)
400
401-foreach(UNIT_SRC ${EXTENSIONS})
402- string(FIND ${UNIT_SRC} "." UNIT_EXTENSION)
403- if (UNIT_EXTENSION EQUAL -1)
404- file(GLOB UNIT_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${UNIT_SRC}/*.c")
405- file(GLOB UNIT_FILES_VALA RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${UNIT_SRC}/*.vala")
406- if (UNIT_FILES_VALA)
407- include(ValaPrecompile)
408- vala_precompile(UNIT_SRC_C ${UNIT_SRC}
409- ${UNIT_FILES_VALA}
410+macro(build_extension name)
411+ set(source "${ARGN}")
412+ set(SOURCE_VALA "")
413+ foreach(FILE ${source})
414+ string(FIND ${FILE} ".web." WEB_EXTENSION)
415+ string(FIND ${FILE} ".vala" VALA_EXTENSION)
416+ if (WEB_EXTENSION GREATER -1)
417+ string(REPLACE ".vala" "" WEB_NAME "${name}_${FILE}")
418+ string(REPLACE "." "_" WEB_NAME "${WEB_NAME}")
419+ vala_precompile(WEB_EXTENSION_C "${WEB_NAME}"
420+ ${FILE}
421 PACKAGES
422- ${PKGS}
423+ ${PACKAGES_CORE}
424 OPTIONS
425 ${VALAFLAGS}
426 GENERATE_HEADER
427- ${UNIT}
428+ ${FILE}
429 CUSTOM_VAPIS
430- ${EXTRA_VAPIS}
431- "${CMAKE_SOURCE_DIR}/midori/midori.vapi"
432- "${CMAKE_SOURCE_DIR}/katze/katze.vapi"
433- "${CMAKE_BINARY_DIR}/midori/${LIBMIDORI}.vapi"
434+ "${CMAKE_SOURCE_DIR}/midori/webkit2gtk-web-extension-4.0.vapi"
435+ "${CMAKE_BINARY_DIR}/ipc/${LIBMIDORI2}.vapi"
436 )
437- set(UNIT_FILES ${UNIT_FILES} ${UNIT_SRC_C})
438- endif ()
439- if (UNIT_FILES)
440- add_library(${UNIT_SRC} MODULE ${UNIT_FILES})
441- target_link_libraries(${UNIT_SRC}
442- ${LIBMIDORI}
443+ add_library(${WEB_NAME} MODULE ${WEB_EXTENSION_C})
444+ target_link_libraries(${WEB_NAME}
445+ ${LIBMIDORI2}
446 )
447- install(TARGETS ${UNIT_SRC}
448+ install(TARGETS ${WEB_NAME}
449 LIBRARY DESTINATION ${EXTENSIONDIR}
450 )
451- # extensions with vala code get the lenient VALA_CFLAGS
452- # others get the usual CFLAGS with -Wall and -Werror
453- if (UNIT_FILES_VALA)
454- set_target_properties(${UNIT_SRC} PROPERTIES
455- COMPILE_FLAGS ${VALA_CFLAGS}
456- )
457- else ()
458- set_target_properties(${UNIT_SRC} PROPERTIES
459- COMPILE_FLAGS ${CFLAGS}
460- )
461- endif ()
462+ # Extensions with Vala code get the lenient VALA_CFLAGS
463+ set_target_properties(${WEB_NAME} PROPERTIES
464+ COMPILE_FLAGS ${VALA_CFLAGS}
465+ )
466+ list(REMOVE_ITEM source ${FILE})
467+
468+ # Mandatory unit testing
469+ add_test(NAME "test-${WEB_NAME}" COMMAND $<TARGET_FILE:midori> -t $<TARGET_FILE:${WEB_NAME}>)
470+ contain_test("test-${WEB_NAME}" $<TARGET_FILE:midori> -t $<TARGET_FILE:${WEB_NAME}>)
471+ elseif (VALA_EXTENSION GREATER -1)
472+ list(APPEND SOURCE_VALA ${FILE})
473 endif ()
474- endif ()
475-endforeach ()
476-
477-foreach(UNIT_SRC ${EXTENSIONS})
478- string(FIND ${UNIT_SRC} ".vala" UNIT_EXTENSION)
479- if (UNIT_EXTENSION GREATER -1)
480- string(REPLACE ".vala" "" UNIT ${UNIT_SRC})
481- include(ValaPrecompile)
482- vala_precompile(UNIT_SRC_C ${UNIT}
483- ${UNIT_SRC}
484+ endforeach()
485+ if (SOURCE_VALA)
486+ vala_precompile(SOURCE_C ${name}
487+ ${SOURCE_VALA}
488 PACKAGES
489 ${PKGS}
490 OPTIONS
491 ${VALAFLAGS}
492 GENERATE_HEADER
493- ${UNIT}
494+ ${name}
495 CUSTOM_VAPIS
496- ${EXTRA_VAPIS}
497 "${CMAKE_SOURCE_DIR}/midori/midori.vapi"
498 "${CMAKE_SOURCE_DIR}/katze/katze.vapi"
499 "${CMAKE_BINARY_DIR}/midori/${LIBMIDORI}.vapi"
500 )
501- add_library(${UNIT} MODULE ${UNIT_SRC_C})
502- target_link_libraries(${UNIT}
503+ set(source ${SOURCE_C})
504+ endif ()
505+ if (source)
506+ add_library(${name} MODULE ${source})
507+ target_link_libraries(${name}
508 ${LIBMIDORI}
509 )
510- set_target_properties(${UNIT} PROPERTIES
511- COMPILE_FLAGS "${VALA_CFLAGS}"
512- )
513- install(TARGETS ${UNIT}
514+ install(TARGETS ${name}
515 LIBRARY DESTINATION ${EXTENSIONDIR}
516 )
517+ if (SOURCE_VALA)
518+ # Extensions with Vala code get the lenient VALA_CFLAGS
519+ set_target_properties(${name} PROPERTIES
520+ COMPILE_FLAGS ${VALA_CFLAGS}
521+ )
522+ else ()
523+ set_target_properties(${name} PROPERTIES
524+ COMPILE_FLAGS ${CFLAGS}
525+ )
526+ endif ()
527+ # Optional unit test
528+ add_test(NAME "test-${name}" COMMAND $<TARGET_FILE:midori> -t $<TARGET_FILE:${name}>)
529+ contain_test("test-${name}" $<TARGET_FILE:midori> -t $<TARGET_FILE:${name}>)
530+ endif ()
531+endmacro(build_extension)
532+
533+foreach(UNIT_SRC ${EXTENSIONS})
534+ string(FIND ${UNIT_SRC} ".c" UNIT_EXTENSION)
535+ if (UNIT_EXTENSION GREATER -1)
536+ string(REPLACE ".c" "" UNIT ${UNIT_SRC})
537+ build_extension(${UNIT} ${UNIT_SRC})
538+ endif ()
539+
540+ string(FIND ${UNIT_SRC} "." UNIT_EXTENSION)
541+ if (UNIT_EXTENSION EQUAL -1)
542+ file(GLOB UNIT_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${UNIT_SRC}/*.c" "${UNIT_SRC}/*.vala")
543+ build_extension(${UNIT_SRC} ${UNIT_FILES})
544+ endif ()
545+
546+ string(FIND ${UNIT_SRC} ".vala" UNIT_EXTENSION)
547+ if (UNIT_EXTENSION GREATER -1)
548+ string(REPLACE ".vala" "" UNIT ${UNIT_SRC})
549+ build_extension(${UNIT} ${UNIT_SRC})
550 endif ()
551 endforeach ()
552
553=== modified file 'extensions/about.vala'
554--- extensions/about.vala 2014-02-26 20:07:51 +0000
555+++ extensions/about.vala 2015-03-10 00:27:20 +0000
556@@ -15,11 +15,7 @@
557 public abstract string uri { get; set; }
558 public abstract void get_contents (Midori.View view, string uri);
559 protected void load_html (Midori.View view, string content, string uri) {
560- #if HAVE_WEBKIT2
561 view.web_view.load_html (content, uri);
562- #else
563- view.web_view.load_html_string (content, uri);
564- #endif
565 }
566 }
567
568@@ -91,6 +87,7 @@
569 private class Version : Page {
570 public override string uri { get; set; }
571 private GLib.HashTable<string, Page> about_pages;
572+ const string placeholder = "<em id=\"addons\">...</em>";
573
574 public Version (string alias, HashTable<string, Page> about_pages) {
575 this.uri = alias;
576@@ -104,13 +101,31 @@
577 return "<p>%s</p>".printf (links);
578 }
579
580+ async void add_addons (string html, Midori.View view, string uri) {
581+ GLib.StringBuilder replacement = new GLib.StringBuilder ();
582+ replacement.append ("<br><h2>Extensions:</h2>");
583+ bool debug = strcmp (Environment.get_variable ("MIDORI_DEBUG"), "addons") == 0;
584+ foreach (var addon in yield Midori.Addons.get_default ().list ()) {
585+ if (addon is Midori.ClassicExtension && (addon as Midori.ClassicExtension).intern && !debug)
586+ continue;
587+ if (addon is Midori.ClassicExtension && !((addon as Midori.ClassicExtension).is_active ()))
588+ continue;
589+ replacement.append_printf ("<tr><td><span style=\"%s\">%s</span>\t%s</td></tr>",
590+ addon.intern ? "font-style: italic" : "font-weight: bold",
591+ addon.name, addon.description);
592+ }
593+ this.load_html (view, html.replace (placeholder, replacement.str), uri);
594+ }
595+
596 public override void get_contents (Midori.View view, string uri) {
597 string contents = """<html>
598- <head><title>about:version</title></head>
599+ <head>
600+ <title>about:version</title>
601+ <meta name="theme-color" content="#00a132">
602+ </head>
603 <body>
604 <h1>a<span style="position: absolute; left: -1000px; top: -1000px">lias a=b; echo Copy carefully #</span>bout:version</h1>
605 <p>%s</p>
606- <img src="res://logo-shade.png" style="position: absolute; right: 15px; bottom: 15px; z-index: -9;">
607 <table>
608 <tr><td>Command line %s</td></tr>
609 %s
610@@ -137,44 +152,25 @@
611 GLib.StringBuilder video_formats = new GLib.StringBuilder ();
612 view.list_video_formats (video_formats, true);
613
614- GLib.StringBuilder ns_plugins = new GLib.StringBuilder ();
615- view.list_plugins (ns_plugins, true);
616-
617- /* TODO: list active extensions */
618-
619- this.load_html (view, contents.printf (
620+ string html = contents.printf (
621 _("Version numbers in brackets show the version used at runtime."),
622 Midori.Paths.get_command_line_str (true),
623 versions.str,
624 platform, sys_name, architecture != null ? architecture : "",
625 ident,
626 video_formats.str,
627- ns_plugins.str,
628- this.list_about_uris ()
629- ), uri);
630+ placeholder,
631+ this.list_about_uris ());
632+ this.load_html (view, html, uri);
633+
634+ add_addons.begin (html, view, uri);
635 }
636 }
637
638 private class Private : Page {
639 public override string uri { get; set; default = "about:private"; }
640 public override void get_contents (Midori.View view, string uri) {
641- this.load_html (view, """<html dir="ltr">
642- <head>
643- <title>%s</title>
644- <link rel="stylesheet" type="text/css" href="res://about.css">
645- </head>
646- <body>
647- <img id="logo" src="res://logo-shade.png" />
648- <div id="main" style="background-image: url(stock://dialog/gtk-dialog-info);">
649- <div id="text">
650- <h1>%s</h1>
651- <p class="message">%s</p><ul class=" suggestions"><li>%s</li><li>%s</li><li>%s</li></ul>
652- <p class="message">%s</p><ul class=" suggestions"><li>%s</li><li>%s</li><li>%s</li><li>%s</li></ul>
653- </div><br style="clear: both"></div>
654- </body>
655- </html>""".printf (
656- _("Private Browsing"), _("Private Browsing"),
657- _("Midori doesn't store any personal data:"),
658+ string suggestions = "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s".printf (
659 _("No history or web cookies are being saved."),
660 _("Extensions are disabled."),
661 _("HTML5 storage, local database and application caches are disabled."),
662@@ -183,7 +179,9 @@
663 _("DNS prefetching is disabled."),
664 _("The language and timezone are not revealed to websites."),
665 _("Flash and other Netscape plugins cannot be listed by websites.")
666- ), uri);
667+ );
668+ view.widget = new Midori.Oops (uri, "security-high", _("Private Browsing"),
669+ _("Midori doesn't store any personal data:"), "", suggestions);
670 }
671 }
672
673
674=== modified file 'extensions/adblock/extension.vala'
675--- extensions/adblock/extension.vala 2015-01-02 19:30:24 +0000
676+++ extensions/adblock/extension.vala 2015-03-10 00:27:20 +0000
677@@ -55,7 +55,6 @@
678 internal string? js_hider_function_body;
679 #endif
680
681-#if HAVE_WEBKIT2
682 #if !HAVE_WEBKIT2_3_91
683 public Extension.WebExtension (WebKit.WebExtension web_extension) {
684 init ();
685@@ -70,7 +69,6 @@
686 return request_handled (request.uri, web_page.uri);
687 }
688 #endif
689-#endif
690
691 public Extension () {
692 GLib.Object (name: _("Advertisement blocker"),
693@@ -87,7 +85,6 @@
694 }
695
696 void extension_activated (Midori.App app) {
697-#if HAVE_WEBKIT2
698 string cache_dir = Environment.get_user_cache_dir ();
699 string wk2path = Path.build_path (Path.DIR_SEPARATOR_S, cache_dir, "wk2ext");
700 Midori.Paths.mkdir_with_parents (wk2path);
701@@ -101,7 +98,6 @@
702 } catch (Error error) {
703 critical ("Failed to create WebKit2 link: %s", error.message);
704 }
705-#endif
706 init ();
707 foreach (var browser in app.get_browsers ())
708 browser_added (browser);
709@@ -126,7 +122,7 @@
710 browser.remove_tab.connect (tab_removed);
711
712 var toggle_button = status_icon.add_button ();
713- browser.statusbar.pack_end (toggle_button, false, false, 3);
714+ browser.statusbar.add (toggle_button);
715 toggle_button.show ();
716 }
717
718@@ -139,17 +135,11 @@
719
720 void tab_added (Midori.View view) {
721 view.navigation_requested.connect (navigation_requested);
722-#if !HAVE_WEBKIT2
723- view.web_view.resource_request_starting.connect (resource_requested);
724-#endif
725 view.notify["load-status"].connect (load_status_changed);
726 view.context_menu.connect (context_menu);
727 }
728
729 void tab_removed (Midori.View view) {
730-#if !HAVE_WEBKIT2
731- view.web_view.resource_request_starting.disconnect (resource_requested);
732-#endif
733 view.navigation_requested.disconnect (navigation_requested);
734 view.notify["load-status"].disconnect (load_status_changed);
735 view.context_menu.disconnect (context_menu);
736@@ -182,16 +172,6 @@
737 menu.add (action);
738 }
739
740-#if !HAVE_WEBKIT2
741- void resource_requested (WebKit.WebView web_view, WebKit.WebFrame frame,
742- WebKit.WebResource resource, WebKit.NetworkRequest request, WebKit.NetworkResponse? response) {
743-
744- if (request_handled (request.uri, web_view.uri)) {
745- request.set_uri ("about:blank");
746- }
747- }
748-#endif
749-
750 bool navigation_requested (Midori.Tab tab, string uri) {
751 if (uri.has_prefix ("abp:")) {
752 string parsed_uri = parse_subscription_uri (uri);
753@@ -370,12 +350,8 @@
754 }
755
756 void load_config () {
757-#if HAVE_WEBKIT2
758 string config_dir = Path.build_filename (Environment.get_user_config_dir (), "midori", "extensions", "libadblock." + GLib.Module.SUFFIX);
759 Midori.Paths.mkdir_with_parents (config_dir);
760-#else
761- string config_dir = Midori.Paths.get_extension_config_dir ("adblock");
762-#endif
763 string presets = Midori.Paths.get_extension_preset_filename ("adblock", "config");
764 string filename = Path.build_filename (config_dir, "config");
765 config = new Config (filename, presets);
766@@ -476,14 +452,12 @@
767 }
768 }
769
770-#if HAVE_WEBKIT2
771 #if !HAVE_WEBKIT2_3_91
772 Adblock.Extension? filter;
773 public static void webkit_web_extension_initialize (WebKit.WebExtension web_extension) {
774 filter = new Adblock.Extension.WebExtension (web_extension);
775 }
776 #endif
777-#endif
778
779 public Midori.Extension extension_init () {
780 return new Adblock.Extension ();
781
782=== modified file 'extensions/adblock/widgets.vala'
783--- extensions/adblock/widgets.vala 2014-04-03 17:07:04 +0000
784+++ extensions/adblock/widgets.vala 2015-03-10 00:27:20 +0000
785@@ -130,15 +130,10 @@
786 public void add_subscription (string? uri) {
787 var dialog = new Gtk.Dialog.with_buttons (_("Configure Advertisement filters"),
788 null,
789-#if !HAVE_GTK3
790- Gtk.DialogFlags.NO_SEPARATOR |
791-#endif
792 Gtk.DialogFlags.DESTROY_WITH_PARENT,
793 Gtk.STOCK_HELP, Gtk.ResponseType.HELP,
794 Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE);
795-#if HAVE_GTK3
796 dialog.get_widget_for_response (Gtk.ResponseType.HELP).get_style_context ().add_class ("help_button");
797-#endif
798 dialog.set_icon_name (Gtk.STOCK_PROPERTIES);
799 dialog.set_response_sensitive (Gtk.ResponseType.HELP, false);
800
801@@ -289,9 +284,6 @@
802 public void show () {
803 this.dialog = new Gtk.Dialog.with_buttons (_("Edit rule"),
804 null,
805-#if !HAVE_GTK3
806- Gtk.DialogFlags.NO_SEPARATOR |
807-#endif
808 Gtk.DialogFlags.DESTROY_WITH_PARENT,
809 Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
810 Gtk.STOCK_ADD, Gtk.ResponseType.ACCEPT);
811
812=== modified file 'extensions/colorful-tabs.c'
813--- extensions/colorful-tabs.c 2013-10-30 00:19:27 +0000
814+++ extensions/colorful-tabs.c 2015-03-10 00:27:20 +0000
815@@ -240,11 +240,6 @@
816 void
817 extension_test (void)
818 {
819- #ifndef HAVE_WEBKIT2
820- g_object_set_data (G_OBJECT (webkit_get_default_session ()),
821- "midori-session-initialized", (void*)1);
822- #endif
823-
824 /* TODO: Add test which uses favicon codepath */
825
826 g_test_add_func ("/extensions/colorful_tabs/hostname_colour", test_colour_for_hostname);
827
828=== added file 'extensions/colorful-tabs.web.vala'
829--- extensions/colorful-tabs.web.vala 1970-01-01 00:00:00 +0000
830+++ extensions/colorful-tabs.web.vala 2015-03-10 00:27:20 +0000
831@@ -0,0 +1,69 @@
832+/*
833+ Copyright (C) 2015 Christian Dywan <christian@twotoasts.de>
834+
835+ This library is free software; you can redistribute it and/or
836+ modify it under the terms of the GNU Lesser General Public
837+ License as published by the Free Software Foundation; either
838+ version 2.1 of the License, or (at your option) any later version.
839+
840+ See the file COPYING for the full license text.
841+*/
842+
843+namespace ColorfulTabs {
844+ [DBus (name = "org.midori.ColorfulTabs")]
845+ public class Extension : Midori.WebExtension {
846+ public Extension (WebKit.WebExtension extension, Variant user_data) {
847+ Object (user_data: user_data, token: "colorfultabs");
848+ extension.page_created.connect (page_created);
849+ }
850+
851+ void page_created (WebKit.WebPage page) {
852+ page.document_loaded.connect (document_loaded);
853+ add_icon.begin (page.get_id ());
854+ }
855+
856+ async void add_icon (uint64 page_id) {
857+ var icon = new Midori.ContextItem ("click", _("Click me!"), null, _("Click me!")).to_user_data ();
858+ try {
859+ var tab = yield Midori.TabProxy.get_by_id (page_id);
860+ uint64 id = yield tab.add_action (icon);
861+ debug ("Adding icon %s with id %s", icon.print (true), id.to_string ());
862+ } catch (Error error) {
863+ critical ("Failed to set icon %s for page %s: %s\n", icon.print (true), page_id.to_string (), error.message);
864+ }
865+ }
866+
867+ void document_loaded (WebKit.WebPage page) {
868+ var nodes = page.get_dom_document ().get_elements_by_name ("theme-color");
869+ if (nodes.length == 0)
870+ return;
871+
872+ var meta = nodes.item (0) as WebKit.DOM.HTMLMetaElement;
873+ debug ("Color %s picked up from meta tag on %s", meta.content, page.uri);
874+ set_color.begin (page.get_id (), meta.content);
875+ }
876+
877+ async void set_color (uint64 page_id, string color) {
878+ try {
879+ var tab = yield Midori.TabProxy.get_by_id (page_id);
880+ tab.color = color;
881+ } catch (Error error) {
882+ critical ("Failed to propagate color %s for page %s: %s\n", color, page_id.to_string (), error.message);
883+ }
884+ }
885+ }
886+}
887+
888+ColorfulTabs.Extension? colorful_tabs;
889+public void webkit_web_extension_initialize_with_user_data (WebKit.WebExtension extension, Variant user_data) {
890+ colorful_tabs = new ColorfulTabs.Extension (extension, user_data);
891+}
892+
893+void colorful_tabs_html () {
894+ /* TODO */
895+}
896+
897+public void extension_test () {
898+ Test.add_func ("/colorful_tabs/html", colorful_tabs_html);
899+}
900+
901
902=== modified file 'extensions/cookie-manager/cookie-manager.c'
903--- extensions/cookie-manager/cookie-manager.c 2013-07-29 21:05:02 +0000
904+++ extensions/cookie-manager/cookie-manager.c 2015-03-10 00:27:20 +0000
905@@ -280,15 +280,9 @@
906 COOKIE_MANAGER_COL_NAME, GTK_SORT_ASCENDING);
907
908 /* setup soup */
909-#ifdef HAVE_WEBKIT2
910 gchar *filename = midori_paths_get_config_filename_for_writing ("cookies.db");
911 priv->jar = soup_cookie_jar_sqlite_new (filename, FALSE);
912 g_free(filename);
913-#else
914- SoupSession *session = webkit_get_default_session();
915- priv->jar = SOUP_COOKIE_JAR(soup_session_get_feature(session, soup_cookie_jar_get_type()));
916- g_object_ref(priv->jar);
917-#endif
918 g_signal_connect(priv->jar, "changed", G_CALLBACK(cookie_manager_jar_changed_cb), self);
919
920 cookie_manager_refresh_store(self);
921
922=== modified file 'extensions/cookie-permissions/cookie-permission-manager-preferences-window.c'
923--- extensions/cookie-permissions/cookie-permission-manager-preferences-window.c 2014-01-01 22:39:30 +0000
924+++ extensions/cookie-permissions/cookie-permission-manager-preferences-window.c 2015-03-10 00:27:20 +0000
925@@ -735,12 +735,8 @@
926
927 /* Get content area to add gui controls to */
928 priv->contentArea=gtk_dialog_get_content_area(GTK_DIALOG(self));
929-#ifdef HAVE_GTK3
930 vbox=gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
931 gtk_box_set_homogeneous(GTK_BOX(vbox), FALSE);
932-#else
933- vbox=gtk_vbox_new(FALSE, 0);
934-#endif
935
936 /* Set up dialog */
937 dialogTitle=_("Configure cookie permission");
938@@ -786,12 +782,8 @@
939 gtk_tree_sortable_set_sort_column_id(sortableList, DOMAIN_COLUMN, GTK_SORT_ASCENDING);
940
941 /* Set up domain addition widgets */
942-#ifdef HAVE_GTK3
943 hbox=gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
944 gtk_box_set_homogeneous(GTK_BOX(hbox), FALSE);
945-#else
946- hbox=gtk_hbox_new(FALSE, 0);
947-#endif
948
949 priv->addDomainEntry=gtk_entry_new();
950 gtk_entry_set_max_length(GTK_ENTRY(priv->addDomainEntry), 64);
951@@ -824,10 +816,6 @@
952 /* Set up cookie domain list */
953 priv->list=gtk_tree_view_new_with_model(GTK_TREE_MODEL(priv->listStore));
954
955-#ifndef HAVE_GTK3
956- gtk_widget_set_size_request(priv->list, -1, 300);
957-#endif
958-
959 priv->listSelection=gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->list));
960 gtk_tree_selection_set_mode(priv->listSelection, GTK_SELECTION_MULTIPLE);
961 g_signal_connect_swapped(priv->listSelection, "changed", G_CALLBACK(_cookie_permission_manager_preferences_changed_selection), self);
962@@ -853,21 +841,15 @@
963 gtk_tree_view_append_column(GTK_TREE_VIEW(priv->list), column);
964
965 scrolled=gtk_scrolled_window_new(NULL, NULL);
966-#ifdef HAVE_GTK3
967 gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolled), height*10);
968-#endif
969 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
970 gtk_container_add(GTK_CONTAINER(scrolled), priv->list);
971 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
972 gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 5);
973
974 /* Set up cookie domain list management buttons */
975-#ifdef HAVE_GTK3
976 hbox=gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
977 gtk_box_set_homogeneous(GTK_BOX(hbox), FALSE);
978-#else
979- hbox=gtk_hbox_new(FALSE, 0);
980-#endif
981
982 priv->deleteButton=gtk_button_new_from_stock(GTK_STOCK_DELETE);
983 gtk_widget_set_sensitive(priv->deleteButton, FALSE);
984@@ -883,12 +865,8 @@
985 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5);
986
987 /* Add "unknown-policy" combo */
988-#ifdef HAVE_GTK3
989 hbox=gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
990 gtk_box_set_homogeneous(GTK_BOX(hbox), FALSE);
991-#else
992- hbox=gtk_hbox_new(FALSE, 0);
993-#endif
994 widget=gtk_label_new(_("Policy for cookies from domains not in the list: "));
995 gtk_container_add(GTK_CONTAINER(hbox), widget);
996
997
998=== modified file 'extensions/cookie-permissions/cookie-permission-manager.c'
999--- extensions/cookie-permissions/cookie-permission-manager.c 2014-06-14 03:40:37 +0000
1000+++ extensions/cookie-permissions/cookie-permission-manager.c 2015-03-10 00:27:20 +0000
1001@@ -545,10 +545,6 @@
1002
1003 /* Create list and set up columns of list */
1004 list=gtk_tree_view_new_with_model(GTK_TREE_MODEL(listStore));
1005-#ifndef HAVE_GTK3
1006- gtk_widget_set_size_request(list, -1, 100);
1007-#endif
1008-
1009 renderer=gtk_cell_renderer_text_new();
1010 column=gtk_tree_view_column_new_with_attributes(_("Domain"),
1011 renderer,
1012@@ -589,9 +585,7 @@
1013 gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
1014
1015 scrolled=gtk_scrolled_window_new(NULL, NULL);
1016-#ifdef HAVE_GTK3
1017 gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolled), 100);
1018-#endif
1019 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1020 gtk_container_add(GTK_CONTAINER(scrolled), list);
1021 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
1022
1023=== added file 'extensions/donottrack.web.vala'
1024--- extensions/donottrack.web.vala 1970-01-01 00:00:00 +0000
1025+++ extensions/donottrack.web.vala 2015-03-10 00:27:20 +0000
1026@@ -0,0 +1,141 @@
1027+/*
1028+ Copyright (C) 2014 Christian Dywan <christian@twotoasts.de>
1029+
1030+ This library is free software; you can redistribute it and/or
1031+ modify it under the terms of the GNU Lesser General Public
1032+ License as published by the Free Software Foundation; either
1033+ version 2.1 of the License, or (at your option) any later version.
1034+
1035+ See the file COPYING for the full license text.
1036+*/
1037+
1038+namespace DoNotTrack {
1039+ struct Stain {
1040+ string key;
1041+ string host;
1042+ }
1043+ const Stain[] stains = {
1044+ /* analytics.google.com */
1045+ { "utm_source" },
1046+ { "utm_medium" },
1047+ { "utm_term" },
1048+ { "utm_content" },
1049+ { "utm_campaign" },
1050+ { "utm_reader" },
1051+ /* metrika.yandex.ru */
1052+ { "yclid" },
1053+ /* youtube.com */
1054+ { "feature", "youtube.com" },
1055+ /* facebook.com */
1056+ { "fb_action_ids" },
1057+ { "fb_action_types" },
1058+ { "fb_ref" },
1059+ { "fb_source" },
1060+ { "action_object_map" },
1061+ { "action_type_map" },
1062+ { "action_ref_map" },
1063+ { "ref", "www.facebook.com" },
1064+ { "fref", "www.facebook.com" },
1065+ { "hc_location", "www.facebook.com" },
1066+ /* imdb.com */
1067+ { "ref_", "imdb.com" },
1068+ /* addons.mozilla.org */
1069+ { "src", "addons.mozilla.org" }
1070+ };
1071+
1072+ public class Cleanser : Object {
1073+ File config;
1074+ public bool active = false;
1075+
1076+ public Cleanser () {
1077+ config = File.new_for_path (Midori.Paths.get_config_filename_for_reading ("config"));
1078+ /* TODO: Determine if removal of dirt is enabled */
1079+ active = true;
1080+ }
1081+ bool has_stains (string host, string key) {
1082+ /*
1083+ See also https://addons.mozilla.org/en/firefox/addon/pure-url/
1084+ as well as Epiphany for a C version
1085+ */
1086+ foreach (var stain in stains) {
1087+ if (stain.host != null && host.has_suffix (stain.host))
1088+ continue;
1089+ if (stain.key == key)
1090+ return true;
1091+ }
1092+ return false;
1093+ }
1094+
1095+ public string? remove_dirt (string uri) {
1096+ string? host = uri.split ("/")[2];
1097+ string? query = uri.split ("?")[1];
1098+ if (query == null)
1099+ return null;
1100+ string[] variables = query.split("&");
1101+ string spotless = "";
1102+ foreach (string variable in variables) {
1103+ // Note: a single & may result in a null key
1104+ string? key = variable.split ("=")[0];
1105+ if (key != null && !has_stains (host, key))
1106+ spotless += variable + "&";
1107+ }
1108+ string pure = uri.replace (query, spotless);
1109+ return pure;
1110+ }
1111+ }
1112+
1113+ public class Extension : Object {
1114+ bool debug = false;
1115+ Cleanser cleanser;
1116+
1117+ public Extension (WebKit.WebExtension extension) {
1118+ if (strcmp (Environment.get_variable ("MIDORI_DEBUG"), "donottrack") == 0)
1119+ debug = true;
1120+ cleanser = new Cleanser ();
1121+ extension.page_created.connect (page_created);
1122+ }
1123+
1124+ void page_created (WebKit.WebPage page) {
1125+ page.send_request.connect (send_request);
1126+ }
1127+
1128+ bool send_request (WebKit.URIRequest request, WebKit.URIResponse? redirect) {
1129+ if (!cleanser.active)
1130+ return false;
1131+
1132+ Soup.MessageHeaders? headers = request.get_http_headers ();
1133+ if (headers == null)
1134+ return false;
1135+
1136+ /*
1137+ First instance: ask nicely to be left alone
1138+ See http://tools.ietf.org/id/draft-mayer-do-not-track-00.txt
1139+ */
1140+ headers.append ("DNT", "1");
1141+
1142+ /* Second instance: deal with what won't play nice */
1143+ string? pure = cleanser.remove_dirt (request.uri);
1144+ if (pure != null) {
1145+ request.uri = pure;
1146+ if (debug)
1147+ stdout.printf ("DoNotTrack: Removed dirt from %s leaving only %s\n", request.uri, pure);
1148+ }
1149+ return false;
1150+ }
1151+ }
1152+}
1153+
1154+DoNotTrack.Extension? do_not_track;
1155+public void webkit_web_extension_initialize_with_user_data (WebKit.WebExtension extension, Variant user_data) {
1156+ Midori.Paths.init_with_user_data (user_data);
1157+ do_not_track = new DoNotTrack.Extension (extension);
1158+}
1159+
1160+void do_not_track_urls () {
1161+ /* TODO */
1162+}
1163+
1164+public void extension_test () {
1165+ Test.add_func ("/donottrack/urls", do_not_track_urls);
1166+}
1167+
1168
1169=== modified file 'extensions/external-download-manager.vala'
1170--- extensions/external-download-manager.vala 2014-07-11 05:49:56 +0000
1171+++ extensions/external-download-manager.vala 2015-03-10 00:27:20 +0000
1172@@ -42,15 +42,8 @@
1173 if (download_type == Midori.DownloadType.SAVE) {
1174 var dlReq = new DownloadRequest ();
1175
1176- #if HAVE_WEBKIT2
1177- dlReq.uri = download.request.get_uri ();
1178- weak MessageHeaders headers = download.request.get_http_headers ();
1179- #else
1180- dlReq.uri = download.get_uri ();
1181- var request = download.get_network_request ();
1182- var message = request.get_message ();
1183- weak MessageHeaders headers = message.request_headers;
1184- #endif
1185+ dlReq.uri = download.get_request ().get_uri ();
1186+ weak MessageHeaders headers = download.get_request ().get_http_headers ();
1187
1188 dlReq.auth = headers.get ("Authorization");
1189 dlReq.referer = headers.get ("Referer");
1190@@ -107,11 +100,7 @@
1191 }
1192
1193 construct {
1194- #if HAVE_WEBKIT2
1195 var session= new Session ();
1196- #else
1197- var session = WebKit.get_default_session ();
1198- #endif
1199 this.cookie_jar = session.get_feature (typeof (CookieJar)) as CookieJar;
1200 }
1201 }
1202@@ -275,15 +264,9 @@
1203 this.input = new Entry ();
1204 this.input.set_text (this.commandline.get_string ("commandline"));
1205
1206-
1207-#if HAVE_GTK3
1208 Gtk.Box vbox = get_content_area () as Gtk.Box;
1209 vbox.pack_start (text, false, false, 0);
1210 vbox.pack_start (this.input, false, true, 0);
1211-#else
1212- this.vbox.pack_start (text, false, false, 0);
1213- this.vbox.pack_start (this.input, false, true, 0);
1214-#endif
1215
1216 this.add_button (Gtk.STOCK_CANCEL, ResponseType.CANCEL);
1217 this.add_button (Gtk.STOCK_APPLY, ResponseType.APPLY);
1218
1219=== modified file 'extensions/feed-panel/feed-panel.c'
1220--- extensions/feed-panel/feed-panel.c 2013-10-25 21:49:56 +0000
1221+++ extensions/feed-panel/feed-panel.c 2015-03-10 00:27:20 +0000
1222@@ -800,12 +800,8 @@
1223 NULL);
1224 gtk_widget_show (treeview);
1225
1226-#if GTK_CHECK_VERSION(3,0,0)
1227 font_desc = (PangoFontDescription*)gtk_style_context_get_font (
1228 gtk_widget_get_style_context (treeview), GTK_STATE_FLAG_NORMAL);
1229-#else
1230- font_desc = treeview->style->font_desc;
1231-#endif
1232 family = pango_font_description_get_family (font_desc);
1233 size = pango_font_description_get_size (font_desc) / PANGO_SCALE;
1234 settings = midori_web_settings_new ();
1235
1236=== modified file 'extensions/feed-panel/main.c'
1237--- extensions/feed-panel/main.c 2013-08-12 19:21:06 +0000
1238+++ extensions/feed-panel/main.c 2015-03-10 00:27:20 +0000
1239@@ -348,7 +348,7 @@
1240
1241 dialog = gtk_dialog_new_with_buttons (
1242 _("New feed"), GTK_WINDOW (priv->browser),
1243- GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
1244+ GTK_DIALOG_DESTROY_WITH_PARENT,
1245 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1246 GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT,
1247 NULL);
1248
1249=== modified file 'extensions/formhistory/formhistory.c'
1250--- extensions/formhistory/formhistory.c 2013-11-26 19:08:06 +0000
1251+++ extensions/formhistory/formhistory.c 2015-03-10 00:27:20 +0000
1252@@ -99,7 +99,7 @@
1253 alive = 1;
1254 title = _("Form history");
1255 dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (parent),
1256- GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
1257+ GTK_DIALOG_DESTROY_WITH_PARENT,
1258 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1259 GTK_STOCK_OK, GTK_RESPONSE_OK,
1260 NULL);
1261
1262=== modified file 'extensions/history-list.vala'
1263--- extensions/history-list.vala 2013-10-28 22:33:16 +0000
1264+++ extensions/history-list.vala 2015-03-10 00:27:20 +0000
1265@@ -107,12 +107,8 @@
1266 Requisition requisition;
1267 int height;
1268 int max_lines = 10;
1269-#if HAVE_GTK3
1270 requisition = Requisition();
1271 this.treeview.get_preferred_size(out requisition, null);
1272-#else
1273- this.treeview.size_request (out requisition);
1274-#endif
1275 Gtk.ListStore model = this.treeview.get_model () as Gtk.ListStore;
1276 int length = model.iter_n_children(null);
1277 if (length > max_lines) {
1278@@ -217,12 +213,6 @@
1279
1280 model.get_iter (out iter, path);
1281 model.get (iter, TabTreeCells.TREE_CELL_POINTER, out view);
1282-#if !HAVE_GTK3
1283- /* removing the selected cursor causes a segfault when using GTK2 */
1284- if (path.prev () == false)
1285- path.next ();
1286- this.treeview.set_cursor (path, column, false);
1287-#endif
1288
1289 /*
1290 FixMe: the retrun value of `Gtk.ListStore.remove` should be checked
1291@@ -364,11 +354,7 @@
1292 table.attach_defaults (proxy, 0, 2, 1, 2);
1293 #endif
1294
1295-#if HAVE_GTK3
1296 (get_content_area() as Gtk.Box).pack_start (table, false, true, 0);
1297-#else
1298- this.vbox.pack_start (table, false, true, 0);
1299-#endif
1300
1301 this.add_button (Gtk.STOCK_CANCEL, ResponseType.CANCEL);
1302 this.add_button (Gtk.STOCK_APPLY, ResponseType.APPLY);
1303
1304=== added file 'extensions/hsts.web.vala'
1305--- extensions/hsts.web.vala 1970-01-01 00:00:00 +0000
1306+++ extensions/hsts.web.vala 2015-03-10 00:27:20 +0000
1307@@ -0,0 +1,173 @@
1308+/*
1309+ Copyright (C) 2012-2014 Christian Dywan <christian@twotoasts.de>
1310+
1311+ This library is free software; you can redistribute it and/or
1312+ modify it under the terms of the GNU Lesser General Public
1313+ License as published by the Free Software Foundation; either
1314+ version 2.1 of the License, or (at your option) any later version.
1315+
1316+ See the file COPYING for the full license text.
1317+*/
1318+
1319+namespace HSTS {
1320+ public class Directive {
1321+ public Soup.Date? expires = null;
1322+ public bool sub_domains = false;
1323+
1324+ public Directive (bool include_sub_domains) {
1325+ expires = new Soup.Date.from_now (int.MAX);
1326+ sub_domains = include_sub_domains;
1327+ }
1328+
1329+ public Directive.from_header (string header) {
1330+ var param_list = Soup.header_parse_param_list (header);
1331+ if (param_list == null)
1332+ return;
1333+
1334+ string? max_age = param_list.lookup ("max-age");
1335+ if (max_age != null)
1336+ expires = new Soup.Date.from_now (max_age.to_int ());
1337+ if ("includeSubDomains" in header)
1338+ sub_domains = true;
1339+ Soup.header_free_param_list (param_list);
1340+ }
1341+
1342+ public bool is_valid () {
1343+ return expires != null && !expires.is_past ();
1344+ }
1345+ }
1346+
1347+ public class Whitelist : Object {
1348+ HashTable<string, Directive> whitelist;
1349+ string preset = "/etc/xdg/midori/hsts";
1350+ File config;
1351+
1352+ public Whitelist () {
1353+ whitelist = new HashTable<string, Directive> (str_hash, str_equal);
1354+ read_cache.begin (File.new_for_path (preset));
1355+ config = File.new_for_path (Midori.Paths.get_config_filename_for_writing ("hsts"));
1356+ read_cache.begin (config);
1357+ }
1358+
1359+ async void read_cache (File file) {
1360+ try {
1361+ var stream = new DataInputStream (yield file.read_async ());
1362+ do {
1363+ string? line = yield stream.read_line_async ();
1364+ if (line == null)
1365+ break;
1366+ string[] parts = line.split (" ", 2);
1367+ if (parts[0] == null || parts[1] == null)
1368+ break;
1369+ var directive = new Directive.from_header (parts[1]);
1370+ if (directive.is_valid ())
1371+ append_to_whitelist (parts[0], directive);
1372+ } while (true);
1373+ } catch (IOError.NOT_FOUND exist_error) {
1374+ /* It's no error if no cache file exists */
1375+ } catch (Error error) {
1376+ warning ("Failed to read cache %s: %s", file.get_path (), error.message);
1377+ }
1378+ }
1379+
1380+ public bool should_secure_host (string host) {
1381+ Directive? directive = whitelist.lookup (host);
1382+ if (directive == null)
1383+ directive = whitelist.lookup ("*." + host);
1384+ return directive != null && directive.is_valid ();
1385+ }
1386+
1387+ void append_to_whitelist (string host, Directive directive) {
1388+ whitelist.insert (host, directive);
1389+ if (directive.sub_domains)
1390+ whitelist.insert ("*." + host, directive);
1391+ }
1392+
1393+ async void append_to_cache (string host, string header) {
1394+ /* FIXME: Don't write in private browsing */
1395+
1396+ try {
1397+ var stream = yield config.append_to_async (FileCreateFlags.NONE);
1398+ yield stream.write_async ((host + " " + header + "\n").data);
1399+ yield stream.flush_async ();
1400+ }
1401+ catch (Error error) {
1402+ critical ("Failed to update %s: %s", config.get_path (), error.message);
1403+ }
1404+ }
1405+
1406+ public Directive? strict_transport_security_handled (string host, Soup.MessageHeaders headers) {
1407+ unowned string? hsts = headers.get_one ("Strict-Transport-Security");
1408+ if (hsts == null)
1409+ return null;
1410+
1411+ var directive = new Directive.from_header (hsts);
1412+ if (directive.is_valid ()) {
1413+ append_to_whitelist (host, directive);
1414+ append_to_cache.begin (host, hsts);
1415+ }
1416+ return directive;
1417+ }
1418+
1419+ }
1420+
1421+ public class Extension : Object {
1422+ Whitelist whitelist;
1423+ bool debug = false;
1424+
1425+ public Extension (WebKit.WebExtension extension) {
1426+ if (strcmp (Environment.get_variable ("MIDORI_DEBUG"), "hsts") == 0)
1427+ debug = true;
1428+ whitelist = new Whitelist ();
1429+ extension.page_created.connect (page_created);
1430+ }
1431+
1432+ void page_created (WebKit.WebPage page) {
1433+ page.send_request.connect (send_request);
1434+ }
1435+
1436+ bool send_request (WebKit.URIRequest request, WebKit.URIResponse? redirect) {
1437+ Soup.MessageHeaders? headers = request.get_http_headers ();
1438+ if (headers == null || !request.uri.contains ("/"))
1439+ return false;
1440+
1441+ string host = request.uri.split ("/")[2];
1442+ if (whitelist.should_secure_host (host)) {
1443+ request.uri = request.uri.replace ("http://", "https://");
1444+ if (debug)
1445+ stdout.printf ("HSTS: Enforce %s\n", host);
1446+ } else if (request.uri.has_prefix ("http://")) {
1447+ var directive = whitelist.strict_transport_security_handled (host, headers);
1448+ if (debug)
1449+ stdout.printf ("HSTS: %s valid? %s\n",
1450+ host, directive != null ? directive.is_valid ().to_string () : "/");
1451+ }
1452+ return false;
1453+ }
1454+ }
1455+}
1456+
1457+HSTS.Extension? hsts;
1458+public void webkit_web_extension_initialize_with_user_data (WebKit.WebExtension extension, Variant user_data) {
1459+ Midori.Paths.init_with_user_data (user_data);
1460+ hsts = new HSTS.Extension (extension);
1461+}
1462+
1463+void hsts_directive () {
1464+ HSTS.Directive d;
1465+ d = new HSTS.Directive.from_header ("max-age=31536000");
1466+ assert (d.is_valid () && !d.sub_domains);
1467+ d = new HSTS.Directive.from_header ("max-age=15768000 ; includeSubDomains");
1468+ assert (d.is_valid () && d.sub_domains);
1469+
1470+ /* Invalid */
1471+ d = new HSTS.Directive.from_header ("");
1472+ assert (!d.is_valid () && !d.sub_domains);
1473+ d = new HSTS.Directive.from_header ("includeSubDomains");
1474+ assert (!d.is_valid () && d.sub_domains);
1475+}
1476+
1477+public void extension_test () {
1478+ Test.add_func ("/hsts/directive", hsts_directive);
1479+}
1480+
1481
1482=== modified file 'extensions/nojs/nojs-preferences.c'
1483--- extensions/nojs/nojs-preferences.c 2013-08-16 22:02:25 +0000
1484+++ extensions/nojs/nojs-preferences.c 2015-03-10 00:27:20 +0000
1485@@ -839,12 +839,8 @@
1486
1487 /* Get content area to add gui controls to */
1488 priv->contentArea=gtk_dialog_get_content_area(GTK_DIALOG(self));
1489-#if GTK_CHECK_VERSION (3, 0, 0)
1490 vbox=gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
1491 gtk_box_set_homogeneous(GTK_BOX(vbox), FALSE);
1492-#else
1493- vbox=gtk_vbox_new(FALSE, 0);
1494-#endif
1495
1496 /* Set up dialog */
1497 dialogTitle=_("Configure NoJS");
1498@@ -887,12 +883,8 @@
1499 gtk_tree_sortable_set_sort_column_id(sortableList, DOMAIN_COLUMN, GTK_SORT_ASCENDING);
1500
1501 /* Set up domain addition widgets */
1502-#ifdef HAVE_GTK3
1503 hbox=gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1504 gtk_box_set_homogeneous(GTK_BOX(hbox), FALSE);
1505-#else
1506- hbox=gtk_hbox_new(FALSE, 0);
1507-#endif
1508
1509 priv->addDomainEntry=gtk_entry_new();
1510 gtk_entry_set_max_length(GTK_ENTRY(priv->addDomainEntry), 64);
1511@@ -925,10 +917,6 @@
1512 /* Set up domain list view */
1513 priv->list=gtk_tree_view_new_with_model(GTK_TREE_MODEL(priv->listStore));
1514
1515-#if !GTK_CHECK_VERSION (3, 0, 0)
1516- gtk_widget_set_size_request(priv->list, -1, 300);
1517-#endif
1518-
1519 priv->listSelection=gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->list));
1520 gtk_tree_selection_set_mode(priv->listSelection, GTK_SELECTION_MULTIPLE);
1521 g_signal_connect_swapped(priv->listSelection, "changed", G_CALLBACK(_nojs_preferences_changed_selection), self);
1522@@ -954,21 +942,15 @@
1523 gtk_tree_view_append_column(GTK_TREE_VIEW(priv->list), column);
1524
1525 scrolled=gtk_scrolled_window_new(NULL, NULL);
1526-#if GTK_CHECK_VERSION (3, 0, 0)
1527 gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolled), height*10);
1528-#endif
1529 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1530 gtk_container_add(GTK_CONTAINER(scrolled), priv->list);
1531 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
1532 gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 5);
1533
1534 /* Set up JavaScript domain list management buttons */
1535-#if GTK_CHECK_VERSION (3, 0, 0)
1536 hbox=gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1537 gtk_box_set_homogeneous(GTK_BOX(hbox), FALSE);
1538-#else
1539- hbox=gtk_hbox_new(FALSE, 0);
1540-#endif
1541
1542 priv->deleteButton=gtk_button_new_from_stock(GTK_STOCK_DELETE);
1543 gtk_widget_set_sensitive(priv->deleteButton, FALSE);
1544
1545=== modified file 'extensions/nojs/nojs.c'
1546--- extensions/nojs/nojs.c 2013-09-16 23:18:48 +0000
1547+++ extensions/nojs/nojs.c 2015-03-10 00:27:20 +0000
1548@@ -513,7 +513,7 @@
1549 statusbarIcon=gtk_button_new();
1550 gtk_button_set_relief(GTK_BUTTON(statusbarIcon), GTK_RELIEF_NONE);
1551 gtk_widget_show_all(statusbarIcon);
1552- gtk_box_pack_end(GTK_BOX(statusbar), statusbarIcon, FALSE, FALSE, 0);
1553+ gtk_container_add(GTK_CONTAINER(statusbar), statusbarIcon);
1554 g_object_set_data_full(G_OBJECT(inBrowser), "nojs-statusicon", g_object_ref(statusbarIcon), (GDestroyNotify)gtk_widget_destroy);
1555
1556 /* Connect signals */
1557
1558=== removed file 'extensions/nsplugin-manager.vala'
1559--- extensions/nsplugin-manager.vala 2013-06-19 20:27:53 +0000
1560+++ extensions/nsplugin-manager.vala 1970-01-01 00:00:00 +0000
1561@@ -1,71 +0,0 @@
1562-/*
1563- Copyright (C) 2012 André Stösel <andre@stoesel.de>
1564-
1565- This library is free software; you can redistribute it and/or
1566- modify it under the terms of the GNU Lesser General Public
1567- License as published by the Free Software Foundation; either
1568- version 2.1 of the License, or (at your option) any later version.
1569-
1570- See the file COPYING for the full license text.
1571-*/
1572-
1573-namespace NSPlugins {
1574- private int active_plugins = 0;
1575-
1576- private class Extension : Midori.Extension {
1577- protected WebKit.WebPlugin plugin;
1578-
1579- void activated (Midori.App app) {
1580- active_plugins += 1;
1581- this.plugin.set_enabled (true);
1582- app.settings.enable_plugins = active_plugins > 0;
1583- }
1584-
1585- void deactivated () {
1586- Midori.App app = this.get_app ();
1587- active_plugins -= 1;
1588- this.plugin.set_enabled (false);
1589- app.settings.enable_plugins = active_plugins > 0;
1590- }
1591-
1592- internal Extension (WebKit.WebPlugin plugin) {
1593- string desc = plugin.get_description ();
1594- try {
1595- var regex = new Regex ("<a.+href.+>(.+)</a>");
1596- desc = regex.replace (desc, -1, 0, "<u>\\1</u>");
1597- desc = desc.replace ("<br>", "\n");
1598- }
1599- catch (Error error) { }
1600- GLib.Object (stock_id: Midori.Stock.PLUGINS,
1601- name: plugin.get_name (),
1602- description: desc,
1603- use_markup: true,
1604- key: GLib.Path.get_basename (plugin.get_path ()),
1605- version: "(%s)".printf ("Netscape plugins"),
1606- authors: "");
1607-
1608- this.plugin = plugin;
1609- this.plugin.set_enabled (false);
1610-
1611- this.activate.connect (activated);
1612- this.deactivate.connect (deactivated);
1613- }
1614- }
1615-}
1616-
1617-public Katze.Array? extension_init () {
1618- if (!Midori.WebSettings.has_plugin_support ())
1619- return null;
1620-
1621- var extensions = new Katze.Array( typeof (Midori.Extension));
1622- WebKit.WebPluginDatabase pdb = WebKit.get_web_plugin_database ();
1623- SList<WebKit.WebPlugin> plugins = pdb.get_plugins ();
1624-
1625- foreach (WebKit.WebPlugin plugin in plugins) {
1626- if (Midori.WebSettings.skip_plugin (plugin.get_path ()))
1627- continue;
1628- extensions.add_item (new NSPlugins.Extension (plugin));
1629- }
1630- return extensions;
1631-}
1632-
1633
1634=== modified file 'extensions/open-with.vala'
1635--- extensions/open-with.vala 2014-03-15 20:43:57 +0000
1636+++ extensions/open-with.vala 2015-03-10 00:27:20 +0000
1637@@ -157,9 +157,6 @@
1638 transient_for = browser;
1639
1640 title = _("Custom…");
1641-#if !HAVE_GTK3
1642- has_separator = false;
1643-#endif
1644 destroy_with_parent = true;
1645 set_icon_name (Gtk.STOCK_OPEN);
1646 resizable = false;
1647@@ -368,11 +365,7 @@
1648
1649 var browser = Midori.Browser.get_for_widget (widget);
1650 transient_for = browser;
1651-
1652 title = _("Choose application");
1653-#if !HAVE_GTK3
1654- has_separator = false;
1655-#endif
1656 destroy_with_parent = true;
1657 set_icon_name (Gtk.STOCK_OPEN);
1658 resizable = false;
1659@@ -547,11 +540,7 @@
1660 renderer.set ("markup",
1661 Markup.printf_escaped ("<b>%s</b>\n%s",
1662 desc, mime_type),
1663-#if HAVE_GTK3
1664 "max-width-chars", 30,
1665-#else
1666- "width-chars", 30,
1667-#endif
1668 "ellipsize", Pango.EllipsizeMode.END);
1669 }
1670
1671
1672=== modified file 'extensions/shortcuts.c'
1673--- extensions/shortcuts.c 2013-03-23 01:37:12 +0000
1674+++ extensions/shortcuts.c 2015-03-10 00:27:20 +0000
1675@@ -167,7 +167,7 @@
1676
1677 dialog_title = _("Customize Keyboard shortcuts");
1678 dialog = gtk_dialog_new_with_buttons (dialog_title, GTK_WINDOW (browser),
1679- GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
1680+ GTK_DIALOG_DESTROY_WITH_PARENT,
1681 #if !HAVE_OSX
1682 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
1683 #endif
1684
1685=== modified file 'extensions/status-clock.c'
1686--- extensions/status-clock.c 2013-06-26 21:54:50 +0000
1687+++ extensions/status-clock.c 2015-03-10 00:27:20 +0000
1688@@ -105,7 +105,7 @@
1689 label = gtk_label_new (NULL);
1690
1691 statusbar = katze_object_get_object (browser, "statusbar");
1692- gtk_box_pack_end (GTK_BOX (statusbar), label, FALSE, FALSE, 0);
1693+ gtk_container_add (GTK_CONTAINER (statusbar), label);
1694
1695 g_object_set_data (G_OBJECT (browser), "clock-label", label);
1696 g_object_set_data (G_OBJECT (browser), "clock-extension", extension);
1697
1698=== modified file 'extensions/statusbar-features.c'
1699--- extensions/statusbar-features.c 2013-10-30 00:05:40 +0000
1700+++ extensions/statusbar-features.c 2015-03-10 00:27:20 +0000
1701@@ -34,33 +34,6 @@
1702 MidoriExtension* extension);
1703
1704 static void
1705-statusbar_features_toolbar_notify_toolbar_style_cb (GtkWidget* toolbar,
1706- GParamSpec* pspec,
1707- GtkWidget* button)
1708-{
1709- GtkToolbarStyle style = katze_object_get_enum (toolbar, "toolbar-style");
1710- const gchar* text = g_object_get_data (G_OBJECT (button), "feature-label");
1711- switch (style)
1712- {
1713- case GTK_TOOLBAR_BOTH:
1714- case GTK_TOOLBAR_BOTH_HORIZ:
1715- gtk_button_set_label (GTK_BUTTON (button), text);
1716- gtk_widget_show (gtk_button_get_image (GTK_BUTTON (button)));
1717- break;
1718- case GTK_TOOLBAR_TEXT:
1719- gtk_button_set_label (GTK_BUTTON (button), text);
1720- gtk_widget_hide (gtk_button_get_image (GTK_BUTTON (button)));
1721- break;
1722- case GTK_TOOLBAR_ICONS:
1723- gtk_button_set_label (GTK_BUTTON (button), "");
1724- gtk_widget_show (gtk_button_get_image (GTK_BUTTON (button)));
1725- break;
1726- default:
1727- g_assert_not_reached ();
1728- }
1729-}
1730-
1731-static void
1732 statusbar_features_browser_notify_tab_cb (MidoriBrowser* browser,
1733 GParamSpec* pspec,
1734 GtkWidget* combobox)
1735@@ -85,8 +58,6 @@
1736 GtkWidget* toolbar = katze_object_get_object (browser, "navigationbar");
1737
1738 gtk_widget_destroy (bbox);
1739- g_signal_handlers_disconnect_matched (toolbar, G_SIGNAL_MATCH_FUNC,
1740- 0, -1, NULL, statusbar_features_toolbar_notify_toolbar_style_cb, NULL);
1741 g_object_unref (toolbar);
1742 g_signal_handlers_disconnect_by_func (
1743 extension, statusbar_features_deactivate_cb, bbox);
1744@@ -149,35 +120,23 @@
1745
1746 if (!strcmp (property, "auto-load-images"))
1747 {
1748- g_object_set_data (G_OBJECT (button), "feature-label", _("Images"));
1749 image = gtk_image_new_from_stock (STOCK_IMAGE, GTK_ICON_SIZE_MENU);
1750 gtk_button_set_image (GTK_BUTTON (button), image);
1751 gtk_widget_set_tooltip_text (button, _("Load images automatically"));
1752- statusbar_features_toolbar_notify_toolbar_style_cb (toolbar, NULL, button);
1753- g_signal_connect (toolbar, "notify::toolbar-style",
1754- G_CALLBACK (statusbar_features_toolbar_notify_toolbar_style_cb), button);
1755 }
1756 if (!strcmp (property, "enable-javascript"))
1757 {
1758- g_object_set_data (G_OBJECT (button), "feature-label", _("Scripts"));
1759 image = gtk_image_new_from_stock (STOCK_SCRIPT, GTK_ICON_SIZE_MENU);
1760 gtk_button_set_image (GTK_BUTTON (button), image);
1761 gtk_widget_set_tooltip_text (button, _("Enable scripts"));
1762- statusbar_features_toolbar_notify_toolbar_style_cb (toolbar, NULL, button);
1763- g_signal_connect (toolbar, "notify::toolbar-style",
1764- G_CALLBACK (statusbar_features_toolbar_notify_toolbar_style_cb), button);
1765 }
1766 else if (!strcmp (property, "enable-plugins"))
1767 {
1768 if (!midori_web_settings_has_plugin_support ())
1769 gtk_widget_hide (button);
1770- g_object_set_data (G_OBJECT (button), "feature-label", _("Netscape plugins"));
1771 image = gtk_image_new_from_stock (MIDORI_STOCK_PLUGINS, GTK_ICON_SIZE_MENU);
1772 gtk_button_set_image (GTK_BUTTON (button), image);
1773 gtk_widget_set_tooltip_text (button, _("Enable Netscape plugins"));
1774- statusbar_features_toolbar_notify_toolbar_style_cb (toolbar, NULL, button);
1775- g_signal_connect (toolbar, "notify::toolbar-style",
1776- G_CALLBACK (statusbar_features_toolbar_notify_toolbar_style_cb), button);
1777 }
1778 return button;
1779 }
1780@@ -228,7 +187,7 @@
1781 gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 2);
1782 }
1783 gtk_widget_show_all (bbox);
1784- gtk_box_pack_end (GTK_BOX (statusbar), bbox, FALSE, FALSE, 3);
1785+ gtk_container_add (GTK_CONTAINER (statusbar), bbox);
1786 g_object_unref (statusbar);
1787 g_object_unref (toolbar);
1788
1789
1790=== modified file 'extensions/tabby.vala'
1791--- extensions/tabby.vala 2014-04-25 19:49:26 +0000
1792+++ extensions/tabby.vala 2015-03-10 00:27:20 +0000
1793@@ -236,12 +236,7 @@
1794 }
1795 }
1796
1797-#if HAVE_GTK3
1798 protected bool delete_event (Gtk.Widget widget, Gdk.EventAny event) {
1799-#else
1800- protected bool delete_event (Gtk.Widget widget, Gdk.Event event) {
1801-#endif
1802-
1803 this.close ();
1804 return false;
1805
1806
1807=== modified file 'extensions/transfers.vala'
1808--- extensions/transfers.vala 2014-02-22 22:35:42 +0000
1809+++ extensions/transfers.vala 2015-03-10 00:27:20 +0000
1810@@ -31,27 +31,14 @@
1811 internal double progress { get {
1812 return Midori.Download.get_progress (download);
1813 } }
1814-#if HAVE_WEBKIT2
1815 public bool succeeded { get; protected set; default = false; }
1816 public bool finished { get; protected set; default = false; }
1817 internal string destination { get {
1818 return download.destination;
1819 } }
1820-#else
1821- internal bool succeeded { get {
1822- return download.status == WebKit.DownloadStatus.FINISHED;
1823- } }
1824- internal bool finished { get {
1825- return Midori.Download.is_finished (download);
1826- } }
1827- internal string destination { get {
1828- return download.destination_uri;
1829- } }
1830-#endif
1831
1832 internal Transfer (WebKit.Download download) {
1833 this.download = download;
1834- #if HAVE_WEBKIT2
1835 download.notify["estimated-progress"].connect (transfer_changed);
1836 download.finished.connect (() => {
1837 succeeded = finished = true;
1838@@ -62,10 +49,6 @@
1839 finished = true;
1840 changed ();
1841 });
1842- #else
1843- download.notify["status"].connect (transfer_changed);
1844- download.notify["progress"].connect (transfer_changed);
1845- #endif
1846 }
1847
1848 void transfer_changed (GLib.ParamSpec pspec) {
1849@@ -316,9 +299,7 @@
1850
1851 var box = new Gtk.HBox (false, 0);
1852 progress = new Gtk.ProgressBar ();
1853-#if HAVE_GTK3
1854 progress.show_text = true;
1855-#endif
1856 progress.ellipsize = Pango.EllipsizeMode.MIDDLE;
1857 string filename = Midori.Download.get_basename_for_display (transfer.destination);
1858 progress.text = filename;
1859@@ -489,11 +470,7 @@
1860 transfer.removed ();
1861 }
1862
1863-#if HAVE_GTK3
1864 bool browser_closed (Gtk.Widget widget, Gdk.EventAny event) {
1865-#else
1866- bool browser_closed (Gtk.Widget widget, Gdk.Event event) {
1867-#endif
1868 var browser = widget as Midori.Browser;
1869 if (pending_transfers (array)) {
1870 var dialog = new Gtk.MessageDialog (browser,
1871@@ -518,11 +495,7 @@
1872 browser.panel.append_page (viewable);
1873 widgets.append (viewable);
1874 var toolbar = new Toolbar (array);
1875-#if HAVE_GTK3
1876- browser.statusbar.pack_end (toolbar, false, false);
1877-#else
1878- browser.statusbar.pack_start (toolbar, false, false);
1879-#endif
1880+ browser.add_toolbar (toolbar);
1881 widgets.append (toolbar);
1882 // TODO: popover
1883 // TODO: progress in dock item
1884
1885=== added directory 'ipc'
1886=== added file 'ipc/CMakeLists.txt'
1887--- ipc/CMakeLists.txt 1970-01-01 00:00:00 +0000
1888+++ ipc/CMakeLists.txt 2015-03-10 00:27:20 +0000
1889@@ -0,0 +1,47 @@
1890+include(ValaPrecompile)
1891+
1892+set(LIBMIDORI2_VERSION 0.6.0)
1893+set(LIBMIDORI2_SOVERSION 0)
1894+file(GLOB LIBMIDORI2_SOURCE *.vala)
1895+
1896+vala_precompile(LIBMIDORI2_SOURCE_C ${LIBMIDORI2}
1897+ ${LIBMIDORI2_SOURCE}
1898+PACKAGES
1899+ ${PACKAGES_CORE}
1900+OPTIONS
1901+ ${VALAFLAGS}
1902+GENERATE_VAPI
1903+ "${LIBMIDORI2}"
1904+GENERATE_HEADER
1905+ "${LIBMIDORI2}"
1906+)
1907+
1908+add_library("${LIBMIDORI2}" SHARED ${LIBMIDORI2_SOURCE_C})
1909+target_link_libraries("${LIBMIDORI2}"
1910+ ${DEPS_LIBRARIES}
1911+ )
1912+set_target_properties("${LIBMIDORI2}" PROPERTIES
1913+ COMPILE_FLAGS "${VALA_CFLAGS}"
1914+ POSITION_INDEPENDENT_CODE ON
1915+ VERSION ${LIBMIDORI2_VERSION}
1916+ SOVERSION ${LIBMIDORI2_SOVERSION}
1917+ )
1918+
1919+include_directories(
1920+ ${CMAKE_SOURCE_DIR}
1921+ ${CMAKE_CURRENT_SOURCE_DIR}
1922+ ${CMAKE_BINARY_DIR}
1923+ ${DEPS_INCLUDE_DIRS}
1924+ ${OPTS_INCLUDE_DIRS}
1925+ ${DEPS_GTK_INCLUDE_DIRS}
1926+ )
1927+if (WIN32)
1928+ install(TARGETS ${LIBMIDORI2}
1929+ LIBRARY DESTINATION ${CMAKE_INSTALL_BINDIR}
1930+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1931+ )
1932+else ()
1933+ install(TARGETS ${LIBMIDORI2}
1934+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1935+ )
1936+endif ()
1937
1938=== added file 'ipc/ipc-contextaction.vala'
1939--- ipc/ipc-contextaction.vala 1970-01-01 00:00:00 +0000
1940+++ ipc/ipc-contextaction.vala 2015-03-10 00:27:20 +0000
1941@@ -0,0 +1,56 @@
1942+/*
1943+ Copyright (C) 2013-2015 Christian Dywan <christian@twotoasts.de>
1944+
1945+ This library is free software; you can redistribute it and/or
1946+ modify it under the terms of the GNU Lesser General Public
1947+ License as published by the Free Software Foundation; either
1948+ version 2.1 of the License, or (at your option) any later version.
1949+
1950+ See the file COPYING for the full license text.
1951+*/
1952+
1953+namespace Midori {
1954+ /* A context item that make a menu, toolbar or button.
1955+ Since: 0.6.0 */
1956+ public class ContextItem : Gtk.Action {
1957+ List<Gtk.Action> children;
1958+ public ContextItem (string name, string? label, string? tooltip, string? stock_id) {
1959+ GLib.Object (name: name, label: label, tooltip: tooltip, stock_id: stock_id);
1960+ children = new List<ContextItem> ();
1961+ }
1962+
1963+ public Variant to_user_data () {
1964+ var user_data = new HashTable<string, string> (str_hash, str_equal);
1965+ user_data.insert ("name", name);
1966+ user_data.insert ("label", label ?? "");
1967+ user_data.insert ("tooltip", tooltip ?? "");
1968+ user_data.insert ("stock_id", stock_id ?? "");
1969+ return user_data;
1970+ }
1971+
1972+ /*
1973+ The action label will be escaped for mnemonics so for example
1974+ "a_fairy_tale" will not get accel keys on "f" or "t".
1975+ */
1976+ public ContextItem.escaped (string name, string label, string? tooltip, string? stock_id) {
1977+ string? escaped_label = label.replace ("_", "__");
1978+ GLib.Object (name: name, label: escaped_label, tooltip: tooltip, stock_id: stock_id);
1979+ children = new List<ContextItem> ();
1980+ }
1981+
1982+ public void add (Gtk.Action? action) {
1983+ if (action == null) {
1984+ add (new SeparatorContextItem ());
1985+ return;
1986+ }
1987+
1988+ children.append (action);
1989+ }
1990+ }
1991+
1992+ public class SeparatorContextItem : ContextItem {
1993+ public SeparatorContextItem () {
1994+ GLib.Object (name: "SeparatorContextAction", label: null, tooltip: null, stock_id: null);
1995+ }
1996+ }
1997+}
1998
1999=== added file 'ipc/ipc-paths.vala'
2000--- ipc/ipc-paths.vala 1970-01-01 00:00:00 +0000
2001+++ ipc/ipc-paths.vala 2015-03-10 00:27:20 +0000
2002@@ -0,0 +1,132 @@
2003+/*
2004+ Copyright (C) 2012-2015 Christian Dywan <christian@twotoasts.de>
2005+
2006+ This library is free software; you can redistribute it and/or
2007+ modify it under the terms of the GNU Lesser General Public
2008+ License as published by the Free Software Foundation; either
2009+ version 2.1 of the License, or (at your option) any later version.
2010+
2011+ See the file COPYING for the full license text.
2012+*/
2013+
2014+extern const string MDATADIR;
2015+extern const string PACKAGE_NAME;
2016+
2017+namespace Midori {
2018+ public enum RuntimeMode {
2019+ UNDEFINED,
2020+ NORMAL,
2021+ APP,
2022+ PRIVATE,
2023+ PORTABLE
2024+ }
2025+
2026+ namespace Paths {
2027+ static RuntimeMode mode = RuntimeMode.UNDEFINED;
2028+ static string? exec_path = null;
2029+ static string? config_dir = null;
2030+ static string? readonly_dir = null;
2031+ static string? app_name = null;
2032+
2033+ public static void mkdir_with_parents (string path, int mode = 0700) {
2034+ /* Use g_access instead of g_file_test for better performance */
2035+ if (Posix.access (path, Posix.F_OK) == 0)
2036+ return;
2037+ int i = path.index_of_char (Path.DIR_SEPARATOR, 0);
2038+ do {
2039+ string fn = path.substring (i, -1);
2040+ if (Posix.access (fn, Posix.F_OK) != 0) {
2041+ if (DirUtils.create (fn, mode) == -1) {
2042+ /* Slow fallback; if this fails we fail */
2043+ DirUtils.create_with_parents (path, mode);
2044+ return;
2045+ }
2046+ }
2047+ else if (!FileUtils.test (fn, FileTest.IS_SYMLINK))
2048+ return; /* Failed */
2049+
2050+ i = path.index_of_char (Path.DIR_SEPARATOR, i);
2051+ }
2052+ while (i != -1);
2053+ }
2054+
2055+ public static void init_with_user_data (Variant user_data) {
2056+ /* Web extensions may run in the same process */
2057+ if (mode != RuntimeMode.UNDEFINED)
2058+ return;
2059+ if (strcmp (Environment.get_variable ("MIDORI_DEBUG"), "addons") == 0)
2060+ stdout.printf ("Addons: Serialized config %s\n", user_data.print (true));
2061+ var config = user_data as HashTable<string, string>;
2062+ mode = (RuntimeMode)config["mode"];
2063+ assert (mode != RuntimeMode.UNDEFINED);
2064+ readonly_dir = config["readonly_dir"];
2065+ config_dir = config["config_dir"];
2066+ assert (readonly_dir != null || config_dir != null);
2067+ exec_path = config["exec_path"];
2068+ assert (exec_path != null);
2069+ app_name = config["app_name"];
2070+ assert (app_name != null);
2071+ }
2072+
2073+ public static string get_config_dir_for_reading () {
2074+ assert (mode != RuntimeMode.UNDEFINED);
2075+ return readonly_dir ?? config_dir;
2076+ }
2077+
2078+ /* returns the path to a user configuration file whose contents should not be modified.
2079+ to get the path to save settings, use get_config_filename() */
2080+ public static string get_config_filename_for_reading (string filename) {
2081+ assert (mode != RuntimeMode.UNDEFINED);
2082+ return Path.build_path (Path.DIR_SEPARATOR_S,
2083+ readonly_dir ?? config_dir, filename);
2084+ }
2085+
2086+ /* returns the path to a user configuration file to which it is permitted to write.
2087+ this is also necessary for files whose state is synchronized to disk by a manager,
2088+ e.g. cookies. */
2089+ public static string get_config_filename_for_writing (string filename) {
2090+ assert (mode != RuntimeMode.UNDEFINED);
2091+ assert (config_dir != null);
2092+ mkdir_with_parents (config_dir);
2093+ return Path.build_path (Path.DIR_SEPARATOR_S, config_dir, filename);
2094+ }
2095+
2096+ #if !HAVE_WIN32
2097+ string? build_folder (string folder, string? middle, string filename) {
2098+ /* Fallback to build folder */
2099+ File? parent = File.new_for_path (exec_path);
2100+ while (parent != null) {
2101+ var data = parent.get_child (folder);
2102+ if (middle != null)
2103+ data = data.get_child (middle);
2104+ var child = data.get_child (filename);
2105+ if (child.query_exists ())
2106+ return child.get_path ();
2107+ parent = parent.get_parent ();
2108+ }
2109+ return null;
2110+ }
2111+ #endif
2112+
2113+ public static string get_res_filename (string filename) {
2114+ assert (exec_path != null);
2115+ assert (filename != "");
2116+ #if HAVE_WIN32
2117+ return Path.build_filename (exec_path, "share", PACKAGE_NAME, "res", filename);
2118+ #else
2119+ string path = Path.build_filename (exec_path, "share", PACKAGE_NAME, "res", filename);
2120+ if (Posix.access (path, Posix.F_OK) == 0)
2121+ return path;
2122+
2123+ return build_folder ("data", null, filename) ??
2124+ Path.build_filename (MDATADIR, PACKAGE_NAME, "res", filename);
2125+ #endif
2126+ }
2127+
2128+ public static string get_app_name () {
2129+ assert (mode != RuntimeMode.UNDEFINED);
2130+ assert (app_name != null);
2131+ return app_name;
2132+ }
2133+ }
2134+}
2135
2136=== renamed file 'midori/midori-database.vala' => 'ipc/midori-database.vala'
2137=== added file 'ipc/midori-tabproxy.vala'
2138--- ipc/midori-tabproxy.vala 1970-01-01 00:00:00 +0000
2139+++ ipc/midori-tabproxy.vala 2015-03-10 00:27:20 +0000
2140@@ -0,0 +1,29 @@
2141+/*
2142+ Copyright (C) 2015 Christian Dywan <christian@twotoasts.de>
2143+
2144+ This library is free software; you can redistribute it and/or
2145+ modify it under the terms of the GNU Lesser General Public
2146+ License as published by the Free Software Foundation; either
2147+ version 2.1 of the License, or (at your option) any later version.
2148+
2149+ See the file COPYING for the full license text.
2150+*/
2151+
2152+namespace Midori {
2153+ [DBus (name = "org.midori.Remote.tab")]
2154+ public interface TabProxy : Object {
2155+ public abstract uint64 id { get; }
2156+ public abstract string color { owned get; set; }
2157+ public async abstract uint64 add_action (Variant user_data) throws IOError;
2158+ public signal void action_added (uint64 id, Variant user_data);
2159+ public signal void action_activated (uint64 id, string name);
2160+ public async static TabProxy? get_by_id (uint64 page_id, Cancellable? cancellable=null) throws Error {
2161+ var app = new Application (Midori.Paths.get_app_name (), ApplicationFlags.IS_LAUNCHER);
2162+ app.register (cancellable);
2163+ var connection = app.get_dbus_connection ();
2164+ return yield connection.get_proxy<TabProxy> (app.get_application_id (),
2165+ "/org/midori/Remote/tab/" + page_id.to_string (), DBusProxyFlags.NONE, cancellable);
2166+ }
2167+ }
2168+}
2169+
2170
2171=== added file 'ipc/midori-webextension.vala'
2172--- ipc/midori-webextension.vala 1970-01-01 00:00:00 +0000
2173+++ ipc/midori-webextension.vala 2015-03-10 00:27:20 +0000
2174@@ -0,0 +1,40 @@
2175+/*
2176+ Copyright (C) 2015 Christian Dywan <christian@twotoats.de>
2177+
2178+ This library is free software; you can redistribute it and/or
2179+ modify it under the terms of the GNU Lesser General Public
2180+ License as published by the Free Software Foundation; either
2181+ version 2.1 of the License, or (at your option) any later version.
2182+
2183+ See the file COPYING for the full license text.
2184+*/
2185+
2186+namespace Midori {
2187+ /*
2188+ * The WebExtension is a base class for out-of-process extensions.
2189+ *
2190+ * Since: 0.6.0
2191+ */
2192+ public class WebExtension : Object {
2193+ protected string? token { get; set; default = null; }
2194+
2195+ /*
2196+ * The user data is used to initialize Midori.Paths.
2197+ */
2198+ public Variant user_data { set {
2199+ Midori.Paths.init_with_user_data (value);
2200+ } }
2201+
2202+ /*
2203+ * Debug messages will be printed if MIDORI_DEBUG contains @token.
2204+ */
2205+ protected void debug (string format, ...) {
2206+ return_if_fail (token != null);
2207+ if (!(token in (Environment.get_variable ("MIDORI_DEBUG") ?? "")))
2208+ return;
2209+
2210+ var args = va_list ();
2211+ stdout.vprintf (token + ": " + format + "\n", args);
2212+ }
2213+ }
2214+}
2215
2216=== removed file 'katze/gtk3-compat.c'
2217--- katze/gtk3-compat.c 2012-12-13 22:58:45 +0000
2218+++ katze/gtk3-compat.c 1970-01-01 00:00:00 +0000
2219@@ -1,119 +0,0 @@
2220-/*
2221- Copyright (C) 2011-2012 Christian Dywan <christian@twotoasts.de>
2222-
2223- This library is free software; you can redistribute it and/or
2224- modify it under the terms of the GNU Lesser General Public
2225- License as published by the Free Software Foundation; either
2226- version 2.1 of the License, or (at your option) any later version.
2227-
2228- See the file COPYING for the full license text.
2229-*/
2230-
2231-#include "katze/gtk3-compat.h"
2232-
2233-#if !GTK_CHECK_VERSION (3, 2, 0)
2234-static void
2235-sokoke_widget_set_pango_font_style (GtkWidget* widget,
2236- PangoStyle style)
2237-{
2238- /* Conveniently change the pango font style
2239- For some reason we need to reset if we actually want the normal style */
2240- if (style == PANGO_STYLE_NORMAL)
2241- gtk_widget_modify_font (widget, NULL);
2242- else
2243- {
2244- PangoFontDescription* font_description = pango_font_description_new ();
2245- pango_font_description_set_style (font_description, PANGO_STYLE_ITALIC);
2246- gtk_widget_modify_font (widget, font_description);
2247- pango_font_description_free (font_description);
2248- }
2249-}
2250-
2251-static gboolean
2252-sokoke_on_entry_focus_in_event (GtkEntry* entry,
2253- GdkEventFocus* event,
2254- gpointer userdata)
2255-{
2256- gint has_default = GPOINTER_TO_INT (
2257- g_object_get_data (G_OBJECT (entry), "sokoke_has_default"));
2258- if (has_default)
2259- {
2260- g_object_set_data (G_OBJECT (entry), "sokoke_has_default",
2261- GINT_TO_POINTER (0));
2262- gtk_entry_set_text (entry, "");
2263- sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
2264- PANGO_STYLE_NORMAL);
2265- }
2266- return FALSE;
2267-}
2268-
2269-static gboolean
2270-sokoke_on_entry_focus_out_event (GtkEntry* entry,
2271- GdkEventFocus* event,
2272- gpointer userdata)
2273-{
2274- const gchar* text = gtk_entry_get_text (entry);
2275- if (text && !*text)
2276- {
2277- const gchar* default_text = (const gchar*)g_object_get_data (
2278- G_OBJECT (entry), "sokoke_default_text");
2279- g_object_set_data (G_OBJECT (entry),
2280- "sokoke_has_default", GINT_TO_POINTER (1));
2281- gtk_entry_set_text (entry, default_text);
2282- sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
2283- PANGO_STYLE_ITALIC);
2284- }
2285- return FALSE;
2286-}
2287-
2288-static void
2289-sokoke_on_entry_drag_data_received (GtkEntry* entry,
2290- GdkDragContext* drag_context,
2291- gint x,
2292- gint y,
2293- guint timestamp,
2294- gpointer user_data)
2295-{
2296- sokoke_on_entry_focus_in_event (entry, NULL, NULL);
2297-}
2298-
2299-void
2300-gtk_entry_set_placeholder_text (GtkEntry* entry,
2301- const gchar* default_text)
2302-{
2303- /* Note: The default text initially overwrites any previous text */
2304- gchar* old_value = g_object_get_data (G_OBJECT (entry), "sokoke_default_text");
2305- g_object_set_data (G_OBJECT (entry), "sokoke_default_text", (gpointer)default_text);
2306-
2307- if (default_text == NULL)
2308- g_object_set_data (G_OBJECT (entry), "sokoke_has_default", GINT_TO_POINTER (0));
2309- else if (!old_value)
2310- {
2311- g_object_set_data (G_OBJECT (entry), "sokoke_has_default", GINT_TO_POINTER (1));
2312- sokoke_widget_set_pango_font_style (GTK_WIDGET (entry), PANGO_STYLE_ITALIC);
2313- gtk_entry_set_text (entry, default_text);
2314- g_signal_connect (entry, "drag-data-received",
2315- G_CALLBACK (sokoke_on_entry_drag_data_received), NULL);
2316- g_signal_connect (entry, "focus-in-event",
2317- G_CALLBACK (sokoke_on_entry_focus_in_event), NULL);
2318- g_signal_connect (entry, "focus-out-event",
2319- G_CALLBACK (sokoke_on_entry_focus_out_event), NULL);
2320- }
2321- else if (!gtk_widget_has_focus (GTK_WIDGET (entry)))
2322- {
2323- gint has_default = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (entry), "sokoke_has_default"));
2324- if (has_default)
2325- {
2326- gtk_entry_set_text (entry, default_text);
2327- sokoke_widget_set_pango_font_style (GTK_WIDGET (entry), PANGO_STYLE_ITALIC);
2328- }
2329- }
2330-}
2331-
2332-const gchar*
2333-gtk_entry_get_placeholder_text (GtkEntry* entry)
2334-{
2335- return g_object_get_data (G_OBJECT (entry), "sokoke_default_text");
2336-}
2337-#endif
2338-
2339
2340=== removed file 'katze/gtk3-compat.h'
2341--- katze/gtk3-compat.h 2013-06-26 21:54:50 +0000
2342+++ katze/gtk3-compat.h 1970-01-01 00:00:00 +0000
2343@@ -1,93 +0,0 @@
2344-/*
2345- Copyright (C) 2011-2012 Christian Dywan <christian@twotoasts.de>
2346-
2347- This library is free software; you can redistribute it and/or
2348- modify it under the terms of the GNU Lesser General Public
2349- License as published by the Free Software Foundation; either
2350- version 2.1 of the License, or (at your option) any later version.
2351-
2352- See the file COPYING for the full license text.
2353-*/
2354-
2355-#include <gtk/gtk.h>
2356-#include <gdk/gdkkeysyms.h>
2357-
2358-#ifndef H_GTK3_COMPAT_20110110
2359-#define H_GTK3_COMPAT_20110110
2360-
2361-G_BEGIN_DECLS
2362-
2363-#if GTK_CHECK_VERSION (3, 2, 0) && defined (GTK_DISABLE_DEPRECATED)
2364- #define GTK_TYPE_VBOX GTK_TYPE_BOX
2365- #define GtkVBox GtkBox
2366- #define GtkVBoxClass GtkBoxClass
2367- #define gtk_vbox_new(hmg,spc) g_object_new (GTK_TYPE_BOX, \
2368- "homogeneous", hmg, "spacing", spc, \
2369- "orientation", GTK_ORIENTATION_VERTICAL, NULL)
2370- #define GTK_TYPE_HBOX GTK_TYPE_BOX
2371- #define GtkHBox GtkBox
2372- #define GtkHBoxClass GtkBoxClass
2373- #define gtk_hbox_new(hmg,spc) g_object_new (GTK_TYPE_BOX, \
2374- "homogeneous", hmg, "spacing", spc, \
2375- "orientation", GTK_ORIENTATION_HORIZONTAL, NULL)
2376- #define gtk_hseparator_new() g_object_new (GTK_TYPE_SEPARATOR, NULL)
2377- #define gtk_hpaned_new() g_object_new (GTK_TYPE_PANED, NULL)
2378- #define gtk_vpaned_new() g_object_new (GTK_TYPE_PANED, \
2379- "orientation", GTK_ORIENTATION_VERTICAL, NULL)
2380- /* FIXME */
2381- #define gtk_widget_render_icon(wdgt, stk, sz, dtl) \
2382- gtk_widget_render_icon_pixbuf(wdgt, stk, sz)
2383- #define gtk_widget_size_request(wdgt, req) \
2384- gtk_widget_get_preferred_size(wdgt, req, NULL)
2385-#endif
2386-
2387-#if GTK_CHECK_VERSION (3, 0, 0)
2388- #define GTK_DIALOG_NO_SEPARATOR 0
2389-#endif
2390-
2391-#if !GTK_CHECK_VERSION (3, 2, 0)
2392- void gtk_entry_set_placeholder_text (GtkEntry* entry, const gchar* text);
2393- const gchar* gtk_entry_get_placeholder_text (GtkEntry* entry);
2394-#endif
2395-
2396-#ifndef GDK_KEY_Return
2397- #define GDK_KEY_0 GDK_0
2398- #define GDK_KEY_BackSpace GDK_BackSpace
2399- #define GDK_KEY_space GDK_space
2400- #define GDK_KEY_F5 GDK_F5
2401- #define GDK_KEY_KP_Equal GDK_KP_Equal
2402- #define GDK_KEY_KP_Enter GDK_KP_Enter
2403- #define GDK_KEY_KP_Left GDK_KP_Left
2404- #define GDK_KEY_KP_Right GDK_KP_Right
2405- #define GDK_KEY_KP_Delete GDK_KP_Delete
2406- #define GDK_KEY_KP_Down GDK_KP_Down
2407- #define GDK_KEY_KP_Up GDK_KP_Up
2408- #define GDK_KEY_KP_Divide GDK_KP_Divide
2409- #define GDK_KEY_Tab GDK_Tab
2410- #define GDK_KEY_ISO_Left_Tab GDK_ISO_Left_Tab
2411- #define GDK_KEY_equal GDK_equal
2412- #define GDK_KEY_ISO_Enter GDK_ISO_Enter
2413- #define GDK_KEY_Left GDK_Left
2414- #define GDK_KEY_Right GDK_Right
2415- #define GDK_KEY_Escape GDK_Escape
2416- #define GDK_KEY_Page_Up GDK_Page_Up
2417- #define GDK_KEY_Page_Down GDK_Page_Down
2418- #define GDK_KEY_Delete GDK_Delete
2419- #define GDK_KEY_Down GDK_Down
2420- #define GDK_KEY_Up GDK_Up
2421- #define GDK_KEY_B GDK_B
2422- #define GDK_KEY_H GDK_H
2423- #define GDK_KEY_J GDK_J
2424- #define GDK_KEY_Return GDK_Return
2425-#endif
2426-
2427-#ifdef GDK_WINDOWING_X11
2428- #include <gdk/gdkx.h>
2429- #ifndef GDK_IS_X11_DISPLAY
2430- #define GDK_IS_X11_DISPLAY(display) TRUE
2431- #endif
2432-#endif
2433-
2434-G_END_DECLS
2435-
2436-#endif
2437
2438=== modified file 'katze/katze-cellrenderercomboboxtext.c'
2439--- katze/katze-cellrenderercomboboxtext.c 2014-05-20 02:15:05 +0000
2440+++ katze/katze-cellrenderercomboboxtext.c 2015-03-10 00:27:20 +0000
2441@@ -39,16 +39,11 @@
2442 static void
2443 katze_cell_renderer_combobox_text_get_size (GtkCellRenderer* cell,
2444 GtkWidget* widget,
2445-#if GTK_CHECK_VERSION(3,0,0)
2446 const GdkRectangle* cell_area,
2447-#else
2448- GdkRectangle* cell_area,
2449-#endif
2450 gint* x_offset,
2451 gint* y_offset,
2452 gint* width,
2453 gint* height);
2454-#if GTK_CHECK_VERSION(3,0,0)
2455 static void
2456 katze_cell_renderer_combobox_text_render (GtkCellRenderer *cell,
2457 cairo_t* cr,
2458@@ -56,16 +51,6 @@
2459 const GdkRectangle *background_area,
2460 const GdkRectangle *cell_area,
2461 GtkCellRendererState flags);
2462-#else
2463-static void
2464-katze_cell_renderer_combobox_text_render (GtkCellRenderer *cell,
2465- GdkDrawable *window,
2466- GtkWidget *widget,
2467- GdkRectangle *background_area,
2468- GdkRectangle *cell_area,
2469- GdkRectangle *expose_area,
2470- GtkCellRendererState flags);
2471-#endif
2472
2473 enum {
2474 PROP_0,
2475@@ -425,11 +410,7 @@
2476 static void
2477 katze_cell_renderer_combobox_text_get_size (GtkCellRenderer *cell,
2478 GtkWidget *widget,
2479-#if GTK_CHECK_VERSION(3,0,0)
2480 const GdkRectangle* cell_area,
2481-#else
2482- GdkRectangle* cell_area,
2483-#endif
2484 gint *x_offset,
2485 gint *y_offset,
2486 gint *width,
2487@@ -450,22 +431,12 @@
2488 }
2489
2490 static void
2491-#if GTK_CHECK_VERSION(3,0,0)
2492 katze_cell_renderer_combobox_text_render (GtkCellRenderer *cell,
2493 cairo_t* cr,
2494 GtkWidget *widget,
2495 const GdkRectangle *background_area,
2496 const GdkRectangle *cell_area,
2497 GtkCellRendererState flags)
2498-#else
2499-katze_cell_renderer_combobox_text_render (GtkCellRenderer *cell,
2500- GdkDrawable *window,
2501- GtkWidget *widget,
2502- GdkRectangle *background_area,
2503- GdkRectangle *cell_area,
2504- GdkRectangle *expose_area,
2505- GtkCellRendererState flags)
2506-#endif
2507 {
2508 const gchar *text = NULL;
2509
2510@@ -473,22 +444,12 @@
2511
2512 set_text (KATZE_CELL_RENDERER_COMBOBOX_TEXT (cell), widget, text);
2513
2514-#if GTK_CHECK_VERSION(3,0,0)
2515 GTK_CELL_RENDERER_CLASS (katze_cell_renderer_combobox_text_parent_class)->render (cell,
2516 cr,
2517 widget,
2518 background_area,
2519 cell_area,
2520 flags);
2521-#else
2522- GTK_CELL_RENDERER_CLASS (katze_cell_renderer_combobox_text_parent_class)->render (cell,
2523- window,
2524- widget,
2525- background_area,
2526- cell_area,
2527- expose_area,
2528- flags);
2529-#endif
2530
2531 g_object_set (G_OBJECT (cell), "text", text, NULL);
2532 g_free ((gpointer)text);
2533
2534=== removed file 'katze/katze-http-auth.c'
2535--- katze/katze-http-auth.c 2013-08-12 19:21:06 +0000
2536+++ katze/katze-http-auth.c 1970-01-01 00:00:00 +0000
2537@@ -1,464 +0,0 @@
2538-/*
2539- Copyright (C) 2008-2009 Christian Dywan <christian@twotoasts.de>
2540-
2541- This library is free software; you can redistribute it and/or
2542- modify it under the terms of the GNU Lesser General Public
2543- License as published by the Free Software Foundation; either
2544- version 2.1 of the License, or (at your option) any later version.
2545-
2546- See the file COPYING for the full license text.
2547-*/
2548-
2549-#if HAVE_CONFIG_H
2550- #include <config.h>
2551-#endif
2552-
2553-#include "katze-http-auth.h"
2554-#include "gtk3-compat.h"
2555-
2556-#include <libsoup/soup.h>
2557-#include <gtk/gtk.h>
2558-#include <glib/gi18n.h>
2559-#include <glib/gstdio.h>
2560-
2561-struct _KatzeHttpAuth
2562-{
2563- GObject parent_instance;
2564- gchar* filename;
2565- GHashTable* logins;
2566-};
2567-
2568-struct _KatzeHttpAuthClass
2569-{
2570- GObjectClass parent_class;
2571-};
2572-
2573-typedef struct
2574-{
2575- KatzeHttpAuth* http_auth;
2576- SoupAuth* auth;
2577- gchar* username;
2578- gchar* password;
2579-} KatzeHttpAuthSave;
2580-
2581-typedef struct
2582-{
2583- gchar* username;
2584- gchar* password;
2585-} KatzeHttpAuthLogin;
2586-
2587-static void
2588-katze_http_auth_session_feature_iface_init (SoupSessionFeatureInterface *iface,
2589- gpointer data);
2590-
2591-G_DEFINE_TYPE_WITH_CODE (KatzeHttpAuth, katze_http_auth, G_TYPE_OBJECT,
2592- G_IMPLEMENT_INTERFACE (SOUP_TYPE_SESSION_FEATURE,
2593- katze_http_auth_session_feature_iface_init));
2594-
2595-enum
2596-{
2597- PROP_0,
2598-
2599- PROP_FILENAME
2600-};
2601-
2602-static void
2603-katze_http_auth_set_property (GObject* object,
2604- guint prop_id,
2605- const GValue* value,
2606- GParamSpec* pspec);
2607-
2608-static void
2609-katze_http_auth_get_property (GObject* object,
2610- guint prop_id,
2611- GValue* value,
2612- GParamSpec* pspec);
2613-
2614-static void
2615-katze_http_auth_finalize (GObject* object);
2616-
2617-static gchar*
2618-katze_http_auth_soup_auth_get_hash (SoupAuth* auth)
2619-{
2620- return g_strdup_printf ("%s:%s:%s",
2621- soup_auth_get_host (auth),
2622- soup_auth_get_scheme_name (auth),
2623- soup_auth_get_realm (auth));
2624-}
2625-
2626-static void
2627-authentication_message_got_headers_cb (SoupMessage* msg,
2628- KatzeHttpAuthSave* save)
2629-{
2630- /* Anything but 401 and 5xx means the password was accepted */
2631- if (msg->status_code != 401 && msg->status_code < 500)
2632- {
2633- gchar* opaque_info;
2634- FILE* file;
2635-
2636- opaque_info = katze_http_auth_soup_auth_get_hash (save->auth);
2637-
2638- if (!g_hash_table_lookup (save->http_auth->logins, opaque_info))
2639- {
2640- KatzeHttpAuthLogin* login = g_slice_new (KatzeHttpAuthLogin);
2641- login->username = save->username;
2642- login->password = save->password;
2643- g_hash_table_insert (save->http_auth->logins, opaque_info, login);
2644-
2645- if ((file = g_fopen (save->http_auth->filename, "a")))
2646- {
2647- fprintf (file, "%s\t%s\t%s\n", opaque_info,
2648- login->username, login->password);
2649- fclose (file);
2650- g_chmod (save->http_auth->filename, 0600);
2651- }
2652- }
2653- else
2654- {
2655- /* FIXME g_free (save->username);
2656- g_free (save->password); */
2657- }
2658- }
2659- else
2660- {
2661- /* FIXME g_free (save->username);
2662- g_free (save->password); */
2663- }
2664-
2665- /* FIXME g_object_unref (save->auth); */
2666- /* FIXME g_slice_free (KatzeHttpAuthSave, save); */
2667- g_signal_handlers_disconnect_by_func (msg,
2668- authentication_message_got_headers_cb, save);
2669-}
2670-
2671-static void
2672-authentication_dialog_response_cb (GtkWidget* dialog,
2673- gint response,
2674- KatzeHttpAuthSave* save)
2675-{
2676- SoupSession* session;
2677- SoupMessage* msg;
2678-
2679- msg = g_object_get_data (G_OBJECT (dialog), "msg");
2680-
2681- if (response == GTK_RESPONSE_OK)
2682- {
2683- GtkEntry* username = g_object_get_data (G_OBJECT (dialog), "username");
2684- GtkEntry* password = g_object_get_data (G_OBJECT (dialog), "password");
2685- GtkToggleButton* remember = g_object_get_data (G_OBJECT (dialog), "remember");
2686-
2687- soup_auth_authenticate (save->auth,
2688- gtk_entry_get_text (username), gtk_entry_get_text (password));
2689-
2690- if (gtk_toggle_button_get_active (remember) && save->http_auth->filename)
2691- {
2692- save->username = g_strdup (gtk_entry_get_text (username));
2693- save->password = g_strdup (gtk_entry_get_text (password));
2694- g_signal_connect (msg, "got-headers",
2695- G_CALLBACK (authentication_message_got_headers_cb), save);
2696- }
2697- else
2698- {
2699- g_object_unref (save->auth);
2700- g_slice_free (KatzeHttpAuthSave, save);
2701- }
2702- }
2703-
2704- session = g_object_get_data (G_OBJECT (dialog), "session");
2705- if (g_object_get_data (G_OBJECT (msg), "paused"))
2706- soup_session_unpause_message (session, msg);
2707- gtk_widget_destroy (dialog);
2708- g_object_unref (msg);
2709-}
2710-
2711-static void
2712-katze_http_auth_session_authenticate_cb (SoupSession* session,
2713- SoupMessage* msg,
2714- SoupAuth* auth,
2715- gboolean retrying,
2716- KatzeHttpAuth* http_auth)
2717-{
2718- gchar* opaque_info;
2719- KatzeHttpAuthLogin* login;
2720- GtkWidget* dialog;
2721- GtkSizeGroup* sizegroup;
2722- GtkWidget* hbox;
2723- GtkWidget* image;
2724- GtkWidget* label;
2725- GtkWidget* align;
2726- GtkWidget* entry;
2727- KatzeHttpAuthSave* save;
2728-
2729- /* We want to ask for authentication exactly once, so we
2730- enforce this with a tag. There might be a better way. */
2731- if (!retrying && g_object_get_data (G_OBJECT (msg), "katze-session-tag"))
2732- return;
2733-
2734- if (1)
2735- {
2736- /* We use another tag to indicate whether a message is paused.
2737- There doesn't seem to be API in libSoup to find that out. */
2738- soup_session_pause_message (session, g_object_ref (msg));
2739- g_object_set_data (G_OBJECT (msg), "paused", (void*)1);
2740- }
2741- g_object_set_data (G_OBJECT (msg), "katze-session-tag", (void*)1);
2742-
2743- opaque_info = katze_http_auth_soup_auth_get_hash (auth);
2744- login = g_hash_table_lookup (http_auth->logins, opaque_info);
2745- g_free (opaque_info);
2746-
2747- dialog = gtk_dialog_new_with_buttons (_("Authentication Required"),
2748- NULL,
2749- GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
2750- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
2751- GTK_STOCK_OK, GTK_RESPONSE_OK,
2752- NULL);
2753- gtk_window_set_icon_name (GTK_WINDOW (dialog),
2754- GTK_STOCK_DIALOG_AUTHENTICATION);
2755- gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
2756- gtk_container_set_border_width (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), 5);
2757-
2758- gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), 5);
2759- hbox = gtk_hbox_new (FALSE, 6);
2760- image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_AUTHENTICATION,
2761- GTK_ICON_SIZE_DIALOG);
2762- gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
2763- label = gtk_label_new (_("A username and a password are required\n"
2764- "to open this location:"));
2765- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
2766- gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), hbox, FALSE, TRUE, 0);
2767- label = gtk_label_new (soup_auth_get_host (auth));
2768- gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), label, FALSE, TRUE, 0);
2769- /* If the realm is merely the host, omit the realm label */
2770- if (g_strcmp0 (soup_auth_get_host (auth), soup_auth_get_realm (auth)))
2771- {
2772- label = gtk_label_new (soup_auth_get_realm (auth));
2773- gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), label, FALSE, TRUE, 0);
2774- }
2775- sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
2776- hbox = gtk_hbox_new (FALSE, 6);
2777- label = gtk_label_new (_("Username"));
2778- align = gtk_alignment_new (0, 0.5, 0, 0);
2779- gtk_container_add (GTK_CONTAINER (align), label);
2780- gtk_size_group_add_widget (sizegroup, align);
2781- gtk_box_pack_start (GTK_BOX (hbox), align, TRUE, TRUE, 0);
2782- entry = gtk_entry_new ();
2783- if (login)
2784- gtk_entry_set_text (GTK_ENTRY (entry), login->username);
2785- gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
2786- gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
2787- g_object_set_data (G_OBJECT (dialog), "username", entry);
2788- gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), hbox, FALSE, TRUE, 0);
2789- hbox = gtk_hbox_new (FALSE, 6);
2790- label = gtk_label_new (_("Password"));
2791- align = gtk_alignment_new (0, 0.5, 0, 0);
2792- gtk_container_add (GTK_CONTAINER (align), label);
2793- gtk_size_group_add_widget (sizegroup, align);
2794- gtk_box_pack_start (GTK_BOX (hbox), align, TRUE, TRUE, 0);
2795- entry = gtk_entry_new ();
2796- if (login)
2797- gtk_entry_set_text (GTK_ENTRY (entry), login->password);
2798- gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE);
2799- gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
2800- gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
2801- g_object_set_data (G_OBJECT (dialog), "password", entry);
2802- gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), hbox, FALSE, TRUE, 0);
2803- hbox = gtk_hbox_new (FALSE, 6);
2804- label = gtk_check_button_new_with_mnemonic (_("_Remember password"));
2805- gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
2806- g_object_set_data (G_OBJECT (dialog), "remember", label);
2807- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (label), (login != NULL));
2808- gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), hbox, FALSE, TRUE, 0);
2809- gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
2810- gtk_widget_show_all (gtk_dialog_get_content_area (GTK_DIALOG (dialog)));
2811-
2812- g_object_set_data (G_OBJECT (dialog), "session", session);
2813- g_object_set_data (G_OBJECT (dialog), "msg", msg);
2814-
2815- save = g_slice_new0 (KatzeHttpAuthSave);
2816- save->http_auth = http_auth;
2817- save->auth = g_object_ref (auth);
2818- g_signal_connect (dialog, "response",
2819- G_CALLBACK (authentication_dialog_response_cb), save);
2820- gtk_widget_show (dialog);
2821-}
2822-
2823-static void
2824-katze_http_auth_session_request_queued_cb (SoupSession* session,
2825- SoupMessage* msg,
2826- KatzeHttpAuth* http_auth)
2827-{
2828- /* WebKit has its own authentication dialog in recent versions.
2829- We want only one, and we choose our own to have localization. */
2830- GType type = g_type_from_name ("WebKitSoupAuthDialog");
2831- if (type)
2832- soup_session_remove_feature_by_type (session, type);
2833-
2834- g_signal_connect (session, "authenticate",
2835- G_CALLBACK (katze_http_auth_session_authenticate_cb), http_auth);
2836- g_signal_handlers_disconnect_by_func (session,
2837- katze_http_auth_session_request_queued_cb, http_auth);
2838-}
2839-
2840-static void
2841-katze_http_auth_attach (SoupSessionFeature* feature,
2842- SoupSession* session)
2843-{
2844- g_signal_connect (session, "request-queued",
2845- G_CALLBACK (katze_http_auth_session_request_queued_cb), feature);
2846-}
2847-
2848-static void
2849-katze_http_auth_detach (SoupSessionFeature* feature,
2850- SoupSession* session)
2851-{
2852- g_signal_handlers_disconnect_by_func (session,
2853- katze_http_auth_session_authenticate_cb, NULL);
2854- g_signal_handlers_disconnect_by_func (session,
2855- katze_http_auth_session_request_queued_cb, NULL);
2856-}
2857-
2858-static void
2859-katze_http_auth_session_feature_iface_init (SoupSessionFeatureInterface *iface,
2860- gpointer data)
2861-{
2862- iface->attach = katze_http_auth_attach;
2863- iface->detach = katze_http_auth_detach;
2864-}
2865-
2866-static void
2867-katze_http_auth_class_init (KatzeHttpAuthClass* class)
2868-{
2869- GObjectClass* gobject_class;
2870- GParamFlags flags;
2871-
2872- gobject_class = G_OBJECT_CLASS (class);
2873- gobject_class->finalize = katze_http_auth_finalize;
2874- gobject_class->set_property = katze_http_auth_set_property;
2875- gobject_class->get_property = katze_http_auth_get_property;
2876-
2877- flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT;
2878-
2879- /**
2880- * KatzeHttpAuth:filename:
2881- *
2882- * An absolute path and name of a file for storing logins.
2883- *
2884- * Since: 0.1.10
2885- */
2886- g_object_class_install_property (gobject_class,
2887- PROP_FILENAME,
2888- g_param_spec_string (
2889- "filename",
2890- "Filename",
2891- "An absolute path and name of a file for storing logins",
2892- NULL,
2893- flags));
2894-}
2895-
2896-static void
2897-katze_http_auth_login_free (KatzeHttpAuthLogin* login)
2898-{
2899- g_free (login->username);
2900- g_free (login->password);
2901- g_slice_free (KatzeHttpAuthLogin, login);
2902-}
2903-
2904-static void
2905-katze_http_auth_set_filename (KatzeHttpAuth* http_auth,
2906- const gchar* filename)
2907-{
2908- FILE* file;
2909-
2910- katze_assign (http_auth->filename, g_strdup (filename));
2911-
2912- g_hash_table_remove_all (http_auth->logins);
2913-
2914- if ((file = g_fopen (filename, "r")))
2915- {
2916- gchar line[255];
2917- guint number = 0;
2918-
2919- while (fgets (line, 255, file))
2920- {
2921- gchar** parts = g_strsplit (line, "\t", 3);
2922- if (parts && parts[0] && parts[1] && parts[2])
2923- {
2924- gint length = strlen (parts[2]);
2925- KatzeHttpAuthLogin* login = g_slice_new (KatzeHttpAuthLogin);
2926- login->username = parts[1];
2927- if (parts[2][length - 1] == '\n')
2928- length--;
2929- login->password = g_strndup (parts[2], length);
2930- g_hash_table_insert (http_auth->logins, parts[0], login);
2931- g_free (parts);
2932- }
2933- else
2934- {
2935- g_strfreev (parts);
2936- g_warning ("Error in line %d in HTTP Auth file", number);
2937- }
2938- number++;
2939- }
2940- fclose (file);
2941- }
2942-}
2943-
2944-static void
2945-katze_http_auth_init (KatzeHttpAuth* http_auth)
2946-{
2947- http_auth->filename = NULL;
2948-
2949- http_auth->logins = g_hash_table_new_full (g_str_hash, g_str_equal,
2950- (GDestroyNotify)g_free, (GDestroyNotify)katze_http_auth_login_free);
2951-}
2952-
2953-static void
2954-katze_http_auth_finalize (GObject* object)
2955-{
2956- KatzeHttpAuth* http_auth = KATZE_HTTP_AUTH (object);
2957-
2958- g_free (http_auth->filename);
2959-
2960- g_hash_table_unref (http_auth->logins);
2961-
2962- G_OBJECT_CLASS (katze_http_auth_parent_class)->finalize (object);
2963-}
2964-
2965-static void
2966-katze_http_auth_set_property (GObject* object,
2967- guint prop_id,
2968- const GValue* value,
2969- GParamSpec* pspec)
2970-{
2971- KatzeHttpAuth* http_auth = KATZE_HTTP_AUTH (object);
2972-
2973- switch (prop_id)
2974- {
2975- case PROP_FILENAME:
2976- katze_http_auth_set_filename (http_auth, g_value_get_string (value));
2977- break;
2978- default:
2979- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
2980- break;
2981- }
2982-}
2983-
2984-static void
2985-katze_http_auth_get_property (GObject* object,
2986- guint prop_id,
2987- GValue* value,
2988- GParamSpec* pspec)
2989-{
2990- KatzeHttpAuth* http_auth = KATZE_HTTP_AUTH (object);
2991-
2992- switch (prop_id)
2993- {
2994- case PROP_FILENAME:
2995- g_value_set_string (value, http_auth->filename);
2996- break;
2997- default:
2998- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
2999- break;
3000- }
3001-}
3002
3003=== removed file 'katze/katze-http-auth.h'
3004--- katze/katze-http-auth.h 2010-01-17 17:14:48 +0000
3005+++ katze/katze-http-auth.h 1970-01-01 00:00:00 +0000
3006@@ -1,42 +0,0 @@
3007-/*
3008- Copyright (C) 2009 Christian Dywan <christian@twotoasts.de>
3009-
3010- This library is free software; you can redistribute it and/or
3011- modify it under the terms of the GNU Lesser General Public
3012- License as published by the Free Software Foundation; either
3013- version 2.1 of the License, or (at your option) any later version.
3014-
3015- See the file COPYING for the full license text.
3016-*/
3017-
3018-#ifndef __KATZE_HTTP_AUTH_H__
3019-#define __KATZE_HTTP_AUTH_H__
3020-
3021-#include "katze-utils.h"
3022-
3023-#include <glib-object.h>
3024-
3025-G_BEGIN_DECLS
3026-
3027-#define KATZE_TYPE_HTTP_AUTH \
3028- (katze_http_auth_get_type ())
3029-#define KATZE_HTTP_AUTH(obj) \
3030- (G_TYPE_CHECK_INSTANCE_CAST ((obj), KATZE_TYPE_HTTP_AUTH, KatzeHttpAuth))
3031-#define KATZE_HTTP_AUTH_CLASS(klass) \
3032- (G_TYPE_CHECK_CLASS_CAST ((klass), KATZE_TYPE_HTTP_AUTH, KatzeHttpAuthClass))
3033-#define KATZE_IS_HTTP_AUTH(obj) \
3034- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KATZE_TYPE_HTTP_AUTH))
3035-#define KATZE_IS_HTTP_AUTH_CLASS(klass) \
3036- (G_TYPE_CHECK_CLASS_TYPE ((klass), KATZE_TYPE_HTTP_AUTH))
3037-#define KATZE_HTTP_AUTH_GET_CLASS(obj) \
3038- (G_TYPE_INSTANCE_GET_CLASS ((obj), KATZE_TYPE_HTTP_AUTH, KatzeHttpAuthClass))
3039-
3040-typedef struct _KatzeHttpAuth KatzeHttpAuth;
3041-typedef struct _KatzeHttpAuthClass KatzeHttpAuthClass;
3042-
3043-GType
3044-katze_http_auth_get_type (void) G_GNUC_CONST;
3045-
3046-G_END_DECLS
3047-
3048-#endif /* __KATZE_HTTP_AUTH_H__ */
3049
3050=== modified file 'katze/katze-preferences.c'
3051--- katze/katze-preferences.c 2014-05-20 02:15:05 +0000
3052+++ katze/katze-preferences.c 2015-03-10 00:27:20 +0000
3053@@ -67,9 +67,6 @@
3054 g_object_set (preferences,
3055 "icon-name", GTK_STOCK_PREFERENCES,
3056 "title", dialog_title,
3057-#if !GTK_CHECK_VERSION (3, 0, 0)
3058- "has-separator", FALSE,
3059-#endif
3060 NULL);
3061 g_free (dialog_title);
3062
3063@@ -144,7 +141,7 @@
3064 {
3065 KatzePreferencesPrivate* priv = preferences->priv;
3066
3067- #if GTK_CHECK_VERSION (3, 10, 0) && !HAVE_OSX
3068+ #if !HAVE_OSX
3069 priv->notebook = gtk_stack_new ();
3070 #else
3071 priv->notebook = gtk_notebook_new ();
3072@@ -160,7 +157,7 @@
3073 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (preferences))),
3074 priv->toolbar, FALSE, FALSE, 0);
3075 #else
3076- #if GTK_CHECK_VERSION (3, 10, 0) && !HAVE_OSX
3077+ #if !HAVE_OSX
3078 priv->toolbar = gtk_stack_switcher_new ();
3079 gtk_stack_switcher_set_stack (GTK_STACK_SWITCHER (priv->toolbar), GTK_STACK (priv->notebook));
3080 gtk_widget_set_halign (priv->toolbar, GTK_ALIGN_CENTER);
3081@@ -200,7 +197,7 @@
3082 gtk_widget_show_all (gtk_dialog_get_content_area (GTK_DIALOG (preferences)));
3083 }
3084
3085-#if GTK_CHECK_VERSION (3, 10, 0) & !HAVE_OSX
3086+#if !HAVE_OSX
3087 /* these functions are used to clear the 100-px width set in GTK3's
3088 update_button function in gtk/gtkstackswitcher.c */
3089
3090@@ -252,7 +249,7 @@
3091 priv->sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
3092 gtk_widget_show (priv->page);
3093 gtk_container_set_border_width (GTK_CONTAINER (priv->page), 4);
3094- #if GTK_CHECK_VERSION (3, 10, 0) & !HAVE_OSX
3095+ #if !HAVE_OSX
3096 gtk_stack_add_titled (GTK_STACK (priv->notebook),
3097 priv->page, label, label);
3098 workaround_stack_switcher_sizing (GTK_STACK_SWITCHER (priv->toolbar));
3099
3100=== modified file 'katze/katze-utils.c'
3101--- katze/katze-utils.c 2014-05-20 02:15:05 +0000
3102+++ katze/katze-utils.c 2015-03-10 00:27:20 +0000
3103@@ -9,8 +9,6 @@
3104 See the file COPYING for the full license text.
3105 */
3106
3107-#include "gtk3-compat.h"
3108-
3109 #include "katze-utils.h"
3110 #include "katze-array.h"
3111 #include "midori-core.h"
3112@@ -70,7 +68,6 @@
3113 g_object_set (object, property, file, NULL);
3114 }
3115
3116-#if GTK_CHECK_VERSION (3, 2, 0)
3117 static void
3118 proxy_font_chooser_font_activated_cb (GtkFontChooser* chooser,
3119 GObject* object)
3120@@ -89,17 +86,6 @@
3121 gboolean monospace = GPOINTER_TO_INT (data);
3122 return monospace == pango_font_family_is_monospace (family);
3123 }
3124-#else
3125-static void
3126-proxy_combo_box_text_changed_cb (GtkComboBoxText* button,
3127- GObject* object)
3128-{
3129- gchar* text = gtk_combo_box_text_get_active_text (button);
3130- const gchar* property = g_object_get_data (G_OBJECT (button), "property");
3131- g_object_set (object, property, text, NULL);
3132- g_free (text);
3133-}
3134-#endif
3135
3136 static gboolean
3137 proxy_entry_focus_out_event_cb (GtkEntry* entry,
3138@@ -423,7 +409,6 @@
3139 katze_assign (string, g_strdup ("sans"));
3140 gboolean monospace = _hint == I_("font-monospace");
3141
3142- #if GTK_CHECK_VERSION (3, 2, 0)
3143 widget = gtk_font_button_new ();
3144 gtk_font_button_set_show_size (GTK_FONT_BUTTON (widget), FALSE);
3145 gtk_font_chooser_set_font (GTK_FONT_CHOOSER (widget), string);
3146@@ -432,36 +417,6 @@
3147 G_CALLBACK (proxy_font_chooser_font_activated_cb), object);
3148 gtk_font_chooser_set_filter_func (GTK_FONT_CHOOSER (widget),
3149 (GtkFontFilterFunc)proxy_font_chooser_filter_monospace_cb, GINT_TO_POINTER (monospace), NULL);
3150- #else
3151- GtkComboBox* combo;
3152- gint n_families, i;
3153- PangoContext* context;
3154- PangoFontFamily** families;
3155-
3156- widget = gtk_combo_box_text_new ();
3157- combo = GTK_COMBO_BOX (widget);
3158- context = gtk_widget_get_pango_context (widget);
3159- pango_context_list_families (context, &families, &n_families);
3160- if (string)
3161- {
3162- gint j = 0;
3163- for (i = 0; i < n_families; i++)
3164- {
3165- if (monospace != pango_font_family_is_monospace (families[i]))
3166- continue;
3167- const gchar* font = pango_font_family_get_name (families[i]);
3168- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), font);
3169- if (!g_ascii_strcasecmp (font, string))
3170- gtk_combo_box_set_active (combo, j);
3171- j++;
3172- }
3173- }
3174- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (
3175- gtk_combo_box_get_model (combo)), 0, GTK_SORT_ASCENDING);
3176- g_signal_connect (widget, "changed",
3177- G_CALLBACK (proxy_combo_box_text_changed_cb), object);
3178- g_free (families);
3179- #endif
3180 }
3181 else if (type == G_TYPE_PARAM_STRING)
3182 {
3183@@ -656,23 +611,13 @@
3184 if (!window)
3185 return;
3186
3187- #if !GTK_CHECK_VERSION (3, 0, 0)
3188- if (GTK_IS_ENTRY (widget))
3189- window = gdk_window_get_parent (window);
3190- #endif
3191-
3192 /* Retrieve size and position of both widget and menu */
3193 gtk_widget_get_allocation (widget, &allocation);
3194 gdk_window_get_origin (window, &wx, &wy);
3195 wx += allocation.x;
3196 wy += allocation.y;
3197- #if GTK_CHECK_VERSION (3, 0, 0)
3198 gtk_widget_get_preferred_size (GTK_WIDGET (menu), &menu_req, NULL);
3199 gtk_widget_get_preferred_size (widget, &widget_req, NULL);
3200- #else
3201- gtk_widget_size_request (GTK_WIDGET (menu), &menu_req);
3202- gtk_widget_size_request (widget, &widget_req);
3203- #endif
3204 menu_width = menu_req.width;
3205 widget_height = widget_req.height; /* Better than allocation.height */
3206
3207@@ -1037,31 +982,13 @@
3208 if (!valid)
3209 valid = midori_uri_is_ip_address (uri);
3210
3211- #if GTK_CHECK_VERSION (3, 2, 0)
3212 g_object_set_data (G_OBJECT (entry), "invalid", GINT_TO_POINTER (uri && *uri && !valid));
3213 gtk_widget_queue_draw (entry);
3214- #else
3215- if (uri && *uri && !valid)
3216- {
3217- GdkColor bg_color = { 0 };
3218- GdkColor fg_color = { 0 };
3219- gdk_color_parse ("#ef7070", &bg_color);
3220- gdk_color_parse ("#000", &fg_color);
3221- gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &bg_color);
3222- gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &fg_color);
3223- }
3224- else
3225- {
3226- gtk_widget_modify_base (entry, GTK_STATE_NORMAL, NULL);
3227- gtk_widget_modify_text (entry, GTK_STATE_NORMAL, NULL);
3228- }
3229- #endif
3230
3231 if (other_widget != NULL)
3232 gtk_widget_set_sensitive (other_widget, valid);
3233 }
3234
3235-#if GTK_CHECK_VERSION (3, 2, 0)
3236 static gboolean
3237 katze_uri_entry_draw_cb (GtkWidget* entry,
3238 cairo_t* cr,
3239@@ -1081,7 +1008,6 @@
3240 width * 0.75, height / 1.9 / 2);
3241 return TRUE;
3242 }
3243-#endif
3244
3245 /**
3246 * katze_uri_entry_new:
3247@@ -1100,18 +1026,14 @@
3248 katze_uri_entry_new (GtkWidget* other_widget)
3249 {
3250 GtkWidget* entry = gtk_entry_new ();
3251- #if GTK_CHECK_VERSION (3, 6, 0)
3252 gtk_entry_set_input_purpose (GTK_ENTRY (entry), GTK_INPUT_PURPOSE_URL);
3253- #endif
3254
3255 gtk_entry_set_icon_from_gicon (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY,
3256 g_themed_icon_new_with_default_fallbacks ("text-html-symbolic"));
3257 g_signal_connect (entry, "changed",
3258 G_CALLBACK (katze_uri_entry_changed_cb), other_widget);
3259- #if GTK_CHECK_VERSION (3, 2, 0)
3260 g_signal_connect_after (entry, "draw",
3261 G_CALLBACK (katze_uri_entry_draw_cb), other_widget);
3262- #endif
3263 return entry;
3264 }
3265
3266@@ -1119,10 +1041,8 @@
3267 katze_widget_add_class (GtkWidget* widget,
3268 const gchar* class_name)
3269 {
3270- #if GTK_CHECK_VERSION (3,0,0)
3271 GtkStyleContext* context = gtk_widget_get_style_context (widget);
3272 gtk_style_context_add_class (context, class_name);
3273- #endif
3274 }
3275
3276 /**
3277
3278=== modified file 'katze/katze-utils.h'
3279--- katze/katze-utils.h 2013-04-16 22:10:56 +0000
3280+++ katze/katze-utils.h 2015-03-10 00:27:20 +0000
3281@@ -15,7 +15,6 @@
3282
3283 #include <gtk/gtk.h>
3284 #include "katze-array.h"
3285-#include "gtk3-compat.h"
3286
3287 G_BEGIN_DECLS
3288
3289
3290=== modified file 'katze/katze.h'
3291--- katze/katze.h 2013-10-22 22:38:26 +0000
3292+++ katze/katze.h 2015-03-10 00:27:20 +0000
3293@@ -12,17 +12,12 @@
3294 #ifndef __KATZE_H__
3295 #define __KATZE_H__
3296
3297-#include "katze-http-auth.h"
3298 #include "katze-utils.h"
3299 #include "katze-item.h"
3300 #include "katze-array.h"
3301 #include "katze-arrayaction.h"
3302 #include "katze-preferences.h"
3303
3304-#ifndef HAVE_WEBKIT2
3305- #include <webkit/webkit.h>
3306-#else
3307 #include <webkit2/webkit2.h>
3308-#endif
3309
3310 #endif /* __KATZE_H__ */
3311
3312=== removed file 'katze/midori-hsts.vala'
3313--- katze/midori-hsts.vala 2012-11-18 20:24:32 +0000
3314+++ katze/midori-hsts.vala 1970-01-01 00:00:00 +0000
3315@@ -1,145 +0,0 @@
3316-/*
3317- Copyright (C) 2012 Christian Dywan <christian@twotoasts.de>
3318-
3319- This library is free software; you can redistribute it and/or
3320- modify it under the terms of the GNU Lesser General Public
3321- License as published by the Free Software Foundation; either
3322- version 2.1 of the License, or (at your option) any later version.
3323-
3324- See the file COPYING for the full license text.
3325-*/
3326-
3327-namespace Midori {
3328- public class HSTS : GLib.Object, Soup.SessionFeature {
3329- public class Directive {
3330- public Soup.Date? expires = null;
3331- public bool sub_domains = false;
3332-
3333- public Directive (bool include_sub_domains) {
3334- expires = new Soup.Date.from_now (int.MAX);
3335- sub_domains = include_sub_domains;
3336- }
3337-
3338- public Directive.from_header (string header) {
3339- var param_list = Soup.header_parse_param_list (header);
3340- if (param_list == null)
3341- return;
3342-
3343- string? max_age = param_list.lookup ("max-age");
3344- if (max_age != null)
3345- expires = new Soup.Date.from_now (max_age.to_int ());
3346- // if (param_list.lookup_extended ("includeSubDomains", null, null))
3347- if ("includeSubDomains" in header)
3348- sub_domains = true;
3349- Soup.header_free_param_list (param_list);
3350- }
3351-
3352- public bool is_valid () {
3353- return expires != null && !expires.is_past ();
3354- }
3355- }
3356-
3357- HashTable<string, Directive> whitelist;
3358- bool debug = false;
3359-
3360- public HSTS () {
3361- whitelist = new HashTable<string, Directive> (str_hash, str_equal);
3362- read_cache.begin (File.new_for_path (Paths.get_preset_filename (null, "hsts")));
3363- read_cache.begin (File.new_for_path (Paths.get_config_filename_for_reading ("hsts")));
3364- if (strcmp (Environment.get_variable ("MIDORI_DEBUG"), "hsts") == 0)
3365- debug = true;
3366- }
3367-
3368- async void read_cache (File file) {
3369- try {
3370- var stream = new DataInputStream (yield file.read_async ());
3371- do {
3372- string? line = yield stream.read_line_async ();
3373- if (line == null)
3374- break;
3375- string[] parts = line.split (" ", 2);
3376- if (parts[0] == null || parts[1] == null)
3377- break;
3378- var directive = new Directive.from_header (parts[1]);
3379- if (directive.is_valid ())
3380- append_to_whitelist (parts[0], directive);
3381- } while (true);
3382- }
3383- catch (Error error) { }
3384- }
3385-
3386-#if HAVE_LIBSOUP_2_34_0
3387- /* No sub-features */
3388- public bool add_feature (Type type) { return false; }
3389- public bool remove_feature (Type type) { return false; }
3390- public bool has_feature (Type type) { return false; }
3391-#endif
3392-
3393- public void attach (Soup.Session session) { session.request_queued.connect (queued); }
3394- public void detach (Soup.Session session) { /* FIXME disconnect */ }
3395-
3396- /* Never called but required by the interface */
3397- public void request_started (Soup.Session session, Soup.Message msg, Soup.Socket socket) { }
3398- public void request_queued (Soup.Session session, Soup.Message message) { }
3399- public void request_unqueued (Soup.Session session, Soup.Message msg) { }
3400-
3401- bool should_secure_host (string host) {
3402- Directive? directive = whitelist.lookup (host);
3403- if (directive == null)
3404- directive = whitelist.lookup ("*." + host);
3405- return directive != null && directive.is_valid ();
3406- }
3407-
3408- void queued (Soup.Session session, Soup.Message message) {
3409- if (should_secure_host (message.uri.host)) {
3410- message.uri.set_scheme ("https");
3411- session.requeue_message (message);
3412- if (debug)
3413- stdout.printf ("HSTS: Enforce %s\n", message.uri.host);
3414- }
3415- else if (message.uri.scheme == "http")
3416- message.finished.connect (strict_transport_security_handled);
3417- }
3418-
3419- void append_to_whitelist (string host, Directive directive) {
3420- whitelist.insert (host, directive);
3421- if (directive.sub_domains)
3422- whitelist.insert ("*." + host, directive);
3423- }
3424-
3425- async void append_to_cache (string host, string header) {
3426- if (Midori.Paths.is_readonly ())
3427- return;
3428-
3429- string filename = Paths.get_config_filename_for_writing ("hsts");
3430- try {
3431- var file = File.new_for_path (filename);
3432- var stream = file.append_to/* FIXME _async*/ (FileCreateFlags.NONE);
3433- yield stream.write_async ((host + " " + header + "\n").data);
3434- yield stream.flush_async ();
3435- }
3436- catch (Error error) {
3437- critical ("Failed to update %s: %s", filename, error.message);
3438- }
3439- }
3440-
3441- void strict_transport_security_handled (Soup.Message message) {
3442- if (message == null || message.uri == null)
3443- return;
3444-
3445- unowned string? hsts = message.response_headers.get_one ("Strict-Transport-Security");
3446- if (hsts == null)
3447- return;
3448-
3449- var directive = new Directive.from_header (hsts);
3450- if (directive.is_valid ()) {
3451- append_to_whitelist (message.uri.host, directive);
3452- append_to_cache.begin (message.uri.host, hsts);
3453- }
3454- if (debug)
3455- stdout.printf ("HSTS: '%s' sets '%s' valid? %s\n",
3456- message.uri.host, hsts, directive.is_valid ().to_string ());
3457- }
3458-
3459- }
3460-}
3461
3462=== modified file 'katze/midori-paths.vala'
3463--- katze/midori-paths.vala 2014-04-03 00:49:01 +0000
3464+++ katze/midori-paths.vala 2015-03-10 00:27:20 +0000
3465@@ -16,30 +16,16 @@
3466 }
3467
3468 extern const string LIBDIR;
3469-extern const string MDATADIR;
3470-extern const string PACKAGE_NAME;
3471 extern const string SYSCONFDIR;
3472 extern const string MIDORI_VERSION_SUFFIX;
3473 const string MODULE_PREFIX = "lib";
3474 const string MODULE_SUFFIX = "." + GLib.Module.SUFFIX;
3475
3476 namespace Midori {
3477- public enum RuntimeMode {
3478- UNDEFINED,
3479- NORMAL,
3480- APP,
3481- PRIVATE,
3482- PORTABLE
3483- }
3484-
3485 namespace Paths {
3486- static string? exec_path = null;
3487 static string[] command_line = null;
3488 static string? runtime_dir = null;
3489- static RuntimeMode mode = RuntimeMode.UNDEFINED;
3490
3491- static string? config_dir = null;
3492- static string? readonly_dir = null;
3493 static string? cache_dir = null;
3494 static string? cache_dir_for_reading = null;
3495 static string? user_data_dir = null;
3496@@ -52,19 +38,6 @@
3497 }
3498 }
3499
3500- public static string get_config_dir_for_reading () {
3501- assert (mode != RuntimeMode.UNDEFINED);
3502- return readonly_dir ?? config_dir;
3503- }
3504-
3505- /* returns the path to a user configuration file whose contents should not be modified.
3506- to get the path to save settings, use get_config_filename() */
3507- public static string get_config_filename_for_reading (string filename) {
3508- assert (mode != RuntimeMode.UNDEFINED);
3509- return Path.build_path (Path.DIR_SEPARATOR_S,
3510- readonly_dir ?? config_dir, filename);
3511- }
3512-
3513 public bool is_readonly () {
3514 assert (mode != RuntimeMode.UNDEFINED);
3515 return readonly_dir != null;
3516@@ -99,6 +72,7 @@
3517
3518 public static void init (RuntimeMode new_mode, string? config) {
3519 assert (mode == RuntimeMode.UNDEFINED);
3520+ assert (exec_path != null);
3521 assert (new_mode != RuntimeMode.UNDEFINED);
3522 mode = new_mode;
3523 if (mode == RuntimeMode.PORTABLE || mode == RuntimeMode.PRIVATE)
3524@@ -133,11 +107,9 @@
3525 tmp_dir = get_runtime_dir ();
3526 }
3527 else {
3528-#if HAVE_WEBKIT2_3_91
3529 /* Allow WebKit to spawn more than one rendering process */
3530 if (!("wk2:no-multi-render-process" in (Environment.get_variable ("MIDORI_DEBUG") ?? "")))
3531 WebKit.WebContext.get_default ().set_process_model (WebKit.ProcessModel.MULTIPLE_SECONDARY_PROCESSES);
3532-#endif
3533 string? real_config = config != null && !Path.is_absolute (config)
3534 ? Path.build_filename (Environment.get_current_dir (), config) : config;
3535 config_dir = real_config ?? Path.build_path (Path.DIR_SEPARATOR_S,
3536@@ -147,11 +119,15 @@
3537 user_data_dir = Environment.get_user_data_dir ();
3538 tmp_dir = get_runtime_dir ();
3539 }
3540-#if HAVE_WEBKIT2
3541+
3542+ /* Cache and extension dir MUST be set no later than here to work */
3543+ WebKit.WebContext.get_default ().set_web_extensions_directory (
3544+ get_lib_path (PACKAGE_NAME));
3545+ WebKit.WebContext.get_default ().initialize_web_extensions.connect (() => {
3546+ app_name = Application.get_default ().get_application_id ();
3547+ WebKit.WebContext.get_default ().set_web_extensions_initialization_user_data (user_data_for_config ());
3548+ });
3549 if (cache_dir != null) {
3550- /* Cache and extension dir MUST be set no later than here to work */
3551- WebKit.WebContext.get_default ().set_web_extensions_directory (
3552- Path.build_path (Path.DIR_SEPARATOR_S, cache_dir, "wk2ext"));
3553 WebKit.WebContext.get_default ().set_disk_cache_directory (
3554 Path.build_path (Path.DIR_SEPARATOR_S, cache_dir, "web"));
3555 }
3556@@ -161,27 +137,19 @@
3557 cookie_manager.set_persistent_storage (Path.build_filename (config_dir, "cookies.db"),
3558 WebKit.CookiePersistentStorage.SQLITE);
3559 }
3560-#endif
3561 if (user_data_dir != null) {
3562 string folder = Path.build_filename (user_data_dir, "webkit", "icondatabase");
3563-#if HAVE_WEBKIT2
3564 WebKit.WebContext.get_default ().set_favicon_database_directory (folder);
3565-#else
3566- WebKit.get_favicon_database ().set_path (folder);
3567-#endif
3568 }
3569 else
3570 {
3571-#if HAVE_WEBKIT2
3572 /* with wk2 set_favicon_database_directory can only be called once and actually
3573 initializes and enables the favicon database, so we do not call it in this case */
3574-#else
3575- /* wk1 documentation claims that the favicon database is not enabled unless
3576- a call to favicon_database.set_path is made, but in fact it must be explicitly
3577- disabled by setting to null (verified as of webkitgtk 2.3.1) */
3578- WebKit.get_favicon_database ().set_path (null);
3579-#endif
3580 }
3581+ if (("wk2:ignore-tls" in (Environment.get_variable ("MIDORI_DEBUG") ?? "")))
3582+ WebKit.WebContext.get_default ().set_tls_errors_policy (WebKit.TLSErrorsPolicy.IGNORE);
3583+ else
3584+ WebKit.WebContext.get_default ().set_tls_errors_policy (WebKit.TLSErrorsPolicy.FAIL);
3585
3586 if (strcmp (Environment.get_variable ("MIDORI_DEBUG"), "paths") == 0) {
3587 stdout.printf ("config: %s\ncache: %s\nuser_data: %s\ntmp: %s\n",
3588@@ -189,26 +157,15 @@
3589 }
3590 }
3591
3592- public static void mkdir_with_parents (string path, int mode = 0700) {
3593- /* Use g_access instead of g_file_test for better performance */
3594- if (Posix.access (path, Posix.F_OK) == 0)
3595- return;
3596- int i = path.index_of_char (Path.DIR_SEPARATOR, 0);
3597- do {
3598- string fn = path.substring (i, -1);
3599- if (Posix.access (fn, Posix.F_OK) != 0) {
3600- if (DirUtils.create (fn, mode) == -1) {
3601- /* Slow fallback; if this fails we fail */
3602- DirUtils.create_with_parents (path, mode);
3603- return;
3604- }
3605- }
3606- else if (!FileUtils.test (fn, FileTest.IS_SYMLINK))
3607- return; /* Failed */
3608-
3609- i = path.index_of_char (Path.DIR_SEPARATOR, i);
3610- }
3611- while (i != -1);
3612+ static Variant user_data_for_config () {
3613+ assert (mode != RuntimeMode.UNDEFINED);
3614+ HashTable<string, string?> config = new HashTable<string, string> (str_hash, str_equal);
3615+ config.insert ("mode", "%d".printf ((int)mode));
3616+ config.insert ("readonly_dir", get_config_dir_for_reading ());
3617+ config.insert ("config_dir", get_config_dir_for_reading ());
3618+ config.insert ("exec_path", exec_path);
3619+ config.insert ("app_name", get_app_name ());
3620+ return config;
3621 }
3622
3623 public static void remove_path (string path) {
3624@@ -255,16 +212,6 @@
3625 return get_preset_filename (Path.build_filename ("extensions", preset_filename), filename);
3626 }
3627
3628- /* returns the path to a user configuration file to which it is permitted to write.
3629- this is also necessary for files whose state is synchronized to disk by a manager,
3630- e.g. cookies. */
3631- public static string get_config_filename_for_writing (string filename) {
3632- assert (mode != RuntimeMode.UNDEFINED);
3633- assert (config_dir != null);
3634- mkdir_with_parents (config_dir);
3635- return Path.build_path (Path.DIR_SEPARATOR_S, config_dir, filename);
3636- }
3637-
3638 public static unowned string get_cache_dir () {
3639 assert (cache_dir != null);
3640 return cache_dir;
3641@@ -369,38 +316,6 @@
3642 #endif
3643 }
3644
3645- public static string get_res_filename (string filename) {
3646- assert (command_line != null);
3647- assert (filename != "");
3648- #if HAVE_WIN32
3649- return Path.build_filename (exec_path, "share", PACKAGE_NAME, "res", filename);
3650- #else
3651- string path = Path.build_filename (exec_path, "share", PACKAGE_NAME, "res", filename);
3652- if (Posix.access (path, Posix.F_OK) == 0)
3653- return path;
3654-
3655- return build_folder ("data", null, filename) ??
3656- Path.build_filename (MDATADIR, PACKAGE_NAME, "res", filename);
3657- #endif
3658- }
3659-
3660- #if !HAVE_WIN32
3661- string? build_folder (string folder, string? middle, string filename) {
3662- /* Fallback to build folder */
3663- File? parent = File.new_for_path (exec_path);
3664- while (parent != null) {
3665- var data = parent.get_child (folder);
3666- if (middle != null)
3667- data = data.get_child (middle);
3668- var child = data.get_child (filename);
3669- if (child.query_exists ())
3670- return child.get_path ();
3671- parent = parent.get_parent ();
3672- }
3673- return null;
3674- }
3675- #endif
3676-
3677 /* returns the path to a file containing read-only data installed with the application
3678 if @res is true, looks in the midori resource folder specifically */
3679 public static string get_data_filename (string filename, bool res) {
3680@@ -446,11 +361,7 @@
3681 public static void clear_icons () {
3682 assert (cache_dir != null);
3683 assert (user_data_dir != null);
3684-#if HAVE_WEBKIT2
3685 WebKit.WebContext.get_default ().get_favicon_database ().clear ();
3686-#else
3687- WebKit.get_favicon_database ().clear ();
3688-#endif
3689 /* FIXME: Exclude search engine icons */
3690 remove_path (Path.build_filename (user_data_dir, "webkit", "icondatabase"));
3691 }
3692
3693=== modified file 'katze/midori-uri.vala'
3694--- katze/midori-uri.vala 2014-04-02 23:51:06 +0000
3695+++ katze/midori-uri.vala 2015-03-10 00:27:20 +0000
3696@@ -229,16 +229,10 @@
3697 * Since: 0.5.8
3698 **/
3699 public static async GLib.Icon? get_icon (string uri, Cancellable? cancellable=null) throws Error {
3700-#if HAVE_WEBKIT2
3701 var database = WebKit.WebContext.get_default ().get_favicon_database ();
3702 var surface = yield database.get_favicon (uri, cancellable);
3703 var image = (Cairo.ImageSurface)surface;
3704 var pixbuf = Gdk.pixbuf_get_from_surface (image, 0, 0, image.get_width (), image.get_height ());
3705-#else
3706- var database = WebKit.get_favicon_database ();
3707- // We must not pass a Cancellable due to a crasher bug
3708- var pixbuf = yield database.get_favicon_pixbuf (uri, 0, 0, null);
3709-#endif
3710 return pixbuf as GLib.Icon;
3711 }
3712
3713
3714=== modified file 'midori/CMakeLists.txt'
3715--- midori/CMakeLists.txt 2013-09-08 21:38:36 +0000
3716+++ midori/CMakeLists.txt 2015-03-10 00:27:20 +0000
3717@@ -1,15 +1,13 @@
3718 # Copyright (C) 2013 Christian Dywan <christian@twotoasts.de>
3719
3720-set(LIBMIDORI_VERSION 0.5.5)
3721+set(LIBMIDORI_VERSION 0.6.0)
3722 set(LIBMIDORI_SOVERSION 0)
3723
3724-file(GLOB MIDORI_VALA_SOURCE ../katze/*.vala *.vala ../panels/*.vala)
3725-file(GLOB LIBMIDORI_SOURCE ../katze/*.c ../panels/*.c ../toolbars/*.c midori-*.vala midori-*.c sokoke.c)
3726+# FIXME: Eventually core should link against ipc
3727+file(GLOB MIDORI_VALA_SOURCE ../katze/*.vala *.vala ../panels/*.vala ../ipc/*.vala)
3728+file(GLOB LIBMIDORI_SOURCE ../katze/*.c ../panels/*.c ../toolbars/*.c midori-*.c sokoke.c)
3729 include(GLibHelpers)
3730 add_glib_marshal(LIBMIDORI_SOURCE marshal ${CMAKE_PROJECT_NAME}_cclosure_marshal "midori.h")
3731-set(MIDORI_SOURCE
3732- main.c
3733- )
3734
3735 include(ValaPrecompile)
3736 vala_precompile(LIBMIDORI_SOURCE_C ${CMAKE_PROJECT_NAME}
3737@@ -21,18 +19,18 @@
3738 CUSTOM_VAPIS
3739 ${EXTRA_VAPIS}
3740 GENERATE_VAPI
3741- "${CMAKE_PROJECT_NAME}-core"
3742+ "${LIBMIDORI}"
3743 GENERATE_HEADER
3744- "${CMAKE_PROJECT_NAME}-core"
3745+ "${LIBMIDORI}"
3746 )
3747
3748-add_library("${LIBMIDORI}-vala" STATIC ${LIBMIDORI_SOURCE_C})
3749-target_link_libraries("${LIBMIDORI}-vala"
3750+add_library("${LIBMIDORIV}" STATIC ${LIBMIDORI_SOURCE_C})
3751+target_link_libraries("${LIBMIDORIV}"
3752 ${DEPS_LIBRARIES}
3753 ${OPTS_LIBRARIES}
3754 ${DEPS_GTK_LIBRARIES}
3755 )
3756-set_target_properties("${LIBMIDORI}-vala" PROPERTIES
3757+set_target_properties("${LIBMIDORIV}" PROPERTIES
3758 COMPILE_FLAGS "${VALA_CFLAGS}"
3759 POSITION_INDEPENDENT_CODE ON
3760 )
3761@@ -49,7 +47,7 @@
3762 ${DEPS_GTK_INCLUDE_DIRS}
3763 )
3764 target_link_libraries(${LIBMIDORI}
3765- "${LIBMIDORI}-vala"
3766+ ${LIBMIDORIV}
3767 ${DEPS_LIBRARIES}
3768 ${OPTS_LIBRARIES}
3769 ${DEPS_GTK_LIBRARIES}
3770
3771=== modified file 'midori/main.c'
3772--- midori/main.c 2014-04-23 03:34:23 +0000
3773+++ midori/main.c 2015-03-10 00:27:20 +0000
3774@@ -62,6 +62,7 @@
3775 gchar* config;
3776 gboolean private;
3777 gboolean portable;
3778+ gchar* test;
3779 gboolean plain;
3780 gboolean diagnostic_dialog = FALSE;
3781 gboolean debug = FALSE;
3782@@ -85,6 +86,8 @@
3783 { "portable", 'P', 0, G_OPTION_ARG_NONE, &portable,
3784 N_("Portable mode, all runtime files are stored in one place"), NULL },
3785 #endif
3786+ { "test", 't', 0, G_OPTION_ARG_STRING, &test,
3787+ N_("Run unit tests for the specified extension"), NULL },
3788 { "plain", '\0', 0, G_OPTION_ARG_NONE, &plain,
3789 N_("Plain GTK+ window with WebKit, akin to GtkLauncher"), NULL },
3790 { "diagnostic-dialog", 'd', 0, G_OPTION_ARG_NONE, &diagnostic_dialog,
3791@@ -118,6 +121,7 @@
3792 config = NULL;
3793 private = FALSE;
3794 portable = FALSE;
3795+ test = NULL;
3796 plain = FALSE;
3797 run = FALSE;
3798 snapshot = NULL;
3799@@ -287,24 +291,62 @@
3800 return 0;
3801 }
3802
3803+ if (test != NULL)
3804+ {
3805+ g_assert (g_module_supported ());
3806+
3807+ GModule* module = g_module_open (test, G_MODULE_BIND_LOCAL);
3808+ if (module == NULL)
3809+ g_error (_("Failed to load %s."), test);
3810+
3811+ midori_test_init (&argc, &argv);
3812+
3813+ typedef void (*extension_test_func)(void);
3814+ extension_test_func extension_test;
3815+ /* Midori.Extension */
3816+ typedef GObject* (*extension_init_func)(void);
3817+ extension_init_func extension_init;
3818+ /* WebKit.WebExtension */
3819+ typedef void (*webkit_web_extension_initialize_func)(GObject* extension);
3820+ webkit_web_extension_initialize_func web_extension_init;
3821+
3822+ if (g_module_symbol (module, "extension_init",
3823+ (gpointer) &extension_init))
3824+ {
3825+ /* It's fine to conditionally return no extension */
3826+ if (!(extension_init ()))
3827+ return 0;
3828+ midori_paths_init (MIDORI_RUNTIME_MODE_NORMAL, NULL);
3829+
3830+ /* Not all extensions have unit tests :-( */
3831+ if (!g_module_symbol (module, "extension_test", (gpointer) &extension_test))
3832+ return 0;
3833+ }
3834+ else if (g_module_symbol (module, "webkit_web_extension_initialize",
3835+ (gpointer) &web_extension_init)
3836+ || g_module_symbol (module, "webkit_web_extension_initialize_with_user_data",
3837+ (gpointer) &web_extension_init))
3838+ {
3839+ if (!g_module_symbol (module, "extension_test", (gpointer) &extension_test))
3840+ g_error (_("%s doesn't provide unit tests."), test);
3841+ }
3842+ else
3843+ g_error (_("%s doesn't look like a Midori extension."), test);
3844+
3845+ extension_test ();
3846+ return g_test_run ();
3847+ }
3848+
3849 if (plain)
3850 {
3851 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3852 GtkWidget* vbox = gtk_vbox_new (FALSE, 0);
3853 GtkWidget* entry = gtk_entry_new ();
3854-#ifndef HAVE_WEBKIT2
3855- GtkWidget* scrolled = gtk_scrolled_window_new (NULL, NULL);
3856-#endif
3857 GtkWidget* web_view = webkit_web_view_new ();
3858 katze_window_set_sensible_default_size (GTK_WINDOW (window));
3859
3860 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
3861-#ifndef HAVE_WEBKIT2
3862- gtk_box_pack_start (GTK_BOX (vbox), scrolled, TRUE, TRUE, 0);
3863- gtk_container_add (GTK_CONTAINER (scrolled), web_view);
3864-#else
3865 gtk_box_pack_start (GTK_BOX (vbox), web_view, TRUE, TRUE, 0);
3866-#endif
3867 gtk_container_add (GTK_CONTAINER (window), vbox);
3868 gtk_entry_set_text (GTK_ENTRY (entry), uris && *uris ? *uris : "http://www.example.com");
3869 plain_entry_activate_cb (entry, web_view);
3870@@ -330,9 +372,6 @@
3871
3872 MidoriBrowser* browser = midori_browser_new ();
3873 MidoriWebSettings* settings = midori_browser_get_settings (browser);
3874-#ifndef HAVE_WEBKIT2
3875- g_object_set_data (G_OBJECT (webkit_get_default_session ()), "pass-through-console", (void*)1);
3876-#endif
3877 midori_load_soup_session (settings);
3878
3879 gchar* msg = NULL;
3880
3881=== added file 'midori/midori-addons.vala'
3882--- midori/midori-addons.vala 1970-01-01 00:00:00 +0000
3883+++ midori/midori-addons.vala 2015-03-10 00:27:20 +0000
3884@@ -0,0 +1,415 @@
3885+/*
3886+ Copyright (C) 2014 Christian Dywan <christian@twotoats.de>
3887+
3888+ This library is free software; you can redistribute it and/or
3889+ modify it under the terms of the GNU Lesser General Public
3890+ License as published by the Free Software Foundation; either
3891+ version 2.1 of the License, or (at your option) any later version.
3892+
3893+ See the file COPYING for the full license text.
3894+*/
3895+
3896+namespace Midori {
3897+ public class Addon : Object {
3898+ public string name { get; set; }
3899+ public string description { get; set; }
3900+ public bool intern { get; internal set; }
3901+ public Addon (string name, string description) {
3902+ Object (name: name, description: description);
3903+ }
3904+ }
3905+
3906+ public class UserContent : Addon {
3907+ internal UserContent (string name, string description) {
3908+ Object (name: name, description: description);
3909+ }
3910+ }
3911+
3912+ public class ClassicExtension : Addon {
3913+ string? _version = null;
3914+ public string? version { get {
3915+ return _version;
3916+ } set {
3917+ /* Don't show version suffix if it matches the running Midori */
3918+ if (value != null && value.has_suffix (MIDORI_VERSION_SUFFIX))
3919+ _version = value.replace (MIDORI_VERSION_SUFFIX, "");
3920+ /* No version suffix at all, must be 0.4.1 or 0.4.1 git */
3921+ else if (value != null && !("-" in value) && !("(" in value))
3922+ _version = value + " (0.4.1)";
3923+ else
3924+ _version = value;
3925+ } }
3926+ public string? authors { get; set; default = null; }
3927+ public string? website { get; set; default = null; }
3928+ public string? stock_id { get; set; default = null; }
3929+ public bool use_markup { get; set; }
3930+ /* If there's more than one extension in an array.
3931+ Since: 0.4.5 */
3932+ public string? key { get; set; default = null; }
3933+
3934+ public string? config_dir { get; /* FIXME: internal */ set; default = null; }
3935+ KeyFile? keyfile = null;
3936+ /* Since: 0.1.3 */
3937+ public void install_boolean (string name, bool default) {
3938+ keyfile.set_boolean ("settings", name, default);
3939+ }
3940+ /* Since: 0.1.3 */
3941+ public bool get_boolean (string name) {
3942+ try {
3943+ return keyfile.get_boolean ("settings", name);
3944+ } catch (Error error) {
3945+ return false;
3946+ }
3947+ }
3948+ /* Since: 0.1.3 */
3949+ public void set_boolean (string name, bool value) {
3950+ keyfile.set_boolean ("settings", name, value);
3951+ save ();
3952+ }
3953+ /* Since: 0.1.3 */
3954+ public void install_integer (string name, int default) {
3955+ keyfile.set_integer ("settings", name, default);
3956+ }
3957+ public int get_integer (string name) {
3958+ try {
3959+ return keyfile.get_integer ("settings", name);
3960+ } catch (Error error) {
3961+ return 0;
3962+ }
3963+ }
3964+ public void set_integer (string name, int value) {
3965+ keyfile.set_integer ("settings", name, value);
3966+ save ();
3967+ }
3968+ /* Since: 0.1.3 */
3969+ public void install_string (string name, string default) {
3970+ keyfile.set_string ("settings", name, default);
3971+ }
3972+ public string? get_string (string name) {
3973+ try {
3974+ return keyfile.get_string ("settings", name);
3975+ } catch (Error error) {
3976+ return null;
3977+ }
3978+ }
3979+ public void set_string (string name, string value) {
3980+ keyfile.set_string ("settings", name, value);
3981+ save ();
3982+ }
3983+ /* Since: 0.1.7 */
3984+ public void install_string_list (string name, string[]? default) {
3985+ if (default != null)
3986+ keyfile.set_string_list ("settings", name, default);
3987+ }
3988+ /* Since: 0.1.7 */
3989+ public string[]? get_string_list (string name) {
3990+ try {
3991+ return keyfile.get_string_list ("settings", name);
3992+ } catch (Error error) {
3993+ return null;
3994+ }
3995+ }
3996+ /* Since: 0.1.7 */
3997+ public void set_string_list (string name, string[]? value) {
3998+ keyfile.set_string_list ("settings", name, value);
3999+ save ();
4000+ }
4001+ void save () {
4002+ Katze.mkdir_with_parents (config_dir, 0700);
4003+ string config = Path.build_filename (config_dir, "config");
4004+ try {
4005+ keyfile.save_to_file (config);
4006+ } catch (Error error) {
4007+ warning (_("The configuration of the extension '%s' couldn't be saved: %s\n"), name, error.message);
4008+ }
4009+ }
4010+
4011+ public bool is_prepared () {
4012+ // FIXME: has 'activate' handler pending?
4013+ return name != null && description != null && version != null && authors != null;
4014+ }
4015+ /* Since: 0.1.6 */
4016+ public Object? app { get; protected set; default = null; }
4017+ /* Since: 0.1.2 */
4018+ public bool is_active () { return app != null; }
4019+
4020+ public signal void activate (Object? app);
4021+ public signal void deactivate ();
4022+ /* Since: 0.4.0 */
4023+ public signal void open_preferences ();
4024+ public bool has_preferences () {
4025+ // FIXME: has 'open-preferences' handler pending?
4026+ return false;
4027+ }
4028+
4029+ protected ClassicExtension (string name, string description) {
4030+ Object (name: name, description: description);
4031+ }
4032+ void activated (Object? app) {
4033+ assert (is_prepared ());
4034+ this.app = app != null ? app : this.app;
4035+ string? filename = get_data<string?>("filename");
4036+ if (!Midori.Paths.is_readonly ()) {
4037+ this.config_dir = Paths.get_extension_config_dir (filename);
4038+ string preset = Paths.get_extension_preset_filename (filename, "config");
4039+ try {
4040+ keyfile.load_from_file (preset, KeyFileFlags.KEEP_COMMENTS);
4041+ } catch (FileError.NOENT exist_error) {
4042+ /* It's no error if no config file exists */
4043+ } catch (Error error) {
4044+ warning ("Failed to load config for %s from %s: %s", name, preset, error.message);
4045+ }
4046+ string config = Path.build_filename (config_dir, "config");
4047+ try {
4048+ keyfile.load_from_file (config, KeyFileFlags.KEEP_COMMENTS);
4049+ } catch (FileError.NOENT exist_error) {
4050+ /* It's no error if no config file exists */
4051+ } catch (Error error) {
4052+ warning ("Failed to load config for %s from %s: %s", name, config, error.message);
4053+ }
4054+ }
4055+ }
4056+ void deactivated () {
4057+ this.app = null;
4058+ }
4059+
4060+ construct {
4061+ keyfile = new KeyFile ();
4062+ activate.connect (activated);
4063+ deactivate.connect (deactivated);
4064+ }
4065+ }
4066+
4067+ delegate Object? ExtensionInitFunction ();
4068+ delegate void WebExtensionInitializeFunction (Object extension);
4069+
4070+ public class Addons : Object {
4071+ bool debug = false;
4072+ public WebKit.UserContentManager content_manager;
4073+
4074+ Addons () {
4075+ addons = new List<Addon> ();
4076+ modules = new HashTable<string, Object> (str_hash, str_equal);
4077+ content_manager = new WebKit.UserContentManager ();
4078+ if (strcmp (Environment.get_variable ("MIDORI_DEBUG"), "addons") == 0)
4079+ debug = true;
4080+ }
4081+
4082+ static Addons? _instance = null;
4083+ public static unowned Addons get_default () {
4084+ if (_instance == null)
4085+ _instance = new Addons ();
4086+ return _instance;
4087+ }
4088+
4089+ public Object? app { private get; set; default = null; }
4090+ string? _interns = null;
4091+ /* A comma separated list of extension names that are always loaded and
4092+ acctive but won't show up in GUI. Can only be set once. */
4093+ public string? interns { get {
4094+ return _interns;
4095+ } set {
4096+ assert (_interns == null);
4097+ _interns = value;
4098+ if (debug)
4099+ stdout.printf ("Addons: internal extensions '%s'\n", _interns);
4100+ foreach (string name in _interns.split (" ")) {
4101+ if (name == "")
4102+ continue;
4103+ var extension = load_by_name (name);
4104+ assert (extension != null);
4105+ assert (extension is ClassicExtension);
4106+ (extension as ClassicExtension).activate (app);
4107+ }
4108+ } }
4109+ /* GModule detects repeated loading but exposes no API zo check it */
4110+ HashTable<string, Object> modules;
4111+
4112+ public Object? load_by_name (string name) {
4113+ return load_by_filename ("lib" + name + "." + Module.SUFFIX);
4114+ }
4115+
4116+ public Object? load_by_filename (string filename) {
4117+ var libs = File.new_for_path (Midori.Paths.get_lib_path (PACKAGE_NAME));
4118+ string fullname = "/" in filename ? filename.split ("/")[0] : filename;
4119+ return load_from_file (libs.get_child (fullname));
4120+ }
4121+
4122+ public Object? load_from_file (File file) {
4123+ /* Not a module of any sort */
4124+ if (!(file.get_basename ().has_suffix (Module.SUFFIX)))
4125+ return null;
4126+ if (debug)
4127+ stdout.printf ("Addons: Module %s\n", file.get_basename ());
4128+
4129+ var addon = modules.lookup (file.get_basename ());
4130+ if (addon != null)
4131+ return addon;
4132+
4133+ Module? module = Module.open (file.get_path (), ModuleFlags.BIND_LOCAL);
4134+ void* extension_init;
4135+ void* web_extension_init;
4136+ if (module == null)
4137+ warning ("'%s' failed to open: %s", file.get_basename (), Module.error ());
4138+ else if (module.symbol ("extension_init", out extension_init)) {
4139+ if (debug)
4140+ stdout.printf ("^^ Midori.Extension\n");
4141+ var extension_or_array = ((ExtensionInitFunction)extension_init) ();
4142+ modules.insert (file.get_basename (), extension_or_array);
4143+ module.make_resident ();
4144+ if (extension_or_array is Addon) {
4145+ var extension = extension_or_array as Addon;
4146+ string bare_name = file.get_basename ().replace ("lib", "").replace ("." + Module.SUFFIX, "");
4147+ extension.intern = (bare_name in interns);
4148+ extension.set_data<string> ("filename", file.get_basename ());
4149+ if (debug)
4150+ stdout.printf ("^^ internal\n");
4151+ addons.append (extension);
4152+ return extension;
4153+ } else if (extension_or_array != null) {
4154+ if (debug)
4155+ stdout.printf ("^^ Katze.Array\n");
4156+ foreach (var extension in Katze.array_peek_items (extension_or_array))
4157+ addons.append (extension as Addon);
4158+ return extension_or_array;
4159+ }
4160+ } else if (module.symbol ("webkit_web_extension_initialize", out web_extension_init)
4161+ || module.symbol ("webkit_web_extension_initialize_with_user_data", out web_extension_init)) {
4162+ if (debug)
4163+ stdout.printf ("^^ WebKit.WebExtension\n");
4164+ var web_extension = new Addon (file.get_basename (), "WebExtension");
4165+ web_extension.intern = true;
4166+ addons.append (web_extension);
4167+ return web_extension;
4168+ } else
4169+ warning ("'%s' is not a known type of extension", file.get_basename ());
4170+ return null;
4171+ }
4172+
4173+ async UserContent parse_user_content (File file) {
4174+ string name = file.get_basename ();
4175+ string description = "";
4176+
4177+ if (file.get_basename ().has_suffix (".js")) {
4178+ try {
4179+ var stream = new DataInputStream (yield file.read_async ());
4180+ var source = new StringBuilder ();
4181+ do {
4182+ string? line = yield stream.read_line_async ();
4183+ if (line == null)
4184+ break;
4185+ // TODO: Parse metadata
4186+ source.append (line);
4187+ } while (true);
4188+
4189+ // TODO: whitelist, blacklist
4190+ var script = new WebKit.UserScript (source.str,
4191+ WebKit.UserContentInjectedFrames.ALL_FRAMES,
4192+ WebKit.UserScriptInjectionTime.END, null, null);
4193+ content_manager.add_script (script);
4194+ } catch (Error error) {
4195+ description = error.message;
4196+ warning ("Failed to read user script %s: %s", file.get_path (), error.message);
4197+ }
4198+ } else if (file.get_basename ().has_suffix (".css")) {
4199+ try {
4200+ var stream = new DataInputStream (yield file.read_async ());
4201+ var source = new StringBuilder ();
4202+ do {
4203+ string? line = yield stream.read_line_async ();
4204+ if (line == null)
4205+ break;
4206+ // TODO: Parse @-moz-document
4207+ source.append (line);
4208+ } while (true);
4209+
4210+ // TODO: whitelist, blacklist
4211+ var script = new WebKit.UserStyleSheet (source.str,
4212+ WebKit.UserContentInjectedFrames.ALL_FRAMES,
4213+ WebKit.UserStyleLevel.USER, null, null);
4214+ content_manager.add_style_sheet (script);
4215+ } catch (Error error) {
4216+ description = error.message;
4217+ warning ("Failed to read user style sheet %s: %s", file.get_path (), error.message);
4218+ }
4219+ } else {
4220+ assert_not_reached ();
4221+ }
4222+
4223+ // TODO: Handle activation
4224+ return new UserContent (name, description);
4225+ }
4226+
4227+ async void scan_user_content_folder (string folder, string extension) {
4228+ var scripts = File.new_for_path (Midori.Paths.get_user_data_dir ())
4229+ .get_child (PACKAGE_NAME).get_child (folder);
4230+ if (debug)
4231+ stdout.printf ("Addons: Scanning %s for user content\n", scripts.get_path ());
4232+ try {
4233+ var enumerator = yield scripts.enumerate_children_async ("standard::name", 0);
4234+ while (true) {
4235+ var files = yield enumerator.next_files_async (10);
4236+ if (files == null)
4237+ break;
4238+ foreach (var info in files) {
4239+ var file = scripts.get_child (info.get_name ());
4240+ /* Not a user script/ style? */
4241+ if (!(file.get_basename ().has_suffix (extension)))
4242+ continue;
4243+ if (debug)
4244+ stdout.printf ("Addons: User content %s\n", file.get_basename ());
4245+ var script = yield parse_user_content (file);
4246+ addons.append (script);
4247+ }
4248+ }
4249+ } catch (Error error) {
4250+ critical ("Failed to list user content: %s", error.message);
4251+ }
4252+ }
4253+
4254+ List<Addon>? addons;
4255+ public async unowned List<unowned Addon> list (Cancellable? cancellable=null) {
4256+ var libs = File.new_for_path (Midori.Paths.get_lib_path (PACKAGE_NAME));
4257+ if (debug)
4258+ stdout.printf ("Addons: Scanning %s for modules\n", libs.get_path ());
4259+ try {
4260+ var enumerator = yield libs.enumerate_children_async ("standard::name", 0);
4261+ while (true) {
4262+ var files = yield enumerator.next_files_async (10);
4263+ if (files == null)
4264+ break;
4265+ foreach (var info in files) {
4266+ var file = libs.get_child (info.get_name ());
4267+ var addon = load_from_file (file);
4268+ if (addon == null)
4269+ continue;
4270+ }
4271+ }
4272+ } catch (Error error) {
4273+ critical ("Failed to list (web) extensions: %s", error.message);
4274+ }
4275+
4276+ if (debug)
4277+ stdout.printf ("Addons: Reading WebKit.Plugin's\n");
4278+ try {
4279+ List<WebKit.Plugin> plugins = yield WebKit.WebContext.get_default ().get_plugins (cancellable);
4280+ foreach (WebKit.Plugin plugin in plugins) {
4281+ if (debug)
4282+ stdout.printf ("Addons: WebKit.Plugin %s\n", plugin.get_path ());
4283+ // FIXME: Skip plugin?
4284+ var regex = new Regex ("<a.+href.+>(.+)</a>");
4285+ string desc = regex.replace (
4286+ plugin.get_description (), -1, 0, "<u>\\1</u>").replace ("<br>", "\n");
4287+ addons.append (new Addon (plugin.get_name (), desc));
4288+ }
4289+ } catch (Error error) {
4290+ critical ("Failed to list plugins: %s", error.message);
4291+ }
4292+
4293+ yield scan_user_content_folder ("scripts", ".js");
4294+ yield scan_user_content_folder ("styles", ".css");
4295+
4296+ return addons;
4297+ }
4298+ }
4299+}
4300
4301=== modified file 'midori/midori-app.c'
4302--- midori/midori-app.c 2014-04-14 06:53:01 +0000
4303+++ midori/midori-app.c 2015-03-10 00:27:20 +0000
4304@@ -202,7 +202,6 @@
4305 G_CALLBACK (midori_app_send_notification), app);
4306 katze_array_add_item (app->browsers, browser);
4307
4308- #if GTK_CHECK_VERSION (3, 0, 0)
4309 if (app->browser == NULL)
4310 {
4311 gchar* filename;
4312@@ -226,7 +225,6 @@
4313 g_free (filename);
4314 }
4315 }
4316- #endif
4317
4318 app->browser = browser;
4319 }
4320@@ -1232,14 +1230,8 @@
4321 textdomain (GETTEXT_PACKAGE);
4322 #endif
4323
4324- #if GTK_CHECK_VERSION (3, 0, 0)
4325 success = gtk_init_with_args (argc, argument_vector, _("[Addresses]"),
4326 entries, GETTEXT_PACKAGE, &error);
4327- #else
4328- success = gtk_init_with_args (argc, argument_vector, _("[Addresses]"),
4329- (GOptionEntry*)entries, GETTEXT_PACKAGE, &error);
4330- #endif
4331-
4332 factory = gtk_icon_factory_new ();
4333 for (i = 0; i < G_N_ELEMENTS (items); i++)
4334 {
4335@@ -1276,7 +1268,10 @@
4336 midori_debug (const gchar* token)
4337 {
4338 static const gchar* debug_token = NULL;
4339- const gchar* debug_tokens = "wk2:no-multi-render-process adblock:match adblock:parse adblock:time adblock:element adblock:css startup headers body referer cookies paths hsts unarmed db:bookmarks db:history db:tabby mouse app database ";
4340+ const gchar* debug_tokens = "wk2:no-multi-render-process \
4341+ adblock:match adblock:parse adblock:time adblock:element adblock:css \
4342+ startup headers body referer cookies paths addons hsts unarmed \
4343+ db:bookmarks db:history db:tabby mouse app database dnt ";
4344 if (debug_token == NULL)
4345 {
4346 gchar* found_token;
4347
4348=== modified file 'midori/midori-app.h'
4349--- midori/midori-app.h 2013-03-28 17:27:56 +0000
4350+++ midori/midori-app.h 2015-03-10 00:27:20 +0000
4351@@ -103,6 +103,11 @@
4352 midori_error (const gchar* format,
4353 ...);
4354
4355+void
4356+midori_app_set_browsers (MidoriApp* app,
4357+ KatzeArray* browsers,
4358+ MidoriBrowser* browser);
4359+
4360 G_END_DECLS
4361
4362 #endif /* __MIDORI_APP_H__ */
4363
4364=== modified file 'midori/midori-browser.c'
4365--- midori/midori-browser.c 2014-11-22 17:20:43 +0000
4366+++ midori/midori-browser.c 2015-03-10 00:27:20 +0000
4367@@ -1,5 +1,5 @@
4368 /*
4369- Copyright (C) 2007-2013 Christian Dywan <christian@twotoasts.de>
4370+ Copyright (C) 2007-2014 Christian Dywan <christian@twotoasts.de>
4371 Copyright (C) 2008 Dale Whittaker <dayul@users.sf.net>
4372 Copyright (C) 2009 Jérôme Geulfucci <jeromeg@xfce.org>
4373
4374@@ -61,7 +61,7 @@
4375
4376 struct _MidoriBrowser
4377 {
4378- GtkWindow parent_instance;
4379+ MidoriWindow parent_instance;
4380 GtkActionGroup* action_group;
4381 GtkWidget* menubar;
4382 GtkWidget* throbber;
4383@@ -70,16 +70,8 @@
4384
4385 GtkWidget* panel;
4386 GtkWidget* notebook;
4387-
4388- GtkWidget* inspector;
4389- GtkWidget* inspector_view;
4390-
4391 GtkWidget* find;
4392
4393- GtkWidget* statusbar;
4394- GtkWidget* statusbar_contents;
4395- gchar* statusbar_text;
4396-
4397 gint last_window_width, last_window_height;
4398 guint alloc_timeout;
4399 guint panel_timeout;
4400@@ -95,14 +87,13 @@
4401 gboolean show_tabs;
4402
4403 gboolean show_navigationbar;
4404- gboolean show_statusbar;
4405 guint maximum_history_age;
4406 guint last_web_search;
4407
4408 gboolean bookmarkbar_populate;
4409 };
4410
4411-G_DEFINE_TYPE (MidoriBrowser, midori_browser, GTK_TYPE_WINDOW)
4412+G_DEFINE_TYPE (MidoriBrowser, midori_browser, MIDORI_TYPE_WINDOW)
4413
4414 enum
4415 {
4416@@ -153,11 +144,9 @@
4417 static void
4418 midori_browser_finalize (GObject* object);
4419
4420-#ifdef HAVE_WEBKIT2
4421 void download_created_destination_cb (WebKitDownload *download,
4422 gchar *destination,
4423 gpointer user_data);
4424-#endif
4425
4426 static void
4427 midori_browser_set_property (GObject* object,
4428@@ -237,7 +226,8 @@
4429 gboolean show_tabs = !midori_browser_is_fullscreen (browser) || ignore_fullscreen;
4430 if (!browser->show_tabs)
4431 show_tabs = FALSE;
4432- midori_notebook_set_labels_visible (MIDORI_NOTEBOOK (browser->notebook), show_tabs);
4433+ if (browser->notebook)
4434+ midori_notebook_set_labels_visible (MIDORI_NOTEBOOK (browser->notebook), show_tabs);
4435 return has_tabs;
4436 }
4437
4438@@ -286,13 +276,6 @@
4439 {
4440 GtkAction* action;
4441
4442- _action_set_sensitive (browser, "Back", midori_view_can_go_back (view));
4443- _action_set_sensitive (browser, "Forward", midori_tab_can_go_forward (MIDORI_TAB (view)));
4444- _action_set_sensitive (browser, "Previous",
4445- midori_view_get_previous_page (view) != NULL);
4446- _action_set_sensitive (browser, "Next",
4447- midori_view_get_next_page (view) != NULL);
4448-
4449 _action_set_sensitive (browser, "AddSpeedDial", !midori_view_is_blank (view));
4450 _action_set_sensitive (browser, "BookmarkAdd", !midori_view_is_blank (view));
4451 _action_set_sensitive (browser, "MailTo", !midori_view_is_blank (view));
4452@@ -305,24 +288,6 @@
4453 midori_tab_can_view_source (MIDORI_TAB (view)));
4454 _action_set_sensitive (browser, "SourceView",
4455 midori_tab_can_view_source (MIDORI_TAB (view)));
4456- _action_set_sensitive (browser, "SourceViewDom",
4457- midori_tab_can_view_source (MIDORI_TAB (view)));
4458-
4459- action = _action_by_name (browser, "NextForward");
4460- if (midori_tab_can_go_forward (MIDORI_TAB (view)))
4461- {
4462- g_object_set (action,
4463- "stock-id", GTK_STOCK_GO_FORWARD,
4464- "tooltip", _("Go forward to the next page"),
4465- "sensitive", TRUE, NULL);
4466- }
4467- else
4468- {
4469- g_object_set (action,
4470- "stock-id", GTK_STOCK_MEDIA_NEXT,
4471- "tooltip", _("Go to the next sub-page"),
4472- "sensitive", midori_view_get_next_page (view) != NULL, NULL);
4473- }
4474
4475 action = _action_by_name (browser, "Location");
4476 if (midori_tab_is_blank (MIDORI_TAB (view)))
4477@@ -339,55 +304,6 @@
4478 midori_browser_update_secondary_icon (browser, view, action);
4479 }
4480
4481-static void
4482-_midori_browser_set_statusbar_text (MidoriBrowser* browser,
4483- MidoriView* view,
4484- const gchar* text)
4485-{
4486- #if GTK_CHECK_VERSION (3, 2, 0)
4487- gboolean is_location = FALSE;
4488- #else
4489- GtkWidget* widget = gtk_window_get_focus (GTK_WINDOW (browser));
4490- gboolean is_location = widget && GTK_IS_ENTRY (widget)
4491- && GTK_IS_ALIGNMENT (gtk_widget_get_parent (widget));
4492- #endif
4493-
4494- katze_assign (browser->statusbar_text, midori_uri_format_for_display (text));
4495- if (view == NULL)
4496- return;
4497-
4498- if (!gtk_widget_get_visible (browser->statusbar) && !is_location
4499- && text && *text)
4500- {
4501- #if GTK_CHECK_VERSION (3, 2, 0)
4502- midori_view_set_overlay_text (view, browser->statusbar_text);
4503- #else
4504- GtkAction* action = _action_by_name (browser, "Location");
4505- MidoriLocationAction* location_action = MIDORI_LOCATION_ACTION (action);
4506- midori_location_action_set_text (location_action, browser->statusbar_text);
4507- midori_location_action_set_secondary_icon (location_action, NULL);
4508- #endif
4509- }
4510- else if (!gtk_widget_get_visible (browser->statusbar) && !is_location)
4511- {
4512- #if GTK_CHECK_VERSION (3, 2, 0)
4513- midori_view_set_overlay_text (view, NULL);
4514- #else
4515- GtkAction* action = _action_by_name (browser, "Location");
4516- MidoriLocationAction* location_action = MIDORI_LOCATION_ACTION (action);
4517- midori_browser_update_secondary_icon (browser, view, action);
4518- midori_location_action_set_text (location_action,
4519- midori_view_get_display_uri (view));
4520- #endif
4521- }
4522- else
4523- {
4524- gtk_statusbar_pop (GTK_STATUSBAR (browser->statusbar), 1);
4525- gtk_statusbar_push (GTK_STATUSBAR (browser->statusbar), 1,
4526- katze_str_non_null (browser->statusbar_text));
4527- }
4528-}
4529-
4530 void
4531 midori_browser_set_current_page_smartly (MidoriBrowser* browser,
4532 gint n)
4533@@ -576,11 +492,6 @@
4534 }
4535 }
4536
4537-void
4538-midori_app_set_browsers (MidoriApp* app,
4539- KatzeArray* browsers,
4540- MidoriBrowser* browser);
4541-
4542 static void
4543 _midori_browser_activate_action (MidoriBrowser* browser,
4544 const gchar* name)
4545@@ -619,17 +530,9 @@
4546 }
4547 else
4548 {
4549- gchar* extension_path = midori_paths_get_lib_path (PACKAGE_NAME);
4550+ gchar* extension_path = NULL;
4551 GObject* extension = midori_extension_load_from_file (extension_path, parts[0], TRUE, FALSE);
4552- MidoriApp* app = midori_app_new_proxy (NULL);
4553- g_object_set (app,
4554- "settings", browser->settings,
4555- NULL);
4556- /* FIXME: tabs of multiple windows */
4557- KatzeArray* browsers = katze_array_new (MIDORI_TYPE_BROWSER);
4558- katze_array_add_item (browsers, browser);
4559- midori_app_set_browsers (app, browsers, browser);
4560- g_free (extension_path);
4561+ MidoriApp* app = NULL;
4562 if (extension && !strcmp (parts[1], "true"))
4563 midori_extension_activate (extension, parts[0], TRUE, app);
4564 else if (extension && !strcmp (parts[1], "false"))
4565@@ -650,6 +553,16 @@
4566 }
4567
4568 static void
4569+midori_view_action_added_cb (MidoriView* view,
4570+ guint64 id,
4571+ GVariant* user_data,
4572+ MidoriBrowser* browser)
4573+{
4574+ MidoriContextAction* action = midori_context_action_new_from_user_data (user_data);
4575+ midori_window_add_action (MIDORI_WINDOW (browser), GTK_ACTION (action));
4576+}
4577+
4578+static void
4579 midori_view_notify_icon_cb (MidoriView* view,
4580 GParamSpec* pspec,
4581 MidoriBrowser* browser)
4582@@ -684,7 +597,6 @@
4583 }
4584
4585 _midori_browser_update_interface (browser, view);
4586- _midori_browser_set_statusbar_text (browser, view, NULL);
4587 }
4588
4589 if (load_status == MIDORI_LOAD_FINISHED)
4590@@ -714,8 +626,6 @@
4591 const gchar* uri = midori_view_get_display_uri (view);
4592 GtkAction* action = _action_by_name (browser, "Location");
4593 midori_location_action_set_text (MIDORI_LOCATION_ACTION (action), uri);
4594- _action_set_sensitive (browser, "Back", midori_view_can_go_back (view));
4595- _action_set_sensitive (browser, "Forward", midori_tab_can_go_forward (MIDORI_TAB (view)));
4596 g_object_notify (G_OBJECT (browser), "uri");
4597 }
4598 }
4599@@ -810,21 +720,6 @@
4600 midori_view_get_zoom_level (MIDORI_VIEW (view)) != 1.0f);
4601 }
4602
4603-static void
4604-midori_view_notify_statusbar_text_cb (GtkWidget* view,
4605- GParamSpec* pspec,
4606- MidoriBrowser* browser)
4607-{
4608- gchar* text;
4609-
4610- if (view == midori_browser_get_current_tab (browser))
4611- {
4612- g_object_get (view, "statusbar-text", &text, NULL);
4613- _midori_browser_set_statusbar_text (browser, MIDORI_VIEW (view), text);
4614- g_free (text);
4615- }
4616-}
4617-
4618 static gboolean
4619 midori_bookmark_folder_button_reach_parent (GtkTreeModel* model, GtkTreeIter *iter, gint64 parentid)
4620 {
4621@@ -1124,7 +1019,7 @@
4622 #endif
4623 {
4624 dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (browser),
4625- GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, NULL, NULL);
4626+ GTK_DIALOG_DESTROY_WITH_PARENT, NULL, NULL);
4627 }
4628 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
4629 gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
4630@@ -1255,54 +1150,11 @@
4631 if (!midori_download_has_enough_space (download, uri, FALSE))
4632 return FALSE;
4633
4634-#ifdef HAVE_WEBKIT2
4635 webkit_download_set_destination (download, uri);
4636-#else
4637- webkit_download_set_destination_uri (download, uri);
4638-#endif
4639 g_signal_emit (browser, signals[ADD_DOWNLOAD], 0, download);
4640 return TRUE;
4641 }
4642
4643-#ifndef HAVE_WEBKIT2
4644-static void
4645-midori_browser_save_resources (GList* resources,
4646- const gchar* folder)
4647-{
4648- GList* list;
4649- katze_mkdir_with_parents (folder, 0700);
4650-
4651- for (list = resources; list; list = g_list_next (list))
4652- {
4653- WebKitWebResource* resource = WEBKIT_WEB_RESOURCE (list->data);
4654- GString* data = webkit_web_resource_get_data (resource);
4655-
4656- /* Resource could be adblocked, skip it in that case */
4657- if (!g_strcmp0 (webkit_web_resource_get_uri (resource), "about:blank"))
4658- continue;
4659-
4660- gchar* sub_filename = midori_download_get_filename_suggestion_for_uri (
4661- webkit_web_resource_get_mime_type (resource),
4662- webkit_web_resource_get_uri (resource));
4663- gchar* sub_path = g_build_filename (folder, sub_filename, NULL);
4664- sub_path = midori_download_get_unique_filename (sub_path);
4665- if (data)
4666- {
4667- GError* error = NULL;
4668- if (!g_file_set_contents (sub_path, data->str, data->len, &error))
4669- {
4670- g_warning ("Failed to save %s: %s", sub_filename, error->message);
4671- g_error_free (error);
4672- }
4673- }
4674- else
4675- g_warning ("Skipping empty resource %s", sub_filename);
4676- g_free (sub_filename);
4677- g_free (sub_path);
4678- }
4679-}
4680-#endif
4681-
4682 void
4683 midori_browser_save_uri (MidoriBrowser* browser,
4684 MidoriView* view,
4685@@ -1331,50 +1183,6 @@
4686 g_free (dirname);
4687 }
4688
4689-#ifndef HAVE_WEBKIT2
4690- GList* resources = midori_view_get_resources (view);
4691- gboolean file_only = TRUE;
4692- GtkWidget* checkbox = NULL;
4693-
4694- if (resources != NULL && g_list_nth_data (resources, 1) != NULL)
4695- {
4696- file_only = FALSE;
4697- checkbox = gtk_check_button_new_with_mnemonic (_("Save associated _resources"));
4698- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), TRUE);
4699- gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (dialog), checkbox);
4700- }
4701-
4702- if (!file_only && !g_str_equal (title, uri))
4703- filename = midori_download_clean_filename (title);
4704- else
4705- {
4706- gchar* mime_type = katze_object_get_object (view, "mime-type");
4707- filename = midori_download_get_filename_suggestion_for_uri (mime_type, uri);
4708- g_free (mime_type);
4709- }
4710- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), filename);
4711- g_free (filename);
4712-
4713- if (midori_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
4714- {
4715- filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
4716- if (checkbox != NULL)
4717- file_only = !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox));
4718- if (!file_only)
4719- {
4720- gchar* fullname = g_strconcat (filename, ".html", NULL);
4721- midori_view_save_source (view, uri, fullname, FALSE);
4722- g_free (fullname);
4723- midori_browser_save_resources (resources, filename);
4724- }
4725- else
4726- midori_view_save_source (view, uri, filename, FALSE);
4727- katze_assign (last_dir,
4728- gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog)));
4729- }
4730- g_list_foreach (resources, (GFunc)g_object_unref, NULL);
4731- g_list_free (resources);
4732-#else
4733 filename = midori_download_clean_filename (title);
4734 gchar* suggested_filename = g_strconcat (filename, ".mht", NULL);
4735 gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), suggested_filename);
4736@@ -1392,7 +1200,6 @@
4737 katze_assign (last_dir,
4738 gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog)));
4739 }
4740-#endif
4741 gtk_widget_destroy (dialog);
4742 }
4743
4744@@ -1416,15 +1223,6 @@
4745 midori_view_get_display_title (MIDORI_VIEW (view)), NULL);
4746 }
4747
4748-static gboolean
4749-midori_browser_tab_leave_notify_event_cb (GtkWidget* widget,
4750- GdkEventCrossing* event,
4751- MidoriBrowser* browser)
4752-{
4753- _midori_browser_set_statusbar_text (browser, MIDORI_VIEW (widget), NULL);
4754- return TRUE;
4755-}
4756-
4757 static void
4758 midori_browser_view_copy_to_item_history (GtkWidget* view,
4759 KatzeItem* item)
4760@@ -1476,41 +1274,6 @@
4761 }
4762
4763 static void
4764-midori_view_attach_inspector_cb (GtkWidget* view,
4765- GtkWidget* inspector_view,
4766- MidoriBrowser* browser)
4767-{
4768- GtkWidget* toplevel = gtk_widget_get_toplevel (inspector_view);
4769- GtkWidget* scrolled = gtk_widget_get_parent (browser->inspector_view);
4770- if (browser->inspector_view == inspector_view)
4771- return;
4772-
4773- gtk_widget_hide (toplevel);
4774- gtk_widget_destroy (browser->inspector_view);
4775- gtk_widget_reparent (inspector_view, scrolled);
4776- gtk_widget_show_all (browser->inspector);
4777- browser->inspector_view = inspector_view;
4778- gtk_widget_destroy (toplevel);
4779- if (!katze_object_get_boolean (browser->settings, "last-inspector-attached"))
4780- g_object_set (browser->settings, "last-inspector-attached", TRUE, NULL);
4781-}
4782-
4783-static void
4784-midori_view_detach_inspector_cb (GtkWidget* view,
4785- GtkWidget* inspector_view,
4786- MidoriBrowser* browser)
4787-{
4788- GtkWidget* scrolled = gtk_widget_get_parent (GTK_WIDGET (inspector_view));
4789- GtkWidget* paned = gtk_widget_get_parent (scrolled);
4790- browser->inspector_view = gtk_viewport_new (NULL, NULL);
4791- gtk_container_remove (GTK_CONTAINER (scrolled), GTK_WIDGET (inspector_view));
4792- gtk_container_add (GTK_CONTAINER (scrolled), browser->inspector_view);
4793- gtk_widget_hide (paned);
4794- if (katze_object_get_boolean (browser->settings, "last-inspector-attached"))
4795- g_object_set (browser->settings, "last-inspector-attached", FALSE, NULL);
4796-}
4797-
4798-static void
4799 midori_browser_view_copy_history (GtkWidget* view_to,
4800 GtkWidget* view_from,
4801 gboolean omit_last)
4802@@ -1652,10 +1415,6 @@
4803 }
4804
4805 static void
4806-_midori_browser_set_toolbar_items (MidoriBrowser* browser,
4807- const gchar* items);
4808-
4809-static void
4810 midori_view_new_view_cb (GtkWidget* view,
4811 GtkWidget* new_view,
4812 MidoriNewView where,
4813@@ -1675,9 +1434,8 @@
4814 NULL);
4815 sokoke_widget_set_visible (new_browser->menubar, FALSE);
4816 sokoke_widget_set_visible (new_browser->bookmarkbar, FALSE);
4817- sokoke_widget_set_visible (new_browser->statusbar, FALSE);
4818 _action_set_visible (new_browser, "CompactMenu", FALSE);
4819- _midori_browser_set_toolbar_items (new_browser, "Location");
4820+ midori_window_set_actions (MIDORI_WINDOW (new_browser), "Location");
4821 sokoke_widget_set_visible (new_browser->panel, FALSE);
4822 midori_browser_add_tab (new_browser, new_view);
4823 midori_browser_set_current_tab (new_browser, new_view);
4824@@ -1724,7 +1482,6 @@
4825 }
4826 }
4827
4828-#ifdef HAVE_WEBKIT2
4829 static void
4830 midori_browser_close_tab_idle (GObject* resource,
4831 GAsyncResult* result,
4832@@ -1734,16 +1491,8 @@
4833 result, NULL, NULL);
4834 if (data != NULL)
4835 return;
4836-#else
4837-static gboolean
4838-midori_browser_close_tab_idle (gpointer view)
4839-{
4840-#endif
4841 MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (view));
4842 midori_browser_close_tab (browser, GTK_WIDGET (view));
4843-#ifndef HAVE_WEBKIT2
4844- return G_SOURCE_REMOVE;
4845-#endif
4846 }
4847
4848 static gboolean
4849@@ -1759,11 +1508,7 @@
4850 {
4851 handled = FALSE;
4852 }
4853- #ifdef HAVE_WEBKIT2
4854 else if (!webkit_download_get_destination (download))
4855- #else
4856- else if (!webkit_download_get_destination_uri (download))
4857- #endif
4858 {
4859 if (type == MIDORI_DOWNLOAD_SAVE_AS)
4860 {
4861@@ -1772,12 +1517,8 @@
4862
4863 if (!dialog)
4864 {
4865- #ifdef HAVE_WEBKIT2
4866 const gchar* download_uri = webkit_uri_response_get_uri (
4867 webkit_download_get_response (download));
4868- #else
4869- const gchar* download_uri = webkit_download_get_uri (download);
4870- #endif
4871 gchar* folder;
4872 dialog = (GtkWidget*)midori_file_chooser_dialog_new (_("Save file"),
4873 GTK_WINDOW (browser), GTK_FILE_CHOOSER_ACTION_SAVE);
4874@@ -1822,24 +1563,14 @@
4875 midori_browser_prepare_download (browser, download, destination_uri);
4876 g_free (destination_uri);
4877 }
4878- #ifndef HAVE_WEBKIT2
4879- webkit_download_start (download);
4880- #endif
4881 }
4882
4883 /* Close empty tabs due to download links with a target */
4884 if (midori_view_is_blank (MIDORI_VIEW (view)))
4885 {
4886 GtkWidget* web_view = midori_view_get_web_view (MIDORI_VIEW (view));
4887- #ifdef HAVE_WEBKIT2
4888 WebKitWebResource* resource = webkit_web_view_get_main_resource (WEBKIT_WEB_VIEW (web_view));
4889 webkit_web_resource_get_data (resource, NULL, midori_browser_close_tab_idle, view);
4890- #else
4891- WebKitWebFrame* web_frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (web_view));
4892- WebKitWebDataSource* datasource = webkit_web_frame_get_data_source (web_frame);
4893- if (webkit_web_data_source_get_data (datasource) == NULL)
4894- g_idle_add (midori_browser_close_tab_idle, view);
4895- #endif
4896 }
4897 return handled;
4898 }
4899@@ -1880,6 +1611,8 @@
4900 katze_array_add_item (browser->proxy_array, item);
4901
4902 g_object_connect (view,
4903+ "signal::action-added",
4904+ midori_view_action_added_cb, browser,
4905 "signal::notify::icon",
4906 midori_view_notify_icon_cb, browser,
4907 "signal::notify::load-status",
4908@@ -1892,12 +1625,6 @@
4909 midori_view_notify_title_cb, browser,
4910 "signal::notify::zoom-level",
4911 midori_view_notify_zoom_level_cb, browser,
4912- "signal::notify::statusbar-text",
4913- midori_view_notify_statusbar_text_cb, browser,
4914- "signal::attach-inspector",
4915- midori_view_attach_inspector_cb, browser,
4916- "signal::detach-inspector",
4917- midori_view_detach_inspector_cb, browser,
4918 "signal::new-tab",
4919 midori_view_new_tab_cb, browser,
4920 "signal::new-window",
4921@@ -1908,8 +1635,6 @@
4922 midori_view_download_requested_cb, browser,
4923 "signal::search-text",
4924 midori_view_search_text_cb, browser,
4925- "signal::leave-notify-event",
4926- midori_browser_tab_leave_notify_event_cb, browser,
4927 "signal::destroy",
4928 midori_view_destroy_cb, browser,
4929 NULL);
4930@@ -1947,12 +1672,6 @@
4931 midori_view_notify_title_cb, browser,
4932 "any_signal",
4933 midori_view_notify_zoom_level_cb, browser,
4934- "any_signal",
4935- midori_view_notify_statusbar_text_cb, browser,
4936- "any_signal::attach-inspector",
4937- midori_view_attach_inspector_cb, browser,
4938- "any_signal::detach-inspector",
4939- midori_view_detach_inspector_cb, browser,
4940 "any_signal::new-tab",
4941 midori_view_new_tab_cb, browser,
4942 "any_signal::new-window",
4943@@ -1963,8 +1682,6 @@
4944 midori_view_download_requested_cb, browser,
4945 "any_signal::search-text",
4946 midori_view_search_text_cb, browser,
4947- "any_signal::leave-notify-event",
4948- midori_browser_tab_leave_notify_event_cb, browser,
4949 NULL);
4950 }
4951
4952@@ -2405,7 +2122,7 @@
4953 "navigationbar",
4954 "Navigationbar",
4955 "The navigationbar",
4956- GTK_TYPE_TOOLBAR,
4957+ GTK_TYPE_WIDGET,
4958 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
4959
4960 g_object_class_install_property (gobject_class,
4961@@ -2459,6 +2176,7 @@
4962 *
4963 * The widget representing the statusbar contents. This is
4964 * not an actual #GtkStatusbar but rather a #GtkBox.
4965+ * Deprecated: 0.6.0
4966 */
4967 g_object_class_install_property (gobject_class,
4968 PROP_STATUSBAR,
4969@@ -2466,7 +2184,7 @@
4970 "statusbar",
4971 "Statusbar",
4972 "The statusbar",
4973- GTK_TYPE_BOX,
4974+ GTK_TYPE_WIDGET,
4975 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
4976
4977 /**
4978@@ -2629,17 +2347,6 @@
4979 "Whether or not to show tabs",
4980 TRUE,
4981 flags));
4982-
4983- #if !GTK_CHECK_VERSION (3, 0, 0)
4984- /* Add 2px space between tool buttons */
4985- gtk_rc_parse_string (
4986- "style \"tool-button-style\"\n {\n"
4987- "GtkToolButton::icon-spacing = 2\n }\n"
4988- "widget \"MidoriBrowser.*.MidoriBookmarkbar.Gtk*ToolButton\" "
4989- "style \"tool-button-style\"\n"
4990- "widget \"MidoriBrowser.*.MidoriFindbar.Gtk*ToolButton\" "
4991- "style \"tool-button-style\"\n");
4992- #endif
4993 }
4994
4995 static void
4996@@ -2668,10 +2375,6 @@
4997 _action_open_activate (GtkAction* action,
4998 MidoriBrowser* browser)
4999 {
5000- #if !GTK_CHECK_VERSION (3, 1, 10)
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: