mirror of
https://github.com/robertkrimen/otto
synced 2025-10-19 19:55:30 +08:00
Make decodeURI correspond to the 15.1.3.1 algorithm and decodeURIComponent ito 15.1.3.2
This commit is contained in:
parent
149f94f9fb
commit
83d4565b22
31
builtin.go
31
builtin.go
|
|
@ -177,12 +177,35 @@ func builtinGlobal_encodeURIComponent(call FunctionCall) Value {
|
||||||
return _builtinGlobal_encodeURI(call, encodeURIComponent_Regexp)
|
return _builtinGlobal_encodeURI(call, encodeURIComponent_Regexp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func builtinGlobal_decodeURI_decodeURIComponent(call FunctionCall) Value {
|
// 3B/2F/3F/3A/40/26/3D/2B/24/2C/23
|
||||||
value, err := url.QueryUnescape(toString(call.Argument(0)))
|
var decodeURI_guard = regexp.MustCompile(`(?i)(?:%)(3B|2F|3F|3A|40|26|3D|2B|24|2C|23)`)
|
||||||
if err != nil {
|
|
||||||
|
func _decodeURI(input string, reserve bool) (string, bool) {
|
||||||
|
if reserve {
|
||||||
|
input = decodeURI_guard.ReplaceAllString(input, "%25$1")
|
||||||
|
}
|
||||||
|
input = strings.Replace(input, "+", "%2B", -1) // Ugly hack to make QueryUnescape work with our use case
|
||||||
|
output, err := url.QueryUnescape(input)
|
||||||
|
if err != nil || !utf8.ValidString(output) {
|
||||||
|
return "", true
|
||||||
|
}
|
||||||
|
return output, false
|
||||||
|
}
|
||||||
|
|
||||||
|
func builtinGlobal_decodeURI(call FunctionCall) Value {
|
||||||
|
output, err := _decodeURI(toString(call.Argument(0)), true)
|
||||||
|
if err {
|
||||||
panic(newURIError("URI malformed"))
|
panic(newURIError("URI malformed"))
|
||||||
}
|
}
|
||||||
return toValue(value)
|
return toValue(output)
|
||||||
|
}
|
||||||
|
|
||||||
|
func builtinGlobal_decodeURIComponent(call FunctionCall) Value {
|
||||||
|
output, err := _decodeURI(toString(call.Argument(0)), false)
|
||||||
|
if err {
|
||||||
|
panic(newURIError("URI malformed"))
|
||||||
|
}
|
||||||
|
return toValue(output)
|
||||||
}
|
}
|
||||||
|
|
||||||
// escape/unescape
|
// escape/unescape
|
||||||
|
|
|
||||||
|
|
@ -706,8 +706,8 @@ func newContext() *_runtime {
|
||||||
"parseFloat", -1, builtinGlobal_parseFloat,
|
"parseFloat", -1, builtinGlobal_parseFloat,
|
||||||
"isNaN", -1, builtinGlobal_isNaN,
|
"isNaN", -1, builtinGlobal_isNaN,
|
||||||
"isFinite", -1, builtinGlobal_isFinite,
|
"isFinite", -1, builtinGlobal_isFinite,
|
||||||
"decodeURI", builtinGlobal_decodeURI_decodeURIComponent,
|
"decodeURI", -1, builtinGlobal_decodeURI,
|
||||||
"decodeURIComponent", builtinGlobal_decodeURI_decodeURIComponent,
|
"decodeURIComponent", -1, builtinGlobal_decodeURIComponent,
|
||||||
"encodeURI", builtinGlobal_encodeURI,
|
"encodeURI", builtinGlobal_encodeURI,
|
||||||
"encodeURIComponent", builtinGlobal_encodeURIComponent,
|
"encodeURIComponent", builtinGlobal_encodeURIComponent,
|
||||||
"escape", builtinGlobal_escape,
|
"escape", builtinGlobal_escape,
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ package otto
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "./terst"
|
. "./terst"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -190,6 +192,13 @@ func Test_decodeURI(t *testing.T) {
|
||||||
test(`decodeURI(encodeURI("http://example.com/ Nothing happens."))`, "http://example.com/ Nothing happens.")
|
test(`decodeURI(encodeURI("http://example.com/ Nothing happens."))`, "http://example.com/ Nothing happens.")
|
||||||
test(`decodeURI(encodeURI("http://example.com/ _^#"))`, "http://example.com/ _^#")
|
test(`decodeURI(encodeURI("http://example.com/ _^#"))`, "http://example.com/ _^#")
|
||||||
test(`raise: decodeURI("http://example.com/ _^#%")`, "URIError: URI malformed")
|
test(`raise: decodeURI("http://example.com/ _^#%")`, "URIError: URI malformed")
|
||||||
|
test(`raise: decodeURI("%DF%7F")`, "URIError: URI malformed")
|
||||||
|
for _, check := range strings.Fields("+ %3B %2F %3F %3A %40 %26 %3D %2B %24 %2C %23") {
|
||||||
|
test(fmt.Sprintf(`decodeURI("%s")`, check), check)
|
||||||
|
}
|
||||||
|
|
||||||
|
test(`decodeURI.length === 1`, "true")
|
||||||
|
test(`decodeURI.prototype === undefined`, "true")
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_decodeURIComponent(t *testing.T) {
|
func Test_decodeURIComponent(t *testing.T) {
|
||||||
|
|
@ -198,6 +207,9 @@ func Test_decodeURIComponent(t *testing.T) {
|
||||||
test := runTest()
|
test := runTest()
|
||||||
test(`decodeURIComponent(encodeURI("http://example.com/ Nothing happens."))`, "http://example.com/ Nothing happens.")
|
test(`decodeURIComponent(encodeURI("http://example.com/ Nothing happens."))`, "http://example.com/ Nothing happens.")
|
||||||
test(`decodeURIComponent(encodeURI("http://example.com/ _^#"))`, "http://example.com/ _^#")
|
test(`decodeURIComponent(encodeURI("http://example.com/ _^#"))`, "http://example.com/ _^#")
|
||||||
|
|
||||||
|
test(`decodeURIComponent.length === 1`, "true")
|
||||||
|
test(`decodeURIComponent.prototype === undefined`, "true")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGlobal_skipEnumeration(t *testing.T) {
|
func TestGlobal_skipEnumeration(t *testing.T) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user