~ubuntuone-control-tower/software-center/trunk

« back to all changes in this revision

Viewing changes to softwarecenter/ui/gtk3/widgets/exhibits.py

  • Committer: CI Train Bot
  • Author(s): Iain Lane
  • Date: 2016-02-17 13:47:35 UTC
  • mfrom: (3343.1.1 software-center)
  • Revision ID: ci-train-bot@canonical.com-20160217134735-8ed8171e5ypkuecx
Port to WebKit 2 Fixes: #1469221
Approved by: Iain Lane

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
from gi.repository import GLib
28
28
from gi.repository import GObject
29
29
from gi.repository import GdkPixbuf
30
 
from gi.repository import WebKit
 
30
from gi.repository import WebKit2
31
31
 
32
32
from urlparse import urlparse
33
33
 
35
35
from softwarecenter.ui.gtk3.em import StockEms
36
36
from softwarecenter.ui.gtk3.drawing import rounded_rect
37
37
from softwarecenter.ui.gtk3.utils import point_in
 
38
from softwarecenter.ui.gtk3.widgets.webkit import SCWebKit
38
39
import softwarecenter.paths
39
40
 
40
41
LOG = logging.getLogger(__name__)
64
65
position:absolute;
65
66
top:100px;
66
67
left:232px;
 
68
white-space: nowrap;
67
69
}
68
70
</style>
69
71
</head><body>
101
103
        #    "cached banners")
102
104
 
103
105
 
104
 
class _HtmlRenderer(Gtk.OffscreenWindow):
105
 
 
106
 
    __gsignals__ = {
107
 
        "render-finished": (GObject.SignalFlags.RUN_LAST,
108
 
                            None,
109
 
                            (),
110
 
                            )
111
 
    }
 
106
class _HtmlRenderer(SCWebKit):
112
107
 
113
108
    def __init__(self):
114
 
        Gtk.OffscreenWindow.__init__(self)
115
 
        self.view = WebKit.WebView()
116
 
        settings = self.view.get_settings()
117
 
        settings.set_property("enable-java-applet", False)
 
109
        super(_HtmlRenderer, self).__init__()
 
110
        settings = self.get_settings()
 
111
        settings.set_property("enable-java", False)
118
112
        settings.set_property("enable-plugins", False)
119
 
        settings.set_property("enable-scripts", False)
120
 
        self.view.set_size_request(-1, ExhibitBanner.MAX_HEIGHT)
121
 
        self.add(self.view)
122
 
        self.show_all()
 
113
        settings.set_property("enable-javascript", False)
 
114
        self.set_size_request(-1, ExhibitBanner.MAX_HEIGHT)
123
115
        self.loader = SimpleFileDownloader()
124
116
        self.loader.connect("file-download-complete",
125
117
                            self._on_one_download_complete)
127
119
                            self._on_download_error)
128
120
        self.exhibit = None
129
121
        self._downloaded_banner_images = []
130
 
        self.view.connect(
131
 
            "notify::load-status", self._on_internal_renderer_load_status)
132
122
 
133
123
    def set_exhibit(self, exhibit):
134
124
        LOG.debug("set_exhibit: '%s'" % exhibit)
165
155
            html = html.replace(server_path, image_name)
166
156
        self.exhibit.html = html
167
157
        LOG.debug("mangled html: '%s'" % html)
168
 
        self.view.load_string(html, "text/html", "UTF-8",
169
 
                              "file:%s/" % cache_dir)
 
158
        self.load_html(html, "file:%s/" % cache_dir)
170
159
 
171
160
    def _download_next_banner_image(self):
172
161
        LOG.debug("_download_next_banner_image")
175
164
            use_cache=True,
176
165
            simple_quoting_for_webkit=True)
177
166
 
178
 
    def _on_internal_renderer_load_status(self, view, prop):
179
 
        """Called when the rendering of the html banner is done"""
180
 
        if view.get_property("load-status") == WebKit.LoadStatus.FINISHED:
181
 
            # this needs to run with a timeout because otherwise the
182
 
            # status is emitted before the offscreen image is finished
183
 
            GLib.timeout_add(100, lambda: self.emit("render-finished"))
184
167
 
185
168
 
186
169
class ExhibitButton(Gtk.Button):
311
294
        self.image = None
312
295
        self.old_image = None
313
296
        self.renderer = _HtmlRenderer()
314
 
        self.renderer.connect("render-finished", self.on_banner_rendered)
 
297
        self.renderer.connect("load-changed", self.on_load_changed)
315
298
 
316
299
        self.set_visible_window(False)
317
300
        self.set_size_request(-1, self.MAX_HEIGHT)
449
432
                                    self.TIMEOUT_SECONDS, self.next_exhibit)
450
433
        return self._timeout
451
434
 
452
 
    def on_banner_rendered(self, renderer):
453
 
        self.image = renderer.get_pixbuf()
454
 
 
455
 
        if self.image.get_width() == 1:
456
 
            # the offscreen window is not really as such content not
457
 
            # correctly rendered
458
 
            GLib.timeout_add(500, self.on_banner_rendered, renderer)
459
 
            return
 
435
    def on_snapshot_created(self, obj, result):
 
436
        surface = obj.get_snapshot_finish(result)
 
437
        self.image = Gdk.pixbuf_get_from_surface(surface, 0, 0,
 
438
                surface.get_width(),
 
439
                surface.get_height())
460
440
 
461
441
        from gi.repository import Atk
462
442
        self.get_accessible().set_name(
464
444
        self.get_accessible().set_role(Atk.Role.PUSH_BUTTON)
465
445
        self._fade_in()
466
446
        self.queue_next()
 
447
 
 
448
    def on_load_changed(self, renderer, load_event):
 
449
        from gi.repository import WebKit2
 
450
 
 
451
        if load_event != WebKit2.LoadEvent.FINISHED:
 
452
            return False
 
453
 
 
454
        renderer.get_snapshot(WebKit2.SnapshotRegion.FULL_DOCUMENT,
 
455
                WebKit2.SnapshotOptions.NONE,
 
456
                None,
 
457
                self.on_snapshot_created)
 
458
 
 
459
        return True
 
460
 
 
461
        if self.image.get_width() == 1:
 
462
            # the offscreen window is not really as such content not
 
463
            # correctly rendered
 
464
            GLib.timeout_add(500, self.on_banner_rendered, renderer)
 
465
            return
 
466
 
467
467
        return False
468
468
 
469
469
    def _fade_in(self, step=0.05):