8331875190eea98371bfb6eeec00755b92ff9a82
[WebKit-https.git] / Source / WebCore / bindings / js / JSMockContentFilterSettingsCustom.cpp
1 /*
2  * Copyright (C) 2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "JSMockContentFilterSettings.h"
28
29 #if ENABLE(CONTENT_FILTERING)
30
31 #include "JSDOMBinding.h"
32 #include "MockContentFilterSettings.h"
33
34 using namespace JSC;
35
36 namespace WebCore {
37
38 using Decision = MockContentFilterSettings::Decision;
39 using DecisionPoint = MockContentFilterSettings::DecisionPoint;
40
41 // Must be kept in sync with values in MockContentFilterSettings.idl.
42 const uint8_t decisionPointAfterWillSendRequest = 0;
43 const uint8_t decisionPointAfterRedirect = 1;
44 const uint8_t decisionPointAfterResponse = 2;
45 const uint8_t decisionPointAfterAddData = 3;
46 const uint8_t decisionPointAfterFinishedAddingData = 4;
47 const uint8_t decisionAllow = 0;
48 const uint8_t decisionBlock = 1;
49
50 JSValue JSMockContentFilterSettings::decisionPoint(ExecState*) const
51 {
52     switch (impl().decisionPoint()) {
53     case DecisionPoint::AfterWillSendRequest:
54         return jsNumber(decisionPointAfterWillSendRequest);
55     case DecisionPoint::AfterRedirect:
56         return jsNumber(decisionPointAfterRedirect);
57     case DecisionPoint::AfterResponse:
58         return jsNumber(decisionPointAfterResponse);
59     case DecisionPoint::AfterAddData:
60         return jsNumber(decisionPointAfterAddData);
61     case DecisionPoint::AfterFinishedAddingData:
62         return jsNumber(decisionPointAfterFinishedAddingData);
63     }
64
65     ASSERT_NOT_REACHED();
66     return jsUndefined();
67 }
68
69 void JSMockContentFilterSettings::setDecisionPoint(ExecState* exec, JSValue value)
70 {
71     uint8_t nativeValue { toUInt8(exec, value, EnforceRange) };
72     if (exec->hadException())
73         return;
74
75     switch (nativeValue) {
76     case decisionPointAfterWillSendRequest:
77         impl().setDecisionPoint(DecisionPoint::AfterWillSendRequest);
78         return;
79     case decisionPointAfterRedirect:
80         impl().setDecisionPoint(DecisionPoint::AfterRedirect);
81         return;
82     case decisionPointAfterResponse:
83         impl().setDecisionPoint(DecisionPoint::AfterResponse);
84         return;
85     case decisionPointAfterAddData:
86         impl().setDecisionPoint(DecisionPoint::AfterAddData);
87         return;
88     case decisionPointAfterFinishedAddingData:
89         impl().setDecisionPoint(DecisionPoint::AfterFinishedAddingData);
90         return;
91     }
92
93     throwTypeError(exec, String::format("%u is not a valid decisionPoint value.", nativeValue));
94 }
95
96 static inline JSValue toJSValue(Decision decision)
97 {
98     switch (decision) {
99     case Decision::Allow:
100         return jsNumber(decisionAllow);
101     case Decision::Block:
102         return jsNumber(decisionBlock);
103     }
104
105     ASSERT_NOT_REACHED();
106     return jsUndefined();
107 }
108
109 static inline Decision toDecision(ExecState* exec, JSValue value)
110 {
111     uint8_t nativeValue { toUInt8(exec, value, EnforceRange) };
112     if (exec->hadException())
113         return Decision::Allow;
114
115     switch (nativeValue) {
116     case decisionAllow:
117         return Decision::Allow;
118     case decisionBlock:
119         return Decision::Block;
120     }
121
122     throwTypeError(exec, String::format("%u is not a valid decision value.", nativeValue));
123     return Decision::Allow;
124 }
125
126 JSValue JSMockContentFilterSettings::decision(ExecState*) const
127 {
128     return toJSValue(impl().decision());
129 }
130
131 void JSMockContentFilterSettings::setDecision(ExecState* exec, JSValue value)
132 {
133     Decision decision { toDecision(exec, value) };
134     if (exec->hadException())
135         return;
136
137     impl().setDecision(decision);
138 }
139
140 JSValue JSMockContentFilterSettings::unblockRequestDecision(ExecState*) const
141 {
142     return toJSValue(impl().unblockRequestDecision());
143 }
144
145 void JSMockContentFilterSettings::setUnblockRequestDecision(ExecState* exec, JSValue value)
146 {
147     Decision unblockRequestDecision { toDecision(exec, value) };
148     if (exec->hadException())
149         return;
150
151     impl().setUnblockRequestDecision(unblockRequestDecision);
152 }
153
154 }; // namespace WebCore
155
156 #endif // ENABLE(CONTENT_FILTERING)