1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//! Various enums used throughout the `webview` module.

use crate::foundation::NSInteger;

/// Describes a navigation type from within the `WebView`.
#[derive(Clone, Copy, Debug)]
pub enum NavigationType {
    /// A user activated a link.
    LinkActivated,

    /// A user submitted a form.
    FormSubmitted,

    /// A user went backwards or fowards.
    BackForward,

    /// A user reloaded the webview.
    Reload,

    /// A user resubmitted a form.
    FormResubmitted,

    /// Other.
    Other
}

// For whatever reason, impl From<> below doesn't generate the reciprocal impl Into<> we need.
// So I guess we'll do it ourselves.
//
// This panic will be removed and is for testing purposes only right now.
impl Into<NavigationType> for NSInteger {
    fn into(self) -> NavigationType {
        match self {
            -1 => NavigationType::Other,
            0 => NavigationType::LinkActivated,
            1 => NavigationType::FormSubmitted,
            2 => NavigationType::BackForward,
            3 => NavigationType::Reload,
            4 => NavigationType::FormResubmitted,
            _ => {
                panic!("Unsupported WKWebView NavigationType value found!");
            }
        }
    }
}

impl From<NavigationType> for NSInteger {
    fn from(nav_type: NavigationType) -> Self {
        match nav_type {
            NavigationType::Other => -1,
            NavigationType::LinkActivated => 0,
            NavigationType::FormSubmitted => 1,
            NavigationType::BackForward => 2,
            NavigationType::Reload => 3,
            NavigationType::FormResubmitted => 4
        }
    }
}

/// Describes the policy for a given navigation.
#[derive(Clone, Copy, Debug)]
pub enum NavigationPolicy {
    /// Should be canceled.
    Cancel,

    /// Allowed.
    Allow
}

impl From<NavigationPolicy> for NSInteger {
    fn from(policy: NavigationPolicy) -> Self {
        match policy {
            NavigationPolicy::Cancel => 0,
            NavigationPolicy::Allow => 1
        }
    }
}

/// Describes a response policy for a given navigation.
#[derive(Clone, Copy, Debug)]
pub enum NavigationResponsePolicy {
    /// Should be canceled.
    Cancel,

    /// Allowed.
    Allow,

    /// This is a private API, and likely won't make it into the App Store. Will only be available
    /// if you opt in via the `webview-downloading` feature.
    #[cfg(feature = "webview-downloading-macos")]
    BecomeDownload
}

impl From<NavigationResponsePolicy> for NSInteger {
    fn from(policy: NavigationResponsePolicy) -> Self {
        match policy {
            NavigationResponsePolicy::Cancel => 0,
            NavigationResponsePolicy::Allow => 1,

            #[cfg(feature = "webview-downloading-macos")]
            NavigationResponsePolicy::BecomeDownload => 2
        }
    }
}

/// Dictates where a given user script should be injected.
#[derive(Clone, Copy, Debug)]
pub enum InjectAt {
    /// Inject at the start of the document.
    Start = 0,

    /// Inject at the end of the document.
    End = 1
}

impl From<InjectAt> for NSInteger {
    fn from(at: InjectAt) -> Self {
        match at {
            InjectAt::Start => 0,
            InjectAt::End => 1
        }
    }
}