Merge lp:~jderose/userwebkit/dmedia-uri into lp:userwebkit

Proposed by Jason Gerard DeRose
Status: Merged
Merged at revision: 25
Proposed branch: lp:~jderose/userwebkit/dmedia-uri
Merge into: lp:userwebkit
Diff against target: 224 lines (+100/-5)
4 files modified
demo-app.py (+28/-0)
test_userwebkit.py (+59/-1)
ui/index.html (+3/-2)
userwebkit.py (+10/-2)
To merge this branch: bzr merge lp:~jderose/userwebkit/dmedia-uri
Reviewer Review Type Date Requested Status
David Jordan Approve
Review via email: mp+86930@code.launchpad.net

Description of the change

Small change so that we can resolve dmedia: URIs into file:// URIs in the WebView 'resource-request-starting' handler.

For example, this would resolve a URI like this:

dmedia:TQVPUCFGL23KWPKPVDXP3BB2ZQWPTYMNDMR55QZZ5A2QLDBK

Into a URI like this:

file:///home/.dmedia/files/TQ/VPUCFGL23KWPKPVDXP3BB2ZQWPTYMNDMR55QZZ5A2QLDBK

And then call request.set_uri() with the new URI. I feel a bit silly I didn't think of this sooner, but better late than never!

To post a comment you must log in.
Revision history for this message
David Jordan (dmj726) wrote :

Approved, looking forward to this change.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'demo-app.py'
2--- demo-app.py 2011-11-22 05:30:06 +0000
3+++ demo-app.py 2011-12-27 09:29:23 +0000
4@@ -22,16 +22,44 @@
5 # Jason Gerard DeRose <jderose@novacut.com>
6
7 import optparse
8+from urllib.parse import urlparse
9+
10+from dmedia import local
11
12 from userwebkit import BaseUI
13
14
15+
16 class UI(BaseUI):
17 app = 'demo'
18 page = 'index.html'
19 splash = 'splash.html'
20 title = 'Demo'
21 databases = ['demo']
22+ proxy_bus = 'org.freedesktop.DMedia'
23+ local = None
24+
25+ def dmedia_resolver(self, uri):
26+ if self.env is None:
27+ return ''
28+ if self.local is None:
29+ self.local = local.LocalSlave(self.env)
30+ try:
31+ u = urlparse(uri)
32+ _id = u.path
33+ doc = self.local.get_doc(_id)
34+ if doc.get('proxies'):
35+ proxies = doc['proxies']
36+ for proxy in proxies:
37+ try:
38+ st = self.local.stat(proxy)
39+ return 'file://' + st.name
40+ except (local.NoSuchFile, local.FileNotLocal):
41+ pass
42+ st = self.local.stat2(doc)
43+ return 'file://' + st.name
44+ except Exception:
45+ return ''
46
47
48 parser = optparse.OptionParser()
49
50=== modified file 'test_userwebkit.py'
51--- test_userwebkit.py 2011-12-24 04:54:45 +0000
52+++ test_userwebkit.py 2011-12-27 09:29:23 +0000
53@@ -28,6 +28,9 @@
54 from base64 import b32encode
55 from urllib.parse import urlparse
56 from random import SystemRandom
57+from urllib.parse import urlparse
58+
59+from microfiber import random_id
60
61 import userwebkit
62
63@@ -74,10 +77,15 @@
64 class DummyRequest:
65 def __init__(self, uri):
66 self.__uri = uri
67+ self._set_uri = None
68
69 def get_uri(self):
70 return self.__uri
71
72+ def set_uri(self, uri):
73+ assert self._set_uri is None
74+ self._set_uri = uri
75+
76
77 class DummyPolicy:
78 def __init__(self):
79@@ -88,6 +96,20 @@
80 self._called = True
81
82
83+class DummyResolver:
84+ def __init__(self):
85+ self._calls = []
86+
87+ def __call__(self, uri):
88+ self._calls.append(uri)
89+ u = urlparse(uri)
90+ assert u.scheme == 'dmedia'
91+ _id = u.path
92+ assert len(_id) == 48
93+ return '/'.join(['/home/.dmedia/files', _id[:2], _id[2:]])
94+
95+
96+
97 class TestCouchView(TestCase):
98 def test_init(self):
99 view = userwebkit.CouchView()
100@@ -135,11 +157,47 @@
101 self.assertIsNone(view._basic)
102
103 def test_on_request(self):
104- # Make sure on_request() immediately returns when env is None:
105 view = userwebkit.CouchView()
106 self.assertIsNone(view._env)
107+
108+ # Make sure on_request() immediately returns when env is None:
109 self.assertIsNone(view._on_request(None, None, None, None, None))
110
111+ # Test with dmedia: URI when dmedia_resolver is None:
112+ env = random_env()
113+ view.set_env(env)
114+ _id = random_id(30)
115+ uri = 'dmedia:' + _id
116+ request = DummyRequest(uri)
117+ self.assertIsNone(view._on_request(None, None, None, request, None))
118+ self.assertEqual(request._set_uri, '')
119+
120+ # Test with dmedia: URI when dmedia_resolver is callable:
121+ env = random_env()
122+ resolver = DummyResolver()
123+ view = userwebkit.CouchView(env, resolver)
124+ self.assertIs(view._dmedia_resolver, resolver)
125+ id1 = random_id(30)
126+ uri1 = 'dmedia:' + id1
127+ request = DummyRequest(uri1)
128+ self.assertIsNone(view._on_request(None, None, None, request, None))
129+ self.assertEqual(
130+ request._set_uri,
131+ '/'.join(['/home/.dmedia/files', id1[:2], id1[2:]])
132+ )
133+ self.assertEqual(resolver._calls, [uri1])
134+
135+ # Lets try one more:
136+ id2 = random_id(30)
137+ uri2 = 'dmedia:' + id2
138+ request = DummyRequest(uri2)
139+ self.assertIsNone(view._on_request(None, None, None, request, None))
140+ self.assertEqual(
141+ request._set_uri,
142+ '/'.join(['/home/.dmedia/files', id2[:2], id2[2:]])
143+ )
144+ self.assertEqual(resolver._calls, [uri1, uri2])
145+
146 def test_on_nav_policy_decision(self):
147 callback = DummyCallback()
148 view = userwebkit.CouchView()
149
150=== modified file 'ui/index.html'
151--- ui/index.html 2011-12-22 03:54:49 +0000
152+++ ui/index.html 2011-12-27 09:29:23 +0000
153@@ -6,7 +6,7 @@
154 <style>
155 body {
156 font-family: Ubuntu;
157- font-size: 18px;
158+ font-size: 16px;
159 background-color: #fff;
160 color: #000;
161 text-align: center;
162@@ -53,9 +53,10 @@
163 <body onload="hello()">
164 <p id="hello"></p>
165 <p>Right click and <strong>Inspect Element</strong></p>
166+<p>
167 <button id="button">Start</button>
168-<p>
169 <a href="http://novacut.com/">A test link</a>
170 </p>
171+<video controls width="640" height="360" src="dmedia:TQVPUCFGL23KWPKPVDXP3BB2ZQWPTYMNDMR55QZZ5A2QLDBK">
172 </body>
173 </html>
174
175=== modified file 'userwebkit.py'
176--- userwebkit.py 2011-12-27 06:45:51 +0000
177+++ userwebkit.py 2011-12-27 09:29:23 +0000
178@@ -79,7 +79,7 @@
179 ),
180 }
181
182- def __init__(self, env=None):
183+ def __init__(self, env=None, dmedia_resolver=None):
184 super().__init__()
185 self.connect('resource-request-starting', self._on_request)
186 self.connect('notify::title', self._on_notify_title)
187@@ -87,6 +87,7 @@
188 self._on_nav_policy_decision
189 )
190 self.set_env(env)
191+ self._dmedia_resolver = dmedia_resolver
192
193 def set_env(self, env):
194 self._env = env
195@@ -103,6 +104,12 @@
196 if self._env is None:
197 return
198 uri = request.get_uri()
199+ if uri.startswith('dmedia'):
200+ if self._dmedia_resolver is None:
201+ request.set_uri('')
202+ else:
203+ request.set_uri(self._dmedia_resolver(uri))
204+ return
205 u = urlparse(uri)
206 if u.netloc != self._u.netloc:
207 return
208@@ -234,6 +241,7 @@
209 splash = 'splash.html'
210 title = 'Fix Me'
211 databases = tuple()
212+ dmedia_resolver = None
213
214 proxy_bus = 'org.freedesktop.DC3'
215 proxy_path = '/'
216@@ -267,7 +275,7 @@
217 self.scroll.set_policy(
218 Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC
219 )
220- self.view = CouchView()
221+ self.view = CouchView(None, self.dmedia_resolver)
222 self.view.connect('open', self.on_open)
223 self.scroll.add(self.view)
224 self.view.get_settings().set_property('enable-developer-extras', True)

Subscribers

People subscribed via source and target branches