Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactoring and fixes in postback pipeline #885

Merged
merged 32 commits into from Oct 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
014993e
Error logging unified to use console.error
Aug 30, 2020
7efb028
SPA navigation cleanup
Aug 30, 2020
c001a4c
ko.toJSON changed to JSON.stringify
Aug 30, 2020
8fe00cf
Object.keys fixes
Aug 30, 2020
c85642c
No waiting for redirect promise
Aug 30, 2020
e5ad81e
Refactor gate to simply enable/disable postbacks
exyi Aug 30, 2020
944b423
Add essential check of disabled/enabled postbacks just before viewmod…
exyi Aug 30, 2020
37fd945
Remove now unnecesary redirectPromise
exyi Aug 30, 2020
422819a
remove unnecesary gate check
exyi Aug 30, 2020
df756af
Freeze PostbackOptions
exyi Aug 30, 2020
bfdb488
move handlers started/completed events to applyPostbackHandlersCore
exyi Aug 30, 2020
94d7a88
Move validation logic from afterPostback event
exyi Aug 30, 2020
b49e3c8
Removed postbackHandlyersCompletedEventHandler and postbackHandlyersS…
quigamdev Sep 1, 2020
66d6f40
Fixed command args for parameters
quigamdev Sep 1, 2020
0364cc4
NuGet package version 3.0.0-preview01-88285-alpha02
Sep 1, 2020
bd755d4
Events and error handling code cleanup
tomasherceg Sep 6, 2020
1b6b69f
Unit tests for staticCommand code generation fixed
tomasherceg Sep 6, 2020
2fe5898
Merge remote-tracking branch 'origin/js-tests-jest' into v3-postback-…
tomasherceg Sep 6, 2020
f2d63f1
Fixed some errors in SPA area
tomasherceg Sep 6, 2020
5336fc5
Fixes in tests and in shared classes
tomasherceg Sep 6, 2020
bd5b36a
Tests for postback pipeline events added
tomasherceg Sep 6, 2020
7d44af3
SPA navigation and staticCommand tests implemented
tomasherceg Sep 7, 2020
c2057d6
Fixed bug in staticCommand (result extraction) and unified error hand…
tomasherceg Sep 12, 2020
9fe9118
Fixed DotVVM init in tests (SPA vs non-SPA modes)
tomasherceg Sep 12, 2020
c1aaf31
Date serialization tests fixed
tomasherceg Sep 12, 2020
a4d3157
Increased timeout in postback concurrency tests
tomasherceg Sep 12, 2020
9fba5f4
Fixed handling of validation errors (they are not hidden as commit er…
tomasherceg Sep 12, 2020
d592c3a
Merge branch 'v3-master' into v3-postback-events-refactoring
tomasherceg Sep 20, 2020
c46a4d1
Merged changes from `master`
tomasherceg Sep 28, 2020
566c8cf
Changes from code review
tomasherceg Sep 28, 2020
8a75a37
Merged changes from `v3-master`
tomasherceg Oct 9, 2020
937d12e
Merged changes from `v3-master`
tomasherceg Oct 18, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 14 additions & 0 deletions src/.vscode/launch.json
@@ -1,6 +1,7 @@
{
"version": "0.2.0",
"configurations": [

// {
// "name": "Tests",
// "type": "coreclr",
Expand Down Expand Up @@ -57,6 +58,19 @@
"type": "coreclr",
"request": "attach",
"processId": "${command:pickProcess}"
},
{
"type": "node",
"request": "launch",
"name": "Jest Tests",
"cwd": "${workspaceFolder}/DotVVM.Framework",
"program": "node_modules/jest/bin/jest.js",
"args": [
//"Resources/Scripts/tests/postback.test.ts",
"-i"
],
"internalConsoleOptions": "openOnSessionStart",
"envFile": "${workspaceRoot}/.env"
}
]
}
28 changes: 17 additions & 11 deletions src/.vscode/tasks.json
@@ -1,32 +1,38 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "0.1.0",
"version": "2.0.0",
"command": "dotnet",
"isShellCommand": true,
"type": "shell",
"args": [ ],
"tasks": [
{
"taskName": "build",
"label": "build",
"args": [ "DotVVM.Samples.BasicSamples.AspNetCore/", "/p:GenerateFullPaths=true" ],
"isBuildCommand": true,
"showOutput": "silent",
"group": "build",
"presentation": {
"reveal": "silent"
},
"problemMatcher": "$msCompile"
},
{
"taskName": "build-cli",
"label": "build-cli",
"command": "build",
"args": [ "DotVVM.CommandLine" ],
"isBuildCommand": true,
"showOutput": "always",
"group": "build",
"presentation": {
"reveal": "silent"
},
"problemMatcher": "$msCompile"
},
{
"taskName": "build-tests",
"label": "build-tests",
"command": "build",
"args": [ "DotVVM.Framework.Tests.Common" ],
"isBuildCommand": true,
"showOutput": "always",
"group": "build",
"presentation": {
"reveal": "silent"
},
"problemMatcher": "$msCompile"
}
]
Expand Down
Expand Up @@ -58,14 +58,14 @@ public string CompileBinding(string expression, Type[] contexts, Type expectedTy
public void StaticCommandCompilation_SimpleCommand()
{
var result = CompileBinding("StaticCommands.GetLength(StringProp)", typeof(TestViewModel));
Assert.AreEqual("(function(a,b){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[b.$data.StringProp()]).then(function(r_0){resolve(r_0);},reject);});}(this,ko.contextFor(this)))", result);
Assert.AreEqual("(function(a,b){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[b.$data.StringProp()],options).then(function(r_0){resolve(r_0);},reject);});}(this,ko.contextFor(this)))", result);
}

[TestMethod]
public void StaticCommandCompilation_AssignedCommand()
{
var result = CompileBinding("StringProp = StaticCommands.GetLength(StringProp).ToString()", typeof(TestViewModel));
Assert.AreEqual("(function(a,b){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[b.$data.StringProp()]).then(function(r_0){resolve(b.$data.StringProp(dotvvm.globalize.bindingNumberToString(r_0)()).StringProp());},reject);});}(this,ko.contextFor(this)))", result);
Assert.AreEqual("(function(a,b){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[b.$data.StringProp()],options).then(function(r_0){resolve(b.$data.StringProp(dotvvm.globalize.bindingNumberToString(r_0)()).StringProp());},reject);});}(this,ko.contextFor(this)))", result);
}

[TestMethod]
Expand All @@ -79,21 +79,21 @@ public void StaticCommandCompilation_JsOnlyCommand()
public void StaticCommandCompilation_ChainedCommands()
{
var result = CompileBinding("StringProp = StaticCommands.GetLength(StaticCommands.GetLength(StringProp).ToString()).ToString()", typeof(TestViewModel));
Assert.AreEqual("(function(a,b){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[b.$data.StringProp()]).then(function(r_0){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[dotvvm.globalize.bindingNumberToString(r_0)()]).then(function(r_1){resolve(b.$data.StringProp(dotvvm.globalize.bindingNumberToString(r_1)()).StringProp());},reject);},reject);});}(this,ko.contextFor(this)))", result);
Assert.AreEqual("(function(a,b){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[b.$data.StringProp()],options).then(function(r_0){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[dotvvm.globalize.bindingNumberToString(r_0)()],options).then(function(r_1){resolve(b.$data.StringProp(dotvvm.globalize.bindingNumberToString(r_1)()).StringProp());},reject);},reject);});}(this,ko.contextFor(this)))", result);
}

[TestMethod]
public void StaticCommandCompilation_ChainedCommandsWithSemicolon()
{
var result = CompileBinding("StringProp = StaticCommands.GetLength(StringProp).ToString(); StringProp = StaticCommands.GetLength(StringProp).ToString()", typeof(TestViewModel));
Assert.AreEqual("(function(a,c,b){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[c.$data.StringProp()]).then(function(r_0){(b=c.$data.StringProp(dotvvm.globalize.bindingNumberToString(r_0)()).StringProp(),dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[c.$data.StringProp()]).then(function(r_1){resolve((b,c.$data.StringProp(dotvvm.globalize.bindingNumberToString(r_1)()).StringProp()));},reject));},reject);});}(this,ko.contextFor(this)))", result);
Assert.AreEqual("(function(a,c,b){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[c.$data.StringProp()],options).then(function(r_0){(b=c.$data.StringProp(dotvvm.globalize.bindingNumberToString(r_0)()).StringProp(),dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[c.$data.StringProp()],options).then(function(r_1){resolve((b,c.$data.StringProp(dotvvm.globalize.bindingNumberToString(r_1)()).StringProp()));},reject));},reject);});}(this,ko.contextFor(this)))", result);
}

[TestMethod]
public void StaticCommandCompilation_DateTimeResultAssignment()
{
var result = CompileBinding("DateFrom = StaticCommands.GetDate()", typeof(TestViewModel));
Assert.AreEqual("(function(a,b){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0RGF0ZSIsW10sIiJd\",[]).then(function(r_0){resolve(b.$data.DateFrom(dotvvm.serialization.serializeDate(r_0,false)).DateFrom());},reject);});}(this,ko.contextFor(this)))", result);
Assert.AreEqual("(function(a,b){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0RGF0ZSIsW10sIiJd\",[],options).then(function(r_0){resolve(b.$data.DateFrom(dotvvm.serialization.serializeDate(r_0,false)).DateFrom());},reject);});}(this,ko.contextFor(this)))", result);
}

[TestMethod]
Expand All @@ -115,7 +115,7 @@ public void StaticCommandCompilation_PossibleAmniguousMatch()
{
var result = CompileBinding("SomeString = injectedService.Load(SomeString)", new[] { typeof(TestViewModel3) }, typeof(Func<string, string>));

Assert.AreEqual("(function(a,b){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuVGVzdFNlcnZpY2UsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiTG9hZCIsW10sIkFRQT0iXQ==\",[b.$data.SomeString()]).then(function(r_0){resolve(b.$data.SomeString(r_0).SomeString());},reject);});}(this,ko.contextFor(this)))", result);
Assert.AreEqual("(function(a,b){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuVGVzdFNlcnZpY2UsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiTG9hZCIsW10sIkFRQT0iXQ==\",[b.$data.SomeString()],options).then(function(r_0){resolve(b.$data.SomeString(r_0).SomeString());},reject);});}(this,ko.contextFor(this)))", result);
}

[TestMethod]
Expand Down
Expand Up @@ -66,6 +66,7 @@ public ExpectedTypeBindingProperty GetExpectedType(AssignedPropertyBindingProper
}
}

public static CodeSymbolicParameter PostbackOptionsParameter = new CodeSymbolicParameter("CommandBindingExpression.PostbackOptionsParameter");
public static CodeSymbolicParameter SenderElementParameter = new CodeSymbolicParameter("CommandBindingExpression.SenderElementParameter");
public static CodeSymbolicParameter CurrentPathParameter = new CodeSymbolicParameter("CommandBindingExpression.CurrentPathParameter");
public static CodeSymbolicParameter CommandIdParameter = new CodeSymbolicParameter("CommandBindingExpression.CommandIdParameter");
Expand Down
Expand Up @@ -188,7 +188,7 @@ protected virtual JsExpression CompileMethodCall(MethodCallExpression methodExpr
var encryptedPlan = EncryptJson(SerializePlan(plan), protector).Apply(Convert.ToBase64String);

return new JsIdentifierExpression("dotvvm").Member("staticCommandPostback")
.Invoke(new JsSymbolicParameter(CommandBindingExpression.SenderElementParameter), new JsLiteral(encryptedPlan), new JsArrayExpression(args))
.Invoke(new JsSymbolicParameter(CommandBindingExpression.SenderElementParameter), new JsLiteral(encryptedPlan), new JsArrayExpression(args), new JsSymbolicParameter(CommandBindingExpression.PostbackOptionsParameter))
.Member("then")
.Invoke(callbackFunction, errorCallback)
.WithAnnotation(new StaticCommandInvocationJsAnnotation(plan));
Expand Down
3 changes: 2 additions & 1 deletion src/DotVVM.Framework/Controls/KnockoutHelper.cs
Expand Up @@ -162,6 +162,7 @@ string getHandlerScript()
default;

var call = adjustedExpression.ToString(p =>
p == CommandBindingExpression.PostbackOptionsParameter ? new CodeParameterAssignment("options", OperatorPrecedence.Max) :
p == CommandBindingExpression.SenderElementParameter ? options.ElementAccessor :
p == CommandBindingExpression.CurrentPathParameter ? new CodeParameterAssignment(
getContextPath(control),
Expand All @@ -176,7 +177,7 @@ string getHandlerScript()
default(CodeParameterAssignment)
);
if (generatedPostbackHandlers == null && options.AllowPostbackHandlers)
return $"dotvvm.applyPostbackHandlers(function(){{return {call}}}.bind(this),{options.ElementAccessor.Code!.ToString(e => default(CodeParameterAssignment))},{getHandlerScript()})";
return $"dotvvm.applyPostbackHandlers(function(options){{return {call}}}.bind(this),{options.ElementAccessor.Code!.ToString(e => default(CodeParameterAssignment))},{getHandlerScript()})";
else return call;
}

Expand Down
8 changes: 0 additions & 8 deletions src/DotVVM.Framework/Resources/Scripts/createPostbackArgs.ts

This file was deleted.

20 changes: 10 additions & 10 deletions src/DotVVM.Framework/Resources/Scripts/events.ts
Expand Up @@ -46,20 +46,20 @@ export class DotvvmEvent<T> {
}
}

export const init = new DotvvmEvent<DotvvmEventArgs>("dotvvm.events.init", true);
export const init = new DotvvmEvent<DotvvmInitEventArgs>("dotvvm.events.init", true);
export const beforePostback = new DotvvmEvent<DotvvmBeforePostBackEventArgs>("dotvvm.events.beforePostback");
export const afterPostback = new DotvvmEvent<DotvvmAfterPostBackEventArgs>("dotvvm.events.afterPostback");
export const error = new DotvvmEvent<DotvvmErrorEventArgs>("dotvvm.events.error");
export const redirect = new DotvvmEvent<DotvvmRedirectEventArgs>("dotvvm.events.redirect");
export const postbackHandlersStarted = new DotvvmEvent<{}>("dotvvm.events.postbackHandlersStarted");
export const postbackHandlersCompleted = new DotvvmEvent<{}>("dotvvm.events.postbackHandlersCompleted");
export const postbackResponseReceived = new DotvvmEvent<{}>("dotvvm.events.postbackResponseReceived");
export const postbackCommitInvoked = new DotvvmEvent<{}>("dotvvm.events.postbackCommitInvoked");
export const postbackViewModelUpdated = new DotvvmEvent<{}>("dotvvm.events.postbackViewModelUpdated");
export const postbackRejected = new DotvvmEvent<{}>("dotvvm.events.postbackRejected");
export const staticCommandMethodInvoking = new DotvvmEvent<{ args: any[], command: string }>("dotvvm.events.staticCommandMethodInvoking");
export const staticCommandMethodInvoked = new DotvvmEvent<{ args: any[], command: string, result: any, xhr: XMLHttpRequest }>("dotvvm.events.staticCommandMethodInvoked");
export const staticCommandMethodFailed = new DotvvmEvent<{ args: any[], command: string, xhr: XMLHttpRequest, error?: any }>("dotvvm.events.staticCommandMethodInvoked");
export const postbackHandlersStarted = new DotvvmEvent<DotvvmPostbackHandlersStartedEventArgs>("dotvvm.events.postbackHandlersStarted");
export const postbackHandlersCompleted = new DotvvmEvent<DotvvmPostbackHandlersCompletedEventArgs>("dotvvm.events.postbackHandlersCompleted");
export const postbackResponseReceived = new DotvvmEvent<DotvvmPostbackResponseReceivedEventArgs>("dotvvm.events.postbackResponseReceived");
export const postbackCommitInvoked = new DotvvmEvent<DotvvmPostbackCommitInvokedEventArgs>("dotvvm.events.postbackCommitInvoked");
export const postbackViewModelUpdated = new DotvvmEvent<DotvvmPostbackViewModelUpdatedEventArgs>("dotvvm.events.postbackViewModelUpdated");
export const postbackRejected = new DotvvmEvent<DotvvmPostbackRejectedEventArgs>("dotvvm.events.postbackRejected");
export const staticCommandMethodInvoking = new DotvvmEvent<DotvvmStaticCommandMethodInvokingEventArgs>("dotvvm.events.staticCommandMethodInvoking");
export const staticCommandMethodInvoked = new DotvvmEvent<DotvvmStaticCommandMethodInvokedEventArgs>("dotvvm.events.staticCommandMethodInvoked");
export const staticCommandMethodFailed = new DotvvmEvent<DotvvmStaticCommandMethodFailedEventArgs>("dotvvm.events.staticCommandMethodInvoked");

class DotvvmEventHandler<T> {
constructor(public handler: (f: T) => void, public isOneTime: boolean) {
Expand Down