mirror of
https://github.com/gotenberg/gotenberg.git
synced 2026-08-17 04:32:15 +01:00
feat(chromium): add 'extraLinkTags' and 'extraScriptTags' form fields, add auto-detection of files for URL endpoint, disable some functionalities if JavaScript is disabled
This commit is contained in:
@@ -3,6 +3,7 @@ package chromium
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
"reflect"
|
||||
@@ -60,7 +61,7 @@ func TestFormDataChromiumPDFOptions(t *testing.T) {
|
||||
_, actual := FormDataChromiumPDFOptions(tc.ctx.Context)
|
||||
|
||||
if !reflect.DeepEqual(actual, tc.options) {
|
||||
t.Errorf("test %d: expected %v but got: %v", i, tc.options, actual)
|
||||
t.Errorf("test %d: expected %+v but got: %+v", i, tc.options, actual)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -137,6 +138,226 @@ func TestConvertURLHandler(t *testing.T) {
|
||||
}(),
|
||||
expectOutputPathsCount: 1,
|
||||
},
|
||||
{
|
||||
ctx: func() *api.MockContext {
|
||||
ctx := &api.MockContext{Context: &api.Context{}}
|
||||
ctx.SetValues(map[string][]string{
|
||||
"url": {
|
||||
"foo",
|
||||
},
|
||||
"extraLinkTags": {
|
||||
"foo",
|
||||
},
|
||||
})
|
||||
|
||||
return ctx
|
||||
}(),
|
||||
api: func() API {
|
||||
chromiumAPI := struct{ ProtoAPI }{}
|
||||
chromiumAPI.pdf = func(_ context.Context, _ *zap.Logger, _, _ string, _ Options) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
return chromiumAPI
|
||||
}(),
|
||||
expectErr: true,
|
||||
expectHTTPErr: true,
|
||||
expectHTTPStatus: http.StatusBadRequest,
|
||||
},
|
||||
{
|
||||
ctx: func() *api.MockContext {
|
||||
ctx := &api.MockContext{Context: &api.Context{}}
|
||||
ctx.SetValues(map[string][]string{
|
||||
"url": {
|
||||
"foo",
|
||||
},
|
||||
})
|
||||
ctx.SetFiles(map[string]string{
|
||||
"b.css": "/b.css",
|
||||
"a.woff": "/a.woff",
|
||||
})
|
||||
|
||||
return ctx
|
||||
}(),
|
||||
api: func() API {
|
||||
chromiumAPI := struct{ ProtoAPI }{}
|
||||
chromiumAPI.pdf = func(_ context.Context, _ *zap.Logger, _, _ string, options Options) error {
|
||||
expectOptions := DefaultOptions()
|
||||
expectOptions.ExtraLinkTags = []LinkTag{
|
||||
{
|
||||
Href: "a.woff",
|
||||
},
|
||||
{
|
||||
Href: "b.css",
|
||||
},
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(options, expectOptions) {
|
||||
return fmt.Errorf("expected options %+v, but got: %+v", expectOptions, options)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
return chromiumAPI
|
||||
}(),
|
||||
expectOutputPathsCount: 1,
|
||||
},
|
||||
{
|
||||
ctx: func() *api.MockContext {
|
||||
ctx := &api.MockContext{Context: &api.Context{}}
|
||||
ctx.SetValues(map[string][]string{
|
||||
"url": {
|
||||
"foo",
|
||||
},
|
||||
"extraLinkTags": {
|
||||
`[{"href":"https://cdn.foo"},{"href":"b.css"}]`,
|
||||
},
|
||||
})
|
||||
ctx.SetFiles(map[string]string{
|
||||
"b.css": "/b.css",
|
||||
"a.woff": "/a.woff",
|
||||
})
|
||||
|
||||
return ctx
|
||||
}(),
|
||||
api: func() API {
|
||||
chromiumAPI := struct{ ProtoAPI }{}
|
||||
chromiumAPI.pdf = func(_ context.Context, _ *zap.Logger, _, _ string, options Options) error {
|
||||
expectOptions := DefaultOptions()
|
||||
expectOptions.ExtraLinkTags = []LinkTag{
|
||||
{
|
||||
Href: "https://cdn.foo",
|
||||
},
|
||||
{
|
||||
Href: "b.css",
|
||||
},
|
||||
{
|
||||
Href: "a.woff",
|
||||
},
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(options, expectOptions) {
|
||||
return fmt.Errorf("expected options %+v, but got: %+v", expectOptions, options)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
return chromiumAPI
|
||||
}(),
|
||||
expectOutputPathsCount: 1,
|
||||
},
|
||||
{
|
||||
ctx: func() *api.MockContext {
|
||||
ctx := &api.MockContext{Context: &api.Context{}}
|
||||
ctx.SetValues(map[string][]string{
|
||||
"url": {
|
||||
"foo",
|
||||
},
|
||||
"extraScriptTags": {
|
||||
"foo",
|
||||
},
|
||||
})
|
||||
|
||||
return ctx
|
||||
}(),
|
||||
api: func() API {
|
||||
chromiumAPI := struct{ ProtoAPI }{}
|
||||
chromiumAPI.pdf = func(_ context.Context, _ *zap.Logger, _, _ string, _ Options) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
return chromiumAPI
|
||||
}(),
|
||||
expectErr: true,
|
||||
expectHTTPErr: true,
|
||||
expectHTTPStatus: http.StatusBadRequest,
|
||||
},
|
||||
{
|
||||
ctx: func() *api.MockContext {
|
||||
ctx := &api.MockContext{Context: &api.Context{}}
|
||||
ctx.SetValues(map[string][]string{
|
||||
"url": {
|
||||
"foo",
|
||||
},
|
||||
})
|
||||
ctx.SetFiles(map[string]string{
|
||||
"b.js": "/b.js",
|
||||
"a.js": "/a.js",
|
||||
})
|
||||
|
||||
return ctx
|
||||
}(),
|
||||
api: func() API {
|
||||
chromiumAPI := struct{ ProtoAPI }{}
|
||||
chromiumAPI.pdf = func(_ context.Context, _ *zap.Logger, _, _ string, options Options) error {
|
||||
expectOptions := DefaultOptions()
|
||||
expectOptions.ExtraScriptTags = []ScriptTag{
|
||||
{
|
||||
Src: "a.js",
|
||||
},
|
||||
{
|
||||
Src: "b.js",
|
||||
},
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(options, expectOptions) {
|
||||
return fmt.Errorf("expected options %+v, but got: %+v", expectOptions, options)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
return chromiumAPI
|
||||
}(),
|
||||
expectOutputPathsCount: 1,
|
||||
},
|
||||
{
|
||||
ctx: func() *api.MockContext {
|
||||
ctx := &api.MockContext{Context: &api.Context{}}
|
||||
ctx.SetValues(map[string][]string{
|
||||
"url": {
|
||||
"foo",
|
||||
},
|
||||
"extraScriptTags": {
|
||||
`[{"src":"https://cdn.foo"},{"src":"b.js"}]`,
|
||||
},
|
||||
})
|
||||
ctx.SetFiles(map[string]string{
|
||||
"b.js": "/b.js",
|
||||
"a.js": "/a.js",
|
||||
})
|
||||
|
||||
return ctx
|
||||
}(),
|
||||
api: func() API {
|
||||
chromiumAPI := struct{ ProtoAPI }{}
|
||||
chromiumAPI.pdf = func(_ context.Context, _ *zap.Logger, _, _ string, options Options) error {
|
||||
expectOptions := DefaultOptions()
|
||||
expectOptions.ExtraScriptTags = []ScriptTag{
|
||||
{
|
||||
Src: "https://cdn.foo",
|
||||
},
|
||||
{
|
||||
Src: "b.js",
|
||||
},
|
||||
{
|
||||
Src: "a.js",
|
||||
},
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(options, expectOptions) {
|
||||
return fmt.Errorf("expected options %+v, but got: %+v", expectOptions, options)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
return chromiumAPI
|
||||
}(),
|
||||
expectOutputPathsCount: 1,
|
||||
},
|
||||
} {
|
||||
c := echo.New().NewContext(nil, nil)
|
||||
c.Set("context", tc.ctx.Context)
|
||||
|
||||
Reference in New Issue
Block a user