use std::ffi::{c_char, c_double, c_void};
use std::ptr;
use libc;
use libc::c_uint;
use crate::document::{Document, DocumentRustMethods};
use crate::event_target::EventTargetMethods;
use crate::exception_state::{ExceptionState, ExceptionStateRustMethods};
use crate::{OpaquePtr, RustValue};
use crate::window::{Window, WindowRustMethods};
#[repr(C)]
pub struct ExecutingContextRustMethods {
pub version: c_double,
pub get_document: extern "C" fn(*const OpaquePtr) -> RustValue<DocumentRustMethods>,
pub get_window: extern "C" fn(*const OpaquePtr) -> RustValue<WindowRustMethods>,
pub create_exception_state: extern "C" fn() -> RustValue<ExceptionStateRustMethods>,
}
pub struct ExecutingContext {
pub ptr: *const OpaquePtr,
method_pointer: *const ExecutingContextRustMethods,
}
impl ExecutingContext {
pub fn initialize(ptr: *const OpaquePtr, method_pointer: *const ExecutingContextRustMethods) -> ExecutingContext {
ExecutingContext {
ptr,
method_pointer
}
}
pub fn window(&self) -> Window {
let result = unsafe {
((*self.method_pointer).get_window)(self.ptr)
};
return Window::initialize(result.value, result.method_pointer);
}
pub fn document(&self) -> Document {
let result = unsafe {
((*self.method_pointer).get_document)(self.ptr)
};
return Document::initialize::<DocumentRustMethods>(result.value, self, result.method_pointer);
}
pub fn create_exception_state(&self) -> ExceptionState {
let result = unsafe {
((*self.method_pointer).create_exception_state)()
};
ExceptionState::initialize(result.value, result.method_pointer)
}
}