{- |
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.ScriptWorld
    ( 

-- * Exported types
    ScriptWorld(..)                         ,
    IsScriptWorld                           ,
    toScriptWorld                           ,
    noScriptWorld                           ,


 -- * Methods
-- ** getDefault #method:getDefault#
    scriptWorldGetDefault                   ,


-- ** new #method:new#
    scriptWorldNew                          ,




 -- * Signals
-- ** windowObjectCleared #signal:windowObjectCleared#
    C_ScriptWorldWindowObjectClearedCallback,
    ScriptWorldWindowObjectClearedCallback  ,
    ScriptWorldWindowObjectClearedSignalInfo,
    afterScriptWorldWindowObjectCleared     ,
    genClosure_ScriptWorldWindowObjectCleared,
    mk_ScriptWorldWindowObjectClearedCallback,
    noScriptWorldWindowObjectClearedCallback,
    onScriptWorldWindowObjectCleared        ,
    wrap_ScriptWorldWindowObjectClearedCallback,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP

import qualified GI.GObject.Objects.Object as GObject.Object
import {-# SOURCE #-} qualified GI.WebKit2WebExtension.Objects.Frame as WebKit2WebExtension.Frame
import {-# SOURCE #-} qualified GI.WebKit2WebExtension.Objects.WebPage as WebKit2WebExtension.WebPage

newtype ScriptWorld = ScriptWorld (ManagedPtr ScriptWorld)
foreign import ccall "webkit_script_world_get_type"
    c_webkit_script_world_get_type :: IO GType

instance GObject ScriptWorld where
    gobjectType _ = c_webkit_script_world_get_type
    

class GObject o => IsScriptWorld o
#if MIN_VERSION_base(4,9,0)
instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError ScriptWorld a) =>
    IsScriptWorld a
#endif
instance IsScriptWorld ScriptWorld
instance GObject.Object.IsObject ScriptWorld

toScriptWorld :: IsScriptWorld o => o -> IO ScriptWorld
toScriptWorld = unsafeCastTo ScriptWorld

noScriptWorld :: Maybe ScriptWorld
noScriptWorld = Nothing

type family ResolveScriptWorldMethod (t :: Symbol) (o :: *) :: * where
    ResolveScriptWorldMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveScriptWorldMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveScriptWorldMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveScriptWorldMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveScriptWorldMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveScriptWorldMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveScriptWorldMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveScriptWorldMethod "ref" o = GObject.Object.ObjectRefMethodInfo
    ResolveScriptWorldMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveScriptWorldMethod "replaceData" o = GObject.Object.ObjectReplaceDataMethodInfo
    ResolveScriptWorldMethod "replaceQdata" o = GObject.Object.ObjectReplaceQdataMethodInfo
    ResolveScriptWorldMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveScriptWorldMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveScriptWorldMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveScriptWorldMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveScriptWorldMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
    ResolveScriptWorldMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveScriptWorldMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveScriptWorldMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveScriptWorldMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveScriptWorldMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveScriptWorldMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveScriptWorldMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveScriptWorldMethod t ScriptWorld, O.MethodInfo info ScriptWorld p) => O.IsLabelProxy t (ScriptWorld -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveScriptWorldMethod t ScriptWorld, O.MethodInfo info ScriptWorld p) => O.IsLabel t (ScriptWorld -> p) where
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif

-- signal ScriptWorld::window-object-cleared
type ScriptWorldWindowObjectClearedCallback =
    WebKit2WebExtension.WebPage.WebPage ->
    WebKit2WebExtension.Frame.Frame ->
    IO ()

noScriptWorldWindowObjectClearedCallback :: Maybe ScriptWorldWindowObjectClearedCallback
noScriptWorldWindowObjectClearedCallback = Nothing

type C_ScriptWorldWindowObjectClearedCallback =
    Ptr () ->                               -- object
    Ptr WebKit2WebExtension.WebPage.WebPage ->
    Ptr WebKit2WebExtension.Frame.Frame ->
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mk_ScriptWorldWindowObjectClearedCallback :: C_ScriptWorldWindowObjectClearedCallback -> IO (FunPtr C_ScriptWorldWindowObjectClearedCallback)

genClosure_ScriptWorldWindowObjectCleared :: ScriptWorldWindowObjectClearedCallback -> IO Closure
genClosure_ScriptWorldWindowObjectCleared cb = do
    let cb' = wrap_ScriptWorldWindowObjectClearedCallback cb
    mk_ScriptWorldWindowObjectClearedCallback cb' >>= newCClosure


wrap_ScriptWorldWindowObjectClearedCallback ::
    ScriptWorldWindowObjectClearedCallback ->
    Ptr () ->
    Ptr WebKit2WebExtension.WebPage.WebPage ->
    Ptr WebKit2WebExtension.Frame.Frame ->
    Ptr () ->
    IO ()
wrap_ScriptWorldWindowObjectClearedCallback _cb _ page frame _ = do
    page' <- (newObject WebKit2WebExtension.WebPage.WebPage) page
    frame' <- (newObject WebKit2WebExtension.Frame.Frame) frame
    _cb  page' frame'


onScriptWorldWindowObjectCleared :: (IsScriptWorld a, MonadIO m) => a -> ScriptWorldWindowObjectClearedCallback -> m SignalHandlerId
onScriptWorldWindowObjectCleared obj cb = liftIO $ do
    let cb' = wrap_ScriptWorldWindowObjectClearedCallback cb
    cb'' <- mk_ScriptWorldWindowObjectClearedCallback cb'
    connectSignalFunPtr obj "window-object-cleared" cb'' SignalConnectBefore

afterScriptWorldWindowObjectCleared :: (IsScriptWorld a, MonadIO m) => a -> ScriptWorldWindowObjectClearedCallback -> m SignalHandlerId
afterScriptWorldWindowObjectCleared obj cb = liftIO $ do
    let cb' = wrap_ScriptWorldWindowObjectClearedCallback cb
    cb'' <- mk_ScriptWorldWindowObjectClearedCallback cb'
    connectSignalFunPtr obj "window-object-cleared" cb'' SignalConnectAfter


instance O.HasAttributeList ScriptWorld
type instance O.AttributeList ScriptWorld = ScriptWorldAttributeList
type ScriptWorldAttributeList = ('[ ] :: [(Symbol, *)])

data ScriptWorldWindowObjectClearedSignalInfo
instance SignalInfo ScriptWorldWindowObjectClearedSignalInfo where
    type HaskellCallbackType ScriptWorldWindowObjectClearedSignalInfo = ScriptWorldWindowObjectClearedCallback
    connectSignal _ obj cb connectMode = do
        let cb' = wrap_ScriptWorldWindowObjectClearedCallback cb
        cb'' <- mk_ScriptWorldWindowObjectClearedCallback cb'
        connectSignalFunPtr obj "window-object-cleared" cb'' connectMode

type instance O.SignalList ScriptWorld = ScriptWorldSignalList
type ScriptWorldSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo), '("windowObjectCleared", ScriptWorldWindowObjectClearedSignalInfo)] :: [(Symbol, *)])

-- method ScriptWorld::new
-- method type : Constructor
-- Args : []
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "WebKit2WebExtension", name = "ScriptWorld"}))
-- throws : False
-- Skip return : False

foreign import ccall "webkit_script_world_new" webkit_script_world_new :: 
    IO (Ptr ScriptWorld)

{- |
Creates a new isolated 'GI.WebKit2WebExtension.Objects.ScriptWorld.ScriptWorld'. Scripts executed in
isolated worlds have access to the DOM but not to other variable
or functions created by the page.
You can get the JavaScript execution context of a 'GI.WebKit2WebExtension.Objects.ScriptWorld.ScriptWorld'
for a given 'GI.WebKit2WebExtension.Objects.Frame.Frame' with 'GI.WebKit2WebExtension.Objects.Frame.frameGetJavascriptContextForScriptWorld'.

@since 2.2
-}
scriptWorldNew ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m ScriptWorld
    {- ^ __Returns:__ a new isolated 'GI.WebKit2WebExtension.Objects.ScriptWorld.ScriptWorld' -}
scriptWorldNew  = liftIO $ do
    result <- webkit_script_world_new
    checkUnexpectedReturnNULL "scriptWorldNew" result
    result' <- (wrapObject ScriptWorld) result
    return result'

-- method ScriptWorld::get_default
-- method type : MemberFunction
-- Args : []
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "WebKit2WebExtension", name = "ScriptWorld"}))
-- throws : False
-- Skip return : False

foreign import ccall "webkit_script_world_get_default" webkit_script_world_get_default :: 
    IO (Ptr ScriptWorld)

{- |
Get the default 'GI.WebKit2WebExtension.Objects.ScriptWorld.ScriptWorld'. This is the normal script world
where all scripts are executed by default.
You can get the JavaScript execution context of a 'GI.WebKit2WebExtension.Objects.ScriptWorld.ScriptWorld'
for a given 'GI.WebKit2WebExtension.Objects.Frame.Frame' with 'GI.WebKit2WebExtension.Objects.Frame.frameGetJavascriptContextForScriptWorld'.

@since 2.2
-}
scriptWorldGetDefault ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m ScriptWorld
    {- ^ __Returns:__ the default 'GI.WebKit2WebExtension.Objects.ScriptWorld.ScriptWorld' -}
scriptWorldGetDefault  = liftIO $ do
    result <- webkit_script_world_get_default
    checkUnexpectedReturnNULL "scriptWorldGetDefault" result
    result' <- (newObject ScriptWorld) result
    return result'