packages feed

hbro-1.6.0.0: library/Graphics/UI/Gtk/WebKit/Extended.hs

{-# LANGUAGE ConstraintKinds   #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
-- | Some lifted functions from 'Graphics.UI.Gtk.WebKit'.
-- Designed to be imported as @qualified@.
module Graphics.UI.Gtk.WebKit.Extended
  ( -- * 'NetworkRequest'
    networkRequestGetUri
    -- * 'Download'
  , downloadGetUri
    -- * 'NetworkRequest'
  , downloadGetSuggestedFilename
    -- * 'WebDataSource'
  , dataSourceGetData
    -- * 'WebView'
  , webViewUri
  , webViewGetUri
  , webViewGetIconUri
  , webViewTryGetFaviconPixbuf
  , webViewGetTitle
  , loadHtmlString
  , loadString
    -- * Exceptions
  , WebKitException(..)
    -- * Re-export
  , module X
  ) where

-- {{{ Imports
import           Hbro.Error
import           Hbro.Prelude

import           Graphics.UI.Gtk.Gdk.Pixbuf
import           Graphics.UI.Gtk.General.General.Extended
import qualified Graphics.UI.Gtk.WebKit.Download          as W
import           Graphics.UI.Gtk.WebKit.NetworkRequest    (NetworkRequest)
import qualified Graphics.UI.Gtk.WebKit.NetworkRequest    as W
import           Graphics.UI.Gtk.WebKit.WebDataSource     as W
import           Graphics.UI.Gtk.WebKit.WebView           as X hiding (webViewGetIconUri,
                                                                webViewGetTitle,
                                                                webViewGetUri,
                                                                webViewTryGetFaviconPixbuf,
                                                                webViewUri)
import qualified Graphics.UI.Gtk.WebKit.WebView           as W

import           Network.URI.Extended

import           System.Glib.Attributes
-- }}}

networkRequestGetUri :: (MonadIO m, MonadThrow m) => NetworkRequest -> m URI
networkRequestGetUri r = parseURIReference =<< io (W.networkRequestGetUri r) <!> UnavailableUri

downloadGetUri :: (MonadIO m, MonadThrow m) => W.Download -> m URI
downloadGetUri d = parseURI =<< io (W.downloadGetUri d) <!> UnavailableUri

downloadGetSuggestedFilename :: (MonadIO m, MonadThrow m) => W.Download -> m Text
downloadGetSuggestedFilename d = io (W.downloadGetSuggestedFilename d) <!> UnavailableFileName

dataSourceGetData :: (MonadIO m, MonadThrow m) => WebDataSource -> m ByteString
dataSourceGetData ds = io (webDataSourceGetData ds) <!> UnavailableData


-- | 'W.webViewUri' with 'Text'
webViewUri :: ReadAttr WebView (Maybe Text)
webViewUri = W.webViewUri

webViewGetUri :: (MonadIO m, MonadThrow m) => WebView -> m URI
webViewGetUri = gSync . W.webViewGetUri >=> maybe (throwM UnavailableUri) return >=> parseURI

webViewGetIconUri :: (MonadIO m, MonadThrow m) => WebView -> m URI
webViewGetIconUri = gSync . W.webViewGetIconUri >=> maybe (throwM UnavailableUri) return >=> parseURI

webViewTryGetFaviconPixbuf :: (MonadIO m, MonadThrow m) => WebView -> Int -> Int -> m Pixbuf
webViewTryGetFaviconPixbuf webView width height = gSync (W.webViewTryGetFaviconPixbuf webView width height) >>= maybe (throwM UnavailableFavicon) return

webViewGetTitle :: (MonadIO m, MonadThrow m) => WebView -> m Text
webViewGetTitle = gSync . W.webViewGetTitle >=> maybe (throwM UnavailableTitle) return

loadHtmlString :: (MonadIO m) => Text -> URI -> WebView -> m ()
loadHtmlString html uri webView = gAsync $ W.webViewLoadHtmlString webView html (show uri)

loadString :: (MonadIO m) => Text -> URI -> WebView -> m ()
loadString html uri webView = gAsync $ W.webViewLoadString webView html Nothing (show uri)


data WebKitException = UnavailableData
                     | UnavailableFavicon
                     | UnavailableFileName
                     | UnavailableTitle
                     | UnavailableUri
                     deriving(Eq, Show)

instance Exception WebKitException where
  displayException UnavailableData     = "No data available in the web frame."
  displayException UnavailableFavicon  = "No available favicon."
  displayException UnavailableFileName = "No file name available."
  displayException UnavailableTitle    = "No available title."
  displayException UnavailableUri      = "No URI available."