{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)
-}

module GI.WebKit2WebExtension.Objects.WebPage
    ( 

-- * Exported types
    WebPage(..)                             ,
    WebPageK                                ,
    toWebPage                               ,
    noWebPage                               ,


 -- * Methods
-- ** webPageGetDomDocument
    webPageGetDomDocument                   ,


-- ** webPageGetEditor
    webPageGetEditor                        ,


-- ** webPageGetId
    webPageGetId                            ,


-- ** webPageGetMainFrame
    webPageGetMainFrame                     ,


-- ** webPageGetUri
    webPageGetUri                           ,




 -- * Properties
-- ** Uri
    WebPageUriPropertyInfo                  ,
    getWebPageUri                           ,




 -- * Signals
-- ** ContextMenu
    WebPageContextMenuCallback              ,
    WebPageContextMenuCallbackC             ,
    WebPageContextMenuSignalInfo            ,
    afterWebPageContextMenu                 ,
    mkWebPageContextMenuCallback            ,
    noWebPageContextMenuCallback            ,
    onWebPageContextMenu                    ,
    webPageContextMenuCallbackWrapper       ,
    webPageContextMenuClosure               ,


-- ** DocumentLoaded
    WebPageDocumentLoadedCallback           ,
    WebPageDocumentLoadedCallbackC          ,
    WebPageDocumentLoadedSignalInfo         ,
    afterWebPageDocumentLoaded              ,
    mkWebPageDocumentLoadedCallback         ,
    noWebPageDocumentLoadedCallback         ,
    onWebPageDocumentLoaded                 ,
    webPageDocumentLoadedCallbackWrapper    ,
    webPageDocumentLoadedClosure            ,


-- ** SendRequest
    WebPageSendRequestCallback              ,
    WebPageSendRequestCallbackC             ,
    WebPageSendRequestSignalInfo            ,
    afterWebPageSendRequest                 ,
    mkWebPageSendRequestCallback            ,
    noWebPageSendRequestCallback            ,
    onWebPageSendRequest                    ,
    webPageSendRequestCallbackWrapper       ,
    webPageSendRequestClosure               ,




    ) where

import Prelude ()
import Data.GI.Base.ShortPrelude

import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map

import GI.WebKit2WebExtension.Types
import GI.WebKit2WebExtension.Callbacks
import qualified GI.GObject as GObject

newtype WebPage = WebPage (ForeignPtr WebPage)
foreign import ccall "webkit_web_page_get_type"
    c_webkit_web_page_get_type :: IO GType

type instance ParentTypes WebPage = WebPageParentTypes
type WebPageParentTypes = '[GObject.Object]

instance GObject WebPage where
    gobjectIsInitiallyUnowned _ = False
    gobjectType _ = c_webkit_web_page_get_type
    

class GObject o => WebPageK o
instance (GObject o, IsDescendantOf WebPage o) => WebPageK o

toWebPage :: WebPageK o => o -> IO WebPage
toWebPage = unsafeCastTo WebPage

noWebPage :: Maybe WebPage
noWebPage = Nothing

-- signal WebPage::context-menu
type WebPageContextMenuCallback =
    ContextMenu ->
    WebHitTestResult ->
    IO Bool

noWebPageContextMenuCallback :: Maybe WebPageContextMenuCallback
noWebPageContextMenuCallback = Nothing

type WebPageContextMenuCallbackC =
    Ptr () ->                               -- object
    Ptr ContextMenu ->
    Ptr WebHitTestResult ->
    Ptr () ->                               -- user_data
    IO CInt

foreign import ccall "wrapper"
    mkWebPageContextMenuCallback :: WebPageContextMenuCallbackC -> IO (FunPtr WebPageContextMenuCallbackC)

webPageContextMenuClosure :: WebPageContextMenuCallback -> IO Closure
webPageContextMenuClosure cb = newCClosure =<< mkWebPageContextMenuCallback wrapped
    where wrapped = webPageContextMenuCallbackWrapper cb

webPageContextMenuCallbackWrapper ::
    WebPageContextMenuCallback ->
    Ptr () ->
    Ptr ContextMenu ->
    Ptr WebHitTestResult ->
    Ptr () ->
    IO CInt
webPageContextMenuCallbackWrapper _cb _ context_menu hit_test_result _ = do
    context_menu' <- (newObject ContextMenu) context_menu
    hit_test_result' <- (newObject WebHitTestResult) hit_test_result
    result <- _cb  context_menu' hit_test_result'
    let result' = (fromIntegral . fromEnum) result
    return result'

onWebPageContextMenu :: (GObject a, MonadIO m) => a -> WebPageContextMenuCallback -> m SignalHandlerId
onWebPageContextMenu obj cb = liftIO $ connectWebPageContextMenu obj cb SignalConnectBefore
afterWebPageContextMenu :: (GObject a, MonadIO m) => a -> WebPageContextMenuCallback -> m SignalHandlerId
afterWebPageContextMenu obj cb = connectWebPageContextMenu obj cb SignalConnectAfter

connectWebPageContextMenu :: (GObject a, MonadIO m) =>
                             a -> WebPageContextMenuCallback -> SignalConnectMode -> m SignalHandlerId
connectWebPageContextMenu obj cb after = liftIO $ do
    cb' <- mkWebPageContextMenuCallback (webPageContextMenuCallbackWrapper cb)
    connectSignalFunPtr obj "context-menu" cb' after

-- signal WebPage::document-loaded
type WebPageDocumentLoadedCallback =
    IO ()

noWebPageDocumentLoadedCallback :: Maybe WebPageDocumentLoadedCallback
noWebPageDocumentLoadedCallback = Nothing

type WebPageDocumentLoadedCallbackC =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkWebPageDocumentLoadedCallback :: WebPageDocumentLoadedCallbackC -> IO (FunPtr WebPageDocumentLoadedCallbackC)

webPageDocumentLoadedClosure :: WebPageDocumentLoadedCallback -> IO Closure
webPageDocumentLoadedClosure cb = newCClosure =<< mkWebPageDocumentLoadedCallback wrapped
    where wrapped = webPageDocumentLoadedCallbackWrapper cb

webPageDocumentLoadedCallbackWrapper ::
    WebPageDocumentLoadedCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
webPageDocumentLoadedCallbackWrapper _cb _ _ = do
    _cb 

onWebPageDocumentLoaded :: (GObject a, MonadIO m) => a -> WebPageDocumentLoadedCallback -> m SignalHandlerId
onWebPageDocumentLoaded obj cb = liftIO $ connectWebPageDocumentLoaded obj cb SignalConnectBefore
afterWebPageDocumentLoaded :: (GObject a, MonadIO m) => a -> WebPageDocumentLoadedCallback -> m SignalHandlerId
afterWebPageDocumentLoaded obj cb = connectWebPageDocumentLoaded obj cb SignalConnectAfter

connectWebPageDocumentLoaded :: (GObject a, MonadIO m) =>
                                a -> WebPageDocumentLoadedCallback -> SignalConnectMode -> m SignalHandlerId
connectWebPageDocumentLoaded obj cb after = liftIO $ do
    cb' <- mkWebPageDocumentLoadedCallback (webPageDocumentLoadedCallbackWrapper cb)
    connectSignalFunPtr obj "document-loaded" cb' after

-- signal WebPage::send-request
type WebPageSendRequestCallback =
    URIRequest ->
    URIResponse ->
    IO Bool

noWebPageSendRequestCallback :: Maybe WebPageSendRequestCallback
noWebPageSendRequestCallback = Nothing

type WebPageSendRequestCallbackC =
    Ptr () ->                               -- object
    Ptr URIRequest ->
    Ptr URIResponse ->
    Ptr () ->                               -- user_data
    IO CInt

foreign import ccall "wrapper"
    mkWebPageSendRequestCallback :: WebPageSendRequestCallbackC -> IO (FunPtr WebPageSendRequestCallbackC)

webPageSendRequestClosure :: WebPageSendRequestCallback -> IO Closure
webPageSendRequestClosure cb = newCClosure =<< mkWebPageSendRequestCallback wrapped
    where wrapped = webPageSendRequestCallbackWrapper cb

webPageSendRequestCallbackWrapper ::
    WebPageSendRequestCallback ->
    Ptr () ->
    Ptr URIRequest ->
    Ptr URIResponse ->
    Ptr () ->
    IO CInt
webPageSendRequestCallbackWrapper _cb _ request redirected_response _ = do
    request' <- (newObject URIRequest) request
    redirected_response' <- (newObject URIResponse) redirected_response
    result <- _cb  request' redirected_response'
    let result' = (fromIntegral . fromEnum) result
    return result'

onWebPageSendRequest :: (GObject a, MonadIO m) => a -> WebPageSendRequestCallback -> m SignalHandlerId
onWebPageSendRequest obj cb = liftIO $ connectWebPageSendRequest obj cb SignalConnectBefore
afterWebPageSendRequest :: (GObject a, MonadIO m) => a -> WebPageSendRequestCallback -> m SignalHandlerId
afterWebPageSendRequest obj cb = connectWebPageSendRequest obj cb SignalConnectAfter

connectWebPageSendRequest :: (GObject a, MonadIO m) =>
                             a -> WebPageSendRequestCallback -> SignalConnectMode -> m SignalHandlerId
connectWebPageSendRequest obj cb after = liftIO $ do
    cb' <- mkWebPageSendRequestCallback (webPageSendRequestCallbackWrapper cb)
    connectSignalFunPtr obj "send-request" cb' after

-- VVV Prop "uri"
   -- Type: TBasicType TUTF8
   -- Flags: [PropertyReadable]

getWebPageUri :: (MonadIO m, WebPageK o) => o -> m T.Text
getWebPageUri obj = liftIO $ getObjectPropertyString obj "uri"

data WebPageUriPropertyInfo
instance AttrInfo WebPageUriPropertyInfo where
    type AttrAllowedOps WebPageUriPropertyInfo = '[ 'AttrGet]
    type AttrSetTypeConstraint WebPageUriPropertyInfo = (~) ()
    type AttrBaseTypeConstraint WebPageUriPropertyInfo = WebPageK
    type AttrGetType WebPageUriPropertyInfo = T.Text
    type AttrLabel WebPageUriPropertyInfo = "WebPage::uri"
    attrGet _ = getWebPageUri
    attrSet _ = undefined
    attrConstruct _ = undefined

type instance AttributeList WebPage = WebPageAttributeList
type WebPageAttributeList = ('[ '("uri", WebPageUriPropertyInfo)] :: [(Symbol, *)])

data WebPageContextMenuSignalInfo
instance SignalInfo WebPageContextMenuSignalInfo where
    type HaskellCallbackType WebPageContextMenuSignalInfo = WebPageContextMenuCallback
    connectSignal _ = connectWebPageContextMenu

data WebPageDocumentLoadedSignalInfo
instance SignalInfo WebPageDocumentLoadedSignalInfo where
    type HaskellCallbackType WebPageDocumentLoadedSignalInfo = WebPageDocumentLoadedCallback
    connectSignal _ = connectWebPageDocumentLoaded

data WebPageSendRequestSignalInfo
instance SignalInfo WebPageSendRequestSignalInfo where
    type HaskellCallbackType WebPageSendRequestSignalInfo = WebPageSendRequestCallback
    connectSignal _ = connectWebPageSendRequest

type instance SignalList WebPage = WebPageSignalList
type WebPageSignalList = ('[ '("context-menu", WebPageContextMenuSignalInfo), '("document-loaded", WebPageDocumentLoadedSignalInfo), '("notify", GObject.ObjectNotifySignalInfo), '("send-request", WebPageSendRequestSignalInfo), '("notify::[property]", GObjectNotifySignalInfo)] :: [(Symbol, *)])

-- method WebPage::get_dom_document
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit2WebExtension" "WebPage", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit2WebExtension" "WebPage", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "WebKit2WebExtension" "DOMDocument"
-- throws : False
-- Skip return : False

foreign import ccall "webkit_web_page_get_dom_document" webkit_web_page_get_dom_document :: 
    Ptr WebPage ->                          -- _obj : TInterface "WebKit2WebExtension" "WebPage"
    IO (Ptr DOMDocument)


webPageGetDomDocument ::
    (MonadIO m, WebPageK a) =>
    a ->                                    -- _obj
    m DOMDocument
webPageGetDomDocument _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- webkit_web_page_get_dom_document _obj'
    checkUnexpectedReturnNULL "webkit_web_page_get_dom_document" result
    result' <- (newObject DOMDocument) result
    touchManagedPtr _obj
    return result'

-- method WebPage::get_editor
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit2WebExtension" "WebPage", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit2WebExtension" "WebPage", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "WebKit2WebExtension" "WebEditor"
-- throws : False
-- Skip return : False

foreign import ccall "webkit_web_page_get_editor" webkit_web_page_get_editor :: 
    Ptr WebPage ->                          -- _obj : TInterface "WebKit2WebExtension" "WebPage"
    IO (Ptr WebEditor)


webPageGetEditor ::
    (MonadIO m, WebPageK a) =>
    a ->                                    -- _obj
    m WebEditor
webPageGetEditor _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- webkit_web_page_get_editor _obj'
    checkUnexpectedReturnNULL "webkit_web_page_get_editor" result
    result' <- (newObject WebEditor) result
    touchManagedPtr _obj
    return result'

-- method WebPage::get_id
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit2WebExtension" "WebPage", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit2WebExtension" "WebPage", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TUInt64
-- throws : False
-- Skip return : False

foreign import ccall "webkit_web_page_get_id" webkit_web_page_get_id :: 
    Ptr WebPage ->                          -- _obj : TInterface "WebKit2WebExtension" "WebPage"
    IO Word64


webPageGetId ::
    (MonadIO m, WebPageK a) =>
    a ->                                    -- _obj
    m Word64
webPageGetId _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- webkit_web_page_get_id _obj'
    touchManagedPtr _obj
    return result

-- method WebPage::get_main_frame
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit2WebExtension" "WebPage", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit2WebExtension" "WebPage", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "WebKit2WebExtension" "Frame"
-- throws : False
-- Skip return : False

foreign import ccall "webkit_web_page_get_main_frame" webkit_web_page_get_main_frame :: 
    Ptr WebPage ->                          -- _obj : TInterface "WebKit2WebExtension" "WebPage"
    IO (Ptr Frame)


webPageGetMainFrame ::
    (MonadIO m, WebPageK a) =>
    a ->                                    -- _obj
    m Frame
webPageGetMainFrame _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- webkit_web_page_get_main_frame _obj'
    checkUnexpectedReturnNULL "webkit_web_page_get_main_frame" result
    result' <- (newObject Frame) result
    touchManagedPtr _obj
    return result'

-- method WebPage::get_uri
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "WebKit2WebExtension" "WebPage", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "WebKit2WebExtension" "WebPage", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TUTF8
-- throws : False
-- Skip return : False

foreign import ccall "webkit_web_page_get_uri" webkit_web_page_get_uri :: 
    Ptr WebPage ->                          -- _obj : TInterface "WebKit2WebExtension" "WebPage"
    IO CString


webPageGetUri ::
    (MonadIO m, WebPageK a) =>
    a ->                                    -- _obj
    m T.Text
webPageGetUri _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- webkit_web_page_get_uri _obj'
    checkUnexpectedReturnNULL "webkit_web_page_get_uri" result
    result' <- cstringToText result
    touchManagedPtr _obj
    return result'