Open
Description
I cannot seem to figure out this issue. I've a very simple WebView with a very simple load to it. It's loading perfectly fine. However, if I try to submit a form with the webview, the form submits using get, not post. Similarly, submitting the form in android doesn't work the first time. It works if I immediately submit the form again.
import { Logger } from "../../modules/shared/services/logger.service";
import { GlobalConfig } from "../../modules/shared/services/global_config.service";
import { Component, OnInit, ViewChild, ElementRef } from "@angular/core";
import { Page } from "ui/page";
import { WebView, LoadEventData } from "ui/web-view";
import { WebViewInterface } from "nativescript-webview-interface";
import { Router, NavigationExtras, ActivatedRoute } from "@angular/router";
import { IWebViewParams } from "../../modules/webview/interfaces/WebViewParams.interface";
import { IRouteChange } from "../../modules/webview/interfaces/RouteChange.interface";
import { WebViewUtils } from "nativescript-webview-utils";
import * as utils from "utils/utils";
@Component({
selector : 'web',
templateUrl : 'pages/webview/webview.component.html'
})
export class WebViewComponent implements OnInit {
private webViewInterface;
private queryParams: IWebViewParams = {redirectUrl : ''};
@ViewChild('webFrame') webFrame: ElementRef = null;
constructor(private page: Page, private logger : Logger, private router : Router, private route: ActivatedRoute) {
this.logMessage('Constructor');
this.router.events.subscribe((event) => {
this.logMessage('Router Events');
this.logMessage(event);
});
this.route.queryParams.subscribe((params: IWebViewParams) => {
this.logMessage('Query Params');
this.logMessage(params);
this.queryParams = params;
});
this.logMessage('Constructor - Done');
}
logMessage(data) {
this.logger.log('WebView', data);
}
ngOnInit() {
this.logMessage('Init');
this.page.actionBarHidden = true;
}
loadWebFrame() {
this.logMessage('After View Init');
setTimeout(() => {
this.webFrame.nativeElement.height = this.page.height;
this.webFrame.nativeElement.cachePagesOnNavigate = false;
//Disabling Zoom On Android
if (this.webFrame.nativeElement.android) {
this.logMessage('Disabling Android Zoom');
this.webFrame.nativeElement.android.getSettings().setBuiltInZoomControls(false);
}
let webView = <WebView>this.webFrame.nativeElement;
let headers = new Map();
headers.set("X-Mobile-Header", GlobalConfig.MobileToken);
WebViewUtils.addHeaders(webView, headers);
this.initWebViewInterface();
this.webFrame.nativeElement.on(
WebView.loadStartedEvent,
(args: LoadEventData) => {
this.logMessage('Loading: ' + args.url);
}
);
this.webFrame.nativeElement.on(
WebView.loadFinishedEvent,
(args: LoadEventData) => {
if (!args.error) {
this.logMessage('Loaded!');
} else {
this.logMessage('Error: ' + args.error);
}
}
)
});
}
initWebViewInterface() {
this.logMessage('WebViewInterface Init');
let redirectUrl = this.queryParams.redirectUrl ? GlobalConfig.ServiceUri + this.queryParams.redirectUrl : GlobalConfig.StartUri;
this.logMessage('Redirect URL: ' + redirectUrl);
this.webViewInterface = new WebViewInterface(this.webFrame.nativeElement, redirectUrl);
let self = this;
self.webViewInterface.on(
'changeRoute', (routerParams: IRouteChange) => {
this.logMessage('changeRoute');
let navigationExtras: NavigationExtras = {
queryParams: routerParams
};
this.logMessage(JSON.stringify(routerParams));
self.router.navigate([routerParams.url], navigationExtras).then(function(data) {
//Woot!
console.log('data', data);
}).catch(function(data) {
//Todo: Add In Error Page
self.logMessage('Failed');
self.logMessage(data);
});
}
);
self.webViewInterface.on(
'openBrowser',
(routerParams: IRouteChange) => {
this.logMessage('Open Browser: ' + routerParams.url);
utils.openUrl(routerParams.url)
}
);
}
}
<ActionBar>
<ActionBar title="Title">
<NavigationButton (tap)="onTap"><</NavigationButton>
</ActionBar>
</ActionBar>
<GridLayout columns="*" rows="*">
<web-view #webFrame height="100%" (loaded)="loadWebFrame()"></web-view>
</GridLayout>
"dependencies": {
"@angular/animations": "~5.2.0",
"@angular/common": "~5.2.0",
"@angular/compiler": "~5.2.0",
"@angular/core": "~5.2.0",
"@angular/forms": "~5.2.0",
"@angular/http": "~5.2.0",
"@angular/platform-browser": "~5.2.0",
"@angular/platform-browser-dynamic": "~5.2.0",
"@angular/router": "~5.2.0",
"nativescript-angular": "~5.2.0",
"nativescript-background-http": "^3.1.0",
"nativescript-imagepicker": "^4.0.1",
"nativescript-purchase": "^2.0.0",
"nativescript-theme-core": "~1.0.4",
"nativescript-webview-interface": "~1.4.1",
"nativescript-webview-utils": "^2.0.3",
"reflect-metadata": "~0.1.8",
"rxjs": "~5.5.2",
"tns-core-modules": "~3.4.0",
"zone.js": "~0.8.2"
},
"devDependencies": {
"nativescript-dev-typescript": "~0.6.0",
"typescript": "~2.6.2",
"babel-traverse": "~6.26.0",
"babel-types": "~6.26.0",
"babylon": "~6.18.0",
"lazy": "~1.0.11",
"nativescript-dev-android-snapshot": "^0.*.*"
}
<form method="post" action="">
<?php if (isset($_POST['text'])): ?>
<?php echo $_POST['text']; ?>
<?php endif; ?>
<input type="text" name="text" />
<input type="submit" name="Go" />
</form>